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