18
18
# either the sync server thread or the main thread is doing database
21
22
mutex = QtCore.QMutex()
23
dialog_closed = QtCore.QWaitCondition()
22
24
database_released = QtCore.QWaitCondition()
24
28
class ServerThread(QtCore.QThread, SyncServer):
26
30
"""When a sync request comes in, the main thread will release the
49
53
sync_ended_signal = QtCore.pyqtSignal()
50
54
information_signal = QtCore.pyqtSignal(QtCore.QString)
51
55
error_signal = QtCore.pyqtSignal(QtCore.QString)
56
question_signal = QtCore.pyqtSignal(QtCore.QString, QtCore.QString,
57
QtCore.QString, QtCore.QString)
52
58
set_progress_text_signal = QtCore.pyqtSignal(QtCore.QString)
53
59
set_progress_range_signal = QtCore.pyqtSignal(int)
54
60
set_progress_update_interval_signal = QtCore.pyqtSignal(int)
82
88
self.terminate_all_sessions() # Does its own locking.
83
89
self.database().release_connection()
84
90
self.server_has_connection = False
91
if self in self.component_manager.components[None]["main_widget"]:
92
self.component_manager.components[None]["main_widget"].pop()
85
93
database_released.wakeAll()
87
95
def load_database(self, database_name):
97
# Libmnemosyne itself could also generate dialog messages, so
98
# we temporarily override the main_widget with the threaded
99
# routines in this class.
100
self.component_manager.components[None]["main_widget"].append(self)
89
101
self.sync_started_signal.emit()
90
102
if not self.server_has_connection:
91
103
database_released.wait(mutex)
100
112
self.database().release_connection()
101
113
self.server_has_connection = False
102
114
database_released.wakeAll()
115
if self in self.component_manager.components[None]["main_widget"]:
116
self.component_manager.components[None]["main_widget"].pop()
104
118
self.sync_ended_signal.emit()
111
125
self.server_has_connection = True
114
def show_information(self, information):
115
self.information_signal.emit(information)
128
def show_information(self, message):
132
self.information_signal.emit(message)
134
dialog_closed.wait(mutex)
117
137
def show_error(self, error):
118
141
self.error_signal.emit(error)
143
dialog_closed.wait(mutex)
146
def show_question(self, question, option0, option1, option2):
150
self.question_signal.emit(question, option0, option1, option2)
152
dialog_closed.wait(mutex)
120
156
def set_progress_text(self, text):
121
157
self.set_progress_text_signal.emit(text)
148
184
Component.__init__(self, component_manager)
149
185
QtCore.QObject.__init__(self)
150
186
self.thread = None
187
# Since we will overwrite the true main widget in the thread, we need
189
self.true_main_widget = self.main_widget()
152
191
def activate(self):
153
192
if self.config()["run_sync_server"]:
176
215
self.thread.sync_ended_signal.connect(\
177
216
self.load_database)
178
217
self.thread.information_signal.connect(\
179
self.main_widget().show_information)
218
self.threaded_show_information)
180
219
self.thread.error_signal.connect(\
181
self.main_widget().show_error)
220
self.threaded_show_error)
221
self.thread.question_signal.connect(\
222
self.threaded_show_question)
182
223
self.thread.set_progress_text_signal.connect(\
183
self.main_widget().set_progress_text)
224
self.true_main_widget.set_progress_text)
184
225
self.thread.set_progress_range_signal.connect(\
185
self.main_widget().set_progress_range)
226
self.true_main_widget.set_progress_range)
186
227
self.thread.set_progress_update_interval_signal.connect(\
187
self.main_widget().set_progress_update_interval)
228
self.true_main_widget.set_progress_update_interval)
188
229
self.thread.increase_progress_signal.connect(\
189
self.main_widget().increase_progress)
230
self.true_main_widget.increase_progress)
190
231
self.thread.set_progress_value_signal.connect(\
191
self.main_widget().set_progress_value)
232
self.true_main_widget.set_progress_value)
192
233
self.thread.close_progress_signal.connect(\
193
self.main_widget().close_progress)
234
self.true_main_widget.close_progress)
194
235
self.thread.start()
196
237
def unload_database(self):
247
288
self.thread.wait()
248
289
self.thread = None
291
def threaded_show_information(self, message):
294
self.true_main_widget.show_information(message)
296
dialog_closed.wakeAll()
299
def threaded_show_error(self, error):
302
self.true_main_widget.show_error(error)
304
dialog_closed.wakeAll()
307
def threaded_show_question(self, question, option0, option1, option2):
310
answer = self.true_main_widget.show_question(question, option0,
312
dialog_closed.wakeAll()