4 from PyQt4 import QtCore
6 from util import qore_utils
7 from util import concurrent
9 _moduleLogger = logging.getLogger(__name__)
12 class Draft(QtCore.QObject):
14 sendingMessage = QtCore.pyqtSignal()
15 sentMessage = QtCore.pyqtSignal()
16 calling = QtCore.pyqtSignal()
17 called = QtCore.pyqtSignal()
18 cancelling = QtCore.pyqtSignal()
19 cancelled = QtCore.pyqtSignal()
20 error = QtCore.pyqtSignal(str)
22 recipientsChanged = QtCore.pyqtSignal()
24 def __init__(self, pool):
29 assert 0 < len(self._contacts)
30 self.sendingMessage.emit()
31 self.error.emit("Not Implemented")
35 assert len(self._contacts) == 1
37 self.error.emit("Not Implemented")
41 self.cancelling.emit()
42 self.error.emit("Not Implemented")
44 def add_contact(self, contact, details):
45 assert contact not in self._contacts
46 self._contacts[contact] = details
47 self.recipientsChanged.emit()
49 def remove_contact(self, contact):
50 assert contact not in self._contacts
51 del self._contacts[contact]
52 self.recipientsChanged.emit()
54 def get_contacts(self, contact):
59 self.recipientsChanged.emit()
62 class Session(QtCore.QObject):
64 stateChange = QtCore.pyqtSignal(str)
65 loggedOut = QtCore.pyqtSignal()
66 loggedIn = QtCore.pyqtSignal()
67 callbackNumberChanged = QtCore.pyqtSignal(str)
69 contactsUpdated = QtCore.pyqtSignal()
70 messagesUpdated = QtCore.pyqtSignal()
71 historyUpdated = QtCore.pyqtSignal()
72 dndStateChange = QtCore.pyqtSignal(bool)
74 error = QtCore.pyqtSignal(str)
76 LOGGEDOUT_STATE = "logged out"
77 LOGGINGIN_STATE = "logging in"
78 LOGGEDIN_STATE = "logged in"
83 def __init__(self, cachePath = None):
84 QtCore.QObject.__init__(self)
85 self._pool = qore_utils.AsyncPool()
86 self._loggedInTime = self._LOGGEDOUT_TIME
88 self._cachePath = cachePath
90 self._draft = Draft(self._pool)
100 self._LOGGEDOUT_TIME: self.LOGGEDOUT_STATE,
101 self._LOGGINGIN_TIME: self.LOGGINGIN_STATE,
102 }.get(self._loggedInTime, default=self.LOGGEDIN_STATE)
108 def login(self, username, password):
109 assert self.state == self.LOGGEDOUT_STATE
110 if self._cachePath is not None:
111 cookiePath = os.path.join(self._cachePath, "%s.cookies" % username)
116 self.error.emit("Not Implemented")
118 # if the username is the same, do nothing
119 # else clear the in-memory caches and attempt to load from file-caches
120 # If caches went from empty to something, fire signals
123 assert self.state != self.LOGGEDOUT_STATE
125 self.error.emit("Not Implemented")
128 assert self.state == self.LOGGEDOUT_STATE
131 self.contactsUpdated.emit()
133 self.messagesUpdated.emit()
135 self.historyUpdated.emit()
137 self.dndStateChange.emit(self._dnd)
139 def update_contacts(self):
140 self._perform_op_while_loggedin(self._update_contacts)
142 def get_contacts(self):
143 return self._contacts
145 def update_messages(self):
146 self._perform_op_while_loggedin(self._update_messages)
148 def get_messages(self):
149 return self._messages
151 def update_history(self):
152 self._perform_op_while_loggedin(self._update_history)
154 def get_history(self):
157 def update_dnd(self):
158 self._perform_op_while_loggedin(self._update_dnd)
160 def set_dnd(self, dnd):
161 assert self.state == self.LOGGEDIN_STATE
162 self.error.emit("Not Implemented")
167 def get_callback_numbers(self):
170 def get_callback_number(self):
173 def set_callback_number(self):
174 assert self.state == self.LOGGEDIN_STATE
175 self.error.emit("Not Implemented")
177 def _update_contacts(self):
178 le = concurrent.AsyncLinearExecution(self._asyncPool, self._login)
180 self.error.emit("Not Implemented")
182 def _update_messages(self):
183 self.error.emit("Not Implemented")
185 def _update_history(self):
186 self.error.emit("Not Implemented")
188 def _update_dnd(self):
189 self.error.emit("Not Implemented")
191 def _perform_op_while_loggedin(self, op):
192 if self.state == self.LOGGEDIN_STATE:
195 self._push_login_op(op)
197 def _push_login_op(self, op):
198 assert self.state != self.LOGGEDIN_STATE
199 if op in self._loginOps:
200 _moduleLogger.info("Skipping queueing duplicate op: %r" % op)
202 self._loginOps.append(op)