diff --git a/src/akonadi/akonadiserializer.cpp b/src/akonadi/akonadiserializer.cpp --- a/src/akonadi/akonadiserializer.cpp +++ b/src/akonadi/akonadiserializer.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include @@ -201,6 +202,25 @@ task->setProperty("relatedUid", todo->relatedTo()); task->setRunning(todo->customProperty("Zanshin", "Running") == QLatin1String("1")); + QMimeDatabase mimeDb; + const auto attachmentsInput = todo->attachments(); + Domain::Task::Attachments attachments; + attachments.reserve(attachmentsInput.size()); + std::transform(attachmentsInput.cbegin(), attachmentsInput.cend(), + std::back_inserter(attachments), + [&mimeDb] (const KCalCore::Attachment::Ptr &attach) { + Domain::Task::Attachment attachment; + if (attach->isUri()) + attachment.setUri(attach->uri()); + else + attachment.setData(attach->decodedData()); + attachment.setLabel(attach->label()); + attachment.setMimeType(attach->mimeType()); + attachment.setIconName(mimeDb.mimeTypeForName(attach->mimeType()).iconName()); + return attachment; + }); + task->setAttachments(attachments); + if (todo->attendeeCount() > 0) { const auto attendees = todo->attendees(); const auto delegate = std::find_if(attendees.begin(), attendees.end(), @@ -248,6 +268,17 @@ todo->setRelatedTo(task->property("relatedUid").toString()); } + for (const auto &attachment : task->attachments()) { + KCalCore::Attachment::Ptr attach(new KCalCore::Attachment(QByteArray())); + if (attachment.isUri()) + attach->setUri(attachment.uri().toString()); + else + attach->setDecodedData(attachment.data()); + attach->setMimeType(attachment.mimeType()); + attach->setLabel(attachment.label()); + todo->addAttachment(attach); + } + if (task->delegate().isValid()) { KCalCore::Attendee::Ptr attendee(new KCalCore::Attendee(task->delegate().name(), task->delegate().email(), diff --git a/tests/units/akonadi/akonadiserializertest.cpp b/tests/units/akonadi/akonadiserializertest.cpp --- a/tests/units/akonadi/akonadiserializertest.cpp +++ b/tests/units/akonadi/akonadiserializertest.cpp @@ -654,13 +654,18 @@ QTest::addColumn("updatedStartDate"); QTest::addColumn("updatedDueDate"); QTest::addColumn("updatedRelated"); + QTest::addColumn("updatedAttachmentData"); + QTest::addColumn("updatedAttachmentUris"); + QTest::addColumn("updatedAttachmentLabels"); + QTest::addColumn("updatedAttachmentMimeTypes"); + QTest::addColumn("updatedAttachmentIconNames"); QTest::addColumn("updatedDelegateName"); QTest::addColumn("updatedDelegateEmail"); QTest::addColumn("updatedRunning"); - QTest::newRow("no change") << "summary" << "content" << false << QDateTime() << QDateTime(QDate(2013, 11, 24)) << QDateTime(QDate(2014, 03, 01)) << "my-uid" << "John Doe" << "j@d.com" << false; - QTest::newRow("changed") << "new summary" << "new content" << true << QDateTime(QDate(2013, 11, 28)) << QDateTime(QDate(2013, 11, 25)) << QDateTime(QDate(2014, 03, 02)) << "my-new-uid" << "John Smith" << "j@s.com" << false; - QTest::newRow("set_to_running") << "summary" << "content" << false << QDateTime() << QDateTime(QDate(2013, 11, 24)) << QDateTime(QDate(2014, 03, 01)) << "my-uid" << "John Doe" << "j@d.com" << true; + QTest::newRow("no change") << "summary" << "content" << false << QDateTime() << QDateTime(QDate(2013, 11, 24)) << QDateTime(QDate(2014, 03, 01)) << "my-uid" << QByteArrayList() << QStringList() << QStringList() << QStringList() << QStringList() << "John Doe" << "j@d.com" << false; + QTest::newRow("changed") << "new summary" << "new content" << true << QDateTime(QDate(2013, 11, 28)) << QDateTime(QDate(2013, 11, 25)) << QDateTime(QDate(2014, 03, 02)) << "my-new-uid" << QByteArrayList({"foo", "# bar", QByteArray()}) << QStringList({QString(), QString(), "https://www.kde.org"}) << QStringList({"label1", "label2", "label3"}) << QStringList({"text/plain", "text/markdown", "text/html"}) << QStringList({"text-plain", "text-markdown", "text-html"}) << "John Smith" << "j@s.com" << false; + QTest::newRow("set_to_running") << "summary" << "content" << false << QDateTime() << QDateTime(QDate(2013, 11, 24)) << QDateTime(QDate(2014, 03, 01)) << "my-uid" << QByteArrayList() << QStringList() << QStringList() << QStringList() << QStringList() << "John Doe" << "j@d.com" << true; } void shouldUpdateTaskFromItem() @@ -705,6 +710,11 @@ QFETCH(QDateTime, updatedStartDate); QFETCH(QDateTime, updatedDueDate); QFETCH(QString, updatedRelated); + QFETCH(QByteArrayList, updatedAttachmentData); + QFETCH(QStringList, updatedAttachmentUris); + QFETCH(QStringList, updatedAttachmentLabels); + QFETCH(QStringList, updatedAttachmentMimeTypes); + QFETCH(QStringList, updatedAttachmentIconNames); QFETCH(QString, updatedDelegateName); QFETCH(QString, updatedDelegateEmail); QFETCH(bool, updatedRunning); @@ -727,6 +737,18 @@ updatedTodo->setDtStart(KDateTime(updatedStartDate, KDateTime::UTC)); updatedTodo->setDtDue(KDateTime(updatedDueDate, KDateTime::UTC)); updatedTodo->setRelatedTo(updatedRelated); + + for (int i = 0; i < updatedAttachmentData.size(); i++) { + KCalCore::Attachment::Ptr attachment(new KCalCore::Attachment(QByteArray())); + if (!updatedAttachmentData.at(i).isEmpty()) + attachment->setDecodedData(updatedAttachmentData.at(i)); + else + attachment->setUri(updatedAttachmentUris.at(i)); + attachment->setMimeType(updatedAttachmentMimeTypes.at(i)); + attachment->setLabel(updatedAttachmentLabels.at(i)); + updatedTodo->addAttachment(attachment); + } + if (!updatedDelegateName.isEmpty() || !updatedDelegateEmail.isEmpty()) { KCalCore::Attendee::Ptr updatedAttendee(new KCalCore::Attendee(updatedDelegateName, updatedDelegateEmail, @@ -763,6 +785,15 @@ QCOMPARE(task->property("relatedUid").toString(), updatedTodo->relatedTo()); QCOMPARE(task->property("itemId").toLongLong(), updatedItem.id()); QCOMPARE(task->property("parentCollectionId").toLongLong(), updatedCollection.id()); + QCOMPARE(task->attachments().size(), updatedAttachmentData.size()); + for (int i = 0; i < task->attachments().size(); i++) { + const auto attachment = task->attachments().at(i); + QCOMPARE(attachment.data(), updatedAttachmentData.at(i)); + QCOMPARE(attachment.uri(), QUrl(updatedAttachmentUris.at(i))); + QCOMPARE(attachment.label(), updatedAttachmentLabels.at(i)); + QCOMPARE(attachment.mimeType(), updatedAttachmentMimeTypes.at(i)); + QCOMPARE(attachment.iconName(), updatedAttachmentIconNames.at(i)); + } QCOMPARE(task->delegate().name(), updatedDelegateName); QCOMPARE(task->delegate().email(), updatedDelegateEmail); QCOMPARE(task->isRunning(), updatedRunning); @@ -778,6 +809,15 @@ QCOMPARE(task->property("relatedUid").toString(), updatedTodo->relatedTo()); QCOMPARE(task->property("itemId").toLongLong(), updatedItem.id()); QCOMPARE(task->property("parentCollectionId").toLongLong(), updatedCollection.id()); + QCOMPARE(task->attachments().size(), updatedAttachmentData.size()); + for (int i = 0; i < task->attachments().size(); i++) { + const auto attachment = task->attachments().at(i); + QCOMPARE(attachment.data(), updatedAttachmentData.at(i)); + QCOMPARE(attachment.uri(), QUrl(updatedAttachmentUris.at(i))); + QCOMPARE(attachment.label(), updatedAttachmentLabels.at(i)); + QCOMPARE(attachment.mimeType(), updatedAttachmentMimeTypes.at(i)); + QCOMPARE(attachment.iconName(), updatedAttachmentIconNames.at(i)); + } QCOMPARE(task->delegate().name(), updatedDelegateName); QCOMPARE(task->delegate().email(), updatedDelegateEmail); QCOMPARE(task->isRunning(), updatedRunning); @@ -920,48 +960,73 @@ QTest::addColumn("itemId"); QTest::addColumn("parentCollectionId"); QTest::addColumn("todoUid"); + QTest::addColumn("attachments"); QTest::addColumn("delegate"); QTest::addColumn("running"); + Domain::Task::Attachments attachments; + + Domain::Task::Attachment dataAttachment; + dataAttachment.setData("foo"); + dataAttachment.setLabel("dataAttachment"); + dataAttachment.setMimeType("text/plain"); + dataAttachment.setIconName("text-plain"); + attachments.append(dataAttachment); + + Domain::Task::Attachment uriAttachment; + uriAttachment.setUri(QUrl("https://www.kde.org")); + uriAttachment.setLabel("uriAttachment"); + uriAttachment.setMimeType("text/html"); + uriAttachment.setIconName("text-html"); + attachments.append(uriAttachment); + QTest::newRow("nominal case (no id)") << "summary" << "content" << false << QDateTime() << QDateTime(QDate(2013, 11, 24)) << QDateTime(QDate(2014, 03, 01)) << qint64(-1) << qint64(-1) << QString() + << attachments << Domain::Task::Delegate(QStringLiteral("John Doe"), QStringLiteral("j@d.com")) << false; QTest::newRow("done case (no id)") << "summary" << "content" << true << QDateTime(QDate(2013, 11, 30)) << QDateTime(QDate(2013, 11, 24)) << QDateTime(QDate(2014, 03, 01)) << qint64(-1) << qint64(-1) << QString() + << Domain::Task::Attachments() << Domain::Task::Delegate(QStringLiteral("John Doe"), QStringLiteral("j@d.com")) << false; QTest::newRow("empty case (no id)") << QString() << QString() << false << QDateTime() << QDateTime() << QDateTime() << qint64(-1) << qint64(-1) << QString() + << Domain::Task::Attachments() << Domain::Task::Delegate() << false; QTest::newRow("nominal_with_time_info_noid") << "summary" << "content" << true << QDateTime(QDate(2015, 3, 1), QTime(1, 2, 3), Qt::UTC) << QDateTime(QDate(2013, 11, 24), QTime(0, 1, 2), Qt::UTC) << QDateTime(QDate(2016, 3, 1), QTime(4, 5, 6), Qt::UTC) << qint64(-1) << qint64(-1) << QString() + << Domain::Task::Attachments() << Domain::Task::Delegate(QStringLiteral("John Doe"), QStringLiteral("j@d.com")) << false; QTest::newRow("nominal case (with id)") << "summary" << "content" << false << QDateTime() << QDateTime(QDate(2013, 11, 24)) << QDateTime(QDate(2014, 03, 01)) << qint64(42) << qint64(43) << "my-uid" + << Domain::Task::Attachments() << Domain::Task::Delegate(QStringLiteral("John Doe"), QStringLiteral("j@d.com")) << false; QTest::newRow("done case (with id)") << "summary" << "content" << true << QDateTime(QDate(2013, 11, 30)) << QDateTime(QDate(2013, 11, 24)) << QDateTime(QDate(2014, 03, 01)) << qint64(42) << qint64(43) << "my-uid" + << Domain::Task::Attachments() << Domain::Task::Delegate(QStringLiteral("John Doe"), QStringLiteral("j@d.com")) << false; QTest::newRow("empty case (with id)") << QString() << QString() << false << QDateTime() << QDateTime() << QDateTime() << qint64(42) << qint64(43) << "my-uid" + << Domain::Task::Attachments() << Domain::Task::Delegate() << false; QTest::newRow("nominal case (running)") << "running" << QString() << false << QDateTime() << QDateTime(QDate(2013, 11, 24)) << QDateTime(QDate(2014, 03, 01)) << qint64(-1) << qint64(-1) << QString() + << Domain::Task::Attachments() << Domain::Task::Delegate() << true; } @@ -980,6 +1045,7 @@ QFETCH(qint64, itemId); QFETCH(qint64, parentCollectionId); QFETCH(QString, todoUid); + QFETCH(Domain::Task::Attachments, attachments); QFETCH(Domain::Task::Delegate, delegate); QFETCH(bool, running); @@ -996,6 +1062,7 @@ task->setDoneDate(doneDate); task->setStartDate(startDate); task->setDueDate(dueDate); + task->setAttachments(attachments); task->setDelegate(delegate); task->setRunning(running); @@ -1039,6 +1106,16 @@ } QCOMPARE(todo->dtStart().isDateOnly(), todo->allDay()); + QCOMPARE(todo->attachments().size(), attachments.size()); + for (int i = 0; i < attachments.size(); i++) { + auto attachment = todo->attachments().at(i); + QCOMPARE(attachment->isUri(), attachments.at(i).isUri()); + QCOMPARE(QUrl(attachment->uri()), attachments.at(i).uri()); + QCOMPARE(attachment->decodedData(), attachments.at(i).data()); + QCOMPARE(attachment->label(), attachments.at(i).label()); + QCOMPARE(attachment->mimeType(), attachments.at(i).mimeType()); + } + if (delegate.isValid()) { auto attendee = todo->attendeeByMail(delegate.email()); QVERIFY(attendee);