Branch 'kolab/integration/4.13.0' - 3 commits - resources/kolab

Christian Mollekopf mollekopf at kolabsys.com
Wed Jan 7 10:02:13 CET 2015


 resources/kolab/kolabchangeitemstagstask.cpp  |   11 +++-
 resources/kolab/kolabchangetagtask.cpp        |    9 ++-
 resources/kolab/kolabrelationresourcetask.cpp |   64 +++++++++++++++++++++++++-
 resources/kolab/kolabrelationresourcetask.h   |    3 +
 4 files changed, 80 insertions(+), 7 deletions(-)

New commits:
commit b832a1eae51f585982895ce10562cb2533fa3bf9
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Wed Jan 7 10:02:05 2015 +0100

    Fetch also on changeitem only from cache.

diff --git a/resources/kolab/kolabchangeitemstagstask.cpp b/resources/kolab/kolabchangeitemstagstask.cpp
index 00c88e9..21269fe 100644
--- a/resources/kolab/kolabchangeitemstagstask.cpp
+++ b/resources/kolab/kolabchangeitemstagstask.cpp
@@ -86,7 +86,7 @@ void KolabChangeItemsTagsTask::onTagFetchDone(KJob *job)
     }
 
     Akonadi::ItemFetchJob *fetch = new Akonadi::ItemFetchJob(tags.first());
-    // fetch->fetchScope().setCacheOnly(true);
+    fetch->fetchScope().setCacheOnly(true);
     fetch->fetchScope().setAncestorRetrieval(Akonadi::ItemFetchScope::All);
     fetch->fetchScope().setFetchGid(true);
     fetch->fetchScope().fetchFullPayload(true);


commit c9761baf173a01ce4a1f8e6cfccc7d7b4b45690c
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Tue Jan 6 19:41:22 2015 +0100

    Filter tag items by resource.

diff --git a/resources/kolab/kolabchangeitemstagstask.cpp b/resources/kolab/kolabchangeitemstagstask.cpp
index ae55c7c..00c88e9 100644
--- a/resources/kolab/kolabchangeitemstagstask.cpp
+++ b/resources/kolab/kolabchangeitemstagstask.cpp
@@ -87,7 +87,6 @@ void KolabChangeItemsTagsTask::onTagFetchDone(KJob *job)
 
     Akonadi::ItemFetchJob *fetch = new Akonadi::ItemFetchJob(tags.first());
     // fetch->fetchScope().setCacheOnly(true);
-    // TODO: does the fetch already limit to resource local items?
     fetch->fetchScope().setAncestorRetrieval(Akonadi::ItemFetchScope::All);
     fetch->fetchScope().setFetchGid(true);
     fetch->fetchScope().fetchFullPayload(true);
@@ -104,7 +103,13 @@ void KolabChangeItemsTagsTask::onItemsFetchDone(KJob *job)
         return;
     }
 
-    const Akonadi::Item::List items = static_cast<Akonadi::ItemFetchJob*>(job)->items();
+    Akonadi::Item::List items;
+    //Filter by resource as all other references make no sense
+    Q_FOREACH (const Akonadi::Item &i, static_cast<Akonadi::ItemFetchJob*>(job)->items()) {
+        if (i.parentCollection().resource() == resourceState()->resourceIdentifier()) {
+            items << i;
+        }
+    }
     kDebug() << items.size();
 
     TagChangeHelper *changeHelper = new TagChangeHelper(this);
diff --git a/resources/kolab/kolabchangetagtask.cpp b/resources/kolab/kolabchangetagtask.cpp
index 71bd221..e6b31ad 100644
--- a/resources/kolab/kolabchangetagtask.cpp
+++ b/resources/kolab/kolabchangetagtask.cpp
@@ -39,7 +39,6 @@ void KolabChangeTagTask::startRelationTask(KIMAP::Session *session)
 
     Akonadi::ItemFetchJob *fetch = new Akonadi::ItemFetchJob(resourceState()->tag());
     fetch->fetchScope().setCacheOnly(true);
-    // TODO: does the fetch already limit to resource local items?
     fetch->fetchScope().setAncestorRetrieval(Akonadi::ItemFetchScope::All);
     fetch->fetchScope().fetchFullPayload(true);
     connect(fetch, SIGNAL(result(KJob*)), this, SLOT(onItemsFetchDone(KJob*)));
@@ -53,7 +52,13 @@ void KolabChangeTagTask::onItemsFetchDone(KJob *job)
         return;
     }
 
-    const Akonadi::Item::List items = static_cast<Akonadi::ItemFetchJob*>(job)->items();
+    Akonadi::Item::List items;
+    //Filter by resource as all other references make no sense
+    Q_FOREACH (const Akonadi::Item &i, static_cast<Akonadi::ItemFetchJob*>(job)->items()) {
+        if (i.parentCollection().resource() == resourceState()->resourceIdentifier()) {
+            items << i;
+        }
+    }
 
     TagChangeHelper *changeHelper = new TagChangeHelper(this);
 


