X-Git-Url: http://git.maemo.org/git/?p=theonering;a=blobdiff_plain;f=src%2Fconnection.py;h=236dc9a7df28a579f167a9171a16cf262e302067;hp=b0979938f7298fdebf0f878263b2a73e01c9efc4;hb=f7ab8d4307b8418dec52a4dbaa82d72c3cd81a36;hpb=69291b6ea410825bc288f4071e4a2bd200bdac2e diff --git a/src/connection.py b/src/connection.py index b097993..236dc9a 100644 --- a/src/connection.py +++ b/src/connection.py @@ -12,18 +12,19 @@ import util.misc as misc_utils import gvoice import handle -import requests -import contacts import aliasing -import simple_presence -import presence +import avatars import capabilities +import contacts +import presence +import requests +import simple_presence import autogv import channel_manager -_moduleLogger = logging.getLogger("connection") +_moduleLogger = logging.getLogger(__name__) class TheOneRingOptions(object): @@ -50,12 +51,13 @@ class TheOneRingOptions(object): class TheOneRingConnection( tp.Connection, - requests.RequestsMixin, - contacts.ContactsMixin, aliasing.AliasingMixin, - simple_presence.SimplePresenceMixin, - presence.PresenceMixin, + avatars.AvatarsMixin, capabilities.CapabilitiesMixin, + contacts.ContactsMixin, + presence.PresenceMixin, + requests.RequestsMixin, + simple_presence.SimplePresenceMixin, ): # overiding base class variable @@ -108,12 +110,13 @@ class TheOneRingConnection( account, constants._telepathy_implementation_name_ ) - requests.RequestsMixin.__init__(self) - contacts.ContactsMixin.__init__(self) aliasing.AliasingMixin.__init__(self) - simple_presence.SimplePresenceMixin.__init__(self) - presence.PresenceMixin.__init__(self) + avatars.AvatarsMixin.__init__(self) capabilities.CapabilitiesMixin.__init__(self) + contacts.ContactsMixin.__init__(self) + presence.PresenceMixin.__init__(self) + requests.RequestsMixin.__init__(self) + simple_presence.SimplePresenceMixin.__init__(self) self.__manager = weakref.proxy(manager) self.__credentials = ( @@ -135,10 +138,13 @@ class TheOneRingConnection( autogv.NewGVConversations(weakref.ref(self)), autogv.RefreshVoicemail(weakref.ref(self)), autogv.AutoDisconnect(weakref.ref(self)), + autogv.DelayEnableContactIntegration(constants._telepathy_implementation_name_), ] self._delayedConnect = gobject_utils.Async(self._delayed_connect) _moduleLogger.info("Connection to the account %s created" % account) + self._timedDisconnect = autogv.TimedDisconnect(weakref.ref(self)) + self._timedDisconnect.start() @property def manager(self): @@ -163,11 +169,9 @@ class TheOneRingConnection( def get_handle_by_name(self, handleType, handleName): requestedHandleName = handleName.encode('utf-8') if handleType == telepathy.HANDLE_TYPE_CONTACT: - _moduleLogger.debug("get_handle_by_name Contact: %s" % requestedHandleName) h = handle.create_handle(self, 'contact', requestedHandleName) elif handleType == telepathy.HANDLE_TYPE_LIST: # Support only server side (immutable) lists - _moduleLogger.debug("get_handle_by_name List: %s" % requestedHandleName) h = handle.create_handle(self, 'list', requestedHandleName) else: raise telepathy.errors.NotAvailable('Handle type unsupported %d' % handleType) @@ -187,6 +191,7 @@ class TheOneRingConnection( return _moduleLogger.info("Kicking off connect") self._delayedConnect.start() + self._timedDisconnect.stop() @misc_utils.log_exception(_moduleLogger) def _delayed_connect(self): @@ -214,11 +219,11 @@ class TheOneRingConnection( publishHandle = self.get_handle_by_name(telepathy.HANDLE_TYPE_LIST, "publish") publishProps = self.generate_props(telepathy.CHANNEL_TYPE_CONTACT_LIST, publishHandle, False) self.__channelManager.channel_for_props(publishProps, signal=True) - except gvoice.backend.NetworkError, e: + except gvoice.backend.NetworkError: _moduleLogger.exception("Connection Failed") self.disconnect(telepathy.CONNECTION_STATUS_REASON_NETWORK_ERROR) return - except Exception, e: + except Exception: _moduleLogger.exception("Connection Failed") self.disconnect(telepathy.CONNECTION_STATUS_REASON_AUTHENTICATION_FAILED) return @@ -235,7 +240,7 @@ class TheOneRingConnection( For org.freedesktop.telepathy.Connection """ _moduleLogger.info("Kicking off disconnect") - self._delayed_disconnect() + self.disconnect(telepathy.CONNECTION_STATUS_REASON_REQUESTED) @misc_utils.log_exception(_moduleLogger) def RequestChannel(self, type, handleType, handleId, suppressHandler): @@ -274,15 +279,11 @@ class TheOneRingConnection( return props - @gobject_utils.async - def _delayed_disconnect(self): - self.disconnect(telepathy.CONNECTION_STATUS_REASON_REQUESTED) - return False - def disconnect(self, reason): _moduleLogger.info("Disconnecting") self._delayedConnect.cancel() + self._timedDisconnect.stop() # Not having the disconnect first can cause weird behavior with clients # including not being able to reconnect or even crashing @@ -295,9 +296,15 @@ class TheOneRingConnection( plumber.stop() self.__channelManager.close() + self.manager.disconnected(self) + self.session.save(self.__cachePath) self.session.logout() self.session.close() - self.manager.disconnected(self) + # In case one of the above items takes too long (which it should never + # do), we leave the starting of the shutdown-on-idle counter to the + # very end + self.manager.disconnect_completed() + _moduleLogger.info("Disconnected")