Adding dnd caching to reduce server hits on login for Maemo 5
authorEd Page <eopage@byu.net>
Wed, 20 Jan 2010 03:44:59 +0000 (21:44 -0600)
committerEd Page <eopage@byu.net>
Wed, 20 Jan 2010 03:44:59 +0000 (21:44 -0600)
src/gvoice/session.py
src/simple_presence.py

index 8f5b79c..2b238d8 100644 (file)
@@ -1,6 +1,7 @@
 #!/usr/bin/env python
 
 import os
+import time
 import logging
 
 import backend
@@ -80,6 +81,9 @@ class Session(object):
                self._masterStateMachine.append_machine(self._voicemailsStateMachine)
                self._masterStateMachine.append_machine(self._textsStateMachine)
 
+               self._lastDndCheck = 0
+               self._cachedIsDnd = False
+
        def load(self, path):
                self._texts.load(os.sep.join((path, "texts.cache")))
                self._voicemails.load(os.sep.join((path, "voicemails.cache")))
@@ -130,6 +134,18 @@ class Session(object):
                                self.logout()
                                return False
 
+       def set_dnd(self, doNotDisturb):
+               self._backend.set_dnd(doNotDisturb)
+               self._cachedIsDnd = doNotDisturb
+
+       def is_dnd(self):
+               # To throttle checking with the server, use a 30s cache
+               newTime = time.time()
+               if self._lastDndCheck + 30 < newTime:
+                       self._lasDndCheck = newTime
+                       self._cachedIsDnd = self._backend.is_dnd()
+               return self._cachedIsDnd
+
        @property
        def backend(self):
                """
index f7e0160..9c7f64e 100644 (file)
@@ -47,15 +47,13 @@ class TheOneRingPresence(object):
 
        def get_presences(self, contactIds):
                """
-               @bug On Maemo 5, the connection handle is being passed in a lot, forcing lots of downloads is the webpage for dnd
-
                @return {ContactHandle: (Status, Presence Type, Message)}
                """
                presences = {}
                for handleId in contactIds:
                        h = self.get_handle_by_id(telepathy.HANDLE_TYPE_CONTACT, handleId)
                        if isinstance(h, handle.ConnectionHandle):
-                               isDnd = self.session.backend.is_dnd()
+                               isDnd = self.session.is_dnd()
                                if isDnd:
                                        presence = TheOneRingPresence.HIDDEN
                                else:
@@ -76,12 +74,12 @@ class TheOneRingPresence(object):
 
        def set_presence(self, status):
                if status == self.ONLINE:
-                       self.session.backend.set_dnd(False)
+                       self.session.set_dnd(False)
                        self.session.stateMachine.set_state(state_machine.StateMachine.STATE_ACTIVE)
                elif status == self.AWAY:
                        self.session.stateMachine.set_state(state_machine.StateMachine.STATE_IDLE)
                elif status == self.HIDDEN:
-                       self.session.backend.set_dnd(True)
+                       self.session.set_dnd(True)
                elif status == self.OFFLINE:
                        self.Disconnect()
                else: