Mass load of bug fixes
[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 close(self):
30                 self._conversations.updateSignalHandler.unregister_sink(
31                         self._stateMachine.request_reset_timers
32                 )
33                 self._stateMachine.close()
34
35         def login(self, username, password):
36                 self._username = username
37                 self._password = password
38                 if not self._backend.is_authed():
39                         self._backend.login(self._username, self._password)
40
41                 self._stateMachine.start()
42
43         def logout(self):
44                 self._stateMachine.stop()
45                 self._backend.logout()
46
47                 self._username = None
48                 self._password = None
49
50         def is_logged_in(self):
51                 if self._username is None and self._password is None:
52                         _moduleLogger.info("Hasn't even attempted to login yet")
53                         return False
54                 elif self._backend.is_authed():
55                         return True
56                 else:
57                         try:
58                                 loggedIn = self._backend.login(self._username, self._password)
59                         except RuntimeError, e:
60                                 _moduleLogger.exception("Re-authenticating and erroring")
61                                 loggedIn = False
62                         if loggedIn:
63                                 return True
64                         else:
65                                 _moduleLogger.info("Login failed")
66                                 self.logout()
67                                 return False
68
69         @property
70         def backend(self):
71                 """
72                 Login enforcing backend
73                 """
74                 assert self.is_logged_in(), "User not logged in"
75                 return self._backend
76
77         @property
78         def addressbook(self):
79                 """
80                 Delay initialized addressbook
81                 """
82                 return self._addressbook
83
84         @property
85         def conversations(self):
86                 """
87                 Delay initialized addressbook
88                 """
89                 return self._conversations
90
91         @property
92         def stateMachine(self):
93                 return self._stateMachine