19ffbe0924045b2d7f503d1c8fdfd1312d59eb20
[theonering] / src / gvoice / session.py
1 #!/usr/bin/env python
2
3 import logging
4
5 import backend
6 import addressbook
7 import conversations
8 import state_machine
9
10
11 _moduleLogger = logging.getLogger("gvoice.session")
12
13
14 class Session(object):
15
16         def __init__(self, cookiePath = None):
17                 self._username = None
18                 self._password = None
19
20                 self._backend = backend.GVoiceBackend(cookiePath)
21                 self._addressbook = addressbook.Addressbook(self._backend)
22                 self._conversations = conversations.Conversations(self._backend)
23                 self._stateMachine = state_machine.StateMachine([self.addressbook], [self.conversations])
24
25                 self._conversations.updateSignalHandler.register_sink(
26                         self._stateMachine.request_reset_timers
27                 )
28
29         def login(self, username, password):
30                 self._username = username
31                 self._password = password
32                 if not self._backend.is_authed():
33                         self._backend.login(self._username, self._password)
34
35                 self._stateMachine.start()
36
37         def logout(self):
38                 self._loggedIn = False
39                 self._stateMachine.stop()
40                 self._backend.logout()
41
42                 self._username = None
43                 self._password = None
44
45         def is_logged_in(self):
46                 if self._username is None and self._password is None:
47                         _moduleLogger.info("Hasn't even attempted to login yet")
48                         return False
49                 elif self._backend.is_authed():
50                         return True
51                 else:
52                         try:
53                                 loggedIn = self._backend.login(self._username, self._password)
54                         except RuntimeError, e:
55                                 _moduleLogger.exception("Re-authenticating and erroring")
56                                 loggedIn = False
57                         if loggedIn:
58                                 return True
59                         else:
60                                 _moduleLogger.info("Login failed")
61                                 self.logout()
62                                 return False
63
64         @property
65         def backend(self):
66                 """
67                 Login enforcing backend
68                 """
69                 assert self.is_logged_in(), "User not logged in"
70                 return self._backend
71
72         @property
73         def addressbook(self):
74                 """
75                 Delay initialized addressbook
76                 """
77                 return self._addressbook
78
79         @property
80         def conversations(self):
81                 """
82                 Delay initialized addressbook
83                 """
84                 return self._conversations