From 6428fdc9a421086233ba166badbadc628c8bb980 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Sat, 3 Mar 2007 03:12:27 -0500 Subject: [PATCH 1/6] Give dbus-python a hint to icon return type --- services/presence2/buddy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/presence2/buddy.py b/services/presence2/buddy.py index a49e1785..97e969ca 100644 --- a/services/presence2/buddy.py +++ b/services/presence2/buddy.py @@ -141,7 +141,7 @@ class Buddy(DBusGObject): def GetIcon(self): if not self.props.icon: return "" - return self.props.icon + return dbus.ByteArray(self.props.icon) @dbus.service.method(_BUDDY_INTERFACE, in_signature="", out_signature="ao") From 7da177a054fe6902791162349dfeb50bc25fa289 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Sat, 3 Mar 2007 03:12:52 -0500 Subject: [PATCH 2/6] color is required for a valid buddy --- services/presence2/buddy.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/services/presence2/buddy.py b/services/presence2/buddy.py index 97e969ca..f9946b5d 100644 --- a/services/presence2/buddy.py +++ b/services/presence2/buddy.py @@ -158,9 +158,7 @@ class Buddy(DBusGObject): props['nick'] = self.props.nick props['owner'] = self.props.owner props['key'] = self.props.key - color = self.props.color - if color: - props['color'] = color + props['color'] = self.props.color return props # methods From fc970ccf3dbbaf2cfac85b3e300eba8564b5877a Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Sat, 3 Mar 2007 03:15:18 -0500 Subject: [PATCH 3/6] Attempt periodic reconnection on connect error, traceback less on server problems --- services/presence2/server_plugin.py | 37 ++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/services/presence2/server_plugin.py b/services/presence2/server_plugin.py index 9990c19f..472b0249 100644 --- a/services/presence2/server_plugin.py +++ b/services/presence2/server_plugin.py @@ -96,6 +96,8 @@ class ServerPlugin(gobject.GObject): self._conn = self._init_connection() + self._reconnect_id = 0 + def _get_account_info(self): account_info = {} @@ -210,7 +212,12 @@ class ServerPlugin(gobject.GObject): # vcards are changed #self._conn[CONN_INTERFACE_ALIASING].connect_to_signal('AliasesChanged', self._alias_changed_cb) - self._set_self_buddy_info() + try: + self._set_self_buddy_info() + except RuntimeError, e: + print e + self.cleanup() + return # Request presence for everyone on the channel self._conn[CONN_INTERFACE_PRESENCE].GetPresence(subscribe_handles) @@ -220,7 +227,11 @@ class ServerPlugin(gobject.GObject): props = {} props['color'] = profile.get_color().to_string() props['key'] = profile.get_pubkey() - self._conn[CONN_INTERFACE_BUDDY_INFO].SetProperties(props) + try: + self._conn[CONN_INTERFACE_BUDDY_INFO].SetProperties(props) + except dbus.DBusException, e: + if str(e).find("Server does not support PEP") >= 0: + raise RuntimeError("Server does not support PEP") name = profile.get_nick_name() self_handle = self._conn[CONN_INTERFACE].GetSelfHandle() @@ -255,6 +266,7 @@ class ServerPlugin(gobject.GObject): return False def start(self): + print "Trying to connect..." # If the connection is already connected query initial contacts conn_status = self._conn[CONN_INTERFACE].GetStatus() if conn_status == CONNECTION_STATUS_CONNECTED: @@ -265,7 +277,22 @@ class ServerPlugin(gobject.GObject): elif conn_status == CONNECTION_STATUS_CONNECTING: pass else: - self._conn[CONN_INTERFACE].Connect() + self._conn[CONN_INTERFACE].Connect(reply_handler=self._connect_reply_cb, + error_handler=self._connect_error_cb) + + def _connect_reply_cb(self): + if self._reconnect_id > 0: + gobject.source_remove(self._reconnect_id) + + def _reconnect(self): + self._reconnect_id = 0 + self.start() + return False + + def _connect_error_cb(self, exception): + print "Connect error: %s" % exception + if not self._reconnect_id: + self._reconnect_id = gobject.timeout_add(10000, self._reconnect) def cleanup(self): self._conn[CONN_INTERFACE].Disconnect() @@ -280,6 +307,10 @@ class ServerPlugin(gobject.GObject): except dbus.DBusException, e: if str(e).startswith("org.freedesktop.DBus.Error.NoReply"): raise InvalidBuddyError("couldn't get properties") + except KeyError, e: + if str(e) == "'%s'" % CONN_INTERFACE_BUDDY_INFO: + raise InvalidBuddyError("server doesn't support BuddyInfo interface") + if not props.has_key('color'): raise InvalidBuddyError("no color") if not props.has_key('key'): From fc7f62359f0ece9bd736e91a17a5479c8c5962d6 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Sat, 3 Mar 2007 03:51:27 -0500 Subject: [PATCH 4/6] Don't traceback on cleanup when disconnected already --- services/presence2/server_plugin.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/services/presence2/server_plugin.py b/services/presence2/server_plugin.py index 472b0249..a0c03b85 100644 --- a/services/presence2/server_plugin.py +++ b/services/presence2/server_plugin.py @@ -260,6 +260,7 @@ class ServerPlugin(gobject.GObject): elif state == CONNECTION_STATUS_DISCONNECTED: print 'disconnected: %r' % reason self.emit('status', state, int(reason)) + self._conn = None if reason == CONNECTION_STATUS_REASON_AUTHENTICATION_FAILED: # FIXME: handle connection failure; retry later? pass @@ -295,6 +296,8 @@ class ServerPlugin(gobject.GObject): self._reconnect_id = gobject.timeout_add(10000, self._reconnect) def cleanup(self): + if not self._conn: + return self._conn[CONN_INTERFACE].Disconnect() def _contact_offline(self, handle): From b4836718de7bf1832cbbb2bb712cd2e349672cda Mon Sep 17 00:00:00 2001 From: Marco Pesenti Gritti Date: Sat, 3 Mar 2007 21:25:34 +0100 Subject: [PATCH 5/6] Fix signal signature --- shell/hardware/nmclient.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/hardware/nmclient.py b/shell/hardware/nmclient.py index 31c198de..5d108a3c 100644 --- a/shell/hardware/nmclient.py +++ b/shell/hardware/nmclient.py @@ -548,7 +548,7 @@ class NMClient(gobject.GObject): return self._devices[device].set_state(DEVICE_STATE_INACTIVE) - def device_activation_failed_sig_handler(self, device): + def device_activation_failed_sig_handler(self, device, ssid=None): logging.debug('DeviceActivationFailed for %s' % (device)) if not self._devices.has_key(device): logging.debug('DeviceActivationFailed, device %s does not exist' % (device)) From 4d0c540f8542fc5d0fdf6ee83d77b84ea9193918 Mon Sep 17 00:00:00 2001 From: Marco Pesenti Gritti Date: Sun, 4 Mar 2007 00:54:50 +0100 Subject: [PATCH 6/6] Fix bw/color switch. Patch by Owen Williams. --- shell/hardware/hardwaremanager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/hardware/hardwaremanager.py b/shell/hardware/hardwaremanager.py index 7230ba3c..631bd7e3 100644 --- a/shell/hardware/hardwaremanager.py +++ b/shell/hardware/hardwaremanager.py @@ -36,7 +36,7 @@ class HardwareManager(object): self._service = dbus.Interface(proxy, _HARDWARE_MANAGER_INTERFACE) def set_display_mode(self, mode): - self._service.set_mode(mode) + self._service.set_display_mode(mode) def set_display_brightness(self, level): self._service.set_display_brightness(level)