changeset 8885f31d37dd in /home/hg/repos/gajim

details:http://hg.gajim.org/gajim?cmd=changeset;node=8885f31d37dd
description: handle outgoing messages with events. Fixes #6743

diffstat:

 src/chat_control.py                      |  26 +++++++----
 src/common/connection.py                 |  28 ++++++++++++
 src/common/connection_handlers_events.py |  28 ++++++++++++
 src/common/ged.py                        |  13 +++++
 src/common/nec.py                        |  71 ++++++++++++++++++++++++++-----
 src/message_control.py                   |  40 +++++++++---------
 6 files changed, 163 insertions(+), 43 deletions(-)

diffs (truncated from 408 to 300 lines):

diff -r ee2d35d1701f -r 8885f31d37dd src/chat_control.py
--- a/src/chat_control.py       Tue May 17 18:57:37 2011 +0400
+++ b/src/chat_control.py       Wed May 18 19:44:43 2011 +0200
@@ -54,6 +54,7 @@
 from common.xmpp.protocol import NS_XHTML, NS_XHTML_IM, NS_FILE, NS_MUC
 from common.xmpp.protocol import NS_RECEIPTS, NS_ESESSION
 from common.xmpp.protocol import NS_JINGLE_RTP_AUDIO, NS_JINGLE_RTP_VIDEO, 
NS_JINGLE_ICE_UDP
+from common.connection_handlers_events import MessageOutgoingEvent
 
 from command_system.implementation.middleware import ChatCommandProcessor
 from command_system.implementation.middleware import CommandTools
@@ -517,6 +518,7 @@
         menu.show_all()
 
     def shutdown(self):
+        super(ChatControlBase, self).shutdown()
         # PluginSystem: removing GUI extension points connected with 
ChatControlBase
         # instance object
         gajim.plugin_manager.remove_gui_extension_point('chat_control_base', 
self)
@@ -848,8 +850,8 @@
         return label
 
     def send_message(self, message, keyID='', type_='chat', chatstate=None,
-                    msg_id=None, composing_xep=None, resource=None, xhtml=None,
-                    callback=None, callback_args=[], process_commands=True):
+    msg_id=None, composing_xep=None, resource=None, xhtml=None, callback=None,
+    callback_args=[], process_commands=True):
         """
         Send the given message to the active tab. Doesn't return None if error
         """
@@ -860,11 +862,12 @@
             return
 
         label = self.get_seclabel()
-        MessageControl.send_message(self, message, keyID, type_=type_,
-                chatstate=chatstate, msg_id=msg_id, 
composing_xep=composing_xep,
-                resource=resource, user_nick=self.user_nick, xhtml=xhtml,
-                label=label,
-                callback=callback, callback_args=callback_args)
+
+        gajim.nec.push_outgoing_event(MessageOutgoingEvent(None,
+            account=self.account, message=message, keyID=keyID, type_=type_,
+            chatstate=chatstate, msg_id=msg_id, composing_xep=composing_xep,
+            resource=resource, user_nick=self.user_nick, xhtml=xhtml,
+            label=label, callback=callback, callback_args= callback_args))
 
         # Record the history of sent messages
         self.save_message(message, 'sent')
@@ -2209,6 +2212,7 @@
         """
         Send a message to contact
         """
+        message = helpers.remove_invalid_xml_chars(message)
         if message in ('', None, '\n'):
             return None
 
@@ -2624,12 +2628,14 @@
         # if we're inactive prevent composing (JEP violation)
         if contact.our_chatstate == 'inactive' and state == 'composing':
             # go active before
-            MessageControl.send_message(self, None, chatstate='active')
+            gajim.nec.push_outgoing_event(MessageOutgoingEvent(None,
+                account=self.account, chatstate='active'))
             contact.our_chatstate = 'active'
             self.reset_kbd_mouse_timeout_vars()
 
-        MessageControl.send_message(self, "", chatstate = state,
-                msg_id = contact.msg_id, composing_xep = contact.composing_xep)
+        gajim.nec.push_outgoing_event(MessageOutgoingEvent(None,
+            account=self.account, chatstate=state, msg_id=contact.msg_id,
+            composing_xep=contact.composing_xep))
 
         contact.our_chatstate = state
         if contact.our_chatstate == 'active':
diff -r ee2d35d1701f -r 8885f31d37dd src/common/connection.py
--- a/src/common/connection.py  Tue May 17 18:57:37 2011 +0400
+++ b/src/common/connection.py  Wed May 18 19:44:43 2011 +0200
@@ -717,6 +717,8 @@
             self._nec_agent_info_error_received)
         gajim.ged.register_event_handler('agent-info-received', ged.CORE,
             self._nec_agent_info_received)
