diff options
author | Jonas Smedegaard <dr@jones.dk> | 2008-04-08 03:02:35 (GMT) |
---|---|---|
committer | Jonas Smedegaard <dr@jones.dk> | 2008-04-08 03:02:35 (GMT) |
commit | d02551fe2b144cd6babfd562e45290beca9b2183 (patch) | |
tree | ca59482c9d69467e6d813d0c575e76369dce301a | |
parent | 95253f88614ec74a3b3af3feede9f86a7f64c920 (diff) |
Imported Upstream version 0.79.2upstream/0.79.2
-rwxr-xr-x | configure | 20 | ||||
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | src/activity.py | 39 | ||||
-rw-r--r-- | src/buddy.py | 21 | ||||
-rw-r--r-- | src/linklocal_plugin.py | 32 | ||||
-rw-r--r-- | src/presenceservice.py | 19 | ||||
-rw-r--r-- | src/pstest.py | 4 | ||||
-rw-r--r-- | src/psutils.py | 28 | ||||
-rw-r--r-- | src/server_plugin.py | 56 | ||||
-rw-r--r-- | src/telepathy_plugin.py | 15 |
10 files changed, 139 insertions, 97 deletions
@@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.61 for Sugar Presence Service 0.79.0. +# Generated by GNU Autoconf 2.61 for Sugar Presence Service 0.79.2. # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. @@ -572,8 +572,8 @@ SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='Sugar Presence Service' PACKAGE_TARNAME='sugar-presence-service' -PACKAGE_VERSION='0.79.0' -PACKAGE_STRING='Sugar Presence Service 0.79.0' +PACKAGE_VERSION='0.79.2' +PACKAGE_STRING='Sugar Presence Service 0.79.2' PACKAGE_BUGREPORT='' ac_unique_file="src/sugar-presence-service.in" @@ -1152,7 +1152,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures Sugar Presence Service 0.79.0 to adapt to many kinds of systems. +\`configure' configures Sugar Presence Service 0.79.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1218,7 +1218,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of Sugar Presence Service 0.79.0:";; + short | recursive ) echo "Configuration of Sugar Presence Service 0.79.2:";; esac cat <<\_ACEOF @@ -1282,7 +1282,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -Sugar Presence Service configure 0.79.0 +Sugar Presence Service configure 0.79.2 generated by GNU Autoconf 2.61 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, @@ -1296,7 +1296,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by Sugar Presence Service $as_me 0.79.0, which was +It was created by Sugar Presence Service $as_me 0.79.2, which was generated by GNU Autoconf 2.61. Invocation command line was $ $0 $@ @@ -1972,7 +1972,7 @@ fi # Define the identity of the package. PACKAGE='sugar-presence-service' - VERSION='0.79.0' + VERSION='0.79.2' cat >>confdefs.h <<_ACEOF @@ -2686,7 +2686,7 @@ exec 6>&1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by Sugar Presence Service $as_me 0.79.0, which was +This file was extended by Sugar Presence Service $as_me 0.79.2, which was generated by GNU Autoconf 2.61. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -2729,7 +2729,7 @@ Report bugs to <bug-autoconf@gnu.org>." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ -Sugar Presence Service config.status 0.79.0 +Sugar Presence Service config.status 0.79.2 configured by $0, generated by GNU Autoconf 2.61, with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" diff --git a/configure.ac b/configure.ac index 82bc99b..554fbff 100644 --- a/configure.ac +++ b/configure.ac @@ -1,4 +1,4 @@ -AC_INIT([Sugar Presence Service],[0.79.0],[],[sugar-presence-service]) +AC_INIT([Sugar Presence Service],[0.79.2],[],[sugar-presence-service]) AC_PREREQ([2.59]) diff --git a/src/activity.py b/src/activity.py index 1401699..ec20536 100644 --- a/src/activity.py +++ b/src/activity.py @@ -793,14 +793,15 @@ class Activity(ExportedGObject): self._join_cb() _logger.debug("%s of activity %r succeeded", verb, self) except Exception, e: - self._join_failed_cb(e) + self._join_failed_cb(e, 'Activity._joined_cb') self._join_cb = None self._join_err_cb = None - def _join_failed_cb(self, e): + def _join_failed_cb(self, e, location='unknown'): verb = self._join_is_sharing and 'Share' or 'Join' - _logger.debug("%s of activity %r failed: %s", verb, self, e) + _logger.debug("%s of activity %r failed: %s in %s", + verb, self, e, location) throw_into_callback(self._join_err_cb, e) self._join_cb = None @@ -830,7 +831,8 @@ class Activity(ExportedGObject): if props_to_set: self._text_channel[PROPERTIES_INTERFACE].SetProperties( props_to_set, reply_handler=self._joined_cb, - error_handler=self._join_failed_cb) + error_handler=lambda e: self._join_failed_cb(e, + 'Activity._join_activity_channel_props_listed_cb')) else: self._joined_cb() @@ -869,13 +871,15 @@ class Activity(ExportedGObject): _logger.debug('%r: I am local pending - entering room', self) group.AddMembers([self_ident[0]], '', reply_handler=lambda: None, - error_handler=self._join_failed_cb) + error_handler=lambda e: self._join_failed_cb(e, + 'got_all_members AddMembers')) elif self._self_handle in local_pending: _logger.debug('%r: I am local pending with channel-specific ' 'handle - entering room', self) group.AddMembers([self._self_handle], '', reply_handler=lambda: None, - error_handler=self._join_failed_cb) + error_handler=lambda e: self._join_failed_cb(e, + 'got_all_members AddMembers cs handle')) elif self._self_handle in members: _logger.debug('%r: I am already in the room', self) assert self._joined # set by _text_channel_members_changed_cb @@ -890,7 +894,8 @@ class Activity(ExportedGObject): # bootstrap by getting the current state. This is where we find # out whether anyone was lying to us in their PEP info group.GetAllMembers(reply_handler=got_all_members, - error_handler=self._join_failed_cb) + error_handler=lambda e: \ + self._join_failed_cb(e, 'got_group_flags')) def got_self_handle(self_handle): self._self_handle = self_handle @@ -900,10 +905,14 @@ class Activity(ExportedGObject): self._text_channel_matches.append(m) group.GetGroupFlags(reply_handler=got_group_flags, - error_handler=self._join_failed_cb) + error_handler=lambda e: \ + self._join_failed_cb(e, + 'got_self_handle GetGroupFlags')) group.GetSelfHandle(reply_handler=got_self_handle, - error_handler=self._join_failed_cb) + error_handler=lambda e: \ + self._join_failed_cb(e, + 'GetSelfHandle')) def _join_activity_create_channel_cb(self, text_chan_path): @@ -913,7 +922,8 @@ class Activity(ExportedGObject): reply_handler=lambda tubes_chan_path: \ self._join_activity_create_tubes_cb( text_chan_path, tubes_chan_path), - error_handler=self._join_failed_cb) + error_handler=lambda e: self._join_failed_cb(e, + 'Activity._join_activity_create_channel_cb')) def _join_activity_got_handles_cb(self, handles): assert len(handles) == 1 @@ -924,7 +934,8 @@ class Activity(ExportedGObject): conn[CONN_INTERFACE].RequestChannel(CHANNEL_TYPE_TEXT, HANDLE_TYPE_ROOM, self._room, True, reply_handler=self._join_activity_create_channel_cb, - error_handler=self._join_failed_cb) + error_handler=lambda e: self._join_failed_cb(e, + 'Activity._join_activity_got_handles_cb')) def join(self, async_cb, async_err_cb, sharing, private=None, sender=None): @@ -978,7 +989,8 @@ class Activity(ExportedGObject): conn[CONN_INTERFACE].RequestHandles(HANDLE_TYPE_ROOM, [self._tp.suggest_room_for_activity(self._id)], reply_handler=self._join_activity_got_handles_cb, - error_handler=self._join_failed_cb) + error_handler=lambda e: self._join_failed_cb(e, + 'Activity.join RequestHandles')) else: _logger.warning("Raising RuntimeError: Don't know room for %r", self) @@ -1132,7 +1144,8 @@ class Activity(ExportedGObject): else: self._text_channel[PROPERTIES_INTERFACE].ListProperties( reply_handler=self._join_activity_channel_props_listed_cb, - error_handler=self._join_failed_cb) + error_handler=lambda e: self._join_failed_cb(e, + 'Activity._text_channel_members_changed_cb')) def _text_channel_closed_cb(self): """Callback method called when the text channel is closed. diff --git a/src/buddy.py b/src/buddy.py index 5be2725..84da0a7 100644 --- a/src/buddy.py +++ b/src/buddy.py @@ -660,7 +660,6 @@ class GenericOwner(Buddy): self._ps = ps self._server = kwargs.pop("server", None) self._key_hash = kwargs.pop("key_hash", None) - self._registered = kwargs.pop("registered", False) #: Telepathy plugin -> dict { activity ID -> room handle } self._activities_by_connection = {} @@ -907,15 +906,11 @@ class GenericOwner(Buddy): if tp.status == CONNECTION_STATUS_CONNECTED: self._set_self_olpc_properties(tp) - def _ip4_address_changed_cb(self, monitor, address): + def _ip4_address_changed_cb(self, monitor, address, iface): """Handle IPv4 address change, set property to generate event""" props = {_PROP_IP4_ADDRESS: address} self.set_properties(props) - def get_registered(self): - """Retrieve whether owner has registered with presence server""" - return self._registered - def get_server(self): """Retrieve XMPP server hostname (used by the server plugin)""" return self._server @@ -926,10 +921,6 @@ class GenericOwner(Buddy): """ return self._key_hash - def set_registered(self, registered): - """Customisation point: handle the registration of the owner""" - raise RuntimeError("Subclasses must implement") - def update_avatar(self, tp, new_avatar_token, icon=None, mime_type=None): # This should never get called because Owner avatar changes are # driven by the Sugar shell, but just in case: @@ -963,7 +954,6 @@ class ShellOwner(GenericOwner): profile = get_profile() server = profile.jabber_server - registered = profile.jabber_registered key_hash = profile.privkey_hash key = profile.pubkey nick = profile.nick_name @@ -977,7 +967,7 @@ class ShellOwner(GenericOwner): GenericOwner.__init__(self, ps, bus, 'keyid/' + psutils.pubkey_to_keyid(key), key=key, nick=nick, color=color, icon=icon, server=server, - key_hash=key_hash, registered=registered) + key_hash=key_hash) # Ask to get notifications on Owner object property changes in the # shell. If it's not currently running, no problem - we'll get the @@ -994,13 +984,6 @@ class ShellOwner(GenericOwner): # we already know our own nick, color, key self._awaiting = None - def set_registered(self, value): - """Handle notification that we have been registered""" - if value: - profile = get_profile() - profile.jabber_registered = True - profile.save() - def _icon_changed_cb(self, icon): """Handle icon change, set property to generate event""" icon = str(icon) diff --git a/src/linklocal_plugin.py b/src/linklocal_plugin.py index 5646018..0fd914c 100644 --- a/src/linklocal_plugin.py +++ b/src/linklocal_plugin.py @@ -62,6 +62,10 @@ class LinkLocalPlugin(TelepathyPlugin): self._watch = self._sys_bus.watch_name_owner('org.freedesktop.Avahi', self._avahi_owner_cb) + # Glib source ID indicating we have to wait before be allowed to try + # to connect + self._have_to_wait_id = 0 + def _avahi_owner_cb(self, unique_name): had_avahi = self._have_avahi @@ -74,7 +78,7 @@ class LinkLocalPlugin(TelepathyPlugin): else: _logger.info('Avahi appeared on the system bus (%s) - ' 'starting...', unique_name) - self.start() + self.emit('want-to-connect') else: self._have_avahi = False if had_avahi: @@ -89,7 +93,8 @@ class LinkLocalPlugin(TelepathyPlugin): self._watch = None def _could_connect(self): - return TelepathyPlugin._could_connect(self) and self._have_avahi + return TelepathyPlugin._could_connect(self) and self._have_avahi and \ + self._have_to_wait_id == 0 def _get_account_info(self): """Retrieve connection manager parameters for this account @@ -194,3 +199,26 @@ class LinkLocalPlugin(TelepathyPlugin): ret[handle] = 'salut/' + psutils.escape_identifier(ident) return ret + + + def _have_to_wait_cb(self): + if self._have_to_wait_id > 0: + gobject.source_remove(self._have_to_wait_id) + self._have_to_wait_id = 0 + + _logger.debug("Timeout elapsed. Salut can connect now") + self.emit('want-to-connect') + + def _ip4_address_changed_cb(self, ip4am, address, iface): + TelepathyPlugin._ip4_address_changed_cb(self, ip4am, address, iface) + + # FIXME: what about IPv6 ? + if iface == "msh0" and not address.startswith("169.254."): + # msh0 got a not link-local IP so we are connected to a school + # server. Let's disable Salut. See #6299 for details. + _logger.debug("Connected to a school server. Disable Salut") + self._stop() + + # Salut can't connect during the next 2 minutes + self._have_to_wait_id = gobject.timeout_add(120000, + self._have_to_wait_cb) diff --git a/src/presenceservice.py b/src/presenceservice.py index fa38efd..0c51f61 100644 --- a/src/presenceservice.py +++ b/src/presenceservice.py @@ -125,6 +125,7 @@ class PresenceService(ExportedGObject): self._activity_invitation) tp.connect('private-invitation', self._private_invitation) + tp.connect('want-to-connect', self._want_to_connect) tp.start() self._contacts_online_queue = [] @@ -148,9 +149,12 @@ class PresenceService(ExportedGObject): def _tp_status_cb(self, plugin, status, reason): if status == CONNECTION_STATUS_CONNECTED: self._tp_connected(plugin) - if plugin == self._server_plugin and self._ll_plugin: + if (plugin == self._server_plugin and self._ll_plugin) or \ + (plugin == self._ll_plugin and self._server_plugin and \ + self._server_plugin.status == CONNECTION_STATUS_CONNECTED): # For now, Gabble takes precedence over Salut to alleviate # corner cases where laptops on mesh can't talk to ones on APs + _logger.debug("Gabble takes precedence, disconnect Salut") self._ll_plugin.cleanup() else: self._tp_disconnected(plugin) @@ -569,6 +573,19 @@ class PresenceService(ExportedGObject): self.PrivateInvitation(str(conn.service_name), conn.object_path, chan_path) + def _want_to_connect(self, plugin): + if plugin == self._ll_plugin: + # Link-local plugin can connect only if the Server plugin isn't + # connected + if not self._server_plugin or \ + self._server_plugin.status != CONNECTION_STATUS_CONNECTED: + plugin.start() + + elif plugin == self._server_plugin: + # Server plugin can always try to connect + plugin.start() + + @dbus.service.signal(PRESENCE_INTERFACE, signature="o") def ActivityAppeared(self, activity): pass diff --git a/src/pstest.py b/src/pstest.py index b3c8183..e7a0fa4 100644 --- a/src/pstest.py +++ b/src/pstest.py @@ -110,10 +110,6 @@ class TestOwner(GenericOwner): if self._change_timeout == 0: self._change_timeout = gobject.timeout_add(10000, self._update_something) - def set_registered(self, value): - if value: - self._registered = True - def _load_config(self): if not os.path.exists(self._cfg_file): return (None, None, False) diff --git a/src/psutils.py b/src/psutils.py index 6b8ec95..f7c6db7 100644 --- a/src/psutils.py +++ b/src/psutils.py @@ -129,7 +129,7 @@ class IP4AddressMonitor(gobject.GObject): __gsignals__ = { 'address-changed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, - ([gobject.TYPE_PYOBJECT])) + ([gobject.TYPE_PYOBJECT, gobject.TYPE_STRING])) } __gproperties__ = { @@ -155,22 +155,22 @@ class IP4AddressMonitor(gobject.GObject): sys_bus = dbus.SystemBus() self._watch = sys_bus.watch_name_owner(NM_SERVICE, self._nm_owner_cb) if not sys_bus.name_has_owner(NM_SERVICE): - addr = self._get_address_fallback() - self._update_address(addr) + addr, iface = self._get_address_fallback() + self._update_address(addr, iface) def do_get_property(self, pspec): if pspec.name == "address": return self._addr - def _update_address(self, new_addr): + def _update_address(self, new_addr, iface): if new_addr == "0.0.0.0": new_addr = None if new_addr == self._addr: return self._addr = new_addr - _logger.debug("IP4 address now '%s'" % new_addr) - self.emit('address-changed', new_addr) + _logger.debug("IP4 address now '%s' (%s)" % (new_addr, iface)) + self.emit('address-changed', new_addr, iface) def _connect_to_nm(self): """Connect to NM device state signals to tell when the IPv4 address changes""" @@ -215,7 +215,7 @@ class IP4AddressMonitor(gobject.GObject): if act_stage != 8 and act_stage != 7: # not activated return - self._update_address(props[6]) + self._update_address(props[6], props[1]) def _device_properties_error_cb(self, err): _logger.debug("Error querying device properties: %s" % err) @@ -244,11 +244,11 @@ class IP4AddressMonitor(gobject.GObject): self._query_device_properties(device) def _nm_device_no_longer_active_cb(self, device): - self._update_address(None) + self._update_address(None, None) def _nm_state_change_cb(self, new_state): if new_state == 4: # NM_STATE_DISCONNECTED - self._update_address(None) + self._update_address(None, None) def _nm_owner_cb(self, unique_name): """Clear state when NM goes away""" @@ -259,10 +259,10 @@ class IP4AddressMonitor(gobject.GObject): match.remove() self._matches = [] if self._nm_has_been_present: - self._update_address(None) + self._update_address(None, None) else: - addr = self._get_address_fallback() - self._update_address(addr) + addr, iface = self._get_address_fallback() + self._update_address(addr, iface) elif not self._nm_present: # NM started up self._nm_present = True @@ -278,7 +278,7 @@ class IP4AddressMonitor(gobject.GObject): SIOCGIFADDR = 0x8915 addr = fcntl.ioctl(fd, SIOCGIFADDR, struct.pack('256s', iface[:15]))[20:24] s.close() - return socket.inet_ntoa(addr) + return socket.inet_ntoa(addr), iface def _get_address_fallback(self): import commands @@ -290,4 +290,4 @@ class IP4AddressMonitor(gobject.GObject): if fields[0] == "0.0.0.0": iface = fields[len(fields) - 1] return self._get_iface_address(iface) - return None + return None, None diff --git a/src/server_plugin.py b/src/server_plugin.py index 9ebc8d9..c81a936 100644 --- a/src/server_plugin.py +++ b/src/server_plugin.py @@ -32,7 +32,7 @@ from telepathy.interfaces import (CONN_MGR_INTERFACE, CONN_INTERFACE, from telepathy.constants import (HANDLE_TYPE_CONTACT, HANDLE_TYPE_GROUP, CONNECTION_STATUS_CONNECTED, CONNECTION_STATUS_DISCONNECTED, CHANNEL_GROUP_FLAG_CHANNEL_SPECIFIC_HANDLES, - CONNECTION_STATUS_REASON_NAME_IN_USE) + CONNECTION_STATUS_REASON_AUTHENTICATION_FAILED) import sugar.profile # Presence Service local modules @@ -62,21 +62,24 @@ class ServerPlugin(TelepathyPlugin): self._friends_channel = None - def _ip4_address_changed_cb(self, ip4am, address): - TelepathyPlugin._ip4_address_changed_cb(self, ip4am, address) + def _ip4_address_changed_cb(self, ip4am, address, iface): + TelepathyPlugin._ip4_address_changed_cb(self, ip4am, address, iface) if address: _logger.debug("::: valid IP4 address, conn_status %s" % self._conn_status) # this is a no-op if starting would be inappropriate right now if self._conn_status != CONNECTION_STATUS_CONNECTED: - self.start() + self.emit('want-to-connect') else: _logger.debug("::: invalid IP4 address, will disconnect") self._stop() def _get_account_info(self): - """Retrieve connection manager parameters for this account + """Retrieve connection manager parameters for this account. + We first try to connect without the register flag. If the connection + fails because of an authentication error we'll try to register + the account. """ server = self._owner.get_server() khash = psutils.pubkey_to_keyid(self._owner.props.key) @@ -85,7 +88,7 @@ class ServerPlugin(TelepathyPlugin): 'account': "%s@%s" % (khash, server), 'fallback-conference-server': "conference.%s" % server, 'password': self._owner.get_key_hash(), - 'register': not self._owner.get_registered(), + 'register': False, 'port': dbus.UInt32(5223), 'old-ssl': True, 'ignore-ssl-errors': True, @@ -234,10 +237,6 @@ class ServerPlugin(TelepathyPlugin): return ret def _connected_cb(self): - if not self._owner.get_registered(): - # we successfully register this account - self._owner.set_registered(True) - TelepathyPlugin._connected_cb(self) # request Friends group channel @@ -305,20 +304,26 @@ class ServerPlugin(TelepathyPlugin): def _handle_connection_status_change(self, status, reason): """Override TelepathyPlugin implementation to manage connection errors - due to registration problem. So, if for any reason the registered flag - was not set in the config file but the account was registered, we don't - fail to connect (see ticket #2062).""" + due to authentication problem. If the connection fails because of an + authentication error that's probably because the account isn't + registered yet on the server. So we try to register it. + If it fails because any other reason we unset the register flag so futur + connection attempts won't try to register until we got a new + authentication error. This should properly handle the "XO having to use + different jabber servers" use case.""" if status == self._conn_status: return - if (status == CONNECTION_STATUS_DISCONNECTED and - reason == CONNECTION_STATUS_REASON_NAME_IN_USE and - self._account['register']): - _logger.debug('This account is already registered. Connect to it') - self._account['register'] = False - self._stop() - self._init_connection() - return + if status == CONNECTION_STATUS_DISCONNECTED: + if reason == CONNECTION_STATUS_REASON_AUTHENTICATION_FAILED and \ + not self._account['register']: + _logger.debug('Authentication failed. Trying to register the account') + self._account['register'] = True + self._stop() + self._init_connection() + return + else: + self._account['register'] = False TelepathyPlugin._handle_connection_status_change(self, status, reason) @@ -369,14 +374,7 @@ class ServerPlugin(TelepathyPlugin): friends_handles = set() friends = set() for key in keys: - try: - decoded = base64.b64decode(key) - except TypeError: - # key is invalid; skip this friend - _logger.debug('skipping friend with invalid key') - continue - - id = psutils.pubkey_to_keyid(decoded) + id = psutils.pubkey_to_keyid(key) # this assumes that all our friends are on the same server as us jid = '%s@%s' % (id, profile.jabber_server) friends.add(jid) diff --git a/src/telepathy_plugin.py b/src/telepathy_plugin.py index c486884..b4581d8 100644 --- a/src/telepathy_plugin.py +++ b/src/telepathy_plugin.py @@ -75,6 +75,10 @@ class TelepathyPlugin(gobject.GObject): # args: # channel object path (gobject.SIGNAL_RUN_FIRST, None, [object]), + 'want-to-connect': + # The TelepathyPlugin wants to connect. presenceservice.py will + # call the start() method if that's OK with its policy. + (gobject.SIGNAL_RUN_FIRST, None, []), } _RECONNECT_INITIAL_TIMEOUT = 5000 # 5 seconds @@ -163,9 +167,6 @@ class TelepathyPlugin(gobject.GObject): """ raise NotImplementedError - def start(self): - raise NotImplementedError - def suggest_room_for_activity(self, activity_id): """Suggest a room to use to share the given activity. """ @@ -340,6 +341,7 @@ class TelepathyPlugin(gobject.GObject): self._backoff_id = 0 self._ip4am.disconnect(self._ip4am_sigid) + self._ip4am_sigid = 0 def _contacts_offline(self, handles): """Handle contacts going offline (send message, update set)""" @@ -544,6 +546,11 @@ class TelepathyPlugin(gobject.GObject): otherwise initiate a connection and transfer control to _connect_reply_cb or _connect_error_cb """ + + if self._ip4am_sigid == 0: + self._ip4am_sigid = self._ip4am.connect('address-changed', + self._ip4_address_changed_cb) + if self._conn is not None: return @@ -555,7 +562,7 @@ class TelepathyPlugin(gobject.GObject): else: _logger.debug('%r: Postponing connection', self) - def _ip4_address_changed_cb(self, ip4am, address): + def _ip4_address_changed_cb(self, ip4am, address, iface): _logger.debug("::: IP4 address now %s", address) self._reconnect_timeout = self._RECONNECT_INITIAL_TIMEOUT |