diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2017-03-28 09:26:50 +0200 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2017-03-28 09:26:50 +0200 |
commit | 547e5e29cbfc12474ab45768ff0d9342882b2633 (patch) | |
tree | 6728cb767b5c3a2ce450a6621815cc7fd8c0bd96 | |
parent | 8b69affc452cd828824ee77653f40d4c4f8d0658 (diff) | |
download | sink-547e5e29cbfc12474ab45768ff0d9342882b2633.tar.gz sink-547e5e29cbfc12474ab45768ff0d9342882b2633.zip |
Track the entities that this request applies to directly in the
syncrequest
That way we can do the notification emitting in the synchronizer and it
keeps working even if the login already fails (so the synchronizing code
would never be executed).
-rw-r--r-- | common/synchronizer.cpp | 6 | ||||
-rw-r--r-- | common/synchronizer.h | 4 | ||||
-rw-r--r-- | examples/imapresource/imapresource.cpp | 17 |
3 files changed, 13 insertions, 14 deletions
diff --git a/common/synchronizer.cpp b/common/synchronizer.cpp index ec896ed..329841b 100644 --- a/common/synchronizer.cpp +++ b/common/synchronizer.cpp | |||
@@ -329,7 +329,7 @@ KAsync::Job<void> Synchronizer::processRequest(const SyncRequest &request) | |||
329 | return KAsync::start([this, request] { | 329 | return KAsync::start([this, request] { |
330 | SinkLogCtx(mLogCtx) << "Synchronizing: " << request.query; | 330 | SinkLogCtx(mLogCtx) << "Synchronizing: " << request.query; |
331 | emitNotification(Notification::Status, ApplicationDomain::BusyStatus, "Synchronization has started.", request.requestId); | 331 | emitNotification(Notification::Status, ApplicationDomain::BusyStatus, "Synchronization has started.", request.requestId); |
332 | emitNotification(Notification::Info, ApplicationDomain::SyncInProgress, {}, {}, request.query.ids()); | 332 | emitNotification(Notification::Info, ApplicationDomain::SyncInProgress, {}, {}, request.applicableEntities); |
333 | }).then(synchronizeWithSource(request.query)).then([this] { | 333 | }).then(synchronizeWithSource(request.query)).then([this] { |
334 | //Commit after every request, so implementations only have to commit more if they add a lot of data. | 334 | //Commit after every request, so implementations only have to commit more if they add a lot of data. |
335 | commit(); | 335 | commit(); |
@@ -337,12 +337,12 @@ KAsync::Job<void> Synchronizer::processRequest(const SyncRequest &request) | |||
337 | if (error) { | 337 | if (error) { |
338 | //Emit notification with error | 338 | //Emit notification with error |
339 | SinkWarningCtx(mLogCtx) << "Synchronization failed: " << error.errorMessage; | 339 | SinkWarningCtx(mLogCtx) << "Synchronization failed: " << error.errorMessage; |
340 | emitNotification(Notification::Warning, ApplicationDomain::SyncError, {}, {}, request.query.ids()); | 340 | emitNotification(Notification::Warning, ApplicationDomain::SyncError, {}, {}, request.applicableEntities); |
341 | emitNotification(Notification::Status, ApplicationDomain::ErrorStatus, "Synchronization has ended.", request.requestId); | 341 | emitNotification(Notification::Status, ApplicationDomain::ErrorStatus, "Synchronization has ended.", request.requestId); |
342 | return KAsync::error(error); | 342 | return KAsync::error(error); |
343 | } else { | 343 | } else { |
344 | SinkLogCtx(mLogCtx) << "Done Synchronizing"; | 344 | SinkLogCtx(mLogCtx) << "Done Synchronizing"; |
345 | emitNotification(Notification::Info, ApplicationDomain::SyncSuccess, {}, {}, request.query.ids()); | 345 | emitNotification(Notification::Info, ApplicationDomain::SyncSuccess, {}, {}, request.applicableEntities); |
346 | emitNotification(Notification::Status, ApplicationDomain::ConnectedStatus, "Synchronization has ended.", request.requestId); | 346 | emitNotification(Notification::Status, ApplicationDomain::ConnectedStatus, "Synchronization has ended.", request.requestId); |
347 | return KAsync::null(); | 347 | return KAsync::null(); |
348 | } | 348 | } |
diff --git a/common/synchronizer.h b/common/synchronizer.h index e3dbddc..751542d 100644 --- a/common/synchronizer.h +++ b/common/synchronizer.h | |||
@@ -134,7 +134,8 @@ protected: | |||
134 | : requestId(requestId_), | 134 | : requestId(requestId_), |
135 | requestType(Synchronization), | 135 | requestType(Synchronization), |
136 | options(o), | 136 | options(o), |
137 | query(q) | 137 | query(q), |
138 | applicableEntities(q.ids()) | ||
138 | { | 139 | { |
139 | } | 140 | } |
140 | 141 | ||
@@ -155,6 +156,7 @@ protected: | |||
155 | RequestType requestType; | 156 | RequestType requestType; |
156 | RequestOptions options = NoOptions; | 157 | RequestOptions options = NoOptions; |
157 | Sink::QueryBase query; | 158 | Sink::QueryBase query; |
159 | QByteArrayList applicableEntities; | ||
158 | }; | 160 | }; |
159 | 161 | ||
160 | /** | 162 | /** |
diff --git a/examples/imapresource/imapresource.cpp b/examples/imapresource/imapresource.cpp index eef0de0..175f75a 100644 --- a/examples/imapresource/imapresource.cpp +++ b/examples/imapresource/imapresource.cpp | |||
@@ -382,7 +382,11 @@ public: | |||
382 | { | 382 | { |
383 | QList<Synchronizer::SyncRequest> list; | 383 | QList<Synchronizer::SyncRequest> list; |
384 | if (query.type() == ApplicationDomain::getTypeName<ApplicationDomain::Mail>()) { | 384 | if (query.type() == ApplicationDomain::getTypeName<ApplicationDomain::Mail>()) { |
385 | list << Synchronizer::SyncRequest{applyMailDefaults(query)}; | 385 | auto request = Synchronizer::SyncRequest{applyMailDefaults(query)}; |
386 | if (query.hasFilter(ApplicationDomain::Mail::Folder::name)) { | ||
387 | request.applicableEntities << query.getFilter(ApplicationDomain::Mail::Folder::name).value.toByteArray(); | ||
388 | } | ||
389 | list << request; | ||
386 | } else if (query.type() == ApplicationDomain::getTypeName<ApplicationDomain::Folder>()) { | 390 | } else if (query.type() == ApplicationDomain::getTypeName<ApplicationDomain::Folder>()) { |
387 | list << Synchronizer::SyncRequest{query}; | 391 | list << Synchronizer::SyncRequest{query}; |
388 | } else { | 392 | } else { |
@@ -556,8 +560,6 @@ public: | |||
556 | SinkLog() << "Syncing folder " << folder.path(); | 560 | SinkLog() << "Syncing folder " << folder.path(); |
557 | //Emit notification that the folder is being synced. | 561 | //Emit notification that the folder is being synced. |
558 | //The synchronizer can't do that because it has no concept of the folder filter on a mail sync scope meaning that the folder is being synchronized. | 562 | //The synchronizer can't do that because it has no concept of the folder filter on a mail sync scope meaning that the folder is being synchronized. |
559 | const auto folderLocalId = syncStore().resolveRemoteId(ENTITY_TYPE_FOLDER, folderRid(folder)); | ||
560 | emitNotification(Notification::Info, ApplicationDomain::SyncInProgress, {}, {}, {folderLocalId}); | ||
561 | QDate dateFilter; | 563 | QDate dateFilter; |
562 | auto filter = query.getFilter<ApplicationDomain::Mail::Date>(); | 564 | auto filter = query.getFilter<ApplicationDomain::Mail::Date>(); |
563 | if (filter.value.canConvert<QDate>()) { | 565 | if (filter.value.canConvert<QDate>()) { |
@@ -565,13 +567,8 @@ public: | |||
565 | SinkLog() << " with date-range " << dateFilter; | 567 | SinkLog() << " with date-range " << dateFilter; |
566 | } | 568 | } |
567 | return synchronizeFolder(imap, folder, dateFilter, syncHeaders) | 569 | return synchronizeFolder(imap, folder, dateFilter, syncHeaders) |
568 | .then([=](const KAsync::Error &error) { | 570 | .onError([=](const KAsync::Error &error) { |
569 | if (error) { | 571 | SinkWarning() << "Failed to sync folder: " << folder.path() << "Error: " << error.errorMessage; |
570 | SinkWarning() << "Failed to sync folder: " << folder.path() << "Error: " << error.errorMessage; | ||
571 | emitNotification(Notification::Info, ApplicationDomain::SyncError, {}, {}, {folderLocalId}); | ||
572 | } else { | ||
573 | emitNotification(Notification::Info, ApplicationDomain::SyncSuccess, {}, {}, {folderLocalId}); | ||
574 | } | ||
575 | }); | 572 | }); |
576 | }); | 573 | }); |
577 | }); | 574 | }); |