+        gajim.ged.register_event_handler('message-outgoing', ged.OUT_CORE,
+            self._nec_message_outgoing)
     # END __init__
 
     def cleanup(self):
@@ -727,6 +729,8 @@
             self._nec_agent_info_error_received)
         gajim.ged.remove_event_handler('agent-info-received', ged.CORE,
             self._nec_agent_info_received)
+        gajim.ged.remove_event_handler('message-outgoing', ged.OUT_CORE,
+            self._nec_message_outgoing)
 
     def get_config_values_or_default(self):
         if gajim.config.get_per('accounts', self.name, 'keep_alives_enabled'):
@@ -1764,6 +1768,30 @@
             session=session, forward_from=forward_from, form_node=form_node,
             original_message=original_message, delayed=delayed, callback=cb)
 
+    def _nec_message_outgoing(self, obj):
+        if obj.account != self.name:
+            return
+
+        def cb(jid, msg, keyID, forward_from, session, original_message,
+        subject, type_, msg_iq):
+            msg_id = self.connection.send(msg_iq, now=obj.now)
+            jid = helpers.parse_jid(obj.jid)
+            gajim.nec.push_incoming_event(MessageSentEvent(None, conn=self,
+                jid=jid, message=msg, keyID=keyID, chatstate=obj.chatstate))
+            if obj.callback:
+                obj.callback(msg_id, *obj.callback_args)
+
+            self.log_message(jid, msg, forward_from, session, original_message,
+                    subject, type_)
+
+        self._prepare_message(obj.jid, obj.message, obj.keyID, type_=obj.type_,
+            subject=obj.subject, chatstate=obj.chatstate, msg_id=obj.msg_id,
+            composing_xep=obj.composing_xep, resource=obj.resource,
+            user_nick=obj.user_nick, xhtml=obj.xhtml, label=obj.label,
+            session=obj.session, forward_from=obj.forward_from,
+            form_node=obj.form_node, original_message=obj.original_message,
+            delayed=obj.delayed, callback=cb)
+
     def send_contacts(self, contacts, jid):
         """
         Send contacts with RosterX (Xep-0144)
diff -r ee2d35d1701f -r 8885f31d37dd src/common/connection_handlers_events.py
--- a/src/common/connection_handlers_events.py  Tue May 17 18:57:37 2011 +0400
+++ b/src/common/connection_handlers_events.py  Wed May 18 19:44:43 2011 +0200
@@ -2042,3 +2042,31 @@
         elif self.notif_type == 'pres':
             self.handle_incoming_pres_event(self.base_event)
         return True
+
+class MessageOutgoingEvent(nec.NetworkIncomingEvent):
+    name = 'message-outgoing'
+    base_network_events = []
+
+    def init(self):
+        self.message = ''
+        self.keyID = None
+        self.type_ = 'chat'
+        self.subject = ''
+        self.chatstate = None
+        self.msg_id = None
+        self.composing_xep = None
+        self.resource = None
+        self.user_nick = None
+        self.xhtml = None
+        self.label = None
+        self.session = None
+        self.forward_from = None
+        self.form_node = None
+        self.original_message = ''
+        self.delayed = None
+        self.callback = None
+        self.callback_args = []
+        self.now = False
+
+    def generate(self):
+        return True
\ No newline at end of file
diff -r ee2d35d1701f -r 8885f31d37dd src/common/ged.py
--- a/src/common/ged.py Tue May 17 18:57:37 2011 +0400
+++ b/src/common/ged.py Wed May 18 19:44:43 2011 +0200
@@ -21,6 +21,7 @@
 :author: Mateusz Biliński <[email protected]>
 :since: 8th August 2008
 :copyright: Copyright (2008) Mateusz Biliński <[email protected]>
+:copyright: Copyright (2011) Yann Leboulanger <[email protected]>
 :license: GPL
 '''
 
@@ -39,6 +40,18 @@
 POSTGUI2 = 100
 POSTGUI = 110
 
+OUT_PREGUI = 10
+OUT_PREGUI1 = 20
+OUT_GUI1 = 30
+OUT_POSTGUI1 = 40
+OUT_PREGUI2 = 50
+OUT_GUI2 = 60
+OUT_POSTGUI2 = 70
+OUT_POSTGUI = 80
+OUT_PRECORE = 90
+OUT_CORE = 100
+OUT_POSTCORE = 110
+
 class GlobalEventsDispatcher(object):
 
     def __init__(self):
diff -r ee2d35d1701f -r 8885f31d37dd src/common/nec.py
--- a/src/common/nec.py Tue May 17 18:57:37 2011 +0400
+++ b/src/common/nec.py Wed May 18 19:44:43 2011 +0200
@@ -21,6 +21,7 @@
 :author: Mateusz Biliński <[email protected]>
 :since: 10th August 2008
 :copyright: Copyright (2008) Mateusz Biliński <[email protected]>
+:copyright: Copyright (2011) Yann Leboulanger <[email protected]>
 :license: GPL
 '''
 
@@ -38,23 +39,38 @@
         Values: list of class objects that are subclasses
         of `NetworkIncomingEvent`
         '''
+        self.outgoing_events_generators = {}
+        '''
+        Keys: names of events
+        Values: list of class objects that are subclasses
+        of `NetworkOutgoingEvent`
+        '''
 
     def register_incoming_event(self, event_class):
         for base_event_name in event_class.base_network_events:
-            event_list = 
self.incoming_events_generators.setdefault(base_event_name, [])
+            event_list = self.incoming_events_generators.setdefault(
+                base_event_name, [])
             if not event_class in event_list:
                 event_list.append(event_class)
 
     def unregister_incoming_event(self, event_class):
         for base_event_name in event_class.base_network_events:
             if base_event_name in self.incoming_events_generators:
-                
self.incoming_events_generators[base_event_name].remove(event_class)
+                self.incoming_events_generators[base_event_name].remove(
+                    event_class)
 
     def register_outgoing_event(self, event_class):
-        pass
+        for base_event_name in event_class.base_network_events:
+            event_list = self.outgoing_events_generators.setdefault(
+                base_event_name, [])
+            if not event_class in event_list:
+                event_list.append(event_class)
 
     def unregister_outgoing_event(self, event_class):
-        pass
+        for base_event_name in event_class.base_network_events:
+            if base_event_name in self.outgoing_events_generators:
+                self.outgoing_events_generators[base_event_name].remove(
+                    event_class)
 
     def push_incoming_event(self, event_object):
         if event_object.generate():
@@ -62,7 +78,9 @@
                 self._generate_events_based_on_incoming_event(event_object)
 
     def push_outgoing_event(self, event_object):
-        pass
+        if event_object.generate():
+            if not gajim.ged.raise_event(event_object.name, event_object):
+                self._generate_events_based_on_outgoing_event(event_object)
 
     def _generate_events_based_on_incoming_event(self, event_object):
         '''
@@ -75,11 +93,36 @@
         '''
         base_event_name = event_object.name
         if base_event_name in self.incoming_events_generators:
-            for new_event_class in 
self.incoming_events_generators[base_event_name]:
-                new_event_object = new_event_class(None, 
base_event=event_object)
+            for new_event_class in self.incoming_events_generators[
+            base_event_name]:
+                new_event_object = new_event_class(None,
+                    base_event=event_object)
                 if new_event_object.generate():
-                    if not gajim.ged.raise_event(new_event_object.name, 
new_event_object):
-                        
self._generate_events_based_on_incoming_event(new_event_object)
+                    if not gajim.ged.raise_event(new_event_object.name,
+                    new_event_object):
+                        self._generate_events_based_on_incoming_event(
+                            new_event_object)
+
+    def _generate_events_based_on_outgoing_event(self, event_object):
+        '''
+        :return: True if even_object should be dispatched through Global
+        Events Dispatcher, False otherwise. This can be used to replace
+        base events with those that more data computed (easier to use
+        by handlers).
+        :note: replacing mechanism is not implemented currently, but will be
+        based on attribute in new network events object.
+        '''
+        base_event_name = event_object.name
+        if base_event_name in self.outgoing_events_generators:
+            for new_event_class in self.outgoing_events_generators[
+            base_event_name]:
+                new_event_object = new_event_class(None,
+                    base_event=event_object)
+                if new_event_object.generate():
+                    if not gajim.ged.raise_event(new_event_object.name,
+                    new_event_object):
+                        self._generate_events_based_on_outgoing_event(
+                            new_event_object)
 
 class NetworkEvent(object):
     name = ''
@@ -88,10 +131,10 @@
         if new_name:
_______________________________________________
Commits mailing list
[email protected]
http://lists.gajim.org/cgi-bin/listinfo/commits

Reply via email to