From 531321740cbf6bd971ce73dbfea2bb83a4d64566 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Wed, 16 May 2007 11:30:49 +0000 Subject: Merge branch 'master' of git+ssh://dev.laptop.org/git/sugar Conflicts: services/presence/server_plugin.py --- (limited to 'services') diff --git a/services/presence/server_plugin.py b/services/presence/server_plugin.py index ac569ba..d4930c9 100644 --- a/services/presence/server_plugin.py +++ b/services/presence/server_plugin.py @@ -622,7 +622,10 @@ class ServerPlugin(gobject.GObject): def cleanup(self): """If we still have a connection, disconnect it""" if self._conn: - self._conn[CONN_INTERFACE].Disconnect() + try: + self._conn[CONN_INTERFACE].Disconnect() + except: + pass self._conn = None self._conn_status = CONNECTION_STATUS_DISCONNECTED @@ -670,10 +673,16 @@ class ServerPlugin(gobject.GObject): reply_handler=lambda *args: self._contact_online_activities_cb(handle, *args), error_handler=lambda *args: self._contact_online_activities_error_cb(handle, *args)) - def _contact_online_aliases_error_cb(self, handle, err): + def _contact_online_aliases_error_cb(self, handle, props, retry, err): """Handle failure to retrieve given user's alias/information""" - _logger.debug("Handle %s - Error getting nickname: %s" % (handle, err)) - self._contact_offline(handle) + if retry: + _logger.debug("Handle %s - Error getting nickname (will retry): %s" % (handle, err)) + self._conn[CONN_INTERFACE_ALIASING].RequestAliases([handle], + reply_handler=lambda *args: self._contact_online_aliases_cb(handle, props, *args), + error_handler=lambda *args: self._contact_online_aliases_error_cb(handle, props, False, *args)) + else: + _logger.debug("Handle %s - Error getting nickname: %s" % (handle, err)) + self._contact_offline(handle) def _contact_online_properties_cb(self, handle, props): """Handle failure to retrieve given user's alias/information""" @@ -691,12 +700,23 @@ class ServerPlugin(gobject.GObject): self._conn[CONN_INTERFACE_ALIASING].RequestAliases([handle], reply_handler=lambda *args: self._contact_online_aliases_cb(handle, props, *args), - error_handler=lambda *args: self._contact_online_aliases_error_cb(handle, *args)) - - def _contact_online_properties_error_cb(self, handle, err): - """Handle error retrieving property-set for a user (handle)""" - _logger.debug("Handle %s - Error getting properties: %s" % (handle, err)) - self._contact_offline(handle) + error_handler=lambda *args: self._contact_online_aliases_error_cb(handle, props, True, *args)) + + def _contact_online_request_properties(self, handle, tries): + self._conn[CONN_INTERFACE_BUDDY_INFO].GetProperties(handle, + reply_handler=lambda *args: self._contact_online_properties_cb(handle, *args), + error_handler=lambda *args: self._contact_online_properties_error_cb(handle, tries, *args)) + return False + + def _contact_online_properties_error_cb(self, handle, tries, err): + """Handle error retrieving property-set for a user (handle)""" + if tries <= 3: + _logger.debug("Handle %s - Error getting properties (will retry): %s" % (handle, err)) + tries += 1 + gobject.timeout_add(1000, self._contact_online_request_properties, handle, tries) + else: + _logger.debug("Handle %s - Error getting properties: %s" % (handle, err)) + self._contact_offline(handle) def _contact_online(self, handle): """Handle a contact coming online""" @@ -715,9 +735,7 @@ class ServerPlugin(gobject.GObject): # are handled locally return - self._conn[CONN_INTERFACE_BUDDY_INFO].GetProperties(handle, - reply_handler=lambda *args: self._contact_online_properties_cb(handle, *args), - error_handler=lambda *args: self._contact_online_properties_error_cb(handle, *args)) + self._contact_online_request_properties(handle, 1) def _subscribe_members_changed_cb(self, added, removed, local_pending, remote_pending, actor, reason): @@ -765,6 +783,15 @@ class ServerPlugin(gobject.GObject): elif status in ["offline", "invisible"]: self._contact_offline(handle) + def _request_avatar_cb(self, handle, new_avatar_token, avatar, mime_type): + jid = self._online_contacts[handle] + if not jid: + logging.debug("Handle %s not valid yet..." % handle) + return + icon = ''.join(map(chr, avatar)) + self._icon_cache.store_icon(jid, new_avatar_token, icon) + self.emit("avatar-updated", handle, icon) + def _avatar_updated_cb(self, handle, new_avatar_token): """Handle update of given user (handle)'s avatar""" if handle == self._conn[CONN_INTERFACE].GetSelfHandle(): @@ -784,11 +811,11 @@ class ServerPlugin(gobject.GObject): icon = self._icon_cache.get_icon(jid, new_avatar_token) if not icon: # cache miss - avatar, mime_type = self._conn[CONN_INTERFACE_AVATARS].RequestAvatar(handle) - icon = ''.join(map(chr, avatar)) - self._icon_cache.store_icon(jid, new_avatar_token, icon) - - self.emit("avatar-updated", handle, icon) + self._conn[CONN_INTERFACE_AVATARS].RequestAvatar(handle, + reply_handler=lambda *args: self._request_avatar_cb(handle, new_avatar_token, *args), + error_handler=lambda *args: self._log_error_cb("getting avatar", *args)) + else: + self.emit("avatar-updated", handle, icon) def _alias_changed_cb(self, aliases): """Handle update of aliases for all users""" -- cgit v0.9.1