Example #1
0
	def getContacts(self, userAccounts):
		self.contactsLoadProgress = 0
		try:
			self.M.recent()
		except:
			self.getUserAccounts()
		contactAccounts = {}
		convNums = self.data[0].split()
		for num in convNums:
			if self.isAborted():
				self.M.close()
				self.M.logout()
				return None
			
			typ, data = self.M.fetch(num, '(RFC822)')
			if typ <> 'OK':
				e = Exception(typ+'')
				e.message = 'Message '+num+' not found.'
				raise e
			email_message = email.message_from_string(data[0][1])
			
			# parse head
			fromField = decode_header(email_message['From'])
			if len(fromField) == 2:
				name = unicode(fromField[0][0], 'utf-8')
				uid = unicode(fromField[1][0], 'utf-8')[1:-1].lower()
			else:
				nameUid = fromField[0][0]
				if fromField[0][1] <> None and fromField[0][1] <> 'utf-8':
					nameUid = unicode(nameUid, 'iso-8859-2')
				m = re.search(r'(?P<name>.*)\s+\<(?P<uid>.*)\>', nameUid)
				name = m.group('name')
				uid = m.group('uid').lower()
			
			# create contact account
			if uid in contactAccounts:
				contactAccount = contactAccounts[uid]
			else:
				contactAccount = ContactAccount(0, name, uid, None, None, self.protocol)
				contactAccounts[contactAccount.uid] = contactAccount
			
			# parse body
			data = self.get_first_text_block(email_message).replace('=\r\n', '')
			pattern = re.compile('\<con\:conversation(.*)\<\/con\:conversation\>', re.DOTALL)
			m = pattern.search(data)
			if m == None:
				e = Exception()
				e.message = 'Conversation parsing error [conversation not found].'
				raise e
			try:
				root = ElementTree.XML(m.group(0))
			except ExpatError, ex:
				e = Exception(m.group(0))
				e.message = 'Conversation parsing error. ' + ex
				raise e
			
			# create conversation
			time = Date()
			time.setTime(long(root[0].find('{google:timestamp}time').get('ms')))
			conversation = Conversation(0, time, root[0].find('{jabber:client}body').text, len(root), contactAccount, userAccounts[0])
			time.setTime(long(root[-1].find('{google:timestamp}time').get('ms')))
			conversation.endTime = time
			contactAccount.conversations.add(conversation)
			
			# parse messages
			for msg in root:
				time = Date()
				time.setTime(long(msg.find('{google:timestamp}time').get('ms')))
				if msg.find('{jabber:client}body') == None:
					txt = ""
				else:
					txt = msg.find('{jabber:client}body').text
				message = Message(0, 
					conversation, 
					txt, 
					time, 
					msg.attrib['to'].find(uid) == -1)
				conversation.addMessage(message)
			self.messagesCount += len(root)
			
			# set progress
			self.contactsLoadProgress = int(num) * 100 / len(convNums)