From 672bbe1f10be056c1170bc227e16060edeff2481 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Fri, 3 Jun 2016 11:26:08 +0200 Subject: Implemented imap flag changes. --- examples/imapresource/imapresource.cpp | 45 ++++++++++++++++++++----------- examples/imapresource/imapserverproxy.cpp | 24 +++++++++++++++++ examples/imapresource/imapserverproxy.h | 3 +++ tests/mailtest.cpp | 8 +++--- 4 files changed, 61 insertions(+), 19 deletions(-) diff --git a/examples/imapresource/imapresource.cpp b/examples/imapresource/imapresource.cpp index 2dfb2ea..02713b3 100644 --- a/examples/imapresource/imapresource.cpp +++ b/examples/imapresource/imapresource.cpp @@ -384,21 +384,36 @@ public: flags << Imap::Flags::Flagged; } - QByteArray content = KMime::LFtoCRLF(mail.getMimeMessage()); - QDateTime internalDate = mail.getDate(); - auto rid = QSharedPointer::create(); - KIMAP::ImapSet set; - set.add(uid); - return login.then(imap->append(mailbox, content, flags, internalDate)) - .then([imap, mailbox, rid](qint64 uid) { - const auto remoteId = mailbox + "/" + QByteArray::number(uid); - Trace() << "Finished creating a modified mail: " << remoteId; - *rid = remoteId; - }) - .then(imap->remove(mailbox, set)) - .then([rid, imap]() { - return *rid; - }); + bool messageChanged = false; + if (messageChanged) { + QByteArray content = KMime::LFtoCRLF(mail.getMimeMessage()); + QDateTime internalDate = mail.getDate(); + auto rid = QSharedPointer::create(); + KIMAP::ImapSet set; + set.add(uid); + return login.then(imap->append(mailbox, content, flags, internalDate)) + .then([imap, mailbox, rid](qint64 uid) { + const auto remoteId = mailbox + "/" + QByteArray::number(uid); + Trace() << "Finished creating a modified mail: " << remoteId; + *rid = remoteId; + }) + .then(imap->remove(mailbox, set)) + .then([rid, imap]() { + return *rid; + }); + } else { + KIMAP::ImapSet set; + set.add(uid); + return login.then(imap->select(mailbox)) + .then(imap->storeFlags(set, flags)) + .then([imap, mailbox](qint64 uid) { + const auto remoteId = mailbox + "/" + QByteArray::number(uid); + Trace() << "Finished modifying mail: " << remoteId; + }) + .then([oldRemoteId, imap]() { + return oldRemoteId; + }); + } } return KAsync::null(); } diff --git a/examples/imapresource/imapserverproxy.cpp b/examples/imapresource/imapserverproxy.cpp index 1414dbe..ddda2e9 100644 --- a/examples/imapresource/imapserverproxy.cpp +++ b/examples/imapresource/imapserverproxy.cpp @@ -132,11 +132,35 @@ KAsync::Job ImapServerProxy::append(const QString &mailbox, const QByteA KAsync::Job ImapServerProxy::store(const KIMAP::ImapSet &set, const QList &flags) { + return storeFlags(set, flags); +} + +KAsync::Job ImapServerProxy::storeFlags(const KIMAP::ImapSet &set, const QList &flags) auto store = new KIMAP::StoreJob(mSession); store->setUidBased(true); + store->setMode(KIMAP::StoreJob::SetFlags); store->setSequenceSet(set); store->setFlags(flags); + return runJob(store); +} + +KAsync::Job ImapServerProxy::addFlags(const KIMAP::ImapSet &set, const QList &flags) +{ + auto store = new KIMAP::StoreJob(mSession); + store->setUidBased(true); store->setMode(KIMAP::StoreJob::AppendFlags); + store->setSequenceSet(set); + store->setFlags(flags); + return runJob(store); +} + +KAsync::Job ImapServerProxy::removeFlags(const KIMAP::ImapSet &set, const QList &flags) +{ + auto store = new KIMAP::StoreJob(mSession); + store->setUidBased(true); + store->setMode(KIMAP::StoreJob::RemoveFlags); + store->setSequenceSet(set); + store->setFlags(flags); return runJob(store); } diff --git a/examples/imapresource/imapserverproxy.h b/examples/imapresource/imapserverproxy.h index 3afeee5..05409c5 100644 --- a/examples/imapresource/imapserverproxy.h +++ b/examples/imapresource/imapserverproxy.h @@ -69,6 +69,9 @@ public: KAsync::Job select(const QString &mailbox); KAsync::Job append(const QString &mailbox, const QByteArray &content, const QList &flags = QList(), const QDateTime &internalDate = QDateTime()); KAsync::Job store(const KIMAP::ImapSet &set, const QList &flags); + KAsync::Job storeFlags(const KIMAP::ImapSet &set, const QList &flags); + KAsync::Job addFlags(const KIMAP::ImapSet &set, const QList &flags); + KAsync::Job removeFlags(const KIMAP::ImapSet &set, const QList &flags); KAsync::Job create(const QString &mailbox); KAsync::Job rename(const QString &mailbox, const QString &newMailbox); KAsync::Job remove(const QString &mailbox); diff --git a/tests/mailtest.cpp b/tests/mailtest.cpp index 912bb1c..9411f91 100644 --- a/tests/mailtest.cpp +++ b/tests/mailtest.cpp @@ -231,7 +231,7 @@ void MailTest::testMarkMailAsRead() auto mail = Mail::create(mResourceInstanceIdentifier); mail.setMimeMessage(message->encodedContent()); mail.setFolder(folder); - mail.setUnread(false); + mail.setUnread(true); VERIFYEXEC(Store::create(mail)); VERIFYEXEC(ResourceControl::flushMessageQueue(QByteArrayList() << mResourceInstanceIdentifier)); @@ -241,10 +241,10 @@ void MailTest::testMarkMailAsRead() .then, QList>([this](const QList &mails) { ASYNCCOMPARE(mails.size(), 1); auto mail = mails.first(); - mail->setUnread(true); + mail->setUnread(false); return Store::modify(*mail) .then(ResourceControl::flushReplayQueue(QByteArrayList() << mResourceInstanceIdentifier)) // The change needs to be replayed already - .then(ResourceControl::inspect(ResourceControl::Inspection::PropertyInspection(*mail, Mail::Unread::name, true))) + .then(ResourceControl::inspect(ResourceControl::Inspection::PropertyInspection(*mail, Mail::Unread::name, false))) .then(ResourceControl::inspect(ResourceControl::Inspection::PropertyInspection(*mail, Mail::Subject::name, mail->getSubject()))); }); VERIFYEXEC(job); @@ -259,7 +259,7 @@ void MailTest::testMarkMailAsRead() ASYNCCOMPARE(mails.size(), 1); auto mail = mails.first(); ASYNCVERIFY(!mail->getSubject().isEmpty()); - ASYNCCOMPARE(mail->getUnread(), true); + ASYNCCOMPARE(mail->getUnread(), false); ASYNCVERIFY(QFileInfo(mail->getMimeMessagePath()).exists()); return KAsync::null(); }); -- cgit v1.2.3