2 commits - kolabformat/kolabobject.cpp kolabformat/kolabobject.h tests/kolabobjecttest.cpp

Christian Mollekopf mollekopf at kolabsys.com
Fri Oct 31 10:29:33 CET 2014


 kolabformat/kolabobject.cpp |  110 ++++++++++++++++++++++++++++++++++----------
 kolabformat/kolabobject.h   |    5 ++
 tests/kolabobjecttest.cpp   |   38 ++++++++++++++-
 3 files changed, 127 insertions(+), 26 deletions(-)

New commits:
commit 7746f2d0e206074964660143626d92c438525461
Author: Christian Mollekopf <mollekopf at kolabsys.com>
Date:   Wed Oct 29 22:22:24 2014 +0100

    Tag: support for gid members and shared folder members.

diff --git a/kolabformat/kolabobject.cpp b/kolabformat/kolabobject.cpp
index 3cf3f86..cc50d9e 100644
--- a/kolabformat/kolabobject.cpp
+++ b/kolabformat/kolabobject.cpp
@@ -64,13 +64,22 @@ KCalCore::Event::Ptr readV2EventXML(const QByteArray& xmlData, QStringList& atta
 
 RelationMember parseMemberUrl(const QString &string)
 {
-    RelationMember member;
+    if (string.startsWith("urn:uuid:")) {
+        RelationMember member;
+        member.gid = string.mid(9);
+        return member;
+    }
     QUrl url(QUrl::fromPercentEncoding(string.toLatin1()));
     QList<QByteArray> path = url.encodedPath().split('/');
     // qDebug() << path;
+    bool isShared = false;
     int start = path.indexOf("user");
     if (start < 0) {
-        Warning() << "Couldn't find \"user\" in path: " << path;
+        start = path.indexOf("shared");
+        isShared = true;
+    }
+    if (start < 0) {
+        Warning() << "Couldn't find \"user\" or \"shared\" in path: " << path;
         return RelationMember();
     }
     path = path.mid(start + 1);
@@ -78,8 +87,10 @@ RelationMember parseMemberUrl(const QString &string)
         Warning() << "Incomplete path: " << path;
         return RelationMember();
     }
-    // user-name
-    path.removeFirst();
+    RelationMember member;
+    if (!isShared) {
+        member.user = path.takeFirst();
+    }
     member.uid = path.takeLast().toLong();
     member.mailbox = path;
     member.messageId = url.queryItemValue("message-id");
@@ -101,11 +112,18 @@ static QByteArray join(const QList<QByteArray> &list, const QByteArray &c)
 
 KOLAB_EXPORT QString generateMemberUrl(const RelationMember &member)
 {
+    if (!member.gid.isEmpty()) {
+        return QString("urn:uuid:%1").arg(member.gid);
+    }
     QUrl url;
     url.setScheme("imap");
     QList<QByteArray> path;
-    path << "user";
-    path << "localuser at localhost";
+    if (!member.user.isEmpty()) {
+        path << "user";
+        path << member.user.toLatin1();
+    } else {
+        path << "shared";
+    }
     path << member.mailbox;
     path << QByteArray::number(member.uid);
     url.setPath("/" + join(path, "/"));
diff --git a/kolabformat/kolabobject.h b/kolabformat/kolabobject.h
index 0b56fe8..dff7a6b 100644
--- a/kolabformat/kolabobject.h
+++ b/kolabformat/kolabobject.h
@@ -51,6 +51,7 @@ struct KOLAB_EXPORT RelationMember {
     QList<QByteArray> mailbox;
     QString user;
     qint64 uid;
+    QString gid;
 };
 KOLAB_EXPORT RelationMember parseMemberUrl(const QString &url);
 KOLAB_EXPORT QString generateMemberUrl(const RelationMember &url);
diff --git a/tests/kolabobjecttest.cpp b/tests/kolabobjecttest.cpp
index f57ce1d..cad5f47 100644
--- a/tests/kolabobjecttest.cpp
+++ b/tests/kolabobjecttest.cpp
@@ -83,15 +83,14 @@ void KolabObjectTest::dontCrashWithEmptyIncidence()
 void KolabObjectTest::parseRelationMembers()
 {
     {
-        // QString memberString("imap:///user/jan.aachen%40lhm.klab.cc/INBOX/20?message-id=%3Cf06aa3345a25005380b47547ad161d36%40lhm.klab.cc%3E&date=Tue%2C+12+Aug+2014+20%3A42%3A59+%2B0200&subject=Re%3A+test");
         QString memberString("imap:///user/jan.aachen%40lhm.klab.cc/INBOX/20?message-id=%3Cf06aa3345a25005380b47547ad161d36%40lhm.klab.cc%3E&date=Tue%2C+12+Aug+2014+20%3A42%3A59+%2B0200&subject=Re%3A+test");
         Kolab::RelationMember member = Kolab::parseMemberUrl(memberString);
 
-
         const QString result = Kolab::generateMemberUrl(member);
         qDebug() << result;
     }
 
+    //user namespace by uid
     {
 
         Kolab::RelationMember member;
@@ -106,6 +105,41 @@ void KolabObjectTest::parseRelationMembers()
         Kolab::RelationMember result = Kolab::parseMemberUrl(url);
         QCOMPARE(result.uid, member.uid);
         QCOMPARE(result.mailbox, member.mailbox);
+        QCOMPARE(result.user, member.user);
+        QCOMPARE(result.messageId, member.messageId);
+        QCOMPARE(result.date, member.date);
+        QCOMPARE(result.subject, member.subject);
+    }
+
+    //shared namespace by uid
+    {
+
+        Kolab::RelationMember member;
+        member.uid = 20;
+        member.mailbox = QList<QByteArray>() << "foo" << "bar";
+        member.messageId = "messageid";
+        member.date = "date";
+        member.subject = "subject";
+        QString url = Kolab::generateMemberUrl(member);
+        qDebug() << url;
+        Kolab::RelationMember result = Kolab::parseMemberUrl(url);
+        QCOMPARE(result.uid, member.uid);
+        QCOMPARE(result.mailbox, member.mailbox);
+        QVERIFY(result.user.isEmpty());
+        QCOMPARE(result.messageId, member.messageId);
+        QCOMPARE(result.date, member.date);
+        QCOMPARE(result.subject, member.subject);
+    }
+
+    //by uuid/gid
+    {
+
+        Kolab::RelationMember member;
+        member.gid = "fooobar";
+        QString url = Kolab::generateMemberUrl(member);
+        qDebug() << url;
+        Kolab::RelationMember result = Kolab::parseMemberUrl(url);
+        QCOMPARE(result.gid, member.gid);
     }
 }
 


commit 8b06c46eaaf70fc70af3abff8f7fbfa7f3116a19
Author: Aaron Seigo <aseigo at kde.org>
Date:   Tue Oct 21 17:23:57 2014 +0200

    add Relation support to KolabObject: read, write and get

diff --git a/kolabformat/kolabobject.cpp b/kolabformat/kolabobject.cpp
index 3d41c5c..3cf3f86 100644
--- a/kolabformat/kolabobject.cpp
+++ b/kolabformat/kolabobject.cpp
@@ -134,7 +134,7 @@ public:
 
     ObjectType readKolabV2(const KMime::Message::Ptr &msg, Kolab::ObjectType objectType);
     ObjectType readKolabV3(const KMime::Message::Ptr &msg, Kolab::ObjectType objectType);
-    
+
     KCalCore::Incidence::Ptr mIncidence;
     KABC::Addressee mAddressee;
     KABC::ContactGroup mContactGroup;
@@ -144,13 +144,15 @@ public:
     ObjectType mObjectType;
     Version mVersion;
     Kolab::Freebusy mFreebusy;
+    ObjectType mOverrideObjectType;
+    Version mOverrideVersion;
+    bool mDoOverrideVersion;
+
 #ifdef HAVE_TAG_H
+    Akonadi::Relation mRelation;
     Akonadi::Tag mTag;
     QStringList mTagMembers;
 #endif
-    ObjectType mOverrideObjectType;
-    Version mOverrideVersion;
-    bool mDoOverrideVersion;
 };
 //@endcond
 
@@ -397,16 +399,31 @@ ObjectType KolabObjectReader::Private::readKolabV3(const KMime::Message::Ptr &ms
             const Kolab::Configuration &configuration = Kolab::readConfiguration(xml, false);
             const Kolab::Relation &relation = configuration.relation();
 
-            mTag = Akonadi::Tag();
-            mTag.setName(Conversion::fromStdString(relation.name()));
-            mTag.setGid(Conversion::fromStdString(configuration.uid()).toLatin1());
-            mTag.setType(Akonadi::Tag::PLAIN);
-
-            mTagMembers.reserve(relation.members().size());
-            foreach (const std::string &member, relation.members()) {
-                mTagMembers << Conversion::fromStdString(member);
+            if (relation.type() == "tag") {
+                mTag = Akonadi::Tag();
+                mTag.setName(Conversion::fromStdString(relation.name()));
+                mTag.setGid(Conversion::fromStdString(configuration.uid()).toLatin1());
+                mTag.setType(Akonadi::Tag::PLAIN);
+
+                mTagMembers.reserve(relation.members().size());
+                foreach (const std::string &member, relation.members()) {
+                    mTagMembers << Conversion::fromStdString(member);
+                }
+            } else if (relation.type() == "generic") {
+                if (relation.members().size() == 2) {
+                    mRelation = Akonadi::Relation();
+                    mRelation.setRemoteId(Conversion::fromStdString(configuration.uid()).toLatin1());
+                    mRelation.setType(Akonadi::Relation::GENERIC);
+                    mRelation.setLeft(Akonadi::Item(Conversion::fromStdString(relation.members()[0]).toLongLong()));
+                    mRelation.setRight(Akonadi::Item(Conversion::fromStdString(relation.members()[1]).toLongLong()));
+                } else {
+                    Critical() << "generic relation had wrong number of members:" << relation.members().size();
+                    printMessageDebugInfo(msg);
+                }
+            } else {
+                Critical() << "unknown configuration object type" << relation.type();
+                printMessageDebugInfo(msg);
             }
-
         }
             break;
 #endif
@@ -537,6 +554,11 @@ Freebusy KolabObjectReader::getFreebusy() const
 }
 
 #ifdef HAVE_TAG_H
+Akonadi::Relation KolabObjectReader::getRelation() const
+{
+    return d->mRelation;
+}
+
 Akonadi::Tag KolabObjectReader::getTag() const
 {
     return d->mTag;
@@ -727,6 +749,32 @@ KMime::Message::Ptr KolabObjectWriter::writeFreebusy(const Freebusy &freebusy, V
 }
 
 #ifdef HAVE_TAG_H
+KMime::Message::Ptr writeRelationHelper(const Kolab::Relation &relation, const QByteArray &uid, const QString &productId)
+{
+    Kolab::Configuration configuration(relation); //TODO preserve creation/lastModified date
+    configuration.setUid(uid.constData());
+    const std::string &v3String = Kolab::writeConfiguration(configuration, Conversion::toStdString(getProductId(productId)));
+    ErrorHandler::handleLibkolabxmlErrors();
+    return  Mime::createMessage(Conversion::fromStdString(configuration.uid()), kolabMimeType(), relationKolabType(), Conversion::fromStdString(v3String).toUtf8(), true, getProductId(productId));
+}
+
+KMime::Message::Ptr KolabObjectWriter::writeRelation(const Akonadi::Relation &relation, Version v, const QString &productId)
+{
+    ErrorHandler::clearErrors();
+    if (v != KolabV3) {
+        Critical() << "only v3 implementation available";
+    }
+
+    Kolab::Relation kolabRelation(std::string(), "generic");
+    std::vector<std::string> m;
+    m.reserve(2);
+    m.push_back(Conversion::toStdString(QString::number(relation.left().id())));
+    m.push_back(Conversion::toStdString(QString::number(relation.right().id())));
+    kolabRelation.setMembers(m);
+
+    return writeRelationHelper(kolabRelation, relation.remoteId(), productId);
+}
+
 KMime::Message::Ptr KolabObjectWriter::writeTag(const Akonadi::Tag &tag, const QStringList &members, Version v, const QString &productId)
 {
     ErrorHandler::clearErrors();
@@ -742,11 +790,7 @@ KMime::Message::Ptr KolabObjectWriter::writeTag(const Akonadi::Tag &tag, const Q
     }
     relation.setMembers(m);
 
-    Kolab::Configuration configuration(relation); //TODO preserve creation/lastModified date
-    configuration.setUid(tag.gid().constData());
-    const std::string &v3String = Kolab::writeConfiguration(configuration, Conversion::toStdString(getProductId(productId)));
-    ErrorHandler::handleLibkolabxmlErrors();
-    return  Mime::createMessage(Conversion::fromStdString(configuration.uid()), kolabMimeType(), relationKolabType(), Conversion::fromStdString(v3String).toUtf8(), true, getProductId(productId));
+    return writeRelationHelper(relation, tag.gid(), productId);
 }
 #endif
 
diff --git a/kolabformat/kolabobject.h b/kolabformat/kolabobject.h
index 9edbfd3..0b56fe8 100644
--- a/kolabformat/kolabobject.h
+++ b/kolabformat/kolabobject.h
@@ -23,7 +23,9 @@
 #include <libkolab_config.h>
 
 #ifdef HAVE_TAG_H
+#include <akonadi/item.h>
 #include <akonadi/tag.h>
+#include <akonadi/relation.h>
 #endif
 #include <kabc/addressee.h>
 #include <kabc/contactgroup.h>
@@ -104,6 +106,7 @@ public:
     QStringList getDictionary(QString &lang) const;
     Freebusy getFreebusy() const;
 #ifdef HAVE_TAG_H
+    Akonadi::Relation getRelation() const;
     Akonadi::Tag getTag() const;
     QStringList getTagMembers() const;
 #endif
@@ -132,6 +135,7 @@ public:
     static KMime::Message::Ptr writeDictionary(const QStringList &, const QString &lang, Version v = KolabV3, const QString &productId = QString());
     static KMime::Message::Ptr writeFreebusy(const Kolab::Freebusy &, Version v = KolabV3, const QString &productId = QString());
 #ifdef HAVE_TAG_H
+    static KMime::Message::Ptr writeRelation(const Akonadi::Relation &, Version v = KolabV3, const QString &productId = QString());
     static KMime::Message::Ptr writeTag(const Akonadi::Tag &, const QStringList &items, Version v = KolabV3, const QString &productId = QString());
 #endif
     




More information about the commits mailing list