changeset 439:866dbb0d7d87

plugin maildir: maildir now use PersistentBinaryDictionary to store profile specific data /!\ profile needs to be connected for maildir/imap/smtp plugins to work, this has to be fixed
author Goffi <goffi@goffi.org>
date Sat, 03 Dec 2011 15:50:09 +0100
parents 62145e50eae5
children 48277946348b
files src/memory/persistent.py src/plugins/plugin_misc_imap.py src/plugins/plugin_misc_maildir.py
diffstat 3 files changed, 22 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/src/memory/persistent.py	Sat Dec 03 15:45:48 2011 +0100
+++ b/src/memory/persistent.py	Sat Dec 03 15:50:09 2011 +0100
@@ -79,7 +79,7 @@
         return self._cache.__hash__()
 
     def __nonzero__(self):
-        return self._cache.__nonzero__()
+        return self._cache.__len__()
 
     def __unicode__(self):
         return self._cache.__unicode__()
--- a/src/plugins/plugin_misc_imap.py	Sat Dec 03 15:45:48 2011 +0100
+++ b/src/plugins/plugin_misc_imap.py	Sat Dec 03 15:50:09 2011 +0100
@@ -50,6 +50,7 @@
 }
 
 class IMAP_server():
+    #TODO: connect profile on mailbox request, once password is accepted
     
     params = """
     <params>
--- a/src/plugins/plugin_misc_maildir.py	Sat Dec 03 15:45:48 2011 +0100
+++ b/src/plugins/plugin_misc_maildir.py	Sat Dec 03 15:50:09 2011 +0100
@@ -34,6 +34,7 @@
 from twisted.internet import reactor
 import pdb
 from sat.exceptions import *
+from sat.memory.persistent import PersistentBinaryDict
 
 
 from zope.interface import implements
@@ -62,20 +63,30 @@
         self.host = host
 
         self.__observed={}
+        self.data={} #list of profile spectific data. key = profile, value = PersistentBinaryDict where key=mailbox name,
+                     # and value is a dictionnary with the following value
+                     #    - cur_idx: value of the current unique integer increment (UID)
+                     #    - message_id (as returned by MaildirMailbox): a tuple of (UID, [flag1, flag2, ...])
         pList=host.memory.getProfilesList #shorter :)
-        self.__mailboxes=dict(zip(pList(),len(pList())*[{}]))
-        self.data=host.memory.getPrivate("MAILDIR_data") or dict(zip(pList(),len(pList())*[{"INBOX":{"cur_idx":0}}])) #Create empty box for each profile
-        #a value in the dictionnary for a mailbox is a dictionnary with the following value
-        #    - cur_idx: value of the current unique integer increment (UID)
-        #    - message_id (as returned by MaildirMailbox): a tuple of (UID, [flag1, flag2, ...])
+        self.__mailboxes={} #key: profile, value: {boxname: MailboxUser instance}
 
         #the triggers
         host.trigger.add("MessageReceived", self.messageReceivedTrigger)
-        host.trigger.add("ProfileCreation", self.newProfileTrigger)
 
-    def __del__(self):
-        debug('Destroying MaildirBox')
-        self.host.memory.setPrivate('MAILDIR_data',self.data)
+    def profileConnected(self, profile):
+        """Called on profile connection, create profile data"""
+        self.data[profile] = PersistentBinaryDict("plugin_maildir", profile)
+        self.__mailboxes[profile]={}
+        def dataLoaded(ignore):
+            if not self.data[profile]:
+                #the mailbox is new, we initiate the data
+                self.data[profile]["INBOX"] = {"cur_idx":0}
+        self.data[profile].load().addCallback(dataLoaded)
+
+    def profileDisconnected(self, profile):
+        """Called on profile disconnection, free profile's resources"""
+        del self.__mailboxes[profile]
+        del self.data[profile]
 
     def messageReceivedTrigger(self, message, profile):
         """This trigger catch normal message and put the in the Maildir box.
@@ -90,13 +101,6 @@
                 self.accessMessageBox("INBOX", profile_key=profile).addMessage(message)
                 return False
 
-    def newProfileTrigger(self, profile):
-        """This trigger create necessary to manage mailbox for every new profile created"""
-        self.__mailboxes[profile] = {}
-        self.data[profile]={"INBOX":{"cur_idx":0}}
-        self.host.memory.setPrivate('MAILDIR_data',self.data)
-        return True
-
     def accessMessageBox(self, boxname, observer=None, profile_key='@DEFAULT@'):
         """Create and return a MailboxUser instance
         @param boxname: name of the box