From 3fa1766af3fa85067d4b2d48c8410e6c201ae323 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Sun, 12 Jun 2016 02:11:02 +0200 Subject: Moving of mails between folders --- examples/imapresource/imapresource.cpp | 9 +++-- examples/imapresource/imapserverproxy.cpp | 16 +++++++++ examples/imapresource/imapserverproxy.h | 2 ++ tests/mailtest.cpp | 55 +++++++++++++++++++++++++++++++ tests/mailtest.h | 1 + 5 files changed, 80 insertions(+), 3 deletions(-) diff --git a/examples/imapresource/imapresource.cpp b/examples/imapresource/imapresource.cpp index aca1c01..8cbb9fa 100644 --- a/examples/imapresource/imapresource.cpp +++ b/examples/imapresource/imapresource.cpp @@ -491,8 +491,11 @@ public: flags << Imap::Flags::Flagged; } - const bool messageChanged = changedProperties.contains(Sink::ApplicationDomain::Mail::MimeMessage::name); - if (messageChanged) { + const bool messageMoved = changedProperties.contains(ApplicationDomain::Mail::Folder::name); + const bool messageChanged = changedProperties.contains(ApplicationDomain::Mail::MimeMessage::name); + if (messageChanged || messageMoved) { + const auto folderId = folderIdFromMailRid(oldRemoteId); + const QString oldMailbox = syncStore().resolveLocalId(ENTITY_TYPE_FOLDER, folderId); QByteArray content = KMime::LFtoCRLF(mail.getMimeMessage()); QDateTime internalDate = mail.getDate(); auto rid = QSharedPointer::create(); @@ -504,7 +507,7 @@ public: Trace() << "Finished creating a modified mail: " << remoteId; *rid = remoteId; }) - .then(imap->remove(mailbox, set)) + .then(imap->remove(oldMailbox, set)) .then([rid, imap]() { return *rid; }); diff --git a/examples/imapresource/imapserverproxy.cpp b/examples/imapresource/imapserverproxy.cpp index db68a53..49711a9 100644 --- a/examples/imapresource/imapserverproxy.cpp +++ b/examples/imapresource/imapserverproxy.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -219,6 +220,15 @@ KAsync::Job ImapServerProxy::expunge(const KIMAP::ImapSet &set) return runJob(job); } +KAsync::Job ImapServerProxy::copy(const KIMAP::ImapSet &set, const QString &newMailbox) +{ + auto copy = new KIMAP::CopyJob(mSession); + copy->setSequenceSet(set); + copy->setUidBased(true); + copy->setMailBox(newMailbox); + return runJob(copy); +} + KAsync::Job ImapServerProxy::fetch(const KIMAP::ImapSet &set, KIMAP::FetchJob::FetchScope scope, FetchCallback callback) { auto fetch = new KIMAP::FetchJob(mSession); @@ -304,6 +314,12 @@ KAsync::Job ImapServerProxy::remove(const QString &mailbox, const QByteArr return remove(mailbox, set); } + +KAsync::Job ImapServerProxy::move(const QString &mailbox, const KIMAP::ImapSet &set, const QString &newMailbox) +{ + return select(mailbox).then(copy(set, newMailbox)).then(store(set, QByteArrayList() << Flags::Deleted)).then(expunge(set)); +} + KAsync::Job ImapServerProxy::createSubfolder(const QString &parentMailbox, const QString &folderName) { auto folder = QSharedPointer::create(); diff --git a/examples/imapresource/imapserverproxy.h b/examples/imapresource/imapserverproxy.h index 67ff000..95ed704 100644 --- a/examples/imapresource/imapserverproxy.h +++ b/examples/imapresource/imapserverproxy.h @@ -93,6 +93,7 @@ public: KAsync::Job remove(const QString &mailbox); KAsync::Job expunge(); KAsync::Job expunge(const KIMAP::ImapSet &set); + KAsync::Job copy(const KIMAP::ImapSet &set, const QString &newMailbox); typedef std::function &, @@ -109,6 +110,7 @@ public: KAsync::Job> fetchHeaders(const QString &mailbox); KAsync::Job remove(const QString &mailbox, const KIMAP::ImapSet &set); KAsync::Job remove(const QString &mailbox, const QByteArray &imapSet); + KAsync::Job move(const QString &mailbox, const KIMAP::ImapSet &set, const QString &newMailbox); KAsync::Job createSubfolder(const QString &parentMailbox, const QString &folderName); KAsync::Job renameSubfolder(const QString &mailbox, const QString &newName); diff --git a/tests/mailtest.cpp b/tests/mailtest.cpp index 70d60bb..2fcad93 100644 --- a/tests/mailtest.cpp +++ b/tests/mailtest.cpp @@ -220,6 +220,61 @@ void MailTest::testCreateModifyDeleteMail() VERIFYEXEC(ResourceControl::inspect(ResourceControl::Inspection::CacheIntegrityInspection(folder))); } +void MailTest::testMoveMail() +{ + const auto subject = QString::fromLatin1("Foobar"); + + auto folder = Folder::create(mResourceInstanceIdentifier); + folder.setName("folder2"); + VERIFYEXEC(Store::create(folder)); + + auto folder1 = Folder::create(mResourceInstanceIdentifier); + folder1.setName("folder3"); + VERIFYEXEC(Store::create(folder1)); + + auto message = KMime::Message::Ptr::create(); + message->subject(true)->fromUnicodeString(subject, "utf8"); + message->assemble(); + + auto mail = Mail::create(mResourceInstanceIdentifier); + mail.setMimeMessage(message->encodedContent()); + mail.setFolder(folder); + + VERIFYEXEC(Store::create(mail)); + VERIFYEXEC(ResourceControl::flushMessageQueue(QByteArrayList() << mResourceInstanceIdentifier)); + { + auto job = Store::fetchAll(Query::RequestedProperties(QByteArrayList() << Mail::Folder::name << Mail::Subject::name << Mail::MimeMessage::name)) + .then>([=](const QList &mails) { + QCOMPARE(mails.size(), 1); + auto mail = *mails.first(); + QCOMPARE(mail.getFolder(), folder.identifier()); + Warning() << "path: " << mail.getMimeMessagePath(); + QVERIFY(QFile(mail.getMimeMessagePath()).exists()); + }); + VERIFYEXEC(job); + } + + VERIFYEXEC(ResourceControl::inspect(ResourceControl::Inspection::CacheIntegrityInspection(folder))); + + mail.setFolder(folder1); + + VERIFYEXEC(Store::modify(mail)); + VERIFYEXEC(ResourceControl::flushMessageQueue(QByteArrayList() << mResourceInstanceIdentifier)); + { + auto job = Store::fetchAll(Query::RequestedProperties(QByteArrayList() << Mail::Folder::name << Mail::Subject::name << Mail::MimeMessage::name)) + .then>([=](const QList &mails) { + QCOMPARE(mails.size(), 1); + auto mail = *mails.first(); + QCOMPARE(mail.getFolder(), folder1.identifier()); + QVERIFY(QFile(mail.getMimeMessagePath()).exists()); + Trace() << "Mime message path: " << mail.getMimeMessagePath(); + }); + VERIFYEXEC(job); + } + VERIFYEXEC(ResourceControl::inspect(ResourceControl::Inspection::CacheIntegrityInspection(folder))); + VERIFYEXEC(ResourceControl::inspect(ResourceControl::Inspection::CacheIntegrityInspection(folder1))); +} + void MailTest::testMarkMailAsRead() { auto folder = Folder::create(mResourceInstanceIdentifier); diff --git a/tests/mailtest.h b/tests/mailtest.h index 43d4f75..3ba7f63 100644 --- a/tests/mailtest.h +++ b/tests/mailtest.h @@ -64,6 +64,7 @@ private slots: void testCreateModifyDeleteFolder(); void testCreateModifyDeleteMail(); + void testMoveMail(); void testMarkMailAsRead(); void testCreateDraft(); }; -- cgit v1.2.3