From 851029240987cf91d3da261e39b521509d0b2324 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Sat, 6 Feb 2010 23:13:00 -0600 Subject: [PATCH] Adjusting voicemails state_machine so that it will intelligently respond to missed/rejected calls --- src/gvoice/session.py | 4 +++- src/gvoice/state_machine.py | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/gvoice/session.py b/src/gvoice/session.py index cf6fa8c..45f80b9 100644 --- a/src/gvoice/session.py +++ b/src/gvoice/session.py @@ -78,7 +78,9 @@ class Session(object): ) 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 diff --git a/src/gvoice/state_machine.py b/src/gvoice/state_machine.py index 1403ebc..bb58c7e 100644 --- a/src/gvoice/state_machine.py +++ b/src/gvoice/state_machine.py @@ -81,6 +81,41 @@ class ConstantStateStrategy(object): 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): @@ -251,6 +286,10 @@ class UpdateStateMachine(StateMachine): 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() -- 1.7.9.5