commit bcf41a922a5dca5cda8807a1d67ef96c03893186
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Tue Jan 6 18:37:48 2015 +0100

    Create configuration folder if missing.

diff --git a/resources/kolab/kolabrelationresourcetask.cpp b/resources/kolab/kolabrelationresourcetask.cpp
index 3485bf4..95dc03d 100644
--- a/resources/kolab/kolabrelationresourcetask.cpp
+++ b/resources/kolab/kolabrelationresourcetask.cpp
@@ -25,6 +25,9 @@
 
 #include <akonadi/collectionfetchjob.h>
 #include <akonadi/collectionfetchscope.h>
+#include <akonadi/collectioncreatejob.h>
+#include <kimap/createjob.h>
+#include <kimap/setmetadatajob.h>
 
 #include <KDE/KLocalizedString>
 
@@ -73,6 +76,63 @@ void KolabRelationResourceTask::onCollectionFetchResult(KJob *job)
         }
     }
 
-    kDebug() << "Couldn't find collection for relations";
-    cancelTask(i18n("No mailbox for storing relations available, cancelling tag operation."));
+    kDebug() << "Couldn't find collection for relations, creating one.";
+
+    const QChar separator = separatorCharacter();
+    mRelationCollection = Akonadi::Collection();
+    mRelationCollection.setName("Configuration");
+    mRelationCollection.setContentMimeTypes(QStringList() << KolabHelpers::getMimeType(Kolab::ConfigurationType));
+    mRelationCollection.setRemoteId(separator + mRelationCollection.name());
+    const QString newMailBox = "Configuration";
+    KIMAP::CreateJob *imapCreateJob = new KIMAP::CreateJob(mImapSession);
+    imapCreateJob->setMailBox(newMailBox);
+    connect(imapCreateJob, SIGNAL(result(KJob*)),
+            this, SLOT(onCreateDone(KJob*)));
+    imapCreateJob->start();
 }
+
+void KolabRelationResourceTask::onCreateDone(KJob *job)
+{
+    if (job->error()) {
+        kWarning() << "Failed to create configuration folder: " << job->errorString();
+        cancelTask(i18n("Failed to create configuration folder on server"));
+        return;
+    }
+
+    KIMAP::SetMetaDataJob *setMetadataJob = new KIMAP::SetMetaDataJob(mImapSession);
+    if (serverCapabilities().contains(QLatin1String("METADATA"))) {
+        setMetadataJob->setServerCapability(KIMAP::MetaDataJobBase::Metadata);
+    } else {
+        setMetadataJob->setServerCapability(KIMAP::MetaDataJobBase::Annotatemore);
+    }
+    setMetadataJob->setMailBox("Configuration");
+    setMetadataJob->addMetaData("/shared/vendor/kolab/folder-type", "configuration.default");
+    connect(setMetadataJob, SIGNAL(result(KJob*)),
+            this, SLOT(onSetMetaDataDone(KJob*)));
+    setMetadataJob->start();
+}
+
+void KolabRelationResourceTask::onSetMetaDataDone(KJob *job)
+{
+    if (job->error()) {
+        kWarning() << "Failed to write annotations: " << job->errorString();
+        cancelTask(i18n("Failed to write some annotations for '%1' on the IMAP server. %2",
+                        collection().name(), job->errorText()));
+        return;
+    }
+
+    Akonadi::CollectionCreateJob *createJob = new Akonadi::CollectionCreateJob(mRelationCollection, this);
+    connect(createJob, SIGNAL(result(KJob*)), this, SLOT(onLocalCreateDone(KJob*)));
+}
+
+void KolabRelationResourceTask::onLocalCreateDone(KJob *job)
+{
+    if (job->error()) {
+        kWarning() << "Failed to create local folder: " << job->errorString();
+        cancelTask(i18n("Failed to create configuration folder"));
+        return;
+    }
+    mRelationCollection = static_cast<Akonadi::CollectionCreateJob*>(job)->collection();
+    startRelationTask(mImapSession);
+}
+
diff --git a/resources/kolab/kolabrelationresourcetask.h b/resources/kolab/kolabrelationresourcetask.h
index 51707da..f947aad 100644
--- a/resources/kolab/kolabrelationresourcetask.h
+++ b/resources/kolab/kolabrelationresourcetask.h
@@ -48,6 +48,9 @@ private:
 
 private Q_SLOTS:
     void onCollectionFetchResult(KJob *job);
+    void onCreateDone(KJob *job);
+    void onSetMetaDataDone(KJob *job);
+    void onLocalCreateDone(KJob *job);
 };
 
 #endif // KOLABRELATIONRESOURCETASK_H




More information about the commits mailing list