else:
return None
+ def get_resource(self, name):
+ if self._dataPath is None:
+ for path in self._DATA_PATHS:
+ if os.path.exists(os.path.join(path, name)):
+ self._dataPath = path
+ break
+ if self._dataPath is not None:
+ return os.path.join(self._dataPath, name)
+ else:
+ return None
+
def _close_windows(self):
qwrappers.ApplicationWrapper._close_windows(self)
if self._aboutDialog is not None:
def __init__(self, parent, app):
qwrappers.WindowWrapper.__init__(self, parent, app)
self._window.setWindowTitle("%s" % constants.__pretty_app_name__)
- #self._freezer = qwrappers.AutoFreezeWindowFeature(self._app, self._window)
self._errorLog = self._app.errorLog
self._session = session.Session(self._errorLog, constants._data_path_)
self._voicemailRefreshDelay.setSingleShot(True)
self._callHandler = call_handler.MissedCallWatcher()
self._callHandler.callMissed.connect(self._voicemailRefreshDelay.start)
+ self._alertSoundPath = self._app.get_resource("bell.wav")
+ if QtGui.QSound.isAvailable():
+ self._session.newMessages.connect(self._on_new_message_alert)
+ else:
+ _moduleLogger.info("No sound support available")
self._defaultCredentials = "", ""
self._curentCredentials = "", ""
self._currentTab = 0
with qui_utils.notify_error(self._errorLog):
self._session.update_messages(True)
+ @QtCore.pyqtSlot()
+ @misc_utils.log_exception(_moduleLogger)
+ def _on_new_message_alert(self):
+ with qui_utils.notify_error(self._errorLog):
+ if self._alertSoundPath is not None:
+ QtGui.QSound.play(self._alertSoundPath)
+ else:
+ _moduleLogger.info("Alert but alas I am missing my voice")
+
@QtCore.pyqtSlot(str)
@misc_utils.log_exception(_moduleLogger)
def _on_session_error(self, message):
contactsUpdated = QtCore.pyqtSignal()
messagesUpdated = QtCore.pyqtSignal()
+ newMessages = QtCore.pyqtSignal()
historyUpdated = QtCore.pyqtSignal()
dndStateChange = QtCore.pyqtSignal(bool)
self._contacts = {}
self._contactUpdateTime = datetime.datetime(1971, 1, 1)
self._messages = []
+ self._cleanMessages = []
self._messageUpdateTime = datetime.datetime(1971, 1, 1)
self._history = []
self._historyUpdateTime = datetime.datetime(1971, 1, 1)
self._loggedInTime = self._LOGGEDOUT_TIME
self.error.emit("Error logging in")
except Exception, e:
+ _moduleLogger.exception("Booh")
self._loggedInTime = self._LOGGEDOUT_TIME
_moduleLogger.exception("Reporting error to user")
self.error.emit(str(e))
self._contacts = {}
self._messages = []
+ self._cleanMessages = []
self._history = []
self._dnd = False
self._callback = ""
try:
with open(cachePath, "rb") as f:
dumpedData = pickle.load(f)
- except (pickle.PickleError, IOError, EOFError, ValueError):
+ except (pickle.PickleError, IOError, EOFError, ValueError, ImportError):
_moduleLogger.exception("Pickle fun loading")
return False
except:
self._contacts = contacts
self._contactUpdateTime = contactUpdateTime
self._messages = messages
+ self._alert_on_messages(self._messages)
self._messageUpdateTime = messageUpdateTime
self._history = history
self._historyUpdateTime = historyUpdateTime
return
self._messageUpdateTime = datetime.datetime.now()
self.messagesUpdated.emit()
+ self._alert_on_messages(self._messages)
def _update_history(self):
try:
_moduleLogger.info("Skipping queueing duplicate op: %r" % asyncOp)
return
self._loginOps.append(asyncOp)
+
+ def _alert_on_messages(self, messages):
+ cleanNewMessages = list(self._clean_messages(messages))
+ if self._cleanMessages:
+ if self._cleanMessages != cleanNewMessages:
+ self.newMessages.emit()
+ self._cleanMessages = cleanNewMessages
+
+ def _clean_messages(self, messages):
+ for message in messages:
+ cleaned = dict(message)
+ del cleaned["relTime"]
+ del cleaned["time"]
+ del cleaned["isArchived"]
+ del cleaned["isRead"]
+ del cleaned["isSpam"]
+ del cleaned["isTrash"]
+ cleaned["messageParts"] = [tuple(part[0:-1]) for part in cleaned["messageParts"] if part[0] != "Me:"]
+ yield cleaned