diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -68,11 +68,13 @@ endif() set(KDEPIMLIBS_LIB_VERSION "4.71.0") +set(KMIME_LIB_VERSION "4.84.0") +find_package(KF5CoreAddons CONFIG REQUIRED) find_package(KF5Akonadi ${KDEPIMLIBS_LIB_VERSION} CONFIG REQUIRED) find_package(KF5Contacts ${KDEPIMLIBS_LIB_VERSION} CONFIG REQUIRED) find_package(KF5CalendarCore ${KDEPIMLIBS_LIB_VERSION} CONFIG REQUIRED) find_package(KF5CalendarUtils ${KDEPIMLIBS_LIB_VERSION} CONFIG REQUIRED) -find_package(KF5Mime ${KDEPIMLIBS_LIB_VERSION} CONFIG REQUIRED) +find_package(KF5Mime ${KMIME_LIB_VERSION} CONFIG REQUIRED) find_package(KF5AkonadiNotes ${KDEPIMLIBS_LIB_VERSION} CONFIG REQUIRED) find_package(SWIG) diff --git a/icalendar/imip.cpp b/icalendar/imip.cpp --- a/icalendar/imip.cpp +++ b/icalendar/imip.cpp @@ -84,7 +84,7 @@ if ( !attachment.isEmpty() ) { KMime::Headers::ContentDisposition *disposition = - new KMime::Headers::ContentDisposition( message.get() ); + new KMime::Headers::ContentDisposition(); disposition->setDisposition( KMime::Headers::CDinline ); message->setHeader( disposition ); message->contentTransferEncoding()->setEncoding( KMime::Headers::CEquPr ); @@ -103,7 +103,7 @@ // Set the first multipart, the body message. KMime::Content *bodyMessage = new KMime::Content; KMime::Headers::ContentDisposition *bodyDisposition = - new KMime::Headers::ContentDisposition( bodyMessage ); + new KMime::Headers::ContentDisposition(); bodyDisposition->setDisposition( KMime::Headers::CDinline ); bodyMessage->contentType()->setMimeType( "text/plain" ); bodyMessage->contentType()->setCharset( "utf-8" ); @@ -115,7 +115,7 @@ if ( !attachment.isEmpty() ) { KMime::Content *attachMessage = new KMime::Content; KMime::Headers::ContentDisposition *attachDisposition = - new KMime::Headers::ContentDisposition( attachMessage ); + new KMime::Headers::ContentDisposition(); attachDisposition->setDisposition( KMime::Headers::CDattachment ); attachMessage->contentType()->setMimeType( "text/calendar" ); attachMessage->contentType()->setCharset( "utf-8" ); diff --git a/kolabformat/mimeobject.cpp b/kolabformat/mimeobject.cpp --- a/kolabformat/mimeobject.cpp +++ b/kolabformat/mimeobject.cpp @@ -29,6 +29,7 @@ #include "libkolab-version.h" #include #include +#include #include @@ -373,7 +374,7 @@ } Kolab::ObjectType objectType = InvalidObject; if (mOverrideObjectType == InvalidObject) { - if (KMime::Headers::Base *xKolabHeader = msg->getHeaderByType(X_KOLAB_TYPE_HEADER)) { + if (KMime::Headers::Base *xKolabHeader = msg->headerByType(X_KOLAB_TYPE_HEADER)) { objectType = getObjectType(xKolabHeader->asUnicodeString().trimmed().toStdString()); } else { Warning() << "could not find the X-Kolab-Type Header, trying autodetection" ; @@ -390,10 +391,10 @@ } if (!mDoOverrideVersion) { - KMime::Headers::Base *xKolabVersion = msg->getHeaderByType(X_KOLAB_MIME_VERSION_HEADER); + KMime::Headers::Base *xKolabVersion = msg->headerByType(X_KOLAB_MIME_VERSION_HEADER); if (!xKolabVersion) { //For backwards compatibility to development versions, can be removed in future versions - xKolabVersion = msg->getHeaderByType(X_KOLAB_MIME_VERSION_HEADER_COMPAT); + xKolabVersion = msg->headerByType(X_KOLAB_MIME_VERSION_HEADER_COMPAT); } if (!xKolabVersion || xKolabVersion->asUnicodeString() == KOLAB_VERSION_V2) { mVersion = KolabV2; @@ -440,7 +441,7 @@ static std::string createCid() { - return QString::fromLatin1("cid:%1@%2").arg(QString::fromLatin1(KMime::uniqueString())).arg("kolab.resource.akonadi").toStdString(); + return QString::fromLatin1("cid:%1@%2").arg(KRandom::randomString(16)).arg("kolab.resource.akonadi").toStdString(); } std::vector convertToReferences(const std::vector &attachments, std::vector &attachmentCids) diff --git a/mime/mimeutils.cpp b/mime/mimeutils.cpp --- a/mime/mimeutils.cpp +++ b/mime/mimeutils.cpp @@ -120,10 +120,10 @@ if (!subject.isEmpty()) { message->subject()->fromUnicodeString( subject, "utf-8" ); } - + KMime::Content *content = createMainPart( mimetype.toLatin1(), xml ); message->addContent( content ); - + message->assemble(); return message; } @@ -153,9 +153,13 @@ { KMime::Message::Ptr message(new KMime::Message); message->date()->setDateTime(KDateTime::currentUtcDateTime().dateTime()); - message->appendHeader(new KMime::Headers::Generic(X_KOLAB_TYPE_HEADER, message.get(), xKolabType, "utf-8")); + KMime::Headers::Generic* h = new KMime::Headers::Generic(X_KOLAB_TYPE_HEADER); + h->fromUnicodeString(xKolabType, "utf-8"); + message->appendHeader(h); if (v3) { - message->appendHeader(new KMime::Headers::Generic(X_KOLAB_MIME_VERSION_HEADER, message.get(), KOLAB_VERSION_V3, "utf-8")); + KMime::Headers::Generic* hv3 = new KMime::Headers::Generic(X_KOLAB_MIME_VERSION_HEADER); + hv3->fromUnicodeString(KOLAB_VERSION_V3, "utf-8"); + message->appendHeader(hv3); } message->userAgent()->from7BitString(prodid); message->contentType()->setMimeType("multipart/mixed"); diff --git a/tests/formattest.cpp b/tests/formattest.cpp --- a/tests/formattest.cpp +++ b/tests/formattest.cpp @@ -49,19 +49,19 @@ KCOMPARE( msg->headerByType( X_KOLAB_TYPE_HEADER )->as7BitString(), expectedMsg->headerByType( X_KOLAB_TYPE_HEADER )->as7BitString() ); // date contains conversion time... // KCOMPARE( msg->date()->asUnicodeString(), expectedMsg->date()->asUnicodeString() ); - + // body parts KCOMPARE( msg->contents().size(), expectedMsg->contents().size() ); for ( int i = 0; i < msg->contents().size(); ++i ) { KMime::Content *part = msg->contents().at( i ); KMime::Content *expectedPart = expectedMsg->contents().at( i ); - + // part headers KCOMPARE( part->contentType()->mimeType(), expectedPart->contentType()->mimeType() ); KCOMPARE( part->contentDisposition()->filename(), expectedPart->contentDisposition()->filename() ); - + KCOMPARE( part->decodedContent().isEmpty(), false ); - + QString content(part->decodedContent()); normalizeMimemessage(content); QString expected(expectedPart->decodedContent()); @@ -84,7 +84,7 @@ QTest::addColumn( "type" ); QTest::addColumn( "icalFileName" ); QTest::addColumn( "mimeFileName" ); - + QTest::newRow( "v2eventSimple" ) << Kolab::KolabV2 << Kolab::EventObject << getPath("v2/event/simple.ics") << getPath("v2/event/simple.ics.mime"); QTest::newRow( "v2eventComplex" ) << Kolab::KolabV2 << Kolab::EventObject << getPath("v2/event/complex.ics") << getPath("v2/event/complex.ics.mime"); QTest::newRow( "v2eventAttachment" ) << Kolab::KolabV2 << Kolab::EventObject << getPath("v2/event/attachment.ics") << getPath("v2/event/attachment.ics.mime"); @@ -117,7 +117,7 @@ QFETCH( Kolab::ObjectType, type ); QFETCH( QString, icalFileName ); //To compare QFETCH( QString, mimeFileName ); //For parsing - + //Parse mime message bool ok = false; const KMime::Message::Ptr &msg = readMimeFile( mimeFileName, ok ); @@ -129,13 +129,13 @@ QCOMPARE(Kolab::ErrorHandler::instance().error(), Kolab::ErrorHandler::Debug); KCalCore::Incidence::Ptr convertedIncidence = reader.getIncidence(); - + //Parse ICalFile for comparison QFile icalFile( icalFileName ); QVERIFY( icalFile.open( QFile::ReadOnly ) ); KCalCore::ICalFormat format; KCalCore::Incidence::Ptr realIncidence( format.fromString( QString::fromUtf8( icalFile.readAll() ) ) ); - + // fix up the converted incidence for comparisson normalizeIncidence(convertedIncidence); normalizeIncidence(realIncidence); @@ -144,20 +144,20 @@ // so make sure both incidences have one realIncidence->recurrence(); convertedIncidence->recurrence(); - + realIncidence->setLastModified(convertedIncidence->lastModified()); - + //The following test is just for debugging and not really relevant if ( *(realIncidence.data()) != *(convertedIncidence.data()) ) { showDiff(format.toString( realIncidence ), format.toString( convertedIncidence )); } QVERIFY( *(realIncidence.data()) == *(convertedIncidence.data()) ); - - + + //Write Kolab::overrideTimestamp(Kolab::cDateTime(2012, 5, 5, 5,5,5, true)); KMime::Message::Ptr convertedMime = Kolab::KolabObjectWriter::writeIncidence(realIncidence, version); - + if ( !compareMimeMessage( convertedMime, msg )) { showDiff(msg->encodedContent(), convertedMime->encodedContent()); QVERIFY( false ); @@ -179,7 +179,7 @@ QTest::addColumn( "vcardFileName" ); QTest::addColumn( "mimeFileName" ); QTest::addColumn( "mode" ); - + QTest::newRow( "v2contactSimple" ) << Kolab::KolabV2 << Kolab::ContactObject << getPath("v2/contacts/simple.vcf") << getPath("v2/contacts/simple.vcf.mime") << ReadWrite; //FIXME Reference files needs to be adjusted due to fix in how pictures are stored // QTest::newRow( "v2contactComplex" ) << Kolab::KolabV2 << Kolab::ContactObject << getPath("v2/contacts/complex.vcf") << getPath("v2/contacts/complex.vcf.mime") << ReadWrite; @@ -192,7 +192,7 @@ // QTest::newRow( "v2contactPicture" ) << Kolab::KolabV2 << Kolab::ContactObject << getPath("v2/contacts/picture.vcf") << getPath("v2/contacts/picture.vcf.mime") << ReadWrite; //FIXME the following test fails because the vcard implementation always writes jpeg (which is lossy). The reference vcf file is therefore probably also not really useful // QTest::newRow( "v2pictureJPGHorde" ) << Kolab::KolabV2 << Kolab::ContactObject << getPath("v2/contacts/pictureJPGHorde.vcf") << getPath("v2/contacts/pictureJPGHorde.vcf.mime"); - + QTest::newRow( "v3contactSimple" ) << Kolab::KolabV3 << Kolab::ContactObject << getPath("v3/contacts/simple.vcf") << getPath("v3/contacts/simple.vcf.mime") << ReadWrite; QTest::newRow( "v3contactComplex" ) << Kolab::KolabV3 << Kolab::ContactObject << getPath("v3/contacts/complex.vcf") << getPath("v3/contacts/complex.vcf.mime") << ReadWrite; QTest::newRow( "v3contactPng" ) << Kolab::KolabV3 << Kolab::ContactObject << getPath("v3/readonly/png.vcf") << getPath("v3/readonly/png.vcf.mime") << ReadOnly; @@ -228,7 +228,7 @@ QFETCH( QString, vcardFileName ); //To compare QFETCH( QString, mimeFileName ); //For parsing QFETCH( TestMode, mode ); //For parsing - + //Parse mime message bool ok = false; const KMime::Message::Ptr &msg = readMimeFile( mimeFileName, ok ); @@ -238,10 +238,10 @@ QCOMPARE(t, type); QCOMPARE(reader.getVersion(), version); QCOMPARE(Kolab::ErrorHandler::instance().error(), Kolab::ErrorHandler::Debug); - + KContacts::Addressee convertedAddressee = reader.getContact(); QVERIFY(!convertedAddressee.isEmpty()); - + //Parse vcard QFile vcardFile( vcardFileName ); QVERIFY( vcardFile.open( QFile::ReadOnly ) ); @@ -273,7 +273,7 @@ if (mode == ReadWrite) { Kolab::overrideTimestamp(Kolab::cDateTime(2012, 5, 5, 5,5,5, true)); const KMime::Message::Ptr &convertedMime = Kolab::KolabObjectWriter::writeContact(realAddressee, version); - + if ( !compareMimeMessage( convertedMime, msg )) { QString expected = msg->encodedContent(); normalizeMimemessage(expected); @@ -295,7 +295,7 @@ QTest::addColumn( "type" ); QTest::addColumn( "vcardFileName" ); QTest::addColumn( "mimeFileName" ); - + QTest::newRow( "v3distlistSimple" ) << Kolab::KolabV3 << Kolab::DistlistObject << getPath("v3/contacts/distlist.vcf") << getPath("v3/contacts/distlist.vcf.mime"); } @@ -305,7 +305,7 @@ 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 ); @@ -315,9 +315,9 @@ QCOMPARE(t, type); QCOMPARE(reader.getVersion(), version); QCOMPARE(Kolab::ErrorHandler::instance().error(), Kolab::ErrorHandler::Debug); - + KContacts::ContactGroup convertedAddressee = reader.getDistlist(); - + //Parse vcard QFile vcardFile( vcardFileName ); QVERIFY( vcardFile.open( QFile::ReadOnly ) ); @@ -325,7 +325,7 @@ QByteArray c = vcardFile.readAll(); QBuffer data(&c); data.open(QIODevice::ReadOnly); - + KContacts::ContactGroup realAddressee; KContacts::ContactGroupTool::convertFromXml( &data, realAddressee ); @@ -333,18 +333,18 @@ QBuffer expected; expected.open(QIODevice::WriteOnly); KContacts::ContactGroupTool::convertToXml(realAddressee, &expected); - + QBuffer converted; converted.open(QIODevice::WriteOnly); KContacts::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); @@ -385,12 +385,12 @@ QCOMPARE(Kolab::ErrorHandler::instance().error(), Kolab::ErrorHandler::Debug); KMime::Message::Ptr convertedNote = reader.getNote(); - QVERIFY(convertedNote.get()); + QVERIFY(convertedNote.data()); //Parse note const KMime::Message::Ptr &realNote = readMimeFile( noteFileName, ok ); QVERIFY(ok); - QVERIFY(realNote.get()); + QVERIFY(realNote.data()); QString expected = realNote->encodedContent(); normalizeMimemessage(expected); @@ -399,11 +399,11 @@ QEXPECT_FAIL("", "Header sorting is off", Continue); QCOMPARE(expected, converted); // showDiff(expected, converted); - + //Write const KMime::Message::Ptr &convertedMime = Kolab::KolabObjectWriter::writeNote(realNote, version); - QVERIFY(convertedMime.get()); - QVERIFY(msg.get()); + QVERIFY(convertedMime.data()); + QVERIFY(msg.data()); QString expected2 = msg->encodedContent(); normalizeMimemessage(expected2); @@ -424,24 +424,24 @@ // QVERIFY( icalFile.open( QFile::ReadOnly ) ); // KCalCore::ICalFormat format; // const KCalCore::Incidence::Ptr realIncidence( format.fromString( QString::fromUtf8( icalFile.readAll() ) ) ); -// +// // QString result; // QTextStream s(&result); // Kolab::overrideTimestamp(Kolab::cDateTime(2012, 5, 5, 5,5,5, true)); // Kolab::KolabObjectWriter::writeIncidence(realIncidence, Kolab::KolabV3)->toStream(s); - + // QFile vcardFile( getPath("v3/contacts/complex.vcf") ); // QVERIFY( vcardFile.open( QFile::ReadOnly ) ); // KContacts::VCardConverter converter; // const KContacts::Addressee realAddressee = converter.parseVCard( vcardFile.readAll() ); -// +// // qDebug() << realAddressee.photo().data(); -// +// // QString result; // QTextStream s(&result); // Kolab::overrideTimestamp(Kolab::cDateTime(2012, 5, 5, 5,5,5, true)); // Kolab::KolabObjectWriter::writeContact(realAddressee, Kolab::KolabV3)->toStream(s); - + // qDebug() << result; } @@ -452,7 +452,7 @@ // qDebug() << msg->encodedContent(); // Kolab::KolabObjectReader reader; // Kolab::ObjectType t = reader.parseMimeMessage(msg); -// +// // KContacts::Addressee convertedAddressee = reader.getContact(); // KContacts::VCardConverter converter; // qDebug() << converter.createVCard(convertedAddressee); @@ -462,7 +462,7 @@ // qDebug() << msg->encodedContent(); // Kolab::KolabObjectReader reader; // Kolab::ObjectType t = reader.parseMimeMessage(msg); -// +// // KContacts::ContactGroup convertedAddressee = reader.getDistlist(); // QBuffer buf; // buf.open(QIODevice::WriteOnly); @@ -480,7 +480,7 @@ // img.save(&buffer, "JPEG"); // buffer.close(); // qDebug() << pic.toBase64(); -// +// // QImage img2; // QByteArray pic2; // QBuffer buffer2(&pic2); @@ -488,7 +488,7 @@ // img2.save(&buffer2, "JPEG"); // buffer2.close(); // qDebug() << pic2.toBase64(); - + } QTEST_MAIN( FormatTest )