Adding a delay to auto-disconnect incase the user is switching networks
authorEd Page <eopage@byu.net>
Sun, 31 Jan 2010 02:18:51 +0000 (20:18 -0600)
committerEd Page <eopage@byu.net>
Sun, 31 Jan 2010 02:18:51 +0000 (20:18 -0600)
src/connection.py

index 1c3eb21..e2e53b4 100644 (file)
@@ -2,6 +2,7 @@ import os
 import weakref
 import logging
 
+import gobject
 import telepathy
 
 try:
@@ -13,6 +14,7 @@ except (ImportError, OSError):
 import constants
 import tp
 import util.coroutines as coroutines
+import util.go_utils as gobject_utils
 import util.misc as util_misc
 import gtk_toolbox
 
@@ -136,6 +138,8 @@ class TheOneRingConnection(
                self.set_self_handle(handle.create_handle(self, 'connection'))
 
                self.__callback = None
+               self.__connectionEventId = None
+               self.__delayedDisconnectEventId = None
                _moduleLogger.info("Connection to the account %s created" % account)
 
        @property
@@ -303,6 +307,9 @@ class TheOneRingConnection(
                self.session.close()
 
                self.manager.disconnected(self)
+
+               self._cancel_delayed_disconnect()
+               self.__connection = None
                _moduleLogger.info("Disconnected")
 
        @gtk_toolbox.log_exception(_moduleLogger)
@@ -333,23 +340,41 @@ class TheOneRingConnection(
                """
                @note Maemo specific
                """
-               if not self.session.is_logged_in():
-                       _moduleLogger.info("Received connection change event when not logged in")
-                       return
                status = event.get_status()
                error = event.get_error()
                iap_id = event.get_iap_id()
                bearer = event.get_bearer_type()
 
                if status == conic.STATUS_DISCONNECTED:
-                       _moduleLogger.info("Disconnecting due to loss of network connection")
-                       self.StatusChanged(
-                               telepathy.CONNECTION_STATUS_DISCONNECTED,
-                               telepathy.CONNECTION_STATUS_REASON_NETWORK_ERROR
+                       _moduleLogger.info("Disconnected from network, starting countdown to logoff")
+                       self.__delayedDisconnectEventId = gobject_utils.timeout_add_seconds(
+                               5, self._on_delayed_disconnect
                        )
-                       try:
-                               self._disconnect()
-                       except Exception:
-                               _moduleLogger.exception("Error durring disconnect")
+               elif status == conic.STATUS_CONNECTED:
+                       _moduleLogger.info("Connected to network")
+                       self._cancel_delayed_disconnect()
                else:
                        _moduleLogger.info("Other status: %r" % (status, ))
+
+       def _cancel_delayed_disconnect(self):
+               if self.__delayedDisconnectEventId is None:
+                       return
+               _moduleLogger.info("Cancelling auto-log off")
+               gobject.source_reove(self.__delayedDisconnectEventId)
+               self.__delayedDisconnectEventId = None
+
+       @gtk_toolbox.log_exception(_moduleLogger)
+       def _on_delayed_disconnect(self):
+               if not self.session.is_logged_in():
+                       _moduleLogger.info("Received connection change event when not logged in")
+                       return
+               try:
+                       self._disconnect()
+               except Exception:
+                       _moduleLogger.exception("Error durring disconnect")
+               self.StatusChanged(
+                       telepathy.CONNECTION_STATUS_DISCONNECTED,
+                       telepathy.CONNECTION_STATUS_REASON_NETWORK_ERROR
+               )
+               self.__delayedDisconnectEventId = None
+               return False