From 344181fc01f3f4776522e6af9ef8812a440a0f7b Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Fri, 5 Nov 2010 20:36:45 +0100 Subject: [PATCH] use NEC to handle archiving stanza. --- src/common/connection_handlers.py | 3 + src/common/connection_handlers_events.py | 75 ++++++++++++++++++++ src/common/message_archiving.py | 87 ++++++------------------ src/dialogs.py | 49 ++++++++----- src/gui_interface.py | 14 ---- 5 files changed, 131 insertions(+), 97 deletions(-) diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index 432a58080..165603977 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -1102,6 +1102,9 @@ ConnectionJingle, ConnectionIBBytestream): gajim.nec.register_incoming_event(StreamConflictReceivedEvent) gajim.nec.register_incoming_event(PresenceReceivedEvent) gajim.nec.register_incoming_event(MessageReceivedEvent) + gajim.nec.register_incoming_event(ArchivingErrorReceivedEvent) + gajim.nec.register_incoming_event( + ArchivingPreferencesChangedReceivedEvent) gajim.ged.register_event_handler('http-auth-received', ged.CORE, self._nec_http_auth_received) diff --git a/src/common/connection_handlers_events.py b/src/common/connection_handlers_events.py index b3e9d303d..b328a6ad0 100644 --- a/src/common/connection_handlers_events.py +++ b/src/common/connection_handlers_events.py @@ -1152,4 +1152,79 @@ class JingleErrorReceivedEvent(nec.NetworkIncomingEvent): self.fjid = self.jingle_session.peerjid self.jid, self.resource = gajim.get_room_and_nick_from_fjid(self.fjid) self.sid = self.jingle_session.sid + return True + +class ArchivingReceivedEvent(nec.NetworkIncomingEvent): + name = 'archiving-received' + base_network_events = [] + + def generate(self): + self.type_ = self.stanza.getType() + if self.type_ not in ('result', 'set', 'error'): + return + return True + +class ArchivingErrorReceivedEvent(nec.NetworkIncomingEvent): + name = 'archiving-error-received' + base_network_events = ['archiving-received'] + + def generate(self): + self.conn = self.base_event.conn + self.stanza = self.base_event.stanza + self.type_ = self.base_event.conn + + if self.type_ == 'error': + self.error_msg = self.stanza.getErrorMsg() + return True + +class ArchivingPreferencesChangedReceivedEvent(nec.NetworkIncomingEvent): + name = 'archiving-preferences-changed-received' + base_network_events = ['archiving-received'] + + def generate(self): + self.conn = self.base_event.conn + self.stanza = self.base_event.stanza + self.type_ = self.base_event.type_ + + if self.type_ not in ('result', 'set'): + return + + self.conf = {} + self.new_items = {} + self.removed_items = [] + if self.stanza.getTag('pref'): + pref = self.stanza.getTag('pref') + + if pref.getTag('auto'): + self.conf['auto'] = pref.getTagAttr('auto', 'save') + + method_auto = pref.getTag('method', attrs={'type': 'auto'}) + if method_auto: + self.conf['method_auto'] = method_auto.getAttr('use') + + method_local = pref.getTag('method', attrs={'type': 'local'}) + if method_local: + self.conf['method_local'] = method_local.getAttr('use') + + method_manual = pref.getTag('method', attrs={'type': 'manual'}) + if method_manual: + self.conf['method_manual'] = method_manual.getAttr('use') + + default = pref.getTag('default') + if default: + self.conf['default'] = { + 'expire': default.getAttr('expire'), + 'otr': default.getAttr('otr'), + 'save': default.getAttr('save'), + 'unset': default.getAttr('unset')} + + for item in pref.getTags('item'): + self.new_items[item.getAttr('jid')] = { + 'expire': item.getAttr('expire'), + 'otr': item.getAttr('otr'), + 'save': item.getAttr('save')} + + elif self.stanza.getTag('itemremove'): + for item in pref.getTags('item'): + self.removed_items.append(item.getAttr('jid')) return True \ No newline at end of file diff --git a/src/common/message_archiving.py b/src/common/message_archiving.py index 87ee655c8..ee254841d 100644 --- a/src/common/message_archiving.py +++ b/src/common/message_archiving.py @@ -19,6 +19,9 @@ ## import common.xmpp +from common import gajim +from common import ged +from common.connection_handlers_events import ArchivingReceivedEvent import logging log = logging.getLogger('gajim.c.message_archiving') @@ -39,6 +42,9 @@ class ConnectionArchive: self.method_manual = None self.default = None self.items = {} + gajim.ged.register_event_handler( + 'archiving-preferences-changed-received', ged.CORE, + self._nec_archiving_changed_received) def request_message_archiving_preferences(self): iq_ = common.xmpp.Iq('get') @@ -129,73 +135,24 @@ class ConnectionArchive: def _ArchiveCB(self, con, iq_obj): log.debug('_ArchiveCB %s' % iq_obj.getType()) - if iq_obj.getType() == 'error': - self.dispatch('ARCHIVING_ERROR', iq_obj.getErrorMsg()) - return - elif iq_obj.getType() not in ('result', 'set'): - return - - if iq_obj.getTag('pref'): - pref = iq_obj.getTag('pref') - - if pref.getTag('auto'): - self.auto = pref.getTagAttr('auto', 'save') - log.debug('archiving preference: auto: %s' % self.auto) - self.dispatch('ARCHIVING_CHANGED', ('auto', - self.auto)) - - method_auto = pref.getTag('method', attrs={'type': 'auto'}) - if method_auto: - self.method_auto = method_auto.getAttr('use') - self.dispatch('ARCHIVING_CHANGED', ('method_auto', - self.method_auto)) - - method_local = pref.getTag('method', attrs={'type': 'local'}) - if method_local: - self.method_local = method_local.getAttr('use') - self.dispatch('ARCHIVING_CHANGED', ('method_local', - self.method_local)) - - method_manual = pref.getTag('method', attrs={'type': 'manual'}) - if method_manual: - self.method_manual = method_manual.getAttr('use') - self.dispatch('ARCHIVING_CHANGED', ('method_manual', - self.method_manual)) - - log.debug('archiving preferences: method auto: %s, local: %s, ' - 'manual: %s' % (self.method_auto, self.method_local, - self.method_manual)) - - if pref.getTag('default'): - default = pref.getTag('default') - log.debug('archiving preferences: default otr: %s, save: %s, ' - 'expire: %s, unset: %s' % (default.getAttr('otr'), - default.getAttr('save'), default.getAttr('expire'), - default.getAttr('unset'))) - self.default = { - 'expire': default.getAttr('expire'), - 'otr': default.getAttr('otr'), - 'save': default.getAttr('save'), - 'unset': default.getAttr('unset')} - self.dispatch('ARCHIVING_CHANGED', ('default', - self.default)) - for item in pref.getTags('item'): - log.debug('archiving preferences for jid %s: otr: %s, save: %s, ' - 'expire: %s' % (item.getAttr('jid'), item.getAttr('otr'), - item.getAttr('save'), item.getAttr('expire'))) - self.items[item.getAttr('jid')] = { - 'expire': item.getAttr('expire'), - 'otr': item.getAttr('otr'), 'save': item.getAttr('save')} - self.dispatch('ARCHIVING_CHANGED', ('item', - item.getAttr('jid'), self.items[item.getAttr('jid')])) - elif iq_obj.getTag('itemremove'): - for item in pref.getTags('item'): - del self.items[item.getAttr('jid')] - self.dispatch('ARCHIVING_CHANGED', ('itemremove', - item.getAttr('jid'))) - + gajim.nec.push_incoming_event(ArchivingReceivedEvent(None, conn=self, + stanza=iq_obj)) raise common.xmpp.NodeProcessed + def _nec_archiving_changed_received(self, obj): + if obj.conn.name != self.name: + return + for key in ('auto', 'method_auto', 'method_local', 'method_manual', + 'default'): + if key in obj.conf: + self.__dict__[key] = obj.conf[key] + + for jid, pref in obj.new_items.items(): + self.items[jid] = pref + + for jid in obj.removed_items: + del self.items[jid] + def request_collections_list_page(self, with_='', start=None, end=None, after=None, max=30, exact_match=False): iq_ = common.xmpp.Iq('get') diff --git a/src/dialogs.py b/src/dialogs.py index 739a2a908..bdd3657e8 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -3610,6 +3610,12 @@ class ArchivingPreferencesWindow: self.window.set_title(_('Archiving Preferences for %s') % self.account) + gajim.ged.register_event_handler( + 'archiving-preferences-changed-received', ged.GUI1, + self._nec_archiving_changed_received) + gajim.ged.register_event_handler('archiving-error-received', ged.GUI1, + self._nec_archiving_error) + self.window.show_all() self.xml.connect_signals(self) @@ -3687,31 +3693,32 @@ class ArchivingPreferencesWindow: if new_key_name in gajim.interface.instances[self.account]: return gajim.interface.instances[self.account][new_key_name] - def archiving_changed(self, data): - if data[0] in ('auto', 'method_auto', 'method_local', 'method_manual'): - if data[0] in self.waiting: - self.waiting.remove(data[0]) - elif data[0] == 'default': + def _nec_archiving_changed_received(self, obj): + if obj.conn.name != self.account: + return + for key in ('auto', 'method_auto', 'method_local', 'method_manual'): + if key in obj.conf and key in self.waiting: + self.waiting.remove(key) + if 'default' in obj.conf: key_name = 'edit_item_archiving_preferences_%s' % \ self.current_item if key_name in gajim.interface.instances[self.account]: gajim.interface.instances[self.account][key_name].\ - response_arrived(data[1:]) + response_arrived(obj.conf['default']) self.fill_items(True) - elif data[0] == 'item': + for jid, pref in obj.new_items.items(): child = self.get_child_window() if child: is_new = not child.item - child.response_arrived(data[1:]) + child.response_arrived(pref) if is_new: model = self.item_treeview.get_model() - model.append((data[1], data[2]['expire'], data[2]['otr'], - data[2]['save'])) - return + model.append((jid, pref['expire'], pref['otr'], + pref['save'])) + continue self.fill_items(True) - elif data[0] == 'itemremove' == self.waiting: - if data[0] in self.waiting: - self.waiting.remove(data[0]) + if 'itemremove' in self.waiting and obj.removed_items: + self.waiting.remove('itemremove') self.fill_items(True) def fill_items(self, clear=False): @@ -3728,22 +3735,28 @@ class ArchivingPreferencesWindow: model.append((item, expire_value, item_config['otr'], item_config['save'])) - def archiving_error(self, error): + def _nec_archiving_error(self, obj): + if obj.conn.name != self.account: + return if self.waiting: pritext = _('There is an error') - sectext = error + sectext = obj.error_msg ErrorDialog(pritext, sectext) self.waiting.pop() else: child = self.get_child_window() if child: - child.error_arrived(error) - print error + child.error_arrived(obj.error_msg) def on_close_button_clicked(self, widget): self.window.destroy() def on_archiving_preferences_window_destroy(self, widget): + gajim.ged.remove_event_handler( + 'archiving-preferences-changed-received', ged.GUI1, + self._nec_archiving_changed_received) + gajim.ged.remove_event_handler('archiving-error-received', ged.GUI1, + self._nec_archiving_error) if 'archiving_preferences' in gajim.interface.instances[self.account]: del gajim.interface.instances[self.account]['archiving_preferences'] diff --git a/src/gui_interface.py b/src/gui_interface.py index 067a8b2ff..c060caea6 100644 --- a/src/gui_interface.py +++ b/src/gui_interface.py @@ -1827,18 +1827,6 @@ class Interface: if pm_ctrl and hasattr(pm_ctrl, "update_contact"): pm_ctrl.update_contact() - def handle_event_archiving_changed(self, account, data): - # ('ARCHIVING_CHANGED', account, (type, value) - if 'archiving_preferences' in self.instances[account]: - self.instances[account]['archiving_preferences'].archiving_changed( - data) - - def handle_event_archiving_error(self, account, data): - # ('ARCHIVING_CHANGED', account, (error_msg,)) - if 'archiving_preferences' in self.instances[account]: - self.instances[account]['archiving_preferences'].archiving_error( - data) - def create_core_handlers_list(self): self.handlers = { 'WARNING': [self.handle_event_warning], @@ -1899,8 +1887,6 @@ class Interface: 'INSECURE_PASSWORD': [self.handle_event_insecure_password], 'PEP_RECEIVED': [self.handle_event_pep_received], 'CAPS_RECEIVED': [self.handle_event_caps_received], - 'ARCHIVING_CHANGED': [self.handle_event_archiving_changed], - 'ARCHIVING_ERROR': [self.handle_event_archiving_error], 'bookmarks-received': [self.handle_event_bookmarks], 'gc-invitation-received': [self.handle_event_gc_invitation], 'gc-presence-received': [self.handle_event_gc_presence],