diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index d6ae20dbd..f60aadc16 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -1263,54 +1263,15 @@ ConnectionCaps, ConnectionHandlersBase, ConnectionJingle): self.connection.send(iq) raise common.xmpp.NodeProcessed - def _gMailQueryCB(self, con, gm): + def _gMailQueryCB(self, con, iq_obj): """ Called when we receive results from Querying the server for mail messages in gmail account """ - if not gm.getTag('mailbox'): - return - self.gmail_url = gm.getTag('mailbox').getAttr('url') - if gm.getTag('mailbox').getNamespace() == common.xmpp.NS_GMAILNOTIFY: - newmsgs = gm.getTag('mailbox').getAttr('total-matched') - if newmsgs != '0': - # there are new messages - gmail_messages_list = [] - if gm.getTag('mailbox').getTag('mail-thread-info'): - gmail_messages = gm.getTag('mailbox').getTags('mail-thread-info') - for gmessage in gmail_messages: - unread_senders = [] - for sender in gmessage.getTag('senders').getTags('sender'): - if sender.getAttr('unread') != '1': - continue - if sender.getAttr('name'): - unread_senders.append(sender.getAttr('name') + '< ' + \ - sender.getAttr('address') + '>') - else: - unread_senders.append(sender.getAttr('address')) - - if not unread_senders: - continue - gmail_subject = gmessage.getTag('subject').getData() - gmail_snippet = gmessage.getTag('snippet').getData() - tid = int(gmessage.getAttr('tid')) - if not self.gmail_last_tid or tid > self.gmail_last_tid: - self.gmail_last_tid = tid - gmail_messages_list.append({ \ - 'From': unread_senders, \ - 'Subject': gmail_subject, \ - 'Snippet': gmail_snippet, \ - 'url': gmessage.getAttr('url'), \ - 'participation': gmessage.getAttr('participation'), \ - 'messages': gmessage.getAttr('messages'), \ - 'date': gmessage.getAttr('date')}) - self.gmail_last_time = int(gm.getTag('mailbox').getAttr( - 'result-time')) - - jid = gajim.get_jid_from_account(self.name) - log.debug(('You have %s new gmail e-mails on %s.') % (newmsgs, jid)) - self.dispatch('GMAIL_NOTIFY', (jid, newmsgs, gmail_messages_list)) - raise common.xmpp.NodeProcessed + log.debug('gMailQueryCB') + gajim.nec.push_incoming_event(GMailQueryReceivedEvent(None, + conn=self, iq_obj=iq_obj)) + raise common.xmpp.NodeProcessed def _rosterItemExchangeCB(self, con, msg): """ @@ -2537,3 +2498,65 @@ class TimeResultReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): return return True + +class GMailQueryReceivedEvent(nec.NetworkIncomingEvent): + name = 'gmail-notify' + base_network_events = [] + + def generate(self): + if not self.conn: + self.conn = self.base_event.conn + if not self.iq_obj: + self.iq_obj = self.base_event.xmpp_iq + + if not self.iq_obj.getTag('mailbox'): + return + mb = self.iq_obj.getTag('mailbox') + if not mb.getAttr('url'): + return + self.conn.gmail_url = mb.getAttr('url') + if mb.getNamespace() != common.xmpp.NS_GMAILNOTIFY: + return + self.newmsgs = mb.getAttr('total-matched') + if not self.newmsgs: + return + if self.newmsgs == '0': + return + # there are new messages + self.gmail_messages_list = [] + if mb.getTag('mail-thread-info'): + gmail_messages = mb.getTags('mail-thread-info') + for gmessage in gmail_messages: + unread_senders = [] + for sender in gmessage.getTag('senders').getTags( + 'sender'): + if sender.getAttr('unread') != '1': + continue + if sender.getAttr('name'): + unread_senders.append(sender.getAttr('name') + \ + '< ' + sender.getAttr('address') + '>') + else: + unread_senders.append(sender.getAttr('address')) + + if not unread_senders: + continue + gmail_subject = gmessage.getTag('subject').getData() + gmail_snippet = gmessage.getTag('snippet').getData() + tid = int(gmessage.getAttr('tid')) + if not self.conn.gmail_last_tid or \ + tid > self.conn.gmail_last_tid: + self.conn.gmail_last_tid = tid + self.gmail_messages_list.append({ + 'From': unread_senders, + 'Subject': gmail_subject, + 'Snippet': gmail_snippet, + 'url': gmessage.getAttr('url'), + 'participation': gmessage.getAttr('participation'), + 'messages': gmessage.getAttr('messages'), + 'date': gmessage.getAttr('date')}) + self.conn.gmail_last_time = int(mb.getAttr('result-time')) + + self.jid = gajim.get_jid_from_account(self.name) + log.debug(('You have %s new gmail e-mails on %s.') % (self.newmsgs, + self.jid)) + return True \ No newline at end of file diff --git a/src/gui_interface.py b/src/gui_interface.py index d7512dc9c..756f9aa77 100644 --- a/src/gui_interface.py +++ b/src/gui_interface.py @@ -1288,41 +1288,38 @@ class Interface: notify.popup(event_type, jid, account, 'file-send-error', path, event_type, file_props['name']) - def handle_event_gmail_notify(self, account, array): - jid = array[0] - gmail_new_messages = int(array[1]) - gmail_messages_list = array[2] - if gajim.config.get('notify_on_new_gmail_email'): - path = gtkgui_helpers.get_icon_path('gajim-new_email_recv', 48) - title = _('New mail on %(gmail_mail_address)s') % \ - {'gmail_mail_address': jid} - text = i18n.ngettext('You have %d new mail conversation', - 'You have %d new mail conversations', gmail_new_messages, - gmail_new_messages, gmail_new_messages) + def handle_event_gmail_notify(self, obj): + jid = obj.jid + gmail_new_messages = int(obj.newmsgs) + gmail_messages_list = obj.gmail_messages_list + if not gajim.config.get('notify_on_new_gmail_email'): + return + path = gtkgui_helpers.get_icon_path('gajim-new_email_recv', 48) + title = _('New mail on %(gmail_mail_address)s') % \ + {'gmail_mail_address': jid} + text = i18n.ngettext('You have %d new mail conversation', + 'You have %d new mail conversations', gmail_new_messages, + gmail_new_messages, gmail_new_messages) - if gajim.config.get('notify_on_new_gmail_email_extra'): - cnt = 0 - for gmessage in gmail_messages_list: - # FIXME: emulate Gtalk client popups. find out what they - # parse and how they decide what to show each message has a - # 'From', 'Subject' and 'Snippet' field - if cnt >= 5: - break - senders = ',\n '.join(reversed(gmessage['From'])) - text += _('\n\nFrom: %(from_address)s\nSubject: ' - '%(subject)s\n%(snippet)s') % \ - {'from_address': senders, - 'subject': gmessage['Subject'], - 'snippet': gmessage['Snippet']} - cnt += 1 + if gajim.config.get('notify_on_new_gmail_email_extra'): + cnt = 0 + for gmessage in gmail_messages_list: + # FIXME: emulate Gtalk client popups. find out what they + # parse and how they decide what to show each message has a + # 'From', 'Subject' and 'Snippet' field + if cnt >= 5: + break + senders = ',\n '.join(reversed(gmessage['From'])) + text += _('\n\nFrom: %(from_address)s\nSubject: ' + '%(subject)s\n%(snippet)s') % {'from_address': senders, + 'subject': gmessage['Subject'], + 'snippet': gmessage['Snippet']} + cnt += 1 - if gajim.config.get_per('soundevents', 'gmail_received', 'enabled'): - helpers.play_sound('gmail_received') - notify.popup(_('New E-mail'), jid, account, 'gmail', - path_to_image=path, title=title, text=text) - - if self.remote_ctrl: - self.remote_ctrl.raise_signal('NewGmail', (account, array)) + if gajim.config.get_per('soundevents', 'gmail_received', 'enabled'): + helpers.play_sound('gmail_received') + notify.popup(_('New E-mail'), jid, obj.conn.name, 'gmail', + path_to_image=path, title=title, text=text) def handle_event_file_request_error(self, account, array): # ('FILE_REQUEST_ERROR', account, (jid, file_props, error_msg)) @@ -2100,7 +2097,6 @@ class Interface: 'CON_TYPE': [self.handle_event_con_type], 'CONNECTION_LOST': [self.handle_event_connection_lost], 'FILE_REQUEST': [self.handle_event_file_request], - 'GMAIL_NOTIFY': [self.handle_event_gmail_notify], 'FILE_REQUEST_ERROR': [self.handle_event_file_request_error], 'FILE_SEND_ERROR': [self.handle_event_file_send_error], 'STANZA_ARRIVED': [self.handle_event_stanza_arrived], @@ -2146,6 +2142,7 @@ class Interface: 'JINGLE_ERROR': [self.handle_event_jingle_error], 'PEP_RECEIVED': [self.handle_event_pep_received], 'CAPS_RECEIVED': [self.handle_event_caps_received], + 'gmail-notify': [self.handle_event_gmail_notify], 'http-auth-received': [self.handle_event_http_auth], 'last-result-received': [self.handle_event_last_status_time], } diff --git a/src/remote_control.py b/src/remote_control.py index 1df760713..3cb29fa68 100644 --- a/src/remote_control.py +++ b/src/remote_control.py @@ -111,6 +111,8 @@ class Remote: self.on_os_info) gajim.ged.register_event_handler('time-result-received', ged.POSTGUI, self.on_time) + gajim.ged.register_event_handler('gmail-nofify', ged.POSTGUI, + self.on_gmail_notify) def on_last_status_time(self, obj): self.raise_signal('LastStatusTime', (obj.conn.name, [ @@ -124,6 +126,10 @@ class Remote: self.raise_signal('EntityTime', (obj.conn.name, [obj.jid, obj.resource, obj.time_info])) + def on_gmail_notify(self, obj): + self.raise_signal('NewGmail', (obj.conn.name, [obj.jid, obj.newmsgs, + obj.gmail_messages_list])) + def raise_signal(self, signal, arg): if self.signal_object: try: