X-Git-Url: http://git.maemo.org/git/?p=theonering;a=blobdiff_plain;f=src%2Fgvoice%2Fsession.py;h=45f80b95689ef3fdb239f01ebae8c230c26c660a;hp=99ef94f5efb7fe17c310b6cf39ad20ec8f792ce9;hb=851029240987cf91d3da261e39b521509d0b2324;hpb=e9e4c596e5cdce9227a819b9e41a5677d9004e3b diff --git a/src/gvoice/session.py b/src/gvoice/session.py index 99ef94f..45f80b9 100644 --- a/src/gvoice/session.py +++ b/src/gvoice/session.py @@ -1,5 +1,7 @@ #!/usr/bin/env python +import os +import time import logging import backend @@ -13,12 +15,34 @@ _moduleLogger = logging.getLogger("gvoice.session") class Session(object): - def __init__(self, cookiePath = None): + _DEFAULTS = { + "contacts": (3, "hours"), + "voicemail": (30, "minutes"), + "texts": (5, "minutes"), + } + + _MINIMUM_MESSAGE_PERIOD = state_machine.to_seconds(minutes=30) + + def __init__(self, cookiePath = None, defaults = None): + if defaults is None: + defaults = self._DEFAULTS + else: + for key, (quant, unit) in defaults.iteritems(): + if quant == 0: + defaults[key] = (self._DEFAULTS[key], unit) + elif quant < 0: + defaults[key] = (state_machine.UpdateStateMachine.INFINITE_PERIOD, unit) self._username = None self._password = None self._backend = backend.GVoiceBackend(cookiePath) + if defaults["contacts"][0] == state_machine.UpdateStateMachine.INFINITE_PERIOD: + contactsPeriodInSeconds = state_machine.UpdateStateMachine.INFINITE_PERIOD + else: + contactsPeriodInSeconds = state_machine.to_seconds( + **{defaults["contacts"][1]: defaults["contacts"][0],} + ) self._addressbook = addressbook.Addressbook(self._backend) self._addressbookStateMachine = state_machine.UpdateStateMachine([self.addressbook], "Addressbook") self._addressbookStateMachine.set_state_strategy( @@ -27,13 +51,19 @@ class Session(object): ) self._addressbookStateMachine.set_state_strategy( state_machine.StateMachine.STATE_IDLE, - state_machine.ConstantStateStrategy(state_machine.to_milliseconds(hours=6)) + state_machine.NopStateStrategy() ) self._addressbookStateMachine.set_state_strategy( state_machine.StateMachine.STATE_ACTIVE, - state_machine.ConstantStateStrategy(state_machine.to_milliseconds(hours=1)) + state_machine.ConstantStateStrategy(contactsPeriodInSeconds) ) + if defaults["voicemail"][0] == state_machine.UpdateStateMachine.INFINITE_PERIOD: + voicemailPeriodInSeconds = state_machine.UpdateStateMachine.INFINITE_PERIOD + else: + voicemailPeriodInSeconds = state_machine.to_seconds( + **{defaults["voicemail"][1]: defaults["voicemail"][0],} + ) self._voicemails = conversations.Conversations(self._backend.get_voicemails) self._voicemailsStateMachine = state_machine.UpdateStateMachine([self.voicemails], "Voicemail") self._voicemailsStateMachine.set_state_strategy( @@ -42,16 +72,26 @@ class Session(object): ) self._voicemailsStateMachine.set_state_strategy( state_machine.StateMachine.STATE_IDLE, - state_machine.ConstantStateStrategy(state_machine.to_milliseconds(minutes=30)) + state_machine.ConstantStateStrategy( + max(voicemailPeriodInSeconds * 4, self._MINIMUM_MESSAGE_PERIOD) + ) ) self._voicemailsStateMachine.set_state_strategy( state_machine.StateMachine.STATE_ACTIVE, - state_machine.ConstantStateStrategy(state_machine.to_milliseconds(minutes=5)) + state_machine.NTimesStateStrategy( + 3 * [state_machine.to_seconds(minutes=1)], voicemailPeriodInSeconds + ) ) self._voicemails.updateSignalHandler.register_sink( self._voicemailsStateMachine.request_reset_timers ) + if defaults["texts"][0] == state_machine.UpdateStateMachine.INFINITE_PERIOD: + textsPeriodInSeconds = state_machine.UpdateStateMachine.INFINITE_PERIOD + else: + textsPeriodInSeconds = state_machine.to_seconds( + **{defaults["texts"][1]: defaults["texts"][0],} + ) self._texts = conversations.Conversations(self._backend.get_texts) self._textsStateMachine = state_machine.UpdateStateMachine([self.texts], "Texting") self._textsStateMachine.set_state_strategy( @@ -60,14 +100,16 @@ class Session(object): ) self._textsStateMachine.set_state_strategy( state_machine.StateMachine.STATE_IDLE, - state_machine.ConstantStateStrategy(state_machine.to_milliseconds(minutes=30)) + state_machine.ConstantStateStrategy( + max(textsPeriodInSeconds * 4, self._MINIMUM_MESSAGE_PERIOD) + ) ) self._textsStateMachine.set_state_strategy( state_machine.StateMachine.STATE_ACTIVE, state_machine.GeometricStateStrategy( - state_machine.to_milliseconds(seconds=10), - state_machine.to_milliseconds(seconds=1), - state_machine.to_milliseconds(minutes=10), + state_machine.to_seconds(seconds=20), + state_machine.to_seconds(seconds=1), + textsPeriodInSeconds, ) ) self._texts.updateSignalHandler.register_sink( @@ -79,6 +121,17 @@ 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"))) + + def save(self, path): + self._texts.save(os.sep.join((path, "texts.cache"))) + self._voicemails.save(os.sep.join((path, "voicemails.cache"))) + def close(self): self._voicemails.updateSignalHandler.unregister_sink( self._voicemailsStateMachine.request_reset_timers @@ -121,6 +174,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): """