From 619d2bcbaf4f5b57d0d92e9f5b65847feb6056c6 Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Sun, 31 May 2009 01:24:42 +0900 Subject: [PATCH] implement full sync uploading --- ankiqt/ui/main.py | 17 ++++++++++++++ ankiqt/ui/sync.py | 59 ++++++++++++++++++++++++++++++++--------------- 2 files changed, 57 insertions(+), 19 deletions(-) diff --git a/ankiqt/ui/main.py b/ankiqt/ui/main.py index f57f9dd44..8781ef844 100644 --- a/ankiqt/ui/main.py +++ b/ankiqt/ui/main.py @@ -1787,6 +1787,9 @@ it to your friends. self.connect(self.syncThread, SIGNAL("closeSyncProgress"), self.closeSyncProgress) self.connect(self.syncThread, SIGNAL("updateSyncProgress"), self.updateSyncProgress) self.connect(self.syncThread, SIGNAL("bulkSyncFailed"), self.bulkSyncFailed) + self.connect(self.syncThread, SIGNAL("fullSyncStarted"), self.fullSyncStarted) + self.connect(self.syncThread, SIGNAL("fullSyncFinished"), self.fullSyncFinished) + self.connect(self.syncThread, SIGNAL("fullSyncProgress"), self.fullSyncProgress) self.syncThread.start() self.switchToWelcomeScreen() self.setEnabled(False) @@ -1887,6 +1890,20 @@ Couldn't contact Anki Online. Please check your internet connection.""") ui.utils.showWarning(_( "Failed to upload media. Please run 'check media db'."), self) + def fullSyncStarted(self, ret): + self.startProgress(max=ret[2]) + if ret[0] == "fromLocal": + s = _("Uploading to server...") + else: + s = _("Downloading from server...") + self.updateProgress(label=s) + + def fullSyncFinished(self): + self.finishProgress() + + def fullSyncProgress(self, val): + self.updateProgress(value=val) + # Menu, title bar & status ########################################################################## diff --git a/ankiqt/ui/sync.py b/ankiqt/ui/sync.py index b092684a8..186552821 100644 --- a/ankiqt/ui/sync.py +++ b/ankiqt/ui/sync.py @@ -7,10 +7,11 @@ import os, types, socket, time, traceback import ankiqt import anki from anki.sync import SyncClient, HttpSyncServerProxy, BulkMediaSyncerProxy -from anki.sync import BulkMediaSyncer +from anki.sync import BulkMediaSyncer, SYNC_HOST, SYNC_PORT from anki.errors import * from anki import DeckStorage import ankiqt.forms +from anki.hooks import addHook, removeHook # Synchronising a deck with a public server ########################################################################## @@ -28,12 +29,27 @@ class Sync(QThread): self.ok = True self.onlyMerge = onlyMerge self.sourcesToCheck = sourcesToCheck + addHook('fullSyncStarted', self.fullSyncStarted) + addHook('fullSyncFinished', self.fullSyncFinished) + addHook('fullSyncProgress', self.fullSyncProgress) def setStatus(self, msg, timeout=5000): self.emit(SIGNAL("setStatus"), msg, timeout) def run(self): self.syncDeck() + removeHook('fullSyncStarted', self.fullSyncStarted) + removeHook('fullSyncFinished', self.fullSyncFinished) + removeHook('fullSyncProgress', self.fullSyncProgress) + + def fullSyncStarted(self, ret): + self.emit(SIGNAL("fullSyncStarted"), ret) + + def fullSyncFinished(self): + self.emit(SIGNAL("fullSyncFinished")) + + def fullSyncProgress(self, val): + self.emit(SIGNAL("fullSyncProgress"), val) def error(self, error): if getattr(error, 'data', None) is None: @@ -101,24 +117,29 @@ class Sync(QThread): # summary self.setStatus(_("Fetching summary from server..."), 0) sums = client.summaries() - # diff - self.setStatus(_("Determining differences..."), 0) - payload = client.genPayload(sums) - # send payload - pr = client.payloadChangeReport(payload) - self.setStatus("
" + pr + "
", 0) - self.setStatus(_("Transferring payload..."), 0) - res = client.server.applyPayload(payload) - # apply reply - self.setStatus(_("Applying reply..."), 0) - client.applyPayloadReply(res) - if client.mediaSyncPending: - self.doBulkDownload(proxy.deckName) - # finished. save deck, preserving mod time - self.setStatus(_("Sync complete.")) - self.deck.lastLoaded = self.deck.modified - self.deck.s.flush() - self.deck.s.commit() + if client.needFullSync(sums): + self.setStatus(_("Preparing full sync..."), 0) + client.fullSync() + self.setStatus(_("Sync complete."), 0) + else: + # diff + self.setStatus(_("Determining differences..."), 0) + payload = client.genPayload(sums) + # send payload + pr = client.payloadChangeReport(payload) + self.setStatus("
" + pr + "
", 0) + self.setStatus(_("Transferring payload..."), 0) + res = client.server.applyPayload(payload) + # apply reply + self.setStatus(_("Applying reply..."), 0) + client.applyPayloadReply(res) + if client.mediaSyncPending: + self.doBulkDownload(proxy.deckName) + # finished. save deck, preserving mod time + self.setStatus(_("Sync complete.")) + self.deck.lastLoaded = self.deck.modified + self.deck.s.flush() + self.deck.s.commit() else: changes = False self.setStatus(_("No changes found."))