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