Branch 'feature/remoterelationsyc' - 2 commits - resources/imap resources/kolab

Aaron Seigo seigo at kolabsys.com
Wed Nov 5 15:59:20 CET 2014


 resources/imap/resourcestate.cpp            |    6 +
 resources/imap/resourcestate.h              |    1 
 resources/imap/resourcestateinterface.h     |    1 
 resources/imap/tests/dummyresourcestate.cpp |    5 +
 resources/imap/tests/dummyresourcestate.h   |    1 
 resources/kolab/kolabretrievetagstask.cpp   |  111 +++++++++++++++++-----------
 resources/kolab/kolabretrievetagstask.h     |   10 ++
 7 files changed, 92 insertions(+), 43 deletions(-)

New commits:
commit 0d296bb92ee2f06cd24b96d2ee04d29cf3cf09c9
Author: Aaron Seigo <aseigo at kde.org>
Date:   Wed Nov 5 15:57:51 2014 +0100

    refactor out tag extraction and add relation extraction

diff --git a/resources/kolab/kolabretrievetagstask.cpp b/resources/kolab/kolabretrievetagstask.cpp
index c2ab6fb..43e540d 100644
--- a/resources/kolab/kolabretrievetagstask.cpp
+++ b/resources/kolab/kolabretrievetagstask.cpp
@@ -101,55 +101,71 @@ void KolabRetrieveTagTask::onHeadersReceived(const QString &mailBox,
         const KMime::Message::Ptr msg = messages[number];
         const Kolab::KolabObjectReader reader(msg);
         switch (reader.getType()) {
-            case Kolab::RelationConfigurationObject: {
-                Akonadi::Tag tag = reader.getTag();
-                tag.setRemoteId(QByteArray::number(uids[number]));
-                mTags << tag;
-
-                Akonadi::Item::List members;
-                Q_FOREACH (const QString &memberUrl, reader.getTagMembers()) {
-                    Kolab::RelationMember member = Kolab::parseMemberUrl(memberUrl);
-                    //TODO should we create a dummy item if it isn't yet available?
-                    Akonadi::Item i;
-                    if (!member.gid.isEmpty()) {
-                        //Reference by GID
-                        i.setGid(member.gid);
-                    } else {
-                        //Reference by imap uid
-                        if (member.uid < 0) {
-                            kWarning() << "Failed to parse uid: " << memberUrl;
-                            continue;
-                        }
-                        i.setRemoteId(QString::number(member.uid));
-                        kDebug() << "got member: " << member.uid << member.mailbox;
-                        Akonadi::Collection parent;
-                        {
-                            //The root collection is not part of the mailbox path
-                            Akonadi::Collection col;
-                            col.setRemoteId(rootRemoteId());
-                            col.setParentCollection(Akonadi::Collection::root());
-                            parent = col;
-                        }
-                        Q_FOREACH(const QByteArray part, member.mailbox) {
-                            Akonadi::Collection col;
-                            col.setRemoteId(separatorCharacter() + QString::fromLatin1(part));
-                            col.setParentCollection(parent);
-                            parent = col;
-                        }
-                        i.setParentCollection(parent);
-                    }
-                    //TODO implement fallback to search if uid is not available
-                    members << i;
+            case Kolab::RelationConfigurationObject:
+                if (reader.isTag()) {
+                    extractTag(reader, uids[number]);
+                } else if (reader.isRelation()) {
+                    extractRelation(reader, uids[number]);
                 }
-                mTagMembers.insert(QString::fromLatin1(tag.remoteId()), members);
-            }
                 break;
+
             default:
                 break;
         }
     }
 }
 
