1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
|
From 038c604aba0cac22275e03c3497672cd254c2568 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dan=20Vr=C3=A1til?= <dvratil@redhat.com>
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<QList<qint64> >();
qRegisterMetaType<QVector<qint64> >();
@@ -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 <Collection>
#include <Item>
+#include <ItemSync>
#include <kimap/listjob.h>
@@ -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
|