13 commits - autogen.sh CMakeLists.txt kolabformat/kolabobject.cpp kolabformat/v2helpers.cpp kolabformat/v2helpers.h mime/mimeutils.cpp
Christian Mollekopf
mollekopf at kolabsys.com
Tue Feb 19 09:52:11 CET 2013
CMakeLists.txt | 7 ++++---
autogen.sh | 1 +
kolabformat/kolabobject.cpp | 15 +++++++--------
kolabformat/v2helpers.cpp | 5 ++++-
kolabformat/v2helpers.h | 5 ++++-
mime/mimeutils.cpp | 8 ++++++++
6 files changed, 28 insertions(+), 13 deletions(-)
New commits:
commit 63987d7d505a63eaa5a28968abfc58dfd323cb44
Merge: c9ba6b1 a3272dd
Author: Christian Mollekopf <mollekopf at kolabsys.com>
Date: Tue Feb 19 09:52:03 2013 +0100
Merge remote-tracking branch 'origin/master'
commit c9ba6b128cc11f655201a9bdb338440e69dcaaf8
Author: Christian Mollekopf <mollekopf at kolabsys.com>
Date: Mon Feb 18 20:52:43 2013 +0100
Always return InvalidObject if an error occured during parsing.
diff --git a/kolabformat/kolabobject.cpp b/kolabformat/kolabobject.cpp
index d2ff3ac..f43dba4 100644
--- a/kolabformat/kolabobject.cpp
+++ b/kolabformat/kolabobject.cpp
@@ -218,7 +218,6 @@ ObjectType KolabObjectReader::Private::readKolabV2(const KMime::Message::Ptr &ms
}
const QByteArray &xmlData = xmlContent->decodedContent();
mDictionary = readLegacyDictionaryConfiguration(xmlData, mDictionaryLanguage);
- ErrorHandler::handleLibkolabxmlErrors();
mObjectType = objectType;
return mObjectType;
}
@@ -263,11 +262,12 @@ ObjectType KolabObjectReader::Private::readKolabV2(const KMime::Message::Ptr &ms
Error() << "Could not extract all attachments. " << mIncidence->attachments().size() << " out of " << attachments.size();
}
}
- mObjectType = objectType;
if (ErrorHandler::errorOccured()) {
printMessageDebugInfo(msg);
+ return InvalidObject;
}
- return objectType;
+ mObjectType = objectType;
+ return mObjectType;
}
ObjectType KolabObjectReader::Private::readKolabV3(const KMime::Message::Ptr &msg, Kolab::ObjectType objectType)
@@ -334,12 +334,13 @@ ObjectType KolabObjectReader::Private::readKolabV3(const KMime::Message::Ptr &ms
// kDebug() << "getting attachments";
Mime::getAttachmentsById(mIncidence, msg);
}
+ ErrorHandler::handleLibkolabxmlErrors();
if (ErrorHandler::errorOccured()) {
printMessageDebugInfo(msg);
+ return InvalidObject;
}
- ErrorHandler::handleLibkolabxmlErrors();
mObjectType = objectType;
- return objectType;
+ return mObjectType;
}
ObjectType KolabObjectReader::parseMimeMessage(const KMime::Message::Ptr &msg)
@@ -389,10 +390,8 @@ ObjectType KolabObjectReader::parseMimeMessage(const KMime::Message::Ptr &msg)
if (d->mVersion == KolabV2) {
return d->readKolabV2(msg, objectType);
- } else {
- return d->readKolabV3(msg, objectType);
}
- return InvalidObject;
+ return d->readKolabV3(msg, objectType);
}
Version KolabObjectReader::getVersion() const
commit 61ed258d6d103116494f9e20352a934e7fda19b3
Merge: dfb1979 efd0f49
Author: Christian Mollekopf <mollekopf at kolabsys.com>
Date: Mon Feb 18 20:21:40 2013 +0100
Merge branch '0.4'
diff --cc CMakeLists.txt
index b8dcdef,ae03027..8c9652b
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@@ -31,11 -31,11 +31,11 @@@ endif(
# 0.1.1 (patch release for 0.1.0)
# 0.2 (0.2 development version towards 0.2.0)
set(Libkolab_VERSION_MAJOR 0)
-set(Libkolab_VERSION_MINOR 4)
+set(Libkolab_VERSION_MINOR 5)
# Enable the full x.y.z version only for release versions
- #set(Libkolab_VERSION_PATCH 1)
- #set(Libkolab_VERSION ${Libkolab_VERSION_MAJOR}.${Libkolab_VERSION_MINOR}.${Libkolab_VERSION_PATCH} )
- set(Libkolab_VERSION ${Libkolab_VERSION_MAJOR}.${Libkolab_VERSION_MINOR} )
+ set(Libkolab_VERSION_PATCH 1)
+ set(Libkolab_VERSION ${Libkolab_VERSION_MAJOR}.${Libkolab_VERSION_MINOR}.${Libkolab_VERSION_PATCH} )
+ #set(Libkolab_VERSION ${Libkolab_VERSION_MAJOR}.${Libkolab_VERSION_MINOR} )
set(Libkolab_VERSION_STRING ${CMAKE_PROJECT_NAME}-${Libkolab_VERSION})
# set up install directories.
commit efd0f49d3a02d5d457b6afc1bf10fe9bcee9733d
Author: Christian Mollekopf <mollekopf at kolabsys.com>
Date: Fri Feb 15 22:38:04 2013 +0100
Got rid of another assert.
diff --git a/kolabformat/v2helpers.cpp b/kolabformat/v2helpers.cpp
index d023a6a..e679351 100644
--- a/kolabformat/v2helpers.cpp
+++ b/kolabformat/v2helpers.cpp
@@ -226,7 +226,10 @@ QStringList readLegacyDictionaryConfiguration(const QByteArray &xmlData, QString
{
QStringList dictionary;
const QDomDocument xmlDoc = KolabV2::KolabBase::loadDocument( QString::fromUtf8(xmlData) ); //TODO extract function from V2 format
- Q_ASSERT ( !xmlDoc.isNull() );
+ if ( xmlDoc.isNull() ) {
+ Error() << "Failed to read the xml document";
+ return QStringList();
+ }
QDomElement top = xmlDoc.documentElement();
commit bf282325e7beb69839c833ee2864301cf5566455
Author: Christian Mollekopf <mollekopf at kolabsys.com>
Date: Fri Feb 15 21:23:34 2013 +0100
No asserts during release builds.
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 69b4532..ae03027 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -74,6 +74,7 @@ endif()
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wnon-virtual-dtor -Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W -Wpointer-arith -Wformat-security -fno-exceptions -DQT_NO_EXCEPTIONS -fno-check-new -fno-common -Woverloaded-virtual -fno-threadsafe-statics -fvisibility=hidden -Werror=return-type -fvisibility-inlines-hidden -fexceptions -UQT_NO_EXCEPTIONS -fPIC -g" )
# message("${CMAKE_CXX_FLAGS}")
+set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DQT_NO_DEBUG")
if (USE_LIBCALENDARING)
set( KDE_INCLUDES ${Libcalendaring_INCLUDE_DIRS} )
diff --git a/autogen.sh b/autogen.sh
index 06308cc..cd8ea88 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -63,6 +63,7 @@ if [ ${doprep} -eq 1 ]; then
-DPHP_BINDINGS=ON \
-DPHP_INSTALL_DIR=/usr/lib64/php/modules \
-DPYTHON_BINDINGS=ON \
+ -DCMAKE_BUILD_TYPE=Release \
..
fi
commit ffa5b196b996b0081eabc6ea9c589b4325012e43
Author: Christian Mollekopf <mollekopf at kolabsys.com>
Date: Fri Feb 15 20:37:01 2013 +0100
Error out early, and avoid assert as this is a realistic error scenario.
diff --git a/kolabformat/v2helpers.h b/kolabformat/v2helpers.h
index 3e2f2f7..f883efb 100644
--- a/kolabformat/v2helpers.h
+++ b/kolabformat/v2helpers.h
@@ -46,7 +46,10 @@ template <typename KCalPtr, typename Container>
static KCalPtr fromXML(const QByteArray &xmlData, QStringList &attachments)
{
const QDomDocument xmlDoc = KolabV2::KolabBase::loadDocument( QString::fromUtf8(xmlData) ); //TODO extract function from V2 format
- Q_ASSERT ( !xmlDoc.isNull() );
+ if ( xmlDoc.isNull() ) {
+ Error() << "Failed to read the xml document";
+ return KCalPtr();
+ }
const KCalPtr i = Container::fromXml( xmlDoc, QString() ); //For parsing we don't need the timezone, so we don't set one
Q_ASSERT ( i );
QDomNodeList nodes = xmlDoc.elementsByTagName("inline-attachment");
diff --git a/mime/mimeutils.cpp b/mime/mimeutils.cpp
index 4f913a8..2ce6475 100644
--- a/mime/mimeutils.cpp
+++ b/mime/mimeutils.cpp
@@ -258,6 +258,10 @@ KMime::Content* createAttachmentPart(const QByteArray& cid, const QString& mimeT
void getAttachments(KCalCore::Incidence::Ptr incidence, const QStringList &attachments, const KMime::Message::Ptr &mimeData)
{
+ if (!incidence) {
+ Error() << "Invalid incidence";
+ return;
+ }
// kDebug() << "getting " << attachments.size() << "attachments";
// kDebug() << mimeData->encodedContent();
foreach (const QString &name, attachments) {
@@ -278,6 +282,10 @@ void getAttachments(KCalCore::Incidence::Ptr incidence, const QStringList &attac
void getAttachmentsById(KCalCore::Incidence::Ptr incidence, const KMime::Message::Ptr &mimeData)
{
+ if (!incidence) {
+ Error() << "Invalid incidence";
+ return;
+ }
// kDebug() << "getting " << attachments.size() << "attachments";
// kDebug() << mimeData->encodedContent();
commit f24fa274f0365a5a0662213b5b781b3f2dbc234f
Author: Christian Mollekopf <mollekopf at kolabsys.com>
Date: Sat Jan 26 02:50:37 2013 +0100
Define Libkolab_VERSION_STRING.
Otherwise tests fail and the product id string lacks the libkolab identifier.
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7d46c48..69b4532 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -36,7 +36,7 @@ set(Libkolab_VERSION_MINOR 4)
set(Libkolab_VERSION_PATCH 1)
set(Libkolab_VERSION ${Libkolab_VERSION_MAJOR}.${Libkolab_VERSION_MINOR}.${Libkolab_VERSION_PATCH} )
#set(Libkolab_VERSION ${Libkolab_VERSION_MAJOR}.${Libkolab_VERSION_MINOR} )
-#set(Libkolab_VERSION_STRING ${CMAKE_PROJECT_NAME}-${Libkolab_VERSION})
+set(Libkolab_VERSION_STRING ${CMAKE_PROJECT_NAME}-${Libkolab_VERSION})
# set up install directories.
set(LIB_INSTALL_DIR lib CACHE STRING "The directories where to install libraries to")
commit dd2b3977b13770dc44eeb0da9d636bce6155b4d0
Author: Christian Mollekopf <mollekopf at kolabsys.com>
Date: Sat Jan 26 02:48:04 2013 +0100
Revert "We require boost."
That was already a few lines below...
This reverts commit 033f29cdc7f73719e406601d57fe60a17bd8876c.
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4f0cb57..7d46c48 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -62,8 +62,6 @@ endif()
find_package(SWIG)
-find_package(Boost REQUIRED)
-
#Show summary of found libraries
macro_display_feature_log()
commit e157e46b7e462adf7900391cde977275be7400e5
Author: Christian Mollekopf <mollekopf at kolabsys.com>
Date: Sat Jan 26 02:25:56 2013 +0100
That's not actually required.
diff --git a/tests/kcalconversiontest.h b/tests/kcalconversiontest.h
index f2a18b8..c58042d 100644
--- a/tests/kcalconversiontest.h
+++ b/tests/kcalconversiontest.h
@@ -20,7 +20,6 @@
#include <QtCore/QObject>
#include <QtTest/QtTest>
-#include <boost/concept_check.hpp>
class KCalConversionTest : public QObject
{
commit a185589458d49552a16b91c0c3a06fb082280269
Author: Christian Mollekopf <mollekopf at kolabsys.com>
Date: Sat Jan 26 02:25:36 2013 +0100
We require boost.
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7d46c48..4f0cb57 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -62,6 +62,8 @@ endif()
find_package(SWIG)
+find_package(Boost REQUIRED)
+
#Show summary of found libraries
macro_display_feature_log()
commit 03621dd8b9b2596ed5053253cc783c865deccb97
Author: Christian Mollekopf <mollekopf at kolabsys.com>
Date: Sat Jan 26 02:03:02 2013 +0100
Having blocking stuff in automated tests isn't such a good idea, disable by default.
diff --git a/tests/testutils.h b/tests/testutils.h
index e6bb15c..071a571 100644
--- a/tests/testutils.h
+++ b/tests/testutils.h
@@ -53,20 +53,20 @@ void showDiff(const QString &expected, const QString &converted)
kWarning() << "contents are the same";
return;
}
- QTemporaryFile expectedFile("expectedFile");
- QTemporaryFile convertedFile("convertedFile");
- if (expectedFile.open() && convertedFile.open()) {
- expectedFile.write(expected.toLatin1());
- convertedFile.write(converted.toLatin1());
- expectedFile.close();
- convertedFile.close();
- QProcess::execute("kompare", QStringList() << "-c" << expectedFile.fileName() << convertedFile.fileName());
- } else {
- kWarning() << "files are not open";
- }
+ // QTemporaryFile expectedFile("expectedFile");
+ // QTemporaryFile convertedFile("convertedFile");
+ // if (expectedFile.open() && convertedFile.open()) {
+ // expectedFile.write(expected.toLatin1());
+ // convertedFile.write(converted.toLatin1());
+ // expectedFile.close();
+ // convertedFile.close();
+ // QProcess::execute("kompare", QStringList() << "-c" << expectedFile.fileName() << convertedFile.fileName());
+ // } else {
+ // kWarning() << "files are not open";
+ // }
-// qDebug() << "EXPECTED: " << expected;
-// qDebug() << "CONVERTED: " << converted;
+ qDebug() << "EXPECTED: " << expected;
+ qDebug() << "CONVERTED: " << converted;
}
KMime::Message::Ptr readMimeFile( const QString &fileName, bool &ok)
commit ad58dcf75eba9e49d0d281de69d3f09c02c339f3
Author: Christian Mollekopf <mollekopf at kolabsys.com>
Date: Wed Jan 9 13:52:40 2013 +0100
Release 0.4.1
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5a459d3..7d46c48 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -33,10 +33,10 @@ endif()
set(Libkolab_VERSION_MAJOR 0)
set(Libkolab_VERSION_MINOR 4)
# Enable the full x.y.z version only for release versions
-#set(Libkolab_VERSION_PATCH 1)
-#set(Libkolab_VERSION ${Libkolab_VERSION_MAJOR}.${Libkolab_VERSION_MINOR}.${Libkolab_VERSION_PATCH} )
-set(Libkolab_VERSION ${Libkolab_VERSION_MAJOR}.${Libkolab_VERSION_MINOR} )
-set(Libkolab_VERSION_STRING ${CMAKE_PROJECT_NAME}-${Libkolab_VERSION})
+set(Libkolab_VERSION_PATCH 1)
+set(Libkolab_VERSION ${Libkolab_VERSION_MAJOR}.${Libkolab_VERSION_MINOR}.${Libkolab_VERSION_PATCH} )
+#set(Libkolab_VERSION ${Libkolab_VERSION_MAJOR}.${Libkolab_VERSION_MINOR} )
+#set(Libkolab_VERSION_STRING ${CMAKE_PROJECT_NAME}-${Libkolab_VERSION})
# set up install directories.
set(LIB_INSTALL_DIR lib CACHE STRING "The directories where to install libraries to")
commit 9f939506c34d395ca6bc5203d0c6c8ba7b9fe6d1
Author: Christian Mollekopf <mollekopf at kolabsys.com>
Date: Wed Jan 9 13:58:18 2013 +0100
Use the correct kolab type for distlists + test.
(cherry picked from commit 2befab0a53b6794020e750cab2e3a5feae1de412)
Conflicts:
tests/testutils.h
diff --git a/kolabformat/kolabobject.cpp b/kolabformat/kolabobject.cpp
index 6377968..d2ff3ac 100644
--- a/kolabformat/kolabobject.cpp
+++ b/kolabformat/kolabobject.cpp
@@ -576,7 +576,7 @@ KMime::Message::Ptr KolabObjectWriter::writeDistlist(const KABC::ContactGroup &d
const Kolab::DistList &dist = Kolab::Conversion::fromKABC(distlist);
const std::string &v3String = Kolab::writeDistlist(dist, Conversion::toStdString(getProductId(productId)));
ErrorHandler::handleLibkolabxmlErrors();
- return Mime::createMessage(Conversion::fromStdString(dist.uid()), xCardMimeType(), contactKolabType(), Conversion::fromStdString(v3String).toUtf8(), true, getProductId(productId));
+ return Mime::createMessage(Conversion::fromStdString(dist.uid()), xCardMimeType(), distlistKolabType(), Conversion::fromStdString(v3String).toUtf8(), true, getProductId(productId));
}
KolabV2::DistributionList d(&distlist);
return distListToKolabFormat(d, getProductId(productId));
diff --git a/tests/formattest.cpp b/tests/formattest.cpp
index 346c6e8..3ca0c24 100644
--- a/tests/formattest.cpp
+++ b/tests/formattest.cpp
@@ -29,6 +29,7 @@
#include <kcalcore/icalformat.h>
#include <kabc/vcardconverter.h>
+#include <kabc/contactgrouptool.h>
#include <akonadi/notes/noteutils.h>
#include "testutils.h"
@@ -279,6 +280,72 @@ void FormatTest::testContact()
QCOMPARE(Kolab::ErrorHandler::instance().error(), Kolab::ErrorHandler::Debug);
}
+void FormatTest::testDistlist_data()
+{
+ QTest::addColumn<Kolab::Version>( "version" );
+ QTest::addColumn<Kolab::ObjectType>( "type" );
+ QTest::addColumn<QString>( "vcardFileName" );
+ QTest::addColumn<QString>( "mimeFileName" );
+
+ QTest::newRow( "v3distlistSimple" ) << Kolab::KolabV3 << Kolab::DistlistObject << TESTFILEDIR+QString::fromLatin1("v3/contacts/distlist.vcf") << TESTFILEDIR+QString::fromLatin1("v3/contacts/distlist.vcf.mime");
+}
+
+void FormatTest::testDistlist()
+{
+ QFETCH( Kolab::Version, version );
+ QFETCH( Kolab::ObjectType, type );
+ QFETCH( QString, vcardFileName ); //To compare
+ QFETCH( QString, mimeFileName ); //For parsing
+
+ //Parse mime message
+ bool ok = false;
+ const KMime::Message::Ptr &msg = readMimeFile( mimeFileName, ok );
+ QVERIFY(ok);
+ Kolab::KolabObjectReader reader;
+ Kolab::ObjectType t = reader.parseMimeMessage(msg);
+ QCOMPARE(t, type);
+ QCOMPARE(reader.getVersion(), version);
+ QCOMPARE(Kolab::ErrorHandler::instance().error(), Kolab::ErrorHandler::Debug);
+
+ KABC::ContactGroup convertedAddressee = reader.getDistlist();
+
+ //Parse vcard
+ QFile vcardFile( vcardFileName );
+ QVERIFY( vcardFile.open( QFile::ReadOnly ) );
+ KABC::VCardConverter converter;
+ QByteArray c = vcardFile.readAll();
+ QBuffer data(&c);
+ data.open(QIODevice::ReadOnly);
+
+ KABC::ContactGroup realAddressee;
+ KABC::ContactGroupTool::convertFromXml( &data, realAddressee );
+
+ {
+ QBuffer expected;
+ expected.open(QIODevice::WriteOnly);
+ KABC::ContactGroupTool::convertToXml(realAddressee, &expected);
+
+ QBuffer converted;
+ converted.open(QIODevice::WriteOnly);
+ KABC::ContactGroupTool::convertToXml(convertedAddressee, &converted);
+
+ showDiff(expected.buffer(), converted.buffer());
+ }
+ QCOMPARE( realAddressee, convertedAddressee );
+
+ //Write
+ const KMime::Message::Ptr &convertedMime = Kolab::KolabObjectWriter::writeDistlist(realAddressee, version);
+
+ if ( !compareMimeMessage( convertedMime, msg )) {
+ QString expected = msg->encodedContent();
+ normalizeMimemessage(expected);
+ QString converted = convertedMime->encodedContent();
+ normalizeMimemessage(converted);
+ showDiff(expected, converted);
+ QVERIFY( false );
+ }
+ QCOMPARE(Kolab::ErrorHandler::instance().error(), Kolab::ErrorHandler::Debug);
+}
void FormatTest::testNote_data()
{
@@ -376,6 +443,18 @@ void FormatTest::generateVCard()
// KABC::Addressee convertedAddressee = reader.getContact();
// KABC::VCardConverter converter;
// qDebug() << converter.createVCard(convertedAddressee);
+
+// bool ok = false;
+// const KMime::Message::Ptr &msg = readMimeFile( TESTFILEDIR+QString::fromLatin1("v3/contacts/distlist.vcf.mime"), ok );
+// qDebug() << msg->encodedContent();
+// Kolab::KolabObjectReader reader;
+// Kolab::ObjectType t = reader.parseMimeMessage(msg);
+//
+// KABC::ContactGroup convertedAddressee = reader.getDistlist();
+// QBuffer buf;
+// buf.open(QIODevice::WriteOnly);
+// KABC::ContactGroupTool::convertToXml(convertedAddressee, &buf);
+// qDebug() << buf.buffer();
}
//Pseudo test to show that JPG is always lossy, even with quality set to 100
diff --git a/tests/formattest.h b/tests/formattest.h
index 12655fb..8097bfc 100644
--- a/tests/formattest.h
+++ b/tests/formattest.h
@@ -55,6 +55,9 @@ private slots:
void testContact_data();
void testContact();
+
+ void testDistlist_data();
+ void testDistlist();
void testNote_data();
void testNote();
diff --git a/tests/testfiles/v3/contacts/distlist.vcf b/tests/testfiles/v3/contacts/distlist.vcf
new file mode 100644
index 0000000..cc4984c
--- /dev/null
+++ b/tests/testfiles/v3/contacts/distlist.vcf
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<contactGroup uid="4xuyC0cyjV" name="My Distlist">
+ <contactData name="John Doe" email="jdoe at example.com"/>
+ <contactData name="John Doe2" email="jdoe2 at example.com"/>
+</contactGroup>
\ No newline at end of file
diff --git a/tests/testfiles/v3/contacts/distlist.vcf.mime b/tests/testfiles/v3/contacts/distlist.vcf.mime
index d54c26c..372728e 100644
--- a/tests/testfiles/v3/contacts/distlist.vcf.mime
+++ b/tests/testfiles/v3/contacts/distlist.vcf.mime
@@ -1,10 +1,9 @@
Date: Mon, 23 Apr 2012 12:46:37 +0200
-X-Kolab-Type: application/x-vnd.kolab.distribution-list
+X-Kolab-Type: application/x-vnd.kolab.contact.distlist
X-Kolab-Mime-Version: 3.0
User-Agent: Libkolab-0.1.0
Content-Type: multipart/mixed; boundary="nextPart1365947.WmFcbPlLFA"
Subject: 4xuyC0cyjV
-From: Volker Krause <vkrause at kde.org>
MIME-Version: 1.0
@@ -38,10 +37,6 @@ Content-Disposition: attachment; filename="kolab.xml"
<rev>
<timestamp>20120505T050505Z</timestamp>
</rev>
- <categories>
- <text>cat1</text>
- <text>cat2</text>
- </categories>
<kind>
<text>group</text>
</kind>
@@ -49,18 +44,13 @@ Content-Disposition: attachment; filename="kolab.xml"
<text>My Distlist</text>
</fn>
<member>
- <uri>mailto:John%20Doe%3cjdoe at example.com%3e</uri>
+ <uri>mailto:John%20Doe%3Cjdoe%40example.com%3E</uri>
</member>
<member>
- <uri>mailto:John%20Doe2%3cjdoe2 at example.com%3e</uri>
+ <uri>mailto:John%20Doe2%3Cjdoe2%40example.com%3E</uri>
</member>
- <x-custom>
- <identifier>X-Identifier</identifier>
- <value>TestValue</value>
- </x-custom>
-
</vcard>
</vcards>
---nextPart1365947.WmFcbPlLFA--
\ No newline at end of file
+--nextPart1365947.WmFcbPlLFA--
More information about the commits
mailing list