From 312702b809907866c085b92b1127129aaaf7f693 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Tue, 29 Dec 2015 22:00:01 +0100 Subject: Stub for mail change-replay. Not usable yet. --- examples/maildirresource/maildirresource.cpp | 43 +++++++++++++++++++++++++++- tests/maildirresourcetest.cpp | 24 ++++++++++++++++ 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/examples/maildirresource/maildirresource.cpp b/examples/maildirresource/maildirresource.cpp index 7fcf12e..c3b3047 100644 --- a/examples/maildirresource/maildirresource.cpp +++ b/examples/maildirresource/maildirresource.cpp @@ -98,7 +98,7 @@ QString MaildirResource::resolveLocalId(const QByteArray &bufferType, const QByt Index index("localid.mapping." + bufferType, transaction); QByteArray remoteId = index.lookup(localId); if (remoteId.isEmpty()) { - Warning() << "Couldn't find the local id"; + Warning() << "Couldn't find the remote id for " << localId; } return remoteId; } @@ -405,6 +405,47 @@ KAsync::Job MaildirResource::replay(const QByteArray &type, const QByteArr } else { Warning() << "Unkown operation" << operation; } + } else if (type == ENTITY_TYPE_MAIL) { + Akonadi2::EntityBuffer buffer(value.data(), value.size()); + const Akonadi2::Entity &entity = buffer.entity(); + const auto metadataBuffer = Akonadi2::EntityBuffer::readBuffer(entity.metadata()); + if (metadataBuffer && !metadataBuffer->replayToSource()) { + Trace() << "Change is coming from the source"; + return KAsync::null(); + } + const qint64 revision = metadataBuffer ? metadataBuffer->revision() : -1; + const auto operation = metadataBuffer ? metadataBuffer->operation() : Akonadi2::Operation_Creation; + if (operation == Akonadi2::Operation_Creation) { + const Akonadi2::ApplicationDomain::Mail mail(mResourceInstanceIdentifier, Akonadi2::Storage::uidFromKey(key), revision, mMailAdaptorFactory->createAdaptor(entity)); + auto parentFolder = mail.getProperty("folder").toByteArray(); + QByteArray parentFolderRemoteId; + if (!parentFolder.isEmpty()) { + parentFolderRemoteId = resolveLocalId(ENTITY_TYPE_FOLDER, parentFolder, synchronizationTransaction).toLatin1(); + } else { + parentFolderRemoteId = mMaildirPath.toLatin1(); + } + const auto parentFolderPath = parentFolderRemoteId; + KPIM::Maildir maildir(parentFolderPath, false); + //FIXME assemble the MIME message + const auto id = maildir.addEntry("foobar"); + Trace() << "Creating a new mail: " << id; + recordRemoteId(ENTITY_TYPE_MAIL, mail.identifier(), id.toUtf8(), synchronizationTransaction); + } else if (operation == Akonadi2::Operation_Removal) { + const auto uid = Akonadi2::Storage::uidFromKey(key); + const auto remoteId = resolveLocalId(ENTITY_TYPE_MAIL, uid, synchronizationTransaction); + const Akonadi2::ApplicationDomain::Mail mail(mResourceInstanceIdentifier, Akonadi2::Storage::uidFromKey(key), revision, mMailAdaptorFactory->createAdaptor(entity)); + auto parentFolder = mail.getProperty("folder").toByteArray(); + const auto parentFolderRemoteId = resolveLocalId(ENTITY_TYPE_FOLDER, parentFolder, synchronizationTransaction); + const auto parentFolderPath = parentFolderRemoteId; + KPIM::Maildir maildir(parentFolderPath, false); + Trace() << "Removing a mail: " << remoteId; + maildir.removeEntry(remoteId); + removeRemoteId(ENTITY_TYPE_MAIL, uid, remoteId.toUtf8(), synchronizationTransaction); + } else if (operation == Akonadi2::Operation_Modification) { + Warning() << "Mail modifications are not implemented"; + } else { + Warning() << "Unkown operation" << operation; + } } return KAsync::null(); } diff --git a/tests/maildirresourcetest.cpp b/tests/maildirresourcetest.cpp index 1e2d36b..b0bc30b 100644 --- a/tests/maildirresourcetest.cpp +++ b/tests/maildirresourcetest.cpp @@ -287,6 +287,30 @@ private Q_SLOTS: QTRY_VERIFY(!QFileInfo(targetPath).exists()); } + void testCreateMail() + { + Akonadi2::Query query; + query.resources << "org.kde.maildir.instance1"; + query.syncOnDemand = false; + query.processAll = true; + + //Ensure all local data is processed + Akonadi2::Store::synchronize(query).exec().waitForFinished(); + + Akonadi2::ApplicationDomain::Mail mail("org.kde.maildir.instance1"); + mail.setProperty("name", "testCreateMail"); + + Akonadi2::Store::create(mail).exec().waitForFinished(); + + //Ensure all local data is processed + Akonadi2::Store::synchronize(query).exec().waitForFinished(); + + auto targetPath = tempDir.path() + "/maildir1/new"; + QDir dir(targetPath); + dir.setFilter(QDir::Files); + QTRY_COMPARE(dir.count(), static_cast(1)); + } + }; QTEST_MAIN(MaildirResourceTest) -- cgit v1.2.3