changeset dd6208b3e902 in /home/hg/repos/gajim

details:http://hg.gajim.org/gajim?cmd=changeset;node=dd6208b3e902
description: use NEC to handle private storage stanza

diffstat:

 src/common/connection_handlers.py |  155 ++++++++++++++++++++++++++++++-------
 src/gui_interface.py              |   16 +--
 2 files changed, 133 insertions(+), 38 deletions(-)

diffs (285 lines):

diff -r 25c13cc61f07 -r dd6208b3e902 src/common/connection_handlers.py
--- a/src/common/connection_handlers.py Fri Aug 27 22:45:16 2010 +0200
+++ b/src/common/connection_handlers.py Fri Aug 27 22:45:59 2010 +0200
@@ -1091,6 +1091,15 @@
             ged.CORE, self._nec_time_revised_request_received)
         gajim.ged.register_event_handler('roster-set-received',
             ged.CORE, self._nec_roster_set_received)
+        gajim.nec.register_incoming_event(PrivateStorageBookmarksReceivedEvent)
+        gajim.ged.register_event_handler('private-storage-bookmarks-received',
+            ged.CORE, self._nec_private_storate_bookmarks_received)
+        gajim.nec.register_incoming_event(BookmarksReceivedEvent)
+        gajim.nec.register_incoming_event(
+            PrivateStorageRosternotesReceivedEvent)
+        
gajim.ged.register_event_handler('private-storage-rosternotes-received',
+            ged.CORE, self._nec_private_storate_rosternotes_received)
+        gajim.nec.register_incoming_event(RosternotesReceivedEvent)
 
     def build_http_auth_answer(self, iq_obj, answer):
         if not self.connection or self.connected < 2:
@@ -1137,34 +1146,28 @@
         errcode = iq_obj.getErrorCode()
         self.dispatch('ERROR_ANSWER', (id_, jid_from, errmsg, errcode))
 
+    def _nec_private_storate_bookmarks_received(self, obj):
+        resend_to_pubsub = False
+        bm_jids = [b['jid'] for b in self.bookmarks]
+        for bm in obj.bookmarks:
+            if bm['jid'] not in bm_jids:
+                self.bookmarks.append(bm)
+                # We got a bookmark that was not in pubsub
+                resend_to_pubsub = True
+        if self.pubsub_supported and resend_to_pubsub:
+            self.store_bookmarks('pubsub')
+
+    def _nec_private_storate_rosternotes_received(self, obj):
+        for jid in obj.annotations:
+            self.annotations[jid] = obj.annotations[jid]
+
     def _PrivateCB(self, con, iq_obj):
         """
         Private Data (XEP 048 and 049)
         """
         log.debug('PrivateCB')
