]> code.delx.au - offlineimap/blob - offlineimap/repository/Base.py
Apply tabspace.diff
[offlineimap] / offlineimap / repository / Base.py
1 # Base repository support
2 # Copyright (C) 2002, 2003, 2006 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 offlineimap import CustomConfig
20 import os.path
21
22 def LoadRepository(name, account, reqtype):
23 from offlineimap.repository.IMAP import IMAPRepository, MappedIMAPRepository
24 from offlineimap.repository.Maildir import MaildirRepository
25 if reqtype == 'remote':
26 # For now, we don't support Maildirs on the remote side.
27 typemap = {'IMAP': IMAPRepository}
28 elif reqtype == 'local':
29 typemap = {'IMAP': MappedIMAPRepository,
30 'Maildir': MaildirRepository}
31 else:
32 raise ValueError, "Request type %s not supported" % reqtype
33 config = account.getconfig()
34 repostype = config.get('Repository ' + name, 'type').strip()
35 return typemap[repostype](name, account)
36
37 class BaseRepository(CustomConfig.ConfigHelperMixin):
38 def __init__(self, reposname, account):
39 self.account = account
40 self.config = account.getconfig()
41 self.name = reposname
42 self.localeval = account.getlocaleval()
43 self.accountname = self.account.getname()
44 self.uiddir = os.path.join(self.config.getmetadatadir(), 'Repository-' + self.name)
45 if not os.path.exists(self.uiddir):
46 os.mkdir(self.uiddir, 0700)
47 self.mapdir = os.path.join(self.uiddir, 'UIDMapping')
48 if not os.path.exists(self.mapdir):
49 os.mkdir(self.mapdir, 0700)
50 self.uiddir = os.path.join(self.uiddir, 'FolderValidity')
51 if not os.path.exists(self.uiddir):
52 os.mkdir(self.uiddir, 0700)
53
54 # The 'restoreatime' config parameter only applies to local Maildir
55 # mailboxes.
56 def restore_atime(self):
57 if self.config.get('Repository ' + self.name, 'type').strip() != \
58 'Maildir':
59 return
60
61 if not self.config.has_option('Repository ' + self.name, 'restoreatime') or not self.config.getboolean('Repository ' + self.name, 'restoreatime'):
62 return
63
64 return self.restore_folder_atimes()
65
66 def holdordropconnections(self):
67 pass
68
69 def dropconnections(self):
70 pass
71
72 def getaccount(self):
73 return self.account
74
75 def getname(self):
76 return self.name
77
78 def getuiddir(self):
79 return self.uiddir
80
81 def getmapdir(self):
82 return self.mapdir
83
84 def getaccountname(self):
85 return self.accountname
86
87 def getsection(self):
88 return 'Repository ' + self.name
89
90 def getconfig(self):
91 return self.config
92
93 def getlocaleval(self):
94 return self.account.getlocaleval()
95
96 def getfolders(self):
97 """Returns a list of ALL folders on this server."""
98 return []
99
100 def getsep(self):
101 raise NotImplementedError
102
103 def makefolder(self, foldername):
104 raise NotImplementedError
105
106 def deletefolder(self, foldername):
107 raise NotImplementedError
108
109 def getfolder(self, foldername):
110 raise NotImplementedError
111
112 def syncfoldersto(self, dest):
113 """Syncs the folders in this repository to those in dest.
114 It does NOT sync the contents of those folders."""
115 src = self
116 srcfolders = src.getfolders()
117 destfolders = dest.getfolders()
118
119 # Create hashes with the names, but convert the source folders
120 # to the dest folder's sep.
121
122 srchash = {}
123 for folder in srcfolders:
124 srchash[folder.getvisiblename().replace(src.getsep(), dest.getsep())] = \
125 folder
126 desthash = {}
127 for folder in destfolders:
128 desthash[folder.getvisiblename()] = folder
129
130 #
131 # Find new folders.
132 #
133
134 for key in srchash.keys():
135 if not key in desthash:
136 dest.makefolder(key)
137
138 #
139 # Find deleted folders.
140 #
141 # We don't delete folders right now.
142
143 #for key in desthash.keys():
144 # if not key in srchash:
145 # dest.deletefolder(key)
146
147 ##### Keepalive
148
149 def startkeepalive(self):
150 """The default implementation will do nothing."""
151 pass
152
153 def stopkeepalive(self, abrupt = 0):
154 """Stop keep alive. If abrupt is 1, stop it but don't bother waiting
155 for the threads to terminate."""
156 pass
157