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.