Helpviewer/Sync/DirectorySyncHandler.py

changeset 1700
40c911b8c0dd
parent 1695
7b115f986d48
child 1701
9eee32bac32e
equal deleted inserted replaced
1699:10706f6ad9d2 1700:40c911b8c0dd
7 Module implementing a synchronization handler using a shared directory. 7 Module implementing a synchronization handler using a shared directory.
8 """ 8 """
9 9
10 import os 10 import os
11 11
12 from PyQt4.QtCore import pyqtSignal, QByteArray, QFileInfo 12 from PyQt4.QtCore import pyqtSignal, QByteArray, QFileInfo, QCoreApplication
13 13
14 from .SyncHandler import SyncHandler 14 from .SyncHandler import SyncHandler
15 15
16 import Helpviewer.HelpWindow 16 import Helpviewer.HelpWindow
17 17
20 20
21 class DirectorySyncHandler(SyncHandler): 21 class DirectorySyncHandler(SyncHandler):
22 """ 22 """
23 Class implementing a synchronization handler using a shared directory. 23 Class implementing a synchronization handler using a shared directory.
24 24
25 @signal syncStatus(type_, done, message) emitted to indicate the synchronization 25 @signal syncStatus(type_, message) emitted to indicate the synchronization
26 status (string one of "bookmarks", "history", "passwords" or "useragents", 26 status (string one of "bookmarks", "history", "passwords", "useragents" or
27 boolean, string) 27 "speeddial", string)
28 @signal syncError(message) emitted for a general error with the error message (string) 28 @signal syncError(message) emitted for a general error with the error message (string)
29 @signal syncMessage(message) emitted to send a message about synchronization (string) 29 @signal syncMessage(message) emitted to send a message about synchronization (string)
30 @signal syncFinished(type_, done, download) emitted after a synchronization has 30 @signal syncFinished(type_, done, download) emitted after a synchronization has
31 finished (string one of "bookmarks", "history", "passwords" or "useragents", 31 finished (string one of "bookmarks", "history", "passwords", "useragents" or
32 boolean, boolean) 32 "speeddial", boolean, boolean)
33 """ 33 """
34 syncStatus = pyqtSignal(str, bool, str) 34 syncStatus = pyqtSignal(str, str)
35 syncError = pyqtSignal(str) 35 syncError = pyqtSignal(str)
36 syncMessage = pyqtSignal(str) 36 syncMessage = pyqtSignal(str)
37 syncFinished = pyqtSignal(str, bool, bool) 37 syncFinished = pyqtSignal(str, bool, bool)
38 38
39 def __init__(self, parent=None): 39 def __init__(self, parent=None):
70 .format(str(err))) 70 .format(str(err)))
71 return 71 return
72 72
73 self.__initialSync() 73 self.__initialSync()
74 74
75 def __downloadFile(self, type_, fileName): 75 def __downloadFile(self, type_, fileName, timestamp):
76 """ 76 """
77 Private method to downlaod the given file. 77 Private method to downlaod the given file.
78 78
79 @param type_ type of the synchronization event (string one 79 @param type_ type of the synchronization event (string one
80 of "bookmarks", "history", "passwords" or "useragents") 80 of "bookmarks", "history", "passwords" or "useragents")
81 @param fileName name of the file to be downloaded (string) 81 @param fileName name of the file to be downloaded (string)
82 """ 82 @param timestamp time stamp in seconds of the file to be downloaded (int)
83 """
84 self.syncStatus.emit(type_, self._messages[type_]["RemoteExists"])
83 try: 85 try:
84 f = open(os.path.join(Preferences.getHelp("SyncDirectoryPath"), 86 f = open(os.path.join(Preferences.getHelp("SyncDirectoryPath"),
85 self._remoteFiles[type_]), "rb") 87 self._remoteFiles[type_]), "rb")
86 data = f.read() 88 data = f.read()
87 f.close() 89 f.close()
88 except IOError as err: 90 except IOError as err:
89 self.syncStatus.emit(type_, False, 91 self.syncStatus.emit(type_,
90 self.trUtf8("Cannot read remote file.\n{0}").format(str(err))) 92 self.trUtf8("Cannot read remote file.\n{0}").format(str(err)))
91 self.syncFinished(type_, False, True) 93 self.syncFinished(type_, False, True)
92 return 94 return
93 95
94 ok, error = self.writeFile(QByteArray(data), fileName) 96 QCoreApplication.processEvents()
95 if ok: 97 ok, error = self.writeFile(QByteArray(data), fileName, timestamp)
96 self.syncStatus.emit(type_, True, self._messages[type_]["RemoteExists"]) 98 if not ok:
97 else: 99 self.syncStatus.emit(type_, error)
98 self.syncStatus.emit(type_, False, error) 100 self.syncFinished.emit(type_, ok, True)
99 self.syncFinished.emit(type_, True, True)
100 101
101 def __uploadFile(self, type_, fileName): 102 def __uploadFile(self, type_, fileName):
102 """ 103 """
103 Private method to upload the given file. 104 Private method to upload the given file.
104 105
105 @param type_ type of the synchronization event (string one 106 @param type_ type of the synchronization event (string one
106 of "bookmarks", "history", "passwords" or "useragents") 107 of "bookmarks", "history", "passwords" or "useragents")
107 @param fileName name of the file to be uploaded (string) 108 @param fileName name of the file to be uploaded (string)
108 """ 109 """
110 QCoreApplication.processEvents()
109 data = self.readFile(fileName) 111 data = self.readFile(fileName)
110 if data.isEmpty(): 112 if data.isEmpty():
111 self.syncStatus.emit(type_, True, 113 self.syncStatus.emit(type_, self._messages[type_]["LocalMissing"])
112 self._messages[type_]["LocalMissing"]) 114 self.syncFinished(type_, False, False)
115 return
113 else: 116 else:
114 try: 117 try:
115 f = open(os.path.join(Preferences.getHelp("SyncDirectoryPath"), 118 f = open(os.path.join(Preferences.getHelp("SyncDirectoryPath"),
116 self._remoteFiles[type_]), "wb") 119 self._remoteFiles[type_]), "wb")
117 f.write(bytes(data)) 120 f.write(bytes(data))
118 f.close() 121 f.close()
119 except IOError as err: 122 except IOError as err:
120 self.syncStatus.emit(type_, False, 123 self.syncStatus.emit(type_,
121 self.trUtf8("Cannot write remote file.\n{0}").format(str(err))) 124 self.trUtf8("Cannot write remote file.\n{0}").format(str(err)))
122 self.syncFinished(type_, False, False) 125 self.syncFinished(type_, False, False)
123 return 126 return
124 127
125 self.syncFinished.emit(type_, True, False) 128 self.syncFinished.emit(type_, True, False)
135 if not self.__forceUpload and \ 138 if not self.__forceUpload and \
136 os.path.exists(os.path.join(Preferences.getHelp("SyncDirectoryPath"), 139 os.path.exists(os.path.join(Preferences.getHelp("SyncDirectoryPath"),
137 self._remoteFiles[type_])) and \ 140 self._remoteFiles[type_])) and \
138 QFileInfo(fileName).lastModified() <= \ 141 QFileInfo(fileName).lastModified() <= \
139 QFileInfo(os.path.join(Preferences.getHelp("SyncDirectoryPath"), 142 QFileInfo(os.path.join(Preferences.getHelp("SyncDirectoryPath"),
140 self._remoteFiles[type_]).lastModified()): 143 self._remoteFiles[type_])).lastModified():
141 self.__downloadFile(type_, fileName, 144 self.__downloadFile(type_, fileName,
142 QFileInfo(os.path.join(Preferences.getHelp("SyncDirectoryPath"), 145 QFileInfo(os.path.join(Preferences.getHelp("SyncDirectoryPath"),
143 self._remoteFiles[type_]).lastModified()).toTime_t()) 146 self._remoteFiles[type_])).lastModified().toTime_t())
144 else: 147 else:
145 if os.path.exists(os.path.join(Preferences.getHelp("SyncDirectoryPath"), 148 if os.path.exists(os.path.join(Preferences.getHelp("SyncDirectoryPath"),
146 self._remoteFiles[type_])): 149 self._remoteFiles[type_])):
147 self.syncStatus.emit(type_, True, 150 self.syncStatus.emit(type_, self._messages[type_]["RemoteMissing"])
148 self._messages[type_]["RemoteMissing"])
149 else: 151 else:
150 self.syncStatus.emit(type_, True, 152 self.syncStatus.emit(type_, self._messages[type_]["LocalNewer"])
151 self._messages[type_]["LocalNewer"])
152 self.__uploadFile(type_, fileName) 153 self.__uploadFile(type_, fileName)
153 154
154 def __initialSync(self): 155 def __initialSync(self):
155 """ 156 """
156 Private slot to do the initial synchronization. 157 Private slot to do the initial synchronization.
157 """ 158 """
159 QCoreApplication.processEvents()
158 # Bookmarks 160 # Bookmarks
159 if Preferences.getHelp("SyncBookmarks"): 161 if Preferences.getHelp("SyncBookmarks"):
160 self.__initialSyncFile("bookmarks", 162 self.__initialSyncFile("bookmarks",
161 Helpviewer.HelpWindow.HelpWindow.bookmarksManager().getFileName()) 163 Helpviewer.HelpWindow.HelpWindow.bookmarksManager().getFileName())
162 164
165 QCoreApplication.processEvents()
163 # History 166 # History
164 if Preferences.getHelp("SyncHistory"): 167 if Preferences.getHelp("SyncHistory"):
165 self.__initialSyncFile("history", 168 self.__initialSyncFile("history",
166 Helpviewer.HelpWindow.HelpWindow.historyManager().getFileName()) 169 Helpviewer.HelpWindow.HelpWindow.historyManager().getFileName())
167 170
171 QCoreApplication.processEvents()
168 # Passwords 172 # Passwords
169 if Preferences.getHelp("SyncPasswords"): 173 if Preferences.getHelp("SyncPasswords"):
170 self.__initialSyncFile("passwords", 174 self.__initialSyncFile("passwords",
171 Helpviewer.HelpWindow.HelpWindow.passwordManager().getFileName()) 175 Helpviewer.HelpWindow.HelpWindow.passwordManager().getFileName())
172 176
177 QCoreApplication.processEvents()
173 # User Agent Settings 178 # User Agent Settings
174 if Preferences.getHelp("SyncUserAgents"): 179 if Preferences.getHelp("SyncUserAgents"):
175 self.__initialSyncFile("useragents", 180 self.__initialSyncFile("useragents",
176 Helpviewer.HelpWindow.HelpWindow.userAgentsManager().getFileName()) 181 Helpviewer.HelpWindow.HelpWindow.userAgentsManager().getFileName())
177 182
183 QCoreApplication.processEvents()
184 # Speed Dial Settings
185 if Preferences.getHelp("SyncSpeedDial"):
186 self.__initialSyncFile("speeddial",
187 Helpviewer.HelpWindow.HelpWindow.speedDial().getFileName())
188
178 self.__forceUpload = False 189 self.__forceUpload = False
179 self.syncMessage.emit(self.trUtf8("Synchronization finished")) 190 self.syncMessage.emit(self.trUtf8("Synchronization finished"))
180 191
181 def __syncFile(self, type_, fileName): 192 def __syncFile(self, type_, fileName):
182 """ 193 """
184 195
185 @param type_ type of the synchronization event (string one 196 @param type_ type of the synchronization event (string one
186 of "bookmarks", "history", "passwords" or "useragents") 197 of "bookmarks", "history", "passwords" or "useragents")
187 @param fileName name of the file to be synchronized (string) 198 @param fileName name of the file to be synchronized (string)
188 """ 199 """
189 self.syncStatus.emit(type_, True, self._messages[type_]["Uploading"]) 200 self.syncStatus.emit(type_, self._messages[type_]["Uploading"])
190 self.__uploadFile(type_, fileName) 201 self.__uploadFile(type_, fileName)
191 202
192 def syncBookmarks(self): 203 def syncBookmarks(self):
193 """ 204 """
194 Public method to synchronize the bookmarks. 205 Public method to synchronize the bookmarks.
215 Public method to synchronize the user agents. 226 Public method to synchronize the user agents.
216 """ 227 """
217 self.__syncFile("useragents", 228 self.__syncFile("useragents",
218 Helpviewer.HelpWindow.HelpWindow.userAgentsManager().getFileName()) 229 Helpviewer.HelpWindow.HelpWindow.userAgentsManager().getFileName())
219 230
231 def syncSpeedDial(self):
232 """
233 Public method to synchronize the speed dial data.
234 """
235 self.__syncFile("speeddial",
236 Helpviewer.HelpWindow.HelpWindow.speedDial().getFileName())
237
220 def shutdown(self): 238 def shutdown(self):
221 """ 239 """
222 Public method to shut down the handler. 240 Public method to shut down the handler.
223 """ 241 """
224 # nothing to do 242 # nothing to do

eric ide

mercurial