-        query = iq_obj.getTag('query')
-        storage = query.getTag('storage')
-        if storage:
-            ns = storage.getNamespace()
-            if ns == 'storage:bookmarks':
-                self._parse_bookmarks(storage, 'xml')
-            elif ns == 'gajim:prefs':
-                # Preferences data
-                # http://www.xmpp.org/extensions/xep-0049.html
-                #TODO: implement this
-                pass
-            elif ns == 'storage:rosternotes':
-                # Annotations
-                # http://www.xmpp.org/extensions/xep-0145.html
-                notes = storage.getTags('note')
-                for note in notes:
-                    try:
-                        jid = helpers.parse_jid(note.getAttr('jid'))
-                    except common.helpers.InvalidFormat:
-                        log.warn('Invalid JID: %s, ignoring it' % 
note.getAttr('jid'))
-                        continue
-                    annotation = note.getData()
-                    self.annotations[jid] = annotation
+        gajim.nec.push_incoming_event(PrivateStorageReceivedEvent(None,
+            conn=self, iq_obj=iq_obj))
 
     def _SecLabelCB(self, con, iq_obj):
         """
@@ -1264,7 +1267,7 @@
         gajim.nec.push_incoming_event(VersionRequestEvent(None,
             conn=self, iq_obj=iq_obj))
         raise common.xmpp.NodeProcessed
-    
+
     def _nec_version_request_received(self, obj):
         if obj.conn.name != self.name:
             return
@@ -2434,7 +2437,7 @@
 class LastResultReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
     name = 'last-result-received'
     base_network_events = []
-    
+
     def generate(self):
         self.get_id()
         self.get_jid_resource()
@@ -2460,7 +2463,7 @@
 class VersionResultReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
     name = 'version-result-received'
     base_network_events = []
-    
+
     def generate(self):
         self.get_id()
         self.get_jid_resource()
@@ -2594,7 +2597,7 @@
 class RosterItemExchangeEvent(nec.NetworkIncomingEvent, HelperEvent):
     name = 'roster-item-exchange-received'
     base_network_events = []
-    
+
     def generate(self):
         self.get_id()
         self.get_jid_resource()
@@ -2639,11 +2642,11 @@
 class VersionRequestEvent(nec.NetworkIncomingEvent):
     name = 'version-request-received'
     base_network_events = []
-    
+
 class LastRequestEvent(nec.NetworkIncomingEvent):
     name = 'last-request-received'
     base_network_events = []
-    
+
 class TimeRequestEvent(nec.NetworkIncomingEvent):
     name = 'time-request-received'
     base_network_events = []
@@ -2725,3 +2728,97 @@
                 if reason:
                     self.users_dict[jid]['reason'] = reason
         return True
+
+class PrivateStorageReceivedEvent(nec.NetworkIncomingEvent):
+    name = 'private-storage-received'
+    base_network_events = []
+
+    def generate(self):
+        query = self.iq_obj.getTag('query')
+        self.storage_node = query.getTag('storage')
+        if self.storage_node:
+            self.namespace = self.storage_node.getNamespace()
+            return True
+
+class BookmarksHelper:
+    def parse_bookmarks(self):
+        self.bookmarks = []
+        confs = self.base_event.storage_node.getTags('conference')
+        for conf in confs:
+            autojoin_val = conf.getAttr('autojoin')
+            if autojoin_val is None: # not there (it's optional)
+                autojoin_val = False
+            minimize_val = conf.getAttr('minimize')
+            if minimize_val is None: # not there (it's optional)
+                minimize_val = False
+            print_status = conf.getTagData('print_status')
+            if not print_status:
+                print_status = conf.getTagData('show_status')
+            try:
+                jid = helpers.parse_jid(conf.getAttr('jid'))
+            except common.helpers.InvalidFormat:
+                log.warn('Invalid JID: %s, ignoring it' % conf.getAttr('jid'))
+                continue
+            bm = {'name': conf.getAttr('name'),
+                'jid': jid,
+                'autojoin': autojoin_val,
+                'minimize': minimize_val,
+                'password': conf.getTagData('password'),
+                'nick': conf.getTagData('nick'),
+                'print_status': print_status}
+
+
+            bm_jids = [b['jid'] for b in self.bookmarks]
+            if bm['jid'] not in bm_jids:
+                self.bookmarks.append(bm)
+
+class PrivateStorageBookmarksReceivedEvent(nec.NetworkIncomingEvent,
+BookmarksHelper):
+    name = 'private-storage-bookmarks-received'
+    base_network_events = ['private-storage-received']
+
+    def generate(self):
+        self.conn = self.base_event.conn
+        if self.base_event.namespace != 'storage:bookmarks':
+            return
+        self.parse_bookmarks()
+        return True
+
+class BookmarksReceivedEvent(nec.NetworkIncomingEvent):
+    name = 'bookmarks-received'
+    base_network_events = ['private-storage-bookmarks-received']
+
+    def generate(self):
+        self.conn = self.base_event.conn
+        self.bookmarks = self.base_event.bookmarks
+        return True
+
+class PrivateStorageRosternotesReceivedEvent(nec.NetworkIncomingEvent):
+    name = 'private-storage-rosternotes-received'
+    base_network_events = ['private-storage-received']
+
+    def generate(self):
+        self.conn = self.base_event.conn
+        if self.base_event.namespace != 'storage:rosternotes':
+            return
+        notes = self.base_event.storage_node.getTags('note')
+        self.annotations = {}
+        for note in notes:
+            try:
+                jid = helpers.parse_jid(note.getAttr('jid'))
+            except common.helpers.InvalidFormat:
+                log.warn('Invalid JID: %s, ignoring it' % note.getAttr('jid'))
+                continue
+            annotation = note.getData()
+            self.annotations[jid] = annotation
+        if self.annotations:
+            return True
+
+class RosternotesReceivedEvent(nec.NetworkIncomingEvent):
+    name = 'rosternotes-received'
+    base_network_events = ['private-storage-rosternotes-received']
+
+    def generate(self):
+        self.conn = self.base_event.conn
+        self.annotations = self.base_event.annotations
+        return True
\ No newline at end of file
diff -r 25c13cc61f07 -r dd6208b3e902 src/gui_interface.py
--- a/src/gui_interface.py      Fri Aug 27 22:45:16 2010 +0200
+++ b/src/gui_interface.py      Fri Aug 27 22:45:59 2010 +0200
@@ -1008,12 +1008,10 @@
                         f.value = True
                     elif f.var == 'public_list':
                         f.value = False
-                gajim.connections[account].send_gc_config(obj.jid,
-                    obj.dataform.get_purged())
+                obj.conn.send_gc_config(obj.jid, obj.dataform.get_purged())
             else:
                 # use default configuration
-                gajim.connections[account].send_gc_config(obj.jid,
-                    obj.form_node)
+                obj.conn.send_gc_config(obj.jid, obj.form_node)
             # invite contacts
             # check if it is necessary to add <continue />
             continue_tag = False
@@ -1021,7 +1019,7 @@
                 continue_tag = True
             if 'invities' in gajim.automatic_rooms[account][obj.jid]:
                 for jid in gajim.automatic_rooms[account][obj.jid]['invities']:
-                    gajim.connections[account].send_invite(obj.jid, jid,
+                    obj.conn.send_invite(obj.jid, jid,
                         continue_tag=continue_tag)
             del gajim.automatic_rooms[account][obj.jid]
         elif obj.jid not in self.instances[account]['gc_config']:
@@ -1254,7 +1252,7 @@
                 self.roster.draw_group(group, account)
             self.roster.draw_contact(obj.jid, account)
 
-    def handle_event_bookmarks(self, account, bms):
+    def handle_event_bookmarks(self, obj):
         # ('BOOKMARKS', account, [{name,jid,autojoin,password,nick}, {}])
         # We received a bookmark item from the server (JEP48)
         # Auto join GC windows if neccessary
@@ -1262,10 +1260,10 @@
         self.roster.set_actions_menu_needs_rebuild()
         invisible_show = gajim.SHOW_LIST.index('invisible')
         # do not autojoin if we are invisible
-        if gajim.connections[account].connected == invisible_show:
+        if obj.conn.connected == invisible_show:
             return
 
-        self.auto_join_bookmarks(account)
+        self.auto_join_bookmarks(obj.conn.name)
 
     def handle_event_file_send_error(self, account, array):
         jid = array[0]
@@ -2110,7 +2108,6 @@
             'GC_PASSWORD_REQUIRED': [self.handle_event_gc_password_required],
             'GC_ERROR': [self.handle_event_gc_error],
             'BAD_PASSPHRASE': [self.handle_event_bad_passphrase],
-            'BOOKMARKS': [self.handle_event_bookmarks],
             'CON_TYPE': [self.handle_event_con_type],
             'CONNECTION_LOST': [self.handle_event_connection_lost],
             'FILE_REQUEST': [self.handle_event_file_request],
@@ -2160,6 +2157,7 @@
             '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],
             'gmail-notify': [self.handle_event_gmail_notify],
             'http-auth-received': [self.handle_event_http_auth],
             'last-result-received': [self.handle_event_last_status_time],
_______________________________________________
Commits mailing list
[email protected]
http://lists.gajim.org/cgi-bin/listinfo/commits

Reply via email to