Adjusting voicemails state_machine so that it will intelligently respond to missed...
authorEd Page <eopage@byu.net>
Sun, 7 Feb 2010 05:13:00 +0000 (23:13 -0600)
committerEd Page <eopage@byu.net>
Sun, 7 Feb 2010 05:13:00 +0000 (23:13 -0600)
src/gvoice/session.py
src/gvoice/state_machine.py

index cf6fa8c..45f80b9 100644 (file)
@@ -78,7 +78,9 @@ class Session(object):
                )
                self._voicemailsStateMachine.set_state_strategy(
                        state_machine.StateMachine.STATE_ACTIVE,
                )
                self._voicemailsStateMachine.set_state_strategy(
                        state_machine.StateMachine.STATE_ACTIVE,
-                       state_machine.ConstantStateStrategy(voicemailPeriodInSeconds)
+                       state_machine.NTimesStateStrategy(
+                               3 * [state_machine.to_seconds(minutes=1)], voicemailPeriodInSeconds
+                       )
                )
                self._voicemails.updateSignalHandler.register_sink(
                        self._voicemailsStateMachine.request_reset_timers
                )
                self._voicemails.updateSignalHandler.register_sink(
                        self._voicemailsStateMachine.request_reset_timers
index 1403ebc..bb58c7e 100644 (file)
@@ -81,6 +81,41 @@ class ConstantStateStrategy(object):
                return "ConstantStateStrategy(timeout=%r)" % self._timeout
 
 
                return "ConstantStateStrategy(timeout=%r)" % self._timeout
 
 
+class NTimesStateStrategy(object):
+
+       def __init__(self, timeouts, postTimeout):
+               assert 0 < len(timeouts)
+               for timeout in timeouts:
+                       assert 0 < timeout or timeout == UpdateStateMachine.INFINITE_PERIOD
+               assert 0 < postTimeout or postTimeout == UpdateStateMachine.INFINITE_PERIOD
+               self._timeouts = timeouts
+               self._postTimeout = postTimeout
+
+               self._attemptCount = 0
+
+       def initialize_state(self):
+               self._attemptCount = len(self._timeouts)
+
+       def reinitialize_state(self):
+               self._attemptCount = 0
+
+       def increment_state(self):
+               self._attemptCount += 1
+
+       @property
+       def timeout(self):
+               try:
+                       return self._timeouts[self._attemptCount]
+               except IndexError:
+                       return self._postTimeout
+
+       def __repr__(self):
+               return "NTimesStateStrategy(timeouts=%r, postTimeout=%r)" % (
+                       self._timeouts,
+                       self._postTimeout,
+               )
+
+
 class GeometricStateStrategy(object):
 
        def __init__(self, init, min, max):
 class GeometricStateStrategy(object):
 
        def __init__(self, init, min, max):
@@ -251,6 +286,10 @@ class UpdateStateMachine(StateMachine):
        def _strategy(self):
                return self._strategies[self._state]
 
        def _strategy(self):
                return self._strategies[self._state]
 
+       @property
+       def maxTime(self):
+               return self._maxTime
+
        @gtk_toolbox.log_exception(_moduleLogger)
        def _request_reset_timers(self, *args):
                self._reset_timers()
        @gtk_toolbox.log_exception(_moduleLogger)
        def _request_reset_timers(self, *args):
                self._reset_timers()