]>
code.delx.au - offlineimap/blob - offlineimap/repository/Base.py
1 # Base repository support
2 # Copyright (C) 2002, 2003, 2006 John Goerzen
3 # <jgoerzen@complete.org>
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.
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.
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
19 from offlineimap
import CustomConfig
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
}
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
)
37 class BaseRepository(CustomConfig
.ConfigHelperMixin
):
38 def __init__(self
, reposname
, account
):
39 self
.account
= account
40 self
.config
= account
.getconfig()
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)
54 # The 'restoreatime' config parameter only applies to local Maildir
56 def restore_atime(self
):
57 if self
.config
.get('Repository ' + self
.name
, 'type').strip() != \
61 if not self
.config
.has_option('Repository ' + self
.name
, 'restoreatime') or not self
.config
.getboolean('Repository ' + self
.name
, 'restoreatime'):
64 return self
.restore_folder_atimes()
66 def holdordropconnections(self
):
69 def dropconnections(self
):
84 def getaccountname(self
):
85 return self
.accountname
88 return 'Repository ' + self
.name
93 def getlocaleval(self
):
94 return self
.account
.getlocaleval()
97 """Returns a list of ALL folders on this server."""
101 raise NotImplementedError
103 def makefolder(self
, foldername
):
104 raise NotImplementedError
106 def deletefolder(self
, foldername
):
107 raise NotImplementedError
109 def getfolder(self
, foldername
):
110 raise NotImplementedError
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."""
116 srcfolders
= src
.getfolders()
117 destfolders
= dest
.getfolders()
119 # Create hashes with the names, but convert the source folders
120 # to the dest folder's sep.
123 for folder
in srcfolders
:
124 srchash
[folder
.getvisiblename().replace(src
.getsep(), dest
.getsep())] = \
127 for folder
in destfolders
:
128 desthash
[folder
.getvisiblename()] = folder
134 for key
in srchash
.keys():
135 if not key
in desthash
:
139 # Find deleted folders.
141 # We don't delete folders right now.
143 #for key in desthash.keys():
144 # if not key in srchash:
145 # dest.deletefolder(key)
149 def startkeepalive(self
):
150 """The default implementation will do nothing."""
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."""