Branch 'kolab/integration/4.13.0' - 5 commits - resources/kolab
Christian Mollekopf
mollekopf at kolabsys.com
Mon Jan 26 23:50:52 CET 2015
resources/kolab/kolabchangeitemsrelationstask.cpp | 63 ++++++++++++++++++----
resources/kolab/kolabchangeitemsrelationstask.h | 1
resources/kolab/kolabchangeitemstagstask.cpp | 1
resources/kolab/kolabchangetagtask.cpp | 1
resources/kolab/kolabhelpers.cpp | 6 ++
resources/kolab/kolabresource.cpp | 1
resources/kolab/kolabretrievecollectionstask.cpp | 9 +--
resources/kolab/tests/testchangeitemstagstask.cpp | 10 ++-
8 files changed, 76 insertions(+), 16 deletions(-)
New commits:
commit 8a28af5edaa6facb36e5390fd576a4d0dbe98875
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date: Mon Jan 26 23:50:47 2015 +0100
Kolab-Resource: Don't crash if the item is no longer existing.
diff --git a/resources/kolab/kolabchangeitemstagstask.cpp b/resources/kolab/kolabchangeitemstagstask.cpp
index cf1564b..4330a18 100644
--- a/resources/kolab/kolabchangeitemstagstask.cpp
+++ b/resources/kolab/kolabchangeitemstagstask.cpp
@@ -77,7 +77,6 @@ void KolabChangeItemsTagsTask::onTagFetchDone(KJob *job)
}
const Akonadi::Tag::List tags = static_cast<Akonadi::TagFetchJob*>(job)->tags();
- Q_ASSERT(tags.size() == 1);
if (tags.size() != 1) {
kWarning() << "Invalid number of tags retrieved: " << tags.size();
// TODO: we could continue for the other tags?
commit 80cb2ef0f5e8732faed59f67897705d50672d4a5
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date: Mon Jan 26 23:50:30 2015 +0100
Kolab-Resource: Fixed changeitemsrelationstask.
diff --git a/resources/kolab/kolabchangeitemsrelationstask.cpp b/resources/kolab/kolabchangeitemsrelationstask.cpp
index 91d6e59..96e2a9d 100644
--- a/resources/kolab/kolabchangeitemsrelationstask.cpp
+++ b/resources/kolab/kolabchangeitemsrelationstask.cpp
@@ -31,6 +31,8 @@
#include <kimap/storejob.h>
#include <akonadi/relationfetchjob.h>
+#include <akonadi/itemfetchjob.h>
+#include <akonadi/itemfetchscope.h>
#include "tracer.h"
#include "kolabhelpers.h"
@@ -61,6 +63,7 @@ void KolabChangeItemsRelationsTask::processNextRelation()
relation = mRemovedRelations.takeFirst();
mAdding = false;
} else {
+ Trace() << "Processing done";
changeProcessed();
return;
}
@@ -82,7 +85,6 @@ void KolabChangeItemsRelationsTask::onRelationFetchDone(KJob *job)
}
const Akonadi::Relation::List relations = static_cast<Akonadi::RelationFetchJob *>(job)->relations();
- Q_ASSERT(relations.size() == 1);
if (relations.size() != 1) {
kWarning() << "Invalid number of relations retrieved: " << relations.size();
processNextRelation();
@@ -99,20 +101,54 @@ void KolabChangeItemsRelationsTask::onRelationFetchDone(KJob *job)
void KolabChangeItemsRelationsTask::addRelation(const Akonadi::Relation &relation)
{
- //FIXME fetch items first?
+ Akonadi::ItemFetchJob *fetchJob = new Akonadi::ItemFetchJob(Akonadi::Item::List() << relation.left() << relation.right());
+ fetchJob->fetchScope().setCacheOnly(true);
+ fetchJob->fetchScope().setAncestorRetrieval(Akonadi::ItemFetchScope::All);
+ fetchJob->fetchScope().setFetchGid(true);
+ fetchJob->fetchScope().fetchFullPayload(true);
+ fetchJob->setProperty("relation", QVariant::fromValue(relation));
+ connect(fetchJob, SIGNAL(result(KJob*)), this, SLOT(onItemsFetched(KJob*)));
+}
+
+void KolabChangeItemsRelationsTask::onItemsFetched(KJob *job)
+{
+ if (job->error()) {
+ kWarning() << "Failed to fetch items for relation: " << job->errorString();
+ processNextRelation();
+ return;
+ }
+ Akonadi::ItemFetchJob *fetchJob = static_cast<Akonadi::ItemFetchJob*>(job);
+ if (fetchJob->items().size() != 2) {
+ kWarning() << "Invalid number of items retrieved: " << fetchJob->items().size();
+ processNextRelation();
+ return;
+ }
+
+
+ const Akonadi::Item::List items = fetchJob->items();
+ const Akonadi::Relation relation = job->property("relation").value<Akonadi::Relation>();
+ Akonadi::Item leftItem = items[0] == relation.left() ? items[0] : items[1];
+ Akonadi::Item rightItem = items[0] == relation.right() ? items[0] : items[1];
+ const QString left = KolabHelpers::createMemberUrl(leftItem, resourceState()->userName());
+ const QString right = KolabHelpers::createMemberUrl(rightItem, resourceState()->userName());
+ if (left.isEmpty() || right.isEmpty()) {
+ kWarning() << "Failed to add relation, invalid member: " << left << " : " << right;
+ processNextRelation();
+ return;
+ }
QStringList members;
members.reserve(2);
- members << KolabHelpers::createMemberUrl(relation.left(), resourceState()->userName());
- members << KolabHelpers::createMemberUrl(relation.right(), resourceState()->userName());
+ members << left << right;
const QLatin1String productId("Akonadi-Kolab-Resource");
const KMime::Message::Ptr message = Kolab::KolabObjectWriter::writeRelation(relation, members, Kolab::KolabV3, productId);
- KIMAP::AppendJob *job = new KIMAP::AppendJob(mSession);
- job->setMailBox(mailBoxForCollection(relationCollection()));
- job->setContent(message->encodedContent(true));
- job->setInternalDate(message->date()->dateTime());
- connect(job, SIGNAL(result(KJob*)), SLOT(onChangeCommitted(KJob*)));
+ KIMAP::AppendJob *appendJob = new KIMAP::AppendJob(mSession);
+ appendJob->setMailBox(mailBoxForCollection(relationCollection()));
+ appendJob->setContent(message->encodedContent(true));
+ appendJob->setInternalDate(message->date()->dateTime());
+ connect(appendJob, SIGNAL(result(KJob*)), SLOT(onChangeCommitted(KJob*)));
+ appendJob->start();
}
void KolabChangeItemsRelationsTask::removeRelation(const Akonadi::Relation &relation)
diff --git a/resources/kolab/kolabchangeitemsrelationstask.h b/resources/kolab/kolabchangeitemsrelationstask.h
index 5feda71..801258b 100644
--- a/resources/kolab/kolabchangeitemsrelationstask.h
+++ b/resources/kolab/kolabchangeitemsrelationstask.h
@@ -37,6 +37,7 @@ private Q_SLOTS:
void onRelationFetchDone(KJob *job);
void addRelation(const Akonadi::Relation &relation);
+ void onItemsFetched(KJob *job);
void removeRelation(const Akonadi::Relation &relation);
void onSelectDone(KJob *job);
void triggerStoreJob();
diff --git a/resources/kolab/kolabresource.cpp b/resources/kolab/kolabresource.cpp
index e07c946..8b4904c 100644
--- a/resources/kolab/kolabresource.cpp
+++ b/resources/kolab/kolabresource.cpp
@@ -229,6 +229,7 @@ void KolabResource::itemsRelationsChanged(const Akonadi::Item::List &items,
{
Trace() << items.size() << addedRelations.size() << removedRelations.size();
KolabChangeItemsRelationsTask *task = new KolabChangeItemsRelationsTask(createResourceState(TaskArguments(items, addedRelations, removedRelations)));
+ startTask(task);
}
AKONADI_RESOURCE_MAIN( KolabResource )
commit 6c16be9b3a3149985fc31c13e7a007af2b3c2e82
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date: Mon Jan 26 22:49:16 2015 +0100
Kolab-Resource: Debug information for kolabchangeitemsrelationstask
diff --git a/resources/kolab/kolabchangeitemsrelationstask.cpp b/resources/kolab/kolabchangeitemsrelationstask.cpp
index 480bbfd..91d6e59 100644
--- a/resources/kolab/kolabchangeitemsrelationstask.cpp
+++ b/resources/kolab/kolabchangeitemsrelationstask.cpp
@@ -32,6 +32,7 @@
#include <akonadi/relationfetchjob.h>
+#include "tracer.h"
#include "kolabhelpers.h"
KolabChangeItemsRelationsTask::KolabChangeItemsRelationsTask(ResourceStateInterface::Ptr resource, QObject *parent)
@@ -41,6 +42,7 @@ KolabChangeItemsRelationsTask::KolabChangeItemsRelationsTask(ResourceStateInterf
void KolabChangeItemsRelationsTask::startRelationTask(KIMAP::Session *session)
{
+ Trace();
mSession = session;
mAddedRelations = resourceState()->addedRelations();
mRemovedRelations = resourceState()->removedRelations();
@@ -50,6 +52,7 @@ void KolabChangeItemsRelationsTask::startRelationTask(KIMAP::Session *session)
void KolabChangeItemsRelationsTask::processNextRelation()
{
+ Trace() << mAddedRelations.size() << mRemovedRelations.size();
Akonadi::Relation relation;
if (!mAddedRelations.isEmpty()) {
relation = mAddedRelations.takeFirst();
@@ -61,6 +64,7 @@ void KolabChangeItemsRelationsTask::processNextRelation()
changeProcessed();
return;
}
+ Trace() << "Processing " << (mAdding ? " add " : " remove ") << relation;
//We have to fetch it again in case it changed since the notification was emitted (which is likely)
//Otherwise we get an empty remoteid for new tags that were immediately applied on an item
@@ -70,6 +74,7 @@ void KolabChangeItemsRelationsTask::processNextRelation()
void KolabChangeItemsRelationsTask::onRelationFetchDone(KJob *job)
{
+ Trace();
if (job->error()) {
kWarning() << "RelatonFetch failed: " << job->errorString();
processNextRelation();
@@ -112,6 +117,7 @@ void KolabChangeItemsRelationsTask::addRelation(const Akonadi::Relation &relatio
void KolabChangeItemsRelationsTask::removeRelation(const Akonadi::Relation &relation)
{
+ Trace();
mCurrentRelation = relation;
const QString mailBox = mailBoxForCollection(relationCollection());
@@ -142,6 +148,8 @@ void KolabChangeItemsRelationsTask::triggerStoreJob()
KIMAP::ImapSet set;
set.add(mCurrentRelation.remoteId().toLong());
+ Trace() << set.toImapSequenceSet();
+
KIMAP::StoreJob *store = new KIMAP::StoreJob(mSession);
store->setUidBased(true);
store->setSequenceSet(set);
@@ -154,6 +162,7 @@ void KolabChangeItemsRelationsTask::triggerStoreJob()
void KolabChangeItemsRelationsTask::onChangeCommitted(KJob *job)
{
if (job->error()) {
+ kWarning() << "Error while storing change";
cancelTask(job->errorString());
} else {
processNextRelation();
diff --git a/resources/kolab/kolabhelpers.cpp b/resources/kolab/kolabhelpers.cpp
index 6f04fe2..0c69c75 100644
--- a/resources/kolab/kolabhelpers.cpp
+++ b/resources/kolab/kolabhelpers.cpp
@@ -27,6 +27,7 @@
#include <kolabobject.h>
#include <errorhandler.h>
#include <KLocalizedString>
+#include "tracer.h"
bool KolabHelpers::checkForErrors(const Akonadi::Item &item)
{
@@ -479,8 +480,13 @@ QList<QByteArray> KolabHelpers::ancestorChain(const Akonadi::Collection &col)
QString KolabHelpers::createMemberUrl(const Akonadi::Item &item, const QString &user)
{
+ Trace() << item.id() << item.mimeType() << item.gid() << item.hasPayload();
Kolab::RelationMember member;
if (item.mimeType() == KMime::Message::mimeType()) {
+ if (!item.hasPayload<KMime::Message::Ptr>()) {
+ kWarning() << "Email without payload, failed to add to tag: " << item.id() << item.remoteId();
+ return QString();
+ }
KMime::Message::Ptr msg = item.payload<KMime::Message::Ptr>();
member.uid = item.remoteId().toLong();
member.user = user;
commit 5aa581182db8217b9fb9c76335a4fbfd30f37a2a
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date: Mon Jan 26 21:29:55 2015 +0100
Tag support fixes
* make tests pass again
* fetch full payload and gids if updating tags
* use login name for relations as username
Conflicts:
resources/kolab/kolabchangetagtask.cpp
diff --git a/resources/kolab/kolabchangeitemsrelationstask.cpp b/resources/kolab/kolabchangeitemsrelationstask.cpp
index 8133cea..480bbfd 100644
--- a/resources/kolab/kolabchangeitemsrelationstask.cpp
+++ b/resources/kolab/kolabchangeitemsrelationstask.cpp
@@ -97,8 +97,8 @@ void KolabChangeItemsRelationsTask::addRelation(const Akonadi::Relation &relatio
//FIXME fetch items first?
QStringList members;
members.reserve(2);
- members << KolabHelpers::createMemberUrl(relation.left(), QLatin1String("user at example.org"));
- members << KolabHelpers::createMemberUrl(relation.right(), QLatin1String("user at example.org"));
+ members << KolabHelpers::createMemberUrl(relation.left(), resourceState()->userName());
+ members << KolabHelpers::createMemberUrl(relation.right(), resourceState()->userName());
const QLatin1String productId("Akonadi-Kolab-Resource");
const KMime::Message::Ptr message = Kolab::KolabObjectWriter::writeRelation(relation, members, Kolab::KolabV3, productId);
diff --git a/resources/kolab/kolabchangetagtask.cpp b/resources/kolab/kolabchangetagtask.cpp
index f58e85d..38f67b9 100644
--- a/resources/kolab/kolabchangetagtask.cpp
+++ b/resources/kolab/kolabchangetagtask.cpp
@@ -39,6 +39,7 @@ void KolabChangeTagTask::startRelationTask(KIMAP::Session *session)
Akonadi::ItemFetchJob *fetch = new Akonadi::ItemFetchJob(resourceState()->tag());
fetch->fetchScope().setCacheOnly(true);
+ fetch->fetchScope().setFetchGid(true);
fetch->fetchScope().setAncestorRetrieval(Akonadi::ItemFetchScope::All);
fetch->fetchScope().fetchFullPayload(true);
connect(fetch, SIGNAL(result(KJob*)), this, SLOT(onItemsFetchDone(KJob*)));
diff --git a/resources/kolab/tests/testchangeitemstagstask.cpp b/resources/kolab/tests/testchangeitemstagstask.cpp
index 0687b06..7360b74 100644
--- a/resources/kolab/tests/testchangeitemstagstask.cpp
+++ b/resources/kolab/tests/testchangeitemstagstask.cpp
@@ -215,11 +215,17 @@ private slots:
void testTagConverter()
{
TagConverter converter;
- Akonadi::Item item;
+ Akonadi::Item item(KMime::Message::mimeType());
+ KMime::Message::Ptr msg= KMime::Message::Ptr(new KMime::Message());
+ msg->subject(true)->from7BitString("subject");
+
+ msg->messageID(true)->from7BitString("<messageid at example.com>");
+ msg->date(true)->setDateTime(KDateTime(QDate(2014,12,10), QTime(9,8,7)));
+ item.setPayload<KMime::Message::Ptr>(msg);
item.setRemoteId(QLatin1String("20"));
item.setParentCollection(createCollectionChain("/INBOX"));
const QString member = KolabHelpers::createMemberUrl(item, QLatin1String("localuser at localhost"));
- const QString expected = QLatin1String("imap:/user/localuser at localhost/INBOX/20?message-id=messageid&subject=subject&date=");
+ const QString expected = QLatin1String("imap:///user/localuser%40localhost/INBOX/20?message-id=%3Cmessageid%40example.com%3E&subject=subject&date=Wed%2C%2010%20Dec%202014%2009%3A08%3A07%20%2B0000");
QCOMPARE(member, expected);
}
};
commit 75aefa2525cc0ee4a61a0021bcf65465624865f8
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date: Sun Jan 18 16:44:05 2015 +0100
Debug output.
diff --git a/resources/kolab/kolabretrievecollectionstask.cpp b/resources/kolab/kolabretrievecollectionstask.cpp
index 3e2b8b6..b8421b3 100644
--- a/resources/kolab/kolabretrievecollectionstask.cpp
+++ b/resources/kolab/kolabretrievecollectionstask.cpp
@@ -416,8 +416,8 @@ void KolabRetrieveCollectionsTask::onMailBoxesReceiveDone(KJob* job)
kDebug() << "in total: " << mMailCollections.size();
mJobs--;
if (job->error()) {
- kWarning() << job->errorString();
- cancelTask(job->errorString());
+ kWarning() << QLatin1String("Failed to retrieve mailboxes: ") + job->errorString();
+ cancelTask("Collection retrieval failed");
} else {
QSet<QString> mailboxes;
Q_FOREACH(const QString &mailbox, mMailCollections.keys()) {
@@ -494,7 +494,7 @@ void KolabRetrieveCollectionsTask::onMetadataRetrieved(KJob *job)
mJobs--;
if (job->error()) {
kWarning() << "Error while retrieving metadata, aborting collection retrieval: " << job->errorString();
- cancelTask(job->errorString());
+ cancelTask("Collection retrieval failed");
} else {
RetrieveMetadataJob *metadata = static_cast<RetrieveMetadataJob*>(job);
applyRights(metadata->mRights);
@@ -527,7 +527,8 @@ void KolabRetrieveCollectionsTask::onFullMailBoxesReceiveDone(KJob* job)
kDebug() << "received subscribed collections " << mTime.elapsed();
mJobs--;
if (job->error()) {
- cancelTask(job->errorString());
+ kWarning() << QLatin1String("Failed to retrieve subscribed collections: ") + job->errorString();
+ cancelTask("Collection retrieval failed");
} else {
checkDone();
}
More information about the commits
mailing list