]> code.delx.au - offlineimap/blob - offlineimap/folder/LocalStatus.py
Update FSF address
[offlineimap] / 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 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.filename = repository.getfolderfilename(name)
31 self.messagelist = None
32 self.repository = repository
33 self.savelock = threading.Lock()
34 self.doautosave = 1
35 self.accountname = accountname
36 BaseFolder.__init__(self)
37
38 def getaccountname(self):
39 return self.accountname
40
41 def storesmessages(self):
42 return 0
43
44 def isnewfolder(self):
45 return not os.path.exists(self.filename)
46
47 def getname(self):
48 return self.name
49
50 def getroot(self):
51 return self.root
52
53 def getsep(self):
54 return self.sep
55
56 def getfullname(self):
57 return self.filename
58
59 def deletemessagelist(self):
60 if not self.isnewfolder():
61 os.unlink(self.filename)
62
63 def cachemessagelist(self):
64 if self.isnewfolder():
65 self.messagelist = {}
66 return
67 file = open(self.filename, "rt")
68 self.messagelist = {}
69 line = file.readline().strip()
70 assert(line == magicline)
71 for line in file.xreadlines():
72 line = line.strip()
73 uid, flags = line.split(':')
74 uid = long(uid)
75 flags = [x for x in flags]
76 self.messagelist[uid] = {'uid': uid, 'flags': flags}
77 file.close()
78
79 def autosave(self):
80 if self.doautosave:
81 self.save()
82
83 def save(self):
84 self.savelock.acquire()
85 try:
86 file = open(self.filename + ".tmp", "wt")
87 file.write(magicline + "\n")
88 for msg in self.messagelist.values():
89 flags = msg['flags']
90 flags.sort()
91 flags = ''.join(flags)
92 file.write("%s:%s\n" % (msg['uid'], flags))
93 file.close()
94 os.rename(self.filename + ".tmp", self.filename)
95 finally:
96 self.savelock.release()
97
98 def getmessagelist(self):
99 return self.messagelist
100
101 def savemessage(self, uid, content, flags):
102 if uid < 0:
103 # We cannot assign a uid.
104 return uid
105
106 if uid in self.messagelist: # already have it
107 self.savemessageflags(uid, flags)
108 return uid
109
110 self.messagelist[uid] = {'uid': uid, 'flags': flags}
111 self.autosave()
112 return uid
113
114 def getmessageflags(self, uid):
115 return self.messagelist[uid]['flags']
116
117 def savemessageflags(self, uid, flags):
118 self.messagelist[uid]['flags'] = flags
119 self.autosave()
120
121 def deletemessage(self, uid):
122 if not uid in self.messagelist:
123 return
124 del(self.messagelist[uid])
125 self.autosave()