Branch 'kolab/integration/4.13.0' - 7 commits - resources/imap resources/kolab

Christian Mollekopf mollekopf at kolabsys.com
Fri Sep 5 10:39:04 CEST 2014


 resources/imap/collectionmetadatahelper.cpp      |    8 +--
 resources/kolab/kolabrelationresourcetask.cpp    |    1 
 resources/kolab/kolabresource.cpp                |    1 
 resources/kolab/kolabretrievecollectionstask.cpp |   53 ++++++++++++++++-------
 resources/kolab/kolabretrievecollectionstask.h   |    9 +++
 resources/kolab/kolabretrievetagstask.cpp        |    2 
 6 files changed, 53 insertions(+), 21 deletions(-)

New commits:
commit 9afbbcf055ae26e01c0bcca1d47e4faffa14ad02
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Thu Sep 4 22:42:40 2014 +0200

    Kolab-Resource: Don't clear subscribed mailboxes so we have them available to retrieve metadata.

diff --git a/resources/kolab/kolabretrievecollectionstask.cpp b/resources/kolab/kolabretrievecollectionstask.cpp
index 44b417f..04ce514 100644
--- a/resources/kolab/kolabretrievecollectionstask.cpp
+++ b/resources/kolab/kolabretrievecollectionstask.cpp
@@ -55,6 +55,11 @@ RetrieveMetadataJob::RetrieveMetadataJob(KIMAP::Session *session, const QStringL
 
 void RetrieveMetadataJob::start()
 {
+    //Fill the map with empty entires so we set the mimetype to mail if no metadata is retrieved
+    Q_FOREACH (const QString &mailbox, mMailboxes) {
+        mMetadata.insert(mailbox, QMap<QByteArray, QByteArray>());
+    }
+
     QSet<QString> toplevelMailboxes;
     Q_FOREACH (const QString &mailbox, mMailboxes) {
         const QStringList parts = mailbox.split(mSeparator);
@@ -368,8 +373,6 @@ void KolabRetrieveCollectionsTask::createCollection(const QString &mailbox, cons
 
     // kDebug() << "creating collection " << mailbox << " with parent " << parentPath;
     mMailCollections.insert(mailbox, c);
-    //This is no longer required
-    mSubscribedMailboxes.remove(mailbox);
 }
 
 void KolabRetrieveCollectionsTask::onMailBoxesReceiveDone(KJob* job)
@@ -382,10 +385,7 @@ void KolabRetrieveCollectionsTask::onMailBoxesReceiveDone(KJob* job)
     } else {
         QSet<QString> personalMailboxes;
         Q_FOREACH(const QString &mailbox, mMailCollections.keys()) {
-            if (!isNamespaceFolder(mailbox, resourceState()->userNamespaces() + resourceState()->sharedNamespaces())) {
-                if (mailbox.isEmpty()) {
-                    continue;
-                }
+            if (!mailbox.isEmpty() && !isNamespaceFolder(mailbox, resourceState()->userNamespaces() + resourceState()->sharedNamespaces())) {
                 personalMailboxes << mailbox;
             }
         }


commit f7889d8d063023aa1d7badf2605eb52373739799
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Thu Sep 4 22:41:08 2014 +0200

    Limit collectionfetch by resource.

diff --git a/resources/kolab/kolabrelationresourcetask.cpp b/resources/kolab/kolabrelationresourcetask.cpp
index 55596e7..aa57b79 100644
--- a/resources/kolab/kolabrelationresourcetask.cpp
+++ b/resources/kolab/kolabrelationresourcetask.cpp
@@ -50,6 +50,7 @@ void KolabRelationResourceTask::doStart(KIMAP::Session *session)
     topLevelCollection.setParentCollection(Akonadi::Collection::root());
 
     Akonadi::CollectionFetchJob *fetchJob = new Akonadi::CollectionFetchJob(topLevelCollection, Akonadi::CollectionFetchJob::Recursive);
+    fetchJob->fetchScope().setResource(resourceState()->resourceIdentifier());
     fetchJob->fetchScope().setContentMimeTypes(QStringList() << KolabHelpers::getMimeType(Kolab::ConfigurationType));
     fetchJob->fetchScope().setAncestorRetrieval(Akonadi::CollectionFetchScope::All);
     fetchJob->fetchScope().setListFilter(Akonadi::CollectionFetchScope::NoFilter);


commit 4aabe17fb8747976f3669470f96c3f3b6862f7e4
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Wed Sep 3 14:25:41 2014 +0200

    Kolab-Resource: per collection setKeepLocalChanges, implicit string sharing, and retrieval of metadata for all subscribred collections.
    
    Since we only retrieve myrights, we have to treat it as a default value too.
    Otherwise we're changing the attribute back an forth. Further we also have to treat
    collectionannotations as default value since we only retrieve the folder-type part.

diff --git a/resources/kolab/kolabresource.cpp b/resources/kolab/kolabresource.cpp
index 509bacb..2e8abf2 100644
--- a/resources/kolab/kolabresource.cpp
+++ b/resources/kolab/kolabresource.cpp
@@ -74,7 +74,6 @@ void KolabResource::retrieveCollections()
 {
     emit status(AgentBase::Running, i18nc("@info:status", "Retrieving folders"));
 
-    setKeepLocalCollectionChanges(QSet<QByteArray>() << "CONTENTMIMETYPES" << "AccessRights");
     startTask(new KolabRetrieveCollectionsTask(createResourceState(TaskArguments()), this));
     synchronizeTags();
 }
diff --git a/resources/kolab/kolabretrievecollectionstask.cpp b/resources/kolab/kolabretrievecollectionstask.cpp
index f7415c1..44b417f 100644
--- a/resources/kolab/kolabretrievecollectionstask.cpp
+++ b/resources/kolab/kolabretrievecollectionstask.cpp
@@ -143,8 +143,15 @@ void RetrieveMetadataJob::checkDone()
 }
 
 KolabRetrieveCollectionsTask::KolabRetrieveCollectionsTask(ResourceStateInterface::Ptr resource, QObject* parent)
-    : ResourceTask(CancelIfNoSession, resource, parent),
-    mJobs(0)
+    : ResourceTask(CancelIfNoSession, resource, parent)
+    , mJobs(0)
+    , cContentMimeTypes("CONTENTMIMETYPES")
+    , cAccessRights("AccessRights")
+    , cImapAcl("imapacl")
+    , cCollectionAnnotations("collectionannotations")
+    , cDefaultKeepLocalChanges(QSet<QByteArray>() << cContentMimeTypes << cAccessRights << cImapAcl << cCollectionAnnotations)
+    , cDefaultMimeTypes(QStringList() << Akonadi::Collection::mimeType() << QLatin1String("application/x-kolab-objects"))
+    , cCollectionOnlyContentMimeTypes(QStringList() << Akonadi::Collection::mimeType())
 {
     mRequestedMetadata << "/shared/vendor/kolab/folder-type";
     mRequestedMetadata << "/private/vendor/kolab/folder-type";
@@ -319,7 +326,10 @@ void KolabRetrieveCollectionsTask::createCollection(const QString &mailbox, cons
     const QStringList parentPath = pathParts.mid(0, pathParts.size() - 1);
     const Akonadi::Collection parentCollection = getOrCreateParent(parentPath.join(separator));
     c.setParentCollection(parentCollection);
-    c.setContentMimeTypes(QStringList() << Akonadi::Collection::mimeType() << KMime::Message::mimeType());
+    //TODO get from ResourceState, and add KMime::Message::mimeType() for the normal imap resource by default
+    //We add a dummy mimetype, otherwise the itemsync doesn't even work (action is disabled and resourcebase aborts the operation)
+    c.setContentMimeTypes(cDefaultMimeTypes);
+    c.setKeepLocalChanges(cDefaultKeepLocalChanges);
 
     //assume LRS, until myrights is executed
     if (serverCapabilities().contains(QLatin1String("ACL"))) {
@@ -341,7 +351,7 @@ void KolabRetrieveCollectionsTask::createCollection(const QString &mailbox, cons
     // If this folder is a noselect folder, make some special settings.
     if (currentFlags.contains("\\noselect")) {
         c.addAttribute(new NoSelectAttribute(true));
-        c.setContentMimeTypes(QStringList() << Akonadi::Collection::mimeType());
+        c.setContentMimeTypes(cCollectionOnlyContentMimeTypes);
         c.setRights( Akonadi::Collection::ReadOnly );
     } else {
         // remove the noselect attribute explicitly, in case we had set it before (eg. for non-subscribed non-leaf folders)
@@ -370,7 +380,7 @@ void KolabRetrieveCollectionsTask::onMailBoxesReceiveDone(KJob* job)
     if (job->error()) {
         cancelTask(job->errorString());
     } else {
-        QStringList personalMailboxes;
+        QSet<QString> personalMailboxes;
         Q_FOREACH(const QString &mailbox, mMailCollections.keys()) {
             if (!isNamespaceFolder(mailbox, resourceState()->userNamespaces() + resourceState()->sharedNamespaces())) {
                 if (mailbox.isEmpty()) {
@@ -379,8 +389,9 @@ void KolabRetrieveCollectionsTask::onMailBoxesReceiveDone(KJob* job)
                 personalMailboxes << mailbox;
             }
         }
+        const QStringList metadataMailboxes = personalMailboxes.unite( mSubscribedMailboxes.toList().toSet()).toList();
 
-        RetrieveMetadataJob *metadata = new RetrieveMetadataJob(mSession, personalMailboxes, serverCapabilities(), mRequestedMetadata, separatorCharacter(), this);
+        RetrieveMetadataJob *metadata = new RetrieveMetadataJob(mSession, metadataMailboxes, serverCapabilities(), mRequestedMetadata, separatorCharacter(), this);
         connect(metadata, SIGNAL(result(KJob*)), this, SLOT(onMetadataRetrieved(KJob*)));
         mJobs++;
         metadata->start();
@@ -430,6 +441,9 @@ void KolabRetrieveCollectionsTask::applyMetadata(QHash<QString, QMap<QByteArray,
             const QByteArray type = KolabHelpers::getFolderTypeAnnotation(metadata);
             const Kolab::FolderType folderType = KolabHelpers::folderTypeFromString(type);
             collection.setContentMimeTypes(KolabHelpers::getContentMimeTypes(folderType));
+            QSet<QByteArray> keepLocalChanges = collection.keepLocalChanges();
+            keepLocalChanges.remove(cContentMimeTypes);
+            collection.setKeepLocalChanges(keepLocalChanges);
         }
     }
 }
diff --git a/resources/kolab/kolabretrievecollectionstask.h b/resources/kolab/kolabretrievecollectionstask.h
index 53f11db..b3d9c0e 100644
--- a/resources/kolab/kolabretrievecollectionstask.h
+++ b/resources/kolab/kolabretrievecollectionstask.h
@@ -63,6 +63,14 @@ private:
     QSet<QByteArray> mRequestedMetadata;
     KIMAP::Session *mSession;
     QTime mTime;
+    //For implicit sharing
+    const QByteArray cContentMimeTypes;
+    const QByteArray cAccessRights;
+    const QByteArray cImapAcl;
+    const QByteArray cCollectionAnnotations;
+    const QSet<QByteArray> cDefaultKeepLocalChanges;
+    const QStringList cDefaultMimeTypes;
+    const QStringList cCollectionOnlyContentMimeTypes;
 };
 
 class RetrieveMetadataJob : public KJob


commit afc33f34f168c681db0a5a0126b4edbd676f1cea
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Wed Sep 3 12:57:03 2014 +0200

    Revert "Don't keep local mimetypes and access rights."
    
    This reverts commit 54f081b869c53f28914554de7c4550c1ae1d65d3.
    
    Because we only fetch the attributes for folders in the local namespace,
    and we can't selectively ignore updates, this won't actually work.

diff --git a/resources/kolab/kolabresource.cpp b/resources/kolab/kolabresource.cpp
index dd25447..509bacb 100644
--- a/resources/kolab/kolabresource.cpp
+++ b/resources/kolab/kolabresource.cpp
@@ -73,6 +73,8 @@ ResourceStateInterface::Ptr KolabResource::createResourceState(const TaskArgumen
 void KolabResource::retrieveCollections()
 {
     emit status(AgentBase::Running, i18nc("@info:status", "Retrieving folders"));
+
+    setKeepLocalCollectionChanges(QSet<QByteArray>() << "CONTENTMIMETYPES" << "AccessRights");
     startTask(new KolabRetrieveCollectionsTask(createResourceState(TaskArguments()), this));
     synchronizeTags();
 }


commit e0f5ee1f392fad87c80e7b0db94640c20144f7c8
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Wed Sep 3 11:54:28 2014 +0200

    Kolab-Resource: Set the right mimetypes during collectionsync.
    
    Otherwise we go back and forth between what is retrieved with the collections
    and what is retrieved while during the metadatatask.

diff --git a/resources/kolab/kolabretrievecollectionstask.cpp b/resources/kolab/kolabretrievecollectionstask.cpp
index 7d1ba81..f7415c1 100644
--- a/resources/kolab/kolabretrievecollectionstask.cpp
+++ b/resources/kolab/kolabretrievecollectionstask.cpp
@@ -319,9 +319,7 @@ void KolabRetrieveCollectionsTask::createCollection(const QString &mailbox, cons
     const QStringList parentPath = pathParts.mid(0, pathParts.size() - 1);
     const Akonadi::Collection parentCollection = getOrCreateParent(parentPath.join(separator));
     c.setParentCollection(parentCollection);
-    //TODO get from ResourceState, and add KMime::Message::mimeType() for the normal imap resource by default
-    //We add a dummy mimetype, otherwise the itemsync doesn't even work (action is disabled and resourcebase aborts the operation)
-    c.setContentMimeTypes(QStringList() << Akonadi::Collection::mimeType() << QLatin1String("application/x-kolab-objects"));
+    c.setContentMimeTypes(QStringList() << Akonadi::Collection::mimeType() << KMime::Message::mimeType());
 
     //assume LRS, until myrights is executed
     if (serverCapabilities().contains(QLatin1String("ACL"))) {
@@ -429,6 +427,9 @@ void KolabRetrieveCollectionsTask::applyMetadata(QHash<QString, QMap<QByteArray,
             Akonadi::Collection &collection = mMailCollections[mailbox];
             // kDebug() << "setting metadata: " << mailbox << metadata;
             collection.attribute<Akonadi::CollectionAnnotationsAttribute>(Akonadi::Collection::AddIfMissing)->setAnnotations(metadata);
+            const QByteArray type = KolabHelpers::getFolderTypeAnnotation(metadata);
+            const Kolab::FolderType folderType = KolabHelpers::folderTypeFromString(type);
+            collection.setContentMimeTypes(KolabHelpers::getContentMimeTypes(folderType));
         }
     }
 }


commit 26d28d93c80f4ccb2ffde6d7de2cac0ae4fe0c87
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Wed Sep 3 11:53:33 2014 +0200

    KolabRetretrieveTagTask: Fetch the right interval

diff --git a/resources/kolab/kolabretrievetagstask.cpp b/resources/kolab/kolabretrievetagstask.cpp
index 0b55c5e..8a04d09 100644
--- a/resources/kolab/kolabretrievetagstask.cpp
+++ b/resources/kolab/kolabretrievetagstask.cpp
@@ -55,7 +55,7 @@ void KolabRetrieveTagTask::onFinalSelectDone(KJob *job)
     KIMAP::FetchJob *fetch = new KIMAP::FetchJob(select->session());
 
     KIMAP::ImapSet set;
-    set.add(KIMAP::ImapInterval(1));
+    set.add(KIMAP::ImapInterval(1, 0));
     fetch->setSequenceSet(set);
     fetch->setUidBased(false);
 


commit 8dd7bbdd4e2a9109c040e4c89449dc2ece87b315
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Wed Sep 3 11:53:04 2014 +0200

    Kolab-Resource: Debug output

diff --git a/resources/imap/collectionmetadatahelper.cpp b/resources/imap/collectionmetadatahelper.cpp
index 92eefbc..c0035aa 100644
--- a/resources/imap/collectionmetadatahelper.cpp
+++ b/resources/imap/collectionmetadatahelper.cpp
@@ -76,10 +76,10 @@ bool CollectionMetadataHelper::applyRights(Akonadi::Collection &collection, cons
         accessRevoked = true;
     }
 
-    kDebug(5327) << collection.remoteId()
-                << "imapRights:" << imapRights
-                << "newRights:" << newRights
-                << "oldRights:" << collection.rights();
+    // kDebug(5327) << collection.remoteId()
+    //             << "imapRights:" << imapRights
+    //             << "newRights:" << newRights
+    //             << "oldRights:" << collection.rights();
 
     if (newRights != collection.rights()) {
         collection.setRights(newRights);
diff --git a/resources/kolab/kolabretrievecollectionstask.cpp b/resources/kolab/kolabretrievecollectionstask.cpp
index cec9ebc..7d1ba81 100644
--- a/resources/kolab/kolabretrievecollectionstask.cpp
+++ b/resources/kolab/kolabretrievecollectionstask.cpp
@@ -157,6 +157,8 @@ KolabRetrieveCollectionsTask::~KolabRetrieveCollectionsTask()
 
 void KolabRetrieveCollectionsTask::doStart(KIMAP::Session *session)
 {
+    kDebug() << "Starting collection retrieval";
+    mTime.start();
     mSession = session;
 
     Akonadi::Collection root;
@@ -356,7 +358,7 @@ void KolabRetrieveCollectionsTask::createCollection(const QString &mailbox, cons
     }
     c.setEnabled(isSubscribed);
 
-    kDebug() << "creating collection " << mailbox << " with parent " << parentPath;
+    // kDebug() << "creating collection " << mailbox << " with parent " << parentPath;
     mMailCollections.insert(mailbox, c);
     //This is no longer required
     mSubscribedMailboxes.remove(mailbox);
@@ -364,6 +366,8 @@ void KolabRetrieveCollectionsTask::createCollection(const QString &mailbox, cons
 
 void KolabRetrieveCollectionsTask::onMailBoxesReceiveDone(KJob* job)
 {
+    kDebug() << "All mailboxes received: " << mTime.elapsed();
+    kDebug() << "in total: " << mMailCollections.size();
     mJobs--;
     if (job->error()) {
         cancelTask(job->errorString());
@@ -418,12 +422,12 @@ void KolabRetrieveCollectionsTask::applyRights(QHash<QString, KIMAP::Acl::Rights
 
 void KolabRetrieveCollectionsTask::applyMetadata(QHash<QString, QMap<QByteArray, QByteArray> > metadataMap)
 {
-    kDebug() << metadataMap;
+    // kDebug() << metadataMap;
     Q_FOREACH(const QString &mailbox, metadataMap.keys()) {
         const QMap<QByteArray, QByteArray> metadata  = metadataMap.value(mailbox);
         if (mMailCollections.contains(mailbox)) {
             Akonadi::Collection &collection = mMailCollections[mailbox];
-            kDebug() << "setting metadata: " << mailbox << metadata;
+            // kDebug() << "setting metadata: " << mailbox << metadata;
             collection.attribute<Akonadi::CollectionAnnotationsAttribute>(Akonadi::Collection::AddIfMissing)->setAnnotations(metadata);
         }
     }
@@ -431,7 +435,7 @@ void KolabRetrieveCollectionsTask::applyMetadata(QHash<QString, QMap<QByteArray,
 
 void KolabRetrieveCollectionsTask::onMetadataRetrieved(KJob *job)
 {
-    kDebug();
+    kDebug() << mTime.elapsed();
     mJobs--;
     if (job->error()) {
         kWarning() << job->errorString();
@@ -448,6 +452,7 @@ void KolabRetrieveCollectionsTask::checkDone()
 {
     if (!mJobs) {
         collectionsRetrieved(mMailCollections.values());
+        kDebug() << "done " <<  mTime.elapsed();
     }
 }
 
@@ -462,6 +467,7 @@ void KolabRetrieveCollectionsTask::onFullMailBoxesReceived(const QList< KIMAP::M
 
 void KolabRetrieveCollectionsTask::onFullMailBoxesReceiveDone(KJob* job)
 {
+    kDebug() << "received subscribed collections " <<  mTime.elapsed();
     mJobs--;
     if (job->error()) {
         cancelTask(job->errorString());
diff --git a/resources/kolab/kolabretrievecollectionstask.h b/resources/kolab/kolabretrievecollectionstask.h
index 6e568f4..53f11db 100644
--- a/resources/kolab/kolabretrievecollectionstask.h
+++ b/resources/kolab/kolabretrievecollectionstask.h
@@ -62,6 +62,7 @@ private:
     QSet<QString> mSubscribedMailboxes;
     QSet<QByteArray> mRequestedMetadata;
     KIMAP::Session *mSession;
+    QTime mTime;
 };
 
 class RetrieveMetadataJob : public KJob




More information about the commits mailing list