def __parse_metadata(self, xml_data): new_messages = [] metadata = Metadata(xml_data) for m in metadata.findall('./M'): id = m.findtext('./I') network = m.findtext('T', 'int') if network == 11: network_id = NetworkID.MSN elif network == 13: network_id = NetworkID.EXTERNAL else: # FIXME: Setting a default value for network_id. Is NetworkID.MSN the correct value? network_id = NetworkID.MSN account = m.findtext('./E') sender = self._client.address_book.search_or_build_contact( account, network_id) # Get the name of the sender name = m.findtext('./N') name = decode_rfc2047_string(name) date = m.find('./RT') if date is not None: date = date.text if not self.__messages.search_by_id(id): message = OfflineMessage(id, sender, name, date) new_messages.append(message) self.__messages.add(message) self._state = OfflineMessagesBoxState.SYNCHRONIZED if len(new_messages) > 0: self.emit('messages-received', new_messages)
def __parse_metadata(self, xml_data): new_messages = [] metadata = Metadata(xml_data) for m in metadata.findall('./M'): id = m.findtext('./I') network = m.findtext('T','int') if network == 11: network_id = NetworkID.MSN elif network == 13: network_id = NetworkID.EXTERNAL else: # FIXME: Setting a default value for network_id. Is NetworkID.MSN the correct value? network_id = NetworkID.MSN account = m.findtext('./E') sender = self._client.address_book.search_or_build_contact(account, network_id) # Get the name of the sender name = m.findtext('./N'); name = decode_rfc2047_string(name) date = m.find('./RT') if date is not None: date = date.text if not self.__messages.search_by_id(id): message = OfflineMessage(id, sender, name, date) new_messages.append(message) self.__messages.add(message) self._state = OfflineMessagesBoxState.SYNCHRONIZED if len(new_messages) > 0: self.emit('messages-received', new_messages)
def _handle_MSG(self, command): message = Message(None, command.payload) content_type = message.content_type if content_type[0] == 'text/x-msmsgsprofile': profile = {} lines = command.payload.split("\r\n") for line in lines: line = line.strip() if line: name, value = line.split(":", 1) profile[name] = value.strip() self._client.profile._server_property_changed("profile", profile) self.set_privacy(self._client.profile.privacy) self._state = ProtocolState.SYNCHRONIZING self._client.address_book.sync() elif content_type[0] in \ ('text/x-msmsgsinitialmdatanotification', \ 'text/x-msmsgsoimnotification'): if self._client.oim_box is not None: self._client.oim_box._state = \ OIM.OfflineMessagesBoxState.NOT_SYNCHRONIZED m = HTTPMessage() m.parse(message.body) mail_data = m.get_header('Mail-Data').strip() if mail_data == 'too-large': mail_data = None self._client.oim_box.sync(mail_data) if mail_data and \ content_type[0] == 'text/x-msmsgsinitialmdatanotification': #Initial mail start = mail_data.find('<IU>') + 4 end = mail_data.find('</IU>') if start < end: mailbox_unread = int(mail_data[start:end]) self._client.mailbox._initial_set(mailbox_unread) elif content_type[0] == 'text/x-msmsgsinitialemailnotification': #Initial mail (obsolete by MSNP11) pass elif content_type[0] == 'text/x-msmsgsemailnotification': #New mail m = HTTPMessage() m.parse(message.body) name = decode_rfc2047_string(m.get_header('From')) address = m.get_header('From-Addr') subject = decode_rfc2047_string(m.get_header('Subject')) message_url = m.get_header('Message-URL') post_url = m.get_header('Post-URL') post_id = m.get_header('id') dest = m.get_header('Dest-Folder') if dest == 'ACTIVE': self._client.mailbox._unread_mail_increased(1) build = self._build_url_post_data post_url, form_data = build(message_url, post_url, post_id) self._client.mailbox._new_mail(name, address, subject, post_url, form_data) elif content_type[0] == 'text/x-msmsgsactivemailnotification': #Movement of unread mail m = HTTPMessage() m.parse(message.body) src = m.get_header('Src-Folder') dest = m.get_header('Dest-Folder') delta = int(m.get_header('Message-Delta')) if src == 'ACTIVE': self._client.mailbox._unread_mail_decreased(delta) elif dest == 'ACTIVE': self._client.mailbox._unread_mail_increased(delta)