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