+void KolabRetrieveTagTask::extractTag(const Kolab::KolabObjectReader &reader, qint64 remoteUid)
+{
+    Akonadi::Tag tag = reader.getTag();
+    tag.setRemoteId(QByteArray::number(remoteUid));
+    mTags << tag;
+
+    Akonadi::Item::List members;
+    Q_FOREACH (const QString &memberUrl, reader.getTagMembers()) {
+        Kolab::RelationMember member = Kolab::parseMemberUrl(memberUrl);
+        //TODO should we create a dummy item if it isn't yet available?
+        Akonadi::Item i;
+        if (!member.gid.isEmpty()) {
+            //Reference by GID
+            i.setGid(member.gid);
+        } else {
+            //Reference by imap uid
+            if (member.uid < 0) {
+                kWarning() << "Failed to parse uid: " << memberUrl;
+                continue;
+            }
+            i.setRemoteId(QString::number(member.uid));
+            kDebug() << "got member: " << member.uid << member.mailbox;
+            Akonadi::Collection parent;
+            {
+                //The root collection is not part of the mailbox path
+                Akonadi::Collection col;
+                col.setRemoteId(rootRemoteId());
+                col.setParentCollection(Akonadi::Collection::root());
+                parent = col;
+            }
+            Q_FOREACH(const QByteArray part, member.mailbox) {
+                Akonadi::Collection col;
+                col.setRemoteId(separatorCharacter() + QString::fromLatin1(part));
+                col.setParentCollection(parent);
+                parent = col;
+            }
+            i.setParentCollection(parent);
+        }
+        //TODO implement fallback to search if uid is not available
+        members << i;
+    }
+    mTagMembers.insert(QString::fromLatin1(tag.remoteId()), members);
+}
+
+void KolabRetrieveTagTask::extractRelation(const Kolab::KolabObjectReader &reader, qint64 remoteUid)
+{
+    Akonadi::Relation relation = reader.getRelation();
+    relation.setRemoteId(QByteArray::number(remoteUid));
+    mRelations << relation;
+}
+
 void KolabRetrieveTagTask::onHeadersFetchDone(KJob *job)
 {
     if (job->error()) {
@@ -157,8 +173,17 @@ void KolabRetrieveTagTask::onHeadersFetchDone(KJob *job)
         cancelTask(job->errorString());
         return;
     }
-    kDebug() << "Fetched tags: " << mTags.size() << mTagMembers.keys().size();
-    resourceState()->tagsRetrieved(mTags, mTagMembers);
+
+    if (!mTags.isEmpty() || !mTagMembers.isEmpty()) {
+        kDebug() << "Fetched tags: " << mTags.size() << mTagMembers.keys().size();
+        resourceState()->tagsRetrieved(mTags, mTagMembers);
+    }
+
+    if (!mRelations.isEmpty()) {
+        kDebug() << "Fetched relations:" << mRelations.size();
+        resourceState()->relationsRetrieved(mRelations);
+    }
+
     deleteLater();
 }
 
diff --git a/resources/kolab/kolabretrievetagstask.h b/resources/kolab/kolabretrievetagstask.h
index d790dbd..0dab163 100644
--- a/resources/kolab/kolabretrievetagstask.h
+++ b/resources/kolab/kolabretrievetagstask.h
@@ -23,6 +23,11 @@
 #include "kolabrelationresourcetask.h"
 #include <akonadi/tag.h>
 
+namespace Kolab
+{
+    class KolabObjectReader;
+} // namespace Kolab
+
 class KolabRetrieveTagTask : public KolabRelationResourceTask
 {
     Q_OBJECT
@@ -36,6 +41,7 @@ private:
     KIMAP::Session *mSession;
     Akonadi::Tag::List mTags;
     QHash<QString, Akonadi::Item::List> mTagMembers;
+    Akonadi::Relation::List mRelations;
 
 private Q_SLOTS:
     // void onItemsFetchDone(KJob *job);
@@ -48,6 +54,10 @@ private Q_SLOTS:
                             const QMap<qint64, KIMAP::MessagePtr> &messages);
     void onHeadersFetchDone(KJob *job);
 
+private:
+    void extractTag(const Kolab::KolabObjectReader &reader, qint64 remoteUid);
+    void extractRelation(const Kolab::KolabObjectReader &reader, qint64 remoteUid);
+
     // void onApplyCollectionChanged(const Akonadi::Collection &collection);
     // void onCancelTask(const QString &errorText);
     // void onChangeCommitted();


