Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/telepathy_plugin.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/telepathy_plugin.py')
-rw-r--r--src/telepathy_plugin.py60
1 files changed, 36 insertions, 24 deletions
diff --git a/src/telepathy_plugin.py b/src/telepathy_plugin.py
index d28e6a3..a9ddfe0 100644
--- a/src/telepathy_plugin.py
+++ b/src/telepathy_plugin.py
@@ -112,8 +112,8 @@ class TelepathyPlugin(gobject.GObject):
#: The connection's status
self._conn_status = CONNECTION_STATUS_DISCONNECTED
- #: GLib signal ID for reconnections
- self._reconnect_id = 0
+ #: GLib source ID indicating when we may try to reconnect
+ self._backoff_id = 0
#: Parameters for the connection manager
self._account = self._get_account_info()
@@ -156,8 +156,16 @@ class TelepathyPlugin(gobject.GObject):
raise NotImplementedError
def _reconnect_cb(self):
- """Attempt to reconnect to the server"""
+ """Attempt to reconnect to the server after the back-off time has
+ elapsed.
+ """
+ if self._backoff_id > 0:
+ gobject.source_remove(self._backoff_id)
+ self._backoff_id = 0
+
+ # this is a no-op unless _could_connect() returns True
self.start()
+
return False
def _init_connection(self):
@@ -192,9 +200,11 @@ class TelepathyPlugin(gobject.GObject):
_logger.debug('%r: Connect() succeeded', self)
def connect_error(e):
_logger.debug('%r: Connect() failed: %s', self, e)
- if not self._reconnect_id:
- self._reconnect_id = gobject.timeout_add(self._RECONNECT_TIMEOUT,
- self._reconnect_cb)
+ # we don't allow ourselves to retry more often than this
+ if self._backoff_id != 0:
+ gobject.source_remove(self._backoff_id)
+ self._backoff_id = gobject.timeout_add(self._RECONNECT_TIMEOUT,
+ self._reconnect_cb)
self._conn[CONN_INTERFACE].Connect(reply_handler=connect_reply,
error_handler=connect_error)
@@ -228,26 +238,30 @@ class TelepathyPlugin(gobject.GObject):
_logger.debug("%r: connected", self)
self._connected_cb()
elif status == CONNECTION_STATUS_DISCONNECTED:
- self.stop()
+ self._conn = None
+ self._stop()
_logger.debug("%r: disconnected (reason %r)", self, reason)
if reason == CONNECTION_STATUS_REASON_AUTHENTICATION_FAILED:
# FIXME: handle connection failure; retry later?
pass
else:
- # If disconnected, but still have a network connection, retry
- # If disconnected and no network connection, do nothing here
- # and let the IP4AddressMonitor address-changed signal handle
- # reconnection
- if self._could_connect() and not self._reconnect_id:
- self._reconnect_id = gobject.timeout_add(self._RECONNECT_TIMEOUT,
+ # Try again later. We'll detect whether we have a network
+ # connection after the retry period elapses. The fact that
+ # this timer is running also serves as a marker to indicate
+ # that we shouldn't try to go back online yet.
+ if self._backoff_id:
+ gobject.source_remove(self._backoff_id)
+ self._backoff_id = gobject.timeout_add(self._RECONNECT_TIMEOUT,
self._reconnect_cb)
self.emit('status', self._conn_status, int(reason))
def _could_connect(self):
- return True
+ # Don't allow connection unless the reconnect timeout has elapsed,
+ # or this is the first attempt
+ return (self._backoff_id == 0)
- def stop(self):
+ def _stop(self):
"""If we still have a connection, disconnect it"""
matches = self._matches
@@ -266,12 +280,12 @@ class TelepathyPlugin(gobject.GObject):
if self._online_contacts:
self._contacts_offline(self._online_contacts)
- if self._reconnect_id > 0:
- gobject.source_remove(self._reconnect_id)
- self._reconnect_id = 0
-
def cleanup(self):
- self.stop()
+ self._stop()
+
+ if self._backoff_id > 0:
+ gobject.source_remove(self._backoff_id)
+ self._backoff_id = 0
def _contacts_offline(self, handles):
"""Handle contacts going offline (send message, update set)"""
@@ -454,13 +468,11 @@ class TelepathyPlugin(gobject.GObject):
otherwise initiate a connection and transfer control to
_connect_reply_cb or _connect_error_cb
"""
+ if self._conn is not None:
+ return
_logger.debug("%r: Starting up...", self)
- if self._reconnect_id > 0:
- gobject.source_remove(self._reconnect_id)
- self._reconnect_id = 0
-
# Only init connection if we have a valid IP address
if self._could_connect():
self._init_connection()