From 524e405f645edb6231f9b16fafc1f9ca36af8237 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Sat, 20 May 2017 11:28:02 +0200 Subject: Avoid notifcations for requests that do nothing, progress with folderid --- common/changereplay.h | 2 +- common/synchronizer.cpp | 19 +++++++++++-------- common/synchronizer.h | 2 +- examples/imapresource/imapresource.cpp | 21 +++++++++++---------- 4 files changed, 24 insertions(+), 20 deletions(-) diff --git a/common/changereplay.h b/common/changereplay.h index c509735..22e26a5 100644 --- a/common/changereplay.h +++ b/common/changereplay.h @@ -54,7 +54,7 @@ public slots: protected: virtual KAsync::Job replay(const QByteArray &type, const QByteArray &key, const QByteArray &value) = 0; virtual bool canReplay(const QByteArray &type, const QByteArray &key, const QByteArray &value) = 0; - virtual void reportProgress(int progress, int total){}; + virtual void reportProgress(int progress, int total, const QByteArrayList &applicableEntities = {}){}; Sink::Storage::DataStore mStorage; KAsync::Job replayNextRevision(); diff --git a/common/synchronizer.cpp b/common/synchronizer.cpp index b9decbd..3ef7eb7 100644 --- a/common/synchronizer.cpp +++ b/common/synchronizer.cpp @@ -315,11 +315,17 @@ void Synchronizer::emitProgressNotification(Notification::NoticationType type, i emit notify(n); } -void Synchronizer::reportProgress(int progress, int total) +void Synchronizer::reportProgress(int progress, int total, const QByteArrayList &entities) { if (progress > 0 && total > 0) { - SinkLogCtx(mLogCtx) << "Progress: " << progress << " out of " << total; - emitProgressNotification(Notification::Progress, progress, total, mCurrentRequest.requestId, mCurrentRequest.applicableEntities); + SinkLogCtx(mLogCtx) << "Progress: " << progress << " out of " << total << mCurrentRequest.requestId << mCurrentRequest.applicableEntities; + const auto applicableEntities = [&] { + if (entities.isEmpty()) { + return mCurrentRequest.applicableEntities; + } + return entities; + }(); + emitProgressNotification(Notification::Progress, progress, total, mCurrentRequest.requestId, applicableEntities); } } @@ -371,6 +377,7 @@ KAsync::Job Synchronizer::processRequest(const SyncRequest &request) } else if (request.requestType == Synchronizer::SyncRequest::Synchronization) { return KAsync::start([this, request] { SinkLogCtx(mLogCtx) << "Synchronizing: " << request.query; + setBusy(true, "Synchronization has started.", request.requestId); emitNotification(Notification::Info, ApplicationDomain::SyncInProgress, {}, {}, request.applicableEntities); }).then(synchronizeWithSource(request.query)).then([this] { //Commit after every request, so implementations only have to commit more if they add a lot of data. @@ -408,6 +415,7 @@ KAsync::Job Synchronizer::processRequest(const SyncRequest &request) return KAsync::null(); } else { return KAsync::start([this, request] { + setBusy(true, "ChangeReplay has started.", request.requestId); SinkLogCtx(mLogCtx) << "Replaying changes."; }) .then(replayNextRevision()) @@ -479,11 +487,6 @@ KAsync::Job Synchronizer::processSyncQueue() mMessageQueue->startTransaction(); mEntityStore->startTransaction(Sink::Storage::DataStore::ReadOnly); mSyncInProgress = true; - if (request.requestType == Synchronizer::SyncRequest::Synchronization) { - setBusy(true, "Synchronization has started.", request.requestId); - } else if (request.requestType == Synchronizer::SyncRequest::ChangeReplay) { - setBusy(true, "ChangeReplay has started.", request.requestId); - } mCurrentRequest = request; }) .then(processRequest(request)) diff --git a/common/synchronizer.h b/common/synchronizer.h index 935c139..cc082be 100644 --- a/common/synchronizer.h +++ b/common/synchronizer.h @@ -197,7 +197,7 @@ protected: /** * Report progress for current task */ - virtual void reportProgress(int progress, int total) Q_DECL_OVERRIDE; + virtual void reportProgress(int progress, int total, const QByteArrayList &entities = {}) Q_DECL_OVERRIDE; protected: Sink::Log::Context mLogCtx; diff --git a/examples/imapresource/imapresource.cpp b/examples/imapresource/imapresource.cpp index 94ca27a..533dea3 100644 --- a/examples/imapresource/imapresource.cpp +++ b/examples/imapresource/imapresource.cpp @@ -184,14 +184,12 @@ public: return flags; } - void synchronizeMails(const QByteArray &folderRid, const Message &message) + void synchronizeMails(const QByteArray &folderRid, const QByteArray &folderLocalId, const Message &message) { auto time = QSharedPointer::create(); time->start(); SinkTraceCtx(mLogCtx) << "Importing new mail." << folderRid; - const auto folderLocalId = syncStore().resolveRemoteId(ENTITY_TYPE_FOLDER, folderRid); - const auto remoteId = assembleMailRid(folderLocalId, message.uid); Q_ASSERT(message.msg); @@ -315,14 +313,15 @@ public: SinkTraceCtx(mLogCtx) << "Uids to fetch: " << filteredAndSorted; bool headersOnly = false; + const auto folderLocalId = syncStore().resolveRemoteId(ENTITY_TYPE_FOLDER, folderRemoteId); return imap->fetchMessages(folder, filteredAndSorted, headersOnly, [=](const Message &m) { if (*maxUid < m.uid) { *maxUid = m.uid; } - synchronizeMails(folderRemoteId, m); + synchronizeMails(folderRemoteId, folderLocalId, m); }, - [this, maxUid, folder](int progress, int total) { - reportProgress(progress, total); + [=](int progress, int total) { + reportProgress(progress, total, QByteArrayList{} << folderLocalId); //commit every 10 messages if ((progress % 10) == 0) { commit(); @@ -359,11 +358,12 @@ public: SinkLogCtx(mLogCtx) << "Fetching headers for: " << toFetch; bool headersOnly = true; + const auto folderLocalId = syncStore().resolveRemoteId(ENTITY_TYPE_FOLDER, folderRemoteId); return imap->fetchMessages(folder, toFetch, headersOnly, [=](const Message &m) { - synchronizeMails(folderRemoteId, m); + synchronizeMails(folderRemoteId, folderLocalId, m); }, [=](int progress, int total) { - reportProgress(progress, total); + reportProgress(progress, total, QByteArrayList{} << folderLocalId); //commit every 100 messages if ((progress % 100) == 0) { commit(); @@ -567,11 +567,12 @@ public: } SinkLog() << "Fetching messages: " << toFetch << folderRemoteId; bool headersOnly = false; + const auto folderLocalId = syncStore().resolveRemoteId(ENTITY_TYPE_FOLDER, folderRemoteId); return imap->fetchMessages(Folder{folderRemoteId}, toFetch, headersOnly, [=](const Message &m) { - synchronizeMails(folderRemoteId, m); + synchronizeMails(folderRemoteId, folderLocalId, m); }, [=](int progress, int total) { - reportProgress(progress, total); + reportProgress(progress, total, QByteArrayList{} << folderLocalId); //commit every 100 messages if ((progress % 100) == 0) { commit(); -- cgit v1.2.3