commit 37601f0bf9a4435202b8e51bb94a70d64e3fb152
Author: Aaron Seigo <aseigo at kde.org>
Date:   Wed Nov 5 15:57:19 2014 +0100

    add a relationsRetrieved method

diff --git a/resources/imap/resourcestate.cpp b/resources/imap/resourcestate.cpp
index b2460c4..fa6289c 100644
--- a/resources/imap/resourcestate.cpp
+++ b/resources/imap/resourcestate.cpp
@@ -418,3 +418,9 @@ void ResourceState::tagsRetrieved( const Akonadi::Tag::List &tags, const QHash<Q
 {
   m_resource->tagsRetrieved(tags, tagMembers);
 }
+
+
+void ResourceState::relationsRetrieved(const Akonadi::Relation::List &relations)
+{
+  m_resource->relationsRetrieved(relations);
+}
diff --git a/resources/imap/resourcestate.h b/resources/imap/resourcestate.h
index 9588be5..9e00562 100644
--- a/resources/imap/resourcestate.h
+++ b/resources/imap/resourcestate.h
@@ -120,6 +120,7 @@ public:
   virtual void collectionsRetrieved( const Akonadi::Collection::List &collections );
 
   virtual void tagsRetrieved( const Akonadi::Tag::List &tags, const QHash<QString, Akonadi::Item::List> & );
+  virtual void relationsRetrieved( const Akonadi::Relation::List &tags);
 
   virtual void collectionChangeCommitted( const Akonadi::Collection &collection );
 
diff --git a/resources/imap/resourcestateinterface.h b/resources/imap/resourcestateinterface.h
index d920199..82ea2e1 100644
--- a/resources/imap/resourcestateinterface.h
+++ b/resources/imap/resourcestateinterface.h
@@ -120,6 +120,7 @@ public:
 
   virtual MessageHelper::Ptr messageHelper() const = 0;
   virtual void tagsRetrieved( const Akonadi::Tag::List &tags, const QHash<QString, Akonadi::Item::List> & ) = 0;
+  virtual void relationsRetrieved( const Akonadi::Relation::List &tags) = 0;
 
   virtual Akonadi::Relation::List addedRelations() const = 0;
   virtual Akonadi::Relation::List removedRelations() const = 0;
diff --git a/resources/imap/tests/dummyresourcestate.cpp b/resources/imap/tests/dummyresourcestate.cpp
index 0e554e7..753099b 100644
--- a/resources/imap/tests/dummyresourcestate.cpp
+++ b/resources/imap/tests/dummyresourcestate.cpp
@@ -332,6 +332,11 @@ void DummyResourceState::tagsRetrieved( const Akonadi::Tag::List &tags, const QH
   recordCall( "tagsRetrieved",  QVariant::fromValue( qMakePair(tags, items) ) );
 }
 
+void DummyResourceState::relationsRetrieved( const Akonadi::Relation::List &relations )
+{
+  recordCall( "relationsRetrieved",  QVariant::fromValue( relations ) );
+}
+
 void DummyResourceState::tagChangeCommitted(const Akonadi::Tag &tag)
 {
   recordCall( "tagChangeCommitted", QVariant::fromValue( tag ) );
diff --git a/resources/imap/tests/dummyresourcestate.h b/resources/imap/tests/dummyresourcestate.h
index ba80a4c..0aa5317 100644
--- a/resources/imap/tests/dummyresourcestate.h
+++ b/resources/imap/tests/dummyresourcestate.h
@@ -119,6 +119,7 @@ public:
   virtual void collectionChangeCommitted( const Akonadi::Collection &collection );
 
   virtual void tagsRetrieved( const Akonadi::Tag::List &tags, const QHash<QString, Akonadi::Item::List> & );
+  virtual void relationsRetrieved( const Akonadi::Relation::List &tags );
   virtual void tagChangeCommitted( const Akonadi::Tag &tag );
 
   virtual void searchFinished( const QVector<qint64> &result, bool isRid = true );




More information about the commits mailing list