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