]> code.delx.au - offlineimap/blob - offlineimap/head/offlineimap/folder/LocalStatus.py
/offlineimap/head: changeset 367
[offlineimap] / offlineimap / head / offlineimap / folder / LocalStatus.py
1 # Local status cache virtual folder
2 # Copyright (C) 2002 - 2003 John Goerzen
3 # <jgoerzen@complete.org>
4 #
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 2 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
19 from Base import BaseFolder
20 import os, threading
21
22 magicline = "OFFLINEIMAP LocalStatus CACHE DATA - DO NOT MODIFY - FORMAT 1"
23
24 class LocalStatusFolder(BaseFolder):
25 def __init__(self, root, name, repository, accountname):
26 self.name = name
27 self.root = root
28 self.sep = '.'
29 self.filename = os.path.join(root, name)
30 self.messagelist = None
31 self.repository = repository
32 self.savelock = threading.Lock()
33 self.doautosave = 1
34 self.accountname = accountname
35
36 def getaccountname(self):
37 return self.accountname
38
39 def storesmessages(self):
40 return 0
41
42 def isnewfolder(self):
43 return not os.path.exists(self.filename)
44
45 def getname(self):
46 return self.name
47
48 def getroot(self):
49 return self.root
50
51 def getsep(self):
52 return self.sep
53
54 def getfullname(self):
55 return self.filename
56
57 def deletemessagelist(self):
58 if not self.isnewfolder():
59 os.unlink(self.filename)
60
61 def cachemessagelist(self):
62 if self.isnewfolder():
63 self.messagelist = {}
64 return
65 file = open(self.filename, "rt")
66 self.messagelist = {}
67 line = file.readline().strip()
68 assert(line == magicline)
69 for line in file.xreadlines():
70 line = line.strip()
71 uid, flags = line.split(':')
72 uid = long(uid)
73 flags = [x for x in flags]
74 self.messagelist[uid] = {'uid': uid, 'flags': flags}
75 file.close()
76
77 def autosave(self):
78 if self.doautosave:
79 self.save()
80
81 def save(self):
82 self.savelock.acquire()
83 try:
84 file = open(self.filename + ".tmp", "wt")
85 file.write(magicline + "\n")
86 for msg in self.messagelist.values():
87 flags = msg['flags']
88 flags.sort()
89 flags = ''.join(flags)
90 file.write("%s:%s\n" % (msg['uid'], flags))
91 file.close()
92 os.rename(self.filename + ".tmp", self.filename)
93 finally:
94 self.savelock.release()
95
96 def getmessagelist(self):
97 return self.messagelist
98
99 def savemessage(self, uid, content, flags):
100 if uid < 0:
101 # We cannot assign a uid.
102 return uid
103
104 if uid in self.messagelist: # already have it
105 self.savemessageflags(uid, flags)
106 return uid
107
108 self.messagelist[uid] = {'uid': uid, 'flags': flags}
109 self.autosave()
110 return uid
111
112 def getmessageflags(self, uid):
113 return self.messagelist[uid]['flags']
114
115 def savemessageflags(self, uid, flags):
116 self.messagelist[uid]['flags'] = flags
117 self.autosave()
118
119 def deletemessage(self, uid):
120 if not uid in self.messagelist:
121 return
122 del(self.messagelist[uid])
123 self.autosave()