From 038c604aba0cac22275e03c3497672cd254c2568 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dan=20Vr=C3=A1til?= Date: Mon, 7 Sep 2015 16:20:39 +0200 Subject: [PATCH] IMAP: switch to GID-based merge when the Collection can contain something else than emails In order to fix the recurrent multiple-merge-candidates issue which was breaking ItemSync, ItemSync switched to RID-based merging, which is way more reliable. However in some cases the IMAP resource still wants to use GID-based merging, because RID might not be stable enough. (cherry picked from commit 93a2baac05a325b688aea2cc12d9714d6b186f69) --- CMakeLists.txt | 2 +- resources/imap/autotests/dummyresourcestate.cpp | 8 +++++++- resources/imap/autotests/dummyresourcestate.h | 3 +++ resources/imap/resourcestate.cpp | 5 +++++ resources/imap/resourcestate.h | 2 ++ resources/imap/resourcestateinterface.h | 3 +++ resources/imap/resourcetask.cpp | 5 +++++ resources/imap/resourcetask.h | 1 + resources/imap/retrieveitemstask.cpp | 10 ++++++++++ 9 files changed, 37 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0511f78..17a39b0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -54,7 +54,7 @@ include(ECMInstallIcons) set(KF5_VERSION "5.12.0") set(QT_REQUIRED_VERSION "5.4.0") -set(KDEPIMLIBS_LIB_VERSION "4.88.0") +set(KDEPIMLIBS_LIB_VERSION "4.89.0") set(KDEPIMRUNTIME_LIB_VERSION "${KDEPIM_RUNTIME_VERSION_NUMBER}") set(KDEPIMRUNTIME_LIB_SOVERSION "5") diff --git a/resources/imap/autotests/dummyresourcestate.cpp b/resources/imap/autotests/dummyresourcestate.cpp index 8b28f0b..9497f8e 100644 --- a/resources/imap/autotests/dummyresourcestate.cpp +++ b/resources/imap/autotests/dummyresourcestate.cpp @@ -27,7 +27,8 @@ Q_DECLARE_METATYPE(TagListAndMembers); DummyResourceState::DummyResourceState() : m_automaticExpunge(true), m_subscriptionEnabled(true), - m_disconnectedMode(true), m_intervalCheckTime(-1) + m_disconnectedMode(true), m_intervalCheckTime(-1), + m_mergeMode(Akonadi::ItemSync::RIDMerge) { qRegisterMetaType >(); qRegisterMetaType >(); @@ -428,6 +429,11 @@ int DummyResourceState::batchSize() const return 10; } +void DummyResourceState::setItemMergingMode(Akonadi::ItemSync::MergeMode mergeMode) +{ + m_mergeMode = mergeMode; +} + MessageHelper::Ptr DummyResourceState::messageHelper() const { return MessageHelper::Ptr(new MessageHelper()); diff --git a/resources/imap/autotests/dummyresourcestate.h b/resources/imap/autotests/dummyresourcestate.h index 39cb055..339501f 100644 --- a/resources/imap/autotests/dummyresourcestate.h +++ b/resources/imap/autotests/dummyresourcestate.h @@ -143,6 +143,7 @@ public: virtual void showInformationDialog(const QString &message, const QString &title, const QString &dontShowAgainName); virtual int batchSize() const; + virtual void setItemMergingMode(Akonadi::ItemSync::MergeMode mergeMode); virtual MessageHelper::Ptr messageHelper() const; @@ -163,6 +164,8 @@ private: int m_intervalCheckTime; QChar m_separator; + Akonadi::ItemSync::MergeMode m_mergeMode; + Akonadi::Collection m_collection; Akonadi::Item::List m_items; diff --git a/resources/imap/resourcestate.cpp b/resources/imap/resourcestate.cpp index 9bf802a..690e562 100644 --- a/resources/imap/resourcestate.cpp +++ b/resources/imap/resourcestate.cpp @@ -362,3 +362,8 @@ void ResourceState::relationsRetrieved(const Akonadi::Relation::List &relations) { m_resource->relationsRetrieved(relations); } + +void ResourceState::setItemMergingMode(Akonadi::ItemSync::MergeMode mode) +{ + m_resource->setItemMergingMode(mode); +} \ No newline at end of file diff --git a/resources/imap/resourcestate.h b/resources/imap/resourcestate.h index 6471419..79ece01 100644 --- a/resources/imap/resourcestate.h +++ b/resources/imap/resourcestate.h @@ -153,6 +153,8 @@ public: MessageHelper::Ptr messageHelper() const Q_DECL_OVERRIDE; + void setItemMergingMode(Akonadi::ItemSync::MergeMode mergeMode); + private: ImapResourceBase *m_resource; const TaskArguments m_arguments; diff --git a/resources/imap/resourcestateinterface.h b/resources/imap/resourcestateinterface.h index eb34a25..35647be 100644 --- a/resources/imap/resourcestateinterface.h +++ b/resources/imap/resourcestateinterface.h @@ -26,6 +26,7 @@ #include #include +#include #include @@ -125,6 +126,8 @@ public: virtual Akonadi::Relation::List addedRelations() const = 0; virtual Akonadi::Relation::List removedRelations() const = 0; + + virtual void setItemMergingMode(Akonadi::ItemSync::MergeMode mergeMode) = 0; }; #endif diff --git a/resources/imap/resourcetask.cpp b/resources/imap/resourcetask.cpp index 59532cd..e9c640c 100644 --- a/resources/imap/resourcetask.cpp +++ b/resources/imap/resourcetask.cpp @@ -591,3 +591,8 @@ KIMAP::Acl::Rights ResourceTask::myRights(const Akonadi::Collection &col) } return KIMAP::Acl::None; } + +void ResourceTask::setItemMergingMode(Akonadi::ItemSync::MergeMode mode) +{ + m_resource->setItemMergingMode(mode); +} diff --git a/resources/imap/resourcetask.h b/resources/imap/resourcetask.h index 74aa518..d034c9d 100644 --- a/resources/imap/resourcetask.h +++ b/resources/imap/resourcetask.h @@ -140,6 +140,7 @@ protected: virtual bool serverSupportsCondstore() const; int batchSize() const; + void setItemMergingMode(Akonadi::ItemSync::MergeMode mode); ResourceStateInterface::Ptr resourceState(); diff --git a/resources/imap/retrieveitemstask.cpp b/resources/imap/retrieveitemstask.cpp index a60c6ba..91b287c 100644 --- a/resources/imap/retrieveitemstask.cpp +++ b/resources/imap/retrieveitemstask.cpp @@ -89,6 +89,16 @@ void RetrieveItemsTask::doStart(KIMAP::Session *session) m_session = session; const Akonadi::Collection col = collection(); + // Only with emails we can be sure that RID is persistent and thus we can use + // it for merging. For other potential content types (like Kolab events etc.) + // use GID instead. + QStringList cts = col.contentMimeTypes(); + cts.removeOne(Akonadi::Collection::mimeType()); + cts.removeOne(KMime::Message::mimeType()); + if (!cts.isEmpty()) { + setItemMergingMode(Akonadi::ItemSync::GIDMerge); + } + if (m_fetchMissingBodies && col.cachePolicy() .localParts().contains(QLatin1String(Akonadi::MessagePart::Body))) { //disconnected mode, make sure we really have the body cached -- 2.4.6