Mercurial > libervia-backend
diff src/plugins/plugin_misc_imap.py @ 255:55b750017b71
plugin IMAP, plugin Maildir: added flag, IMAP's uid management
author | Goffi <goffi@goffi.org> |
---|---|
date | Mon, 17 Jan 2011 21:26:16 +0100 |
parents | 9fc32d1d9046 |
children | 012c38b56cdd |
line wrap: on
line diff
--- a/src/plugins/plugin_misc_imap.py Mon Jan 17 04:23:31 2011 +0100 +++ b/src/plugins/plugin_misc_imap.py Mon Jan 17 21:26:16 2011 +0100 @@ -75,9 +75,10 @@ class Message(): implements(imap4.IMessage) - def __init__(self, uid, mess_fp): + def __init__(self, uid, flags, mess_fp): debug('Message Init') self.uid=uid + self.flags=flags self.mess_fp=mess_fp self.message=Parser().parse(mess_fp) @@ -93,7 +94,7 @@ @return: The flags, represented as strings. """ debug('getFlags') - return [] + return self.flags def getInternalDate(self): """Retrieve the date internally associated with this message. @@ -184,8 +185,9 @@ @param message: The message sequence number @return: The UID of the message. """ - debug ('getUID') - return self.mailbox.getUid(message) + debug ('getUID (%i)' % message) + #return self.mailbox.getUid(message-1) #XXX: it seems that this method get uid and not message sequence number + return message def getMessageCount(self): """Return the number of messages in this mailbox. @@ -199,13 +201,13 @@ """Return the number of messages with the 'Recent' flag. """ debug('getRecentCount') - return 0 + return len(self.mailbox.getMessageIdsWithFlag('\\Recent')) def getUnseenCount(self): """Return the number of messages with the 'Unseen' flag. """ debug('getUnseenCount') - return 1 + return self.getMessageCount()-len(self.mailbox.getMessageIdsWithFlag('\\Seen')) def isWriteable(self): """Get the read/write status of the mailbox. @@ -277,7 +279,7 @@ or a Deferred whose callback will be invoked with such a list. """ debug('expunge') - raise NotImplementedError + self.mailbox.removeDeleted() def fetch(self, messages, uid): """Retrieve one or more messages. @@ -294,8 +296,7 @@ debug ('stopping iteration') raise StopIteration try: - debug ('yielding (%s,%s)' % (mess_uid,Message(mess_uid,self.mailbox.getMessageUid(mess_uid)))) - yield (mess_uid,Message(mess_uid,self.mailbox.getMessageUid(mess_uid))) + yield (mess_uid,Message(mess_uid,self.mailbox.getFlagsUid(mess_uid), self.mailbox.getMessageUid(mess_uid))) except IndexError: continue else: @@ -303,7 +304,7 @@ for mess_idx in messages: if mess_idx>self.getMessageCount(): raise StopIteration - yield (mess_idx,Message(mess_idx,self.mailbox.getMessage(mess_idx-1))) + yield (mess_idx,Message(mess_idx,self.mailbox.getFlags(mess_idx),self.mailbox.getMessage(mess_idx-1))) def store(self, messages, flags, mode, uid): """Set the flags of one or more messages. @@ -321,7 +322,29 @@ such a dict. """ debug('store') - raise NotImplementedError + + def updateFlags(getF,setF): + ret = {} + for mess_id in messages: + if (uid and mess_id == None) or (not uid and mess_id>self.getMessageCount()): + break + _flags=set(getF(mess_id) if mode else []) + if mode==-1: + _flags.difference_update(set(flags)) + else: + _flags.update(set(flags)) + new_flags=list(_flags) + setF(mess_id, new_flags) + ret[mess_id] = new_flags + return ret + + if uid: + messages.last = self.mailbox.getMaxUid() + messages.getnext = self.mailbox.getNextExistingUid + return updateFlags(self.mailbox.getFlagsUid,self.mailbox.setFlagsUid) + else: + messages.last = self.getMessageCount() + return updateFlags(self.mailbox.getFlags,self.mailbox.setFlags) def getFlags(self): """Return the flags defined in this mailbox @@ -329,8 +352,7 @@ @return: A list of the flags that can be set on messages in this mailbox. """ debug('getFlags') - #return ['\Seen','\Answered','\Flagged','\Deleted','\Draft', '\Recent'] - return [] + return ['\Seen','\Answered','\Flagged','\Deleted','\Draft'] #TODO: add '\Recent' def getHierarchicalDelimiter(self): """Get the character which delimits namespaces for in this mailbox.