plugin IMAP, plugin Maildir: added flag, IMAP's uid management

This commit is contained in:
Goffi 2011-01-17 21:26:16 +01:00
commit f3565fa4a8
2 changed files with 175 additions and 63 deletions

View file

@ -75,9 +75,10 @@ class IMAP_server():
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 @@ class Message():
@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 @@ class SatMailbox:
@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 @@ class SatMailbox:
"""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 @@ class SatMailbox:
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 @@ class SatMailbox:
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 @@ class SatMailbox:
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 @@ class SatMailbox:
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 @@ class SatMailbox:
@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.