From 26816c21f60450e461a5b6ef4ef740f6070ce278 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Wed, 27 Jul 2016 02:26:47 +0200 Subject: Ported to the kasync revamp --- examples/dummyresource/resourcefactory.cpp | 2 +- examples/imapresource/imapresource.cpp | 74 ++++++++++------------ examples/imapresource/imapserverproxy.cpp | 35 +++++----- examples/maildirresource/maildirresource.cpp | 18 ++---- .../mailtransportresource.cpp | 7 +- 5 files changed, 59 insertions(+), 77 deletions(-) (limited to 'examples') diff --git a/examples/dummyresource/resourcefactory.cpp b/examples/dummyresource/resourcefactory.cpp index 0f7463f..221e20d 100644 --- a/examples/dummyresource/resourcefactory.cpp +++ b/examples/dummyresource/resourcefactory.cpp @@ -113,7 +113,7 @@ class DummySynchronizer : public Sink::Synchronizer { KAsync::Job synchronizeWithSource() Q_DECL_OVERRIDE { SinkLog() << " Synchronizing with the source"; - return KAsync::start([this]() { + return KAsync::syncStart([this]() { synchronize(ENTITY_TYPE_EVENT, DummyStore::instance().events(), [this](const QByteArray &ridBuffer, const QMap &data) { return createEvent(ridBuffer, data); }); diff --git a/examples/imapresource/imapresource.cpp b/examples/imapresource/imapresource.cpp index e199ea1..f78376a 100644 --- a/examples/imapresource/imapresource.cpp +++ b/examples/imapresource/imapresource.cpp @@ -56,6 +56,8 @@ SINK_DEBUG_AREA("imapresource") +Q_DECLARE_METATYPE(QSharedPointer) + using namespace Imap; using namespace Sink; @@ -217,22 +219,22 @@ public: SinkLog() << "Synchronizing mails" << folder.normalizedPath(); auto capabilities = imap->getCapabilities(); bool canDoIncrementalRemovals = false; - return KAsync::start([=]() { + return KAsync::syncStart([=]() { //TODO update flags }) - .then>([=]() { + .then([=]() { //TODO Remove what's no longer existing if (canDoIncrementalRemovals) { } else { - return imap->fetchUids(folder).then>([this, folder](const QVector &uids) { + return imap->fetchUids(folder).syncThen>([this, folder](const QVector &uids) { SinkTrace() << "Syncing removals"; synchronizeRemovals(folder.normalizedPath(), uids.toList().toSet()); commit(); - }).then([](){}); + }); } return KAsync::null(); }) - .then>([this, folder, imap]() { + .then([this, folder, imap]() { SinkTrace() << "About to fetch mail"; const auto uidNext = syncStore().readValue(folder.normalizedPath().toUtf8() + "uidnext").toLongLong(); auto maxUid = QSharedPointer::create(0); @@ -248,7 +250,7 @@ public: [](int progress, int total) { SinkTrace() << "Progress: " << progress << " out of " << total; }) - .then([this, maxUid, folder]() { + .syncThen([this, maxUid, folder]() { syncStore().writeValue(folder.normalizedPath().toUtf8() + "uidnext", QByteArray::number(*maxUid)); }); }); @@ -330,15 +332,12 @@ public: flags << Imap::Flags::Flagged; } QDateTime internalDate = mail.getDate(); - auto rid = QSharedPointer::create(); return login.then(imap->append(mailbox, content, flags, internalDate)) - .then([imap, mailbox, rid, mail](qint64 uid) { + .addToContext(imap) + .syncThen([mail](qint64 uid) { const auto remoteId = assembleMailRid(mail, uid); - //FIXME this get's called after the final error handler? WTF? SinkTrace() << "Finished creating a new mail: " << remoteId; - *rid = remoteId; - }).then([rid, imap]() { //FIXME fix KJob so we don't need this extra clause - return *rid; + return remoteId; }); } else if (operation == Sink::Operation_Removal) { const auto folderId = folderIdFromMailRid(oldRemoteId); @@ -348,7 +347,7 @@ public: KIMAP::ImapSet set; set.add(uid); return login.then(imap->remove(mailbox, set)) - .then([imap, oldRemoteId]() { + .syncThen([imap, oldRemoteId] { SinkTrace() << "Finished removing a mail: " << oldRemoteId; return QByteArray(); }); @@ -374,29 +373,24 @@ public: const QString oldMailbox = syncStore().resolveLocalId(ENTITY_TYPE_FOLDER, folderId); 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, mail](qint64 uid) { + .addToContext(imap) + .then([=](qint64 uid) { const auto remoteId = assembleMailRid(mail, uid); SinkTrace() << "Finished creating a modified mail: " << remoteId; - *rid = remoteId; - }) - .then(imap->remove(oldMailbox, set)) - .then([rid, imap]() { - return *rid; + return imap->remove(oldMailbox, set).then(KAsync::value(remoteId)); }); } else { SinkTrace() << "Updating flags only."; KIMAP::ImapSet set; set.add(uid); return login.then(imap->select(mailbox)) + .addToContext(imap) .then(imap->storeFlags(set, flags)) - .then([imap, mailbox]() { + .syncThen([=] { SinkTrace() << "Finished modifying mail"; - }) - .then([oldRemoteId, imap]() { return oldRemoteId; }); } @@ -416,13 +410,13 @@ public: SinkTrace() << "Creating a new folder: " << parentFolder << folder.getName(); auto rid = QSharedPointer::create(); auto createFolder = login.then(imap->createSubfolder(parentFolder, folder.getName())) - .then([imap, rid](const QString &createdFolder) { + .syncThen([imap, rid](const QString &createdFolder) { SinkTrace() << "Finished creating a new folder: " << createdFolder; *rid = createdFolder.toUtf8(); }); if (folder.getSpecialPurpose().isEmpty()) { return createFolder - .then([rid](){ + .syncThen([rid](){ return *rid; }); } else { //We try to merge special purpose folders first @@ -435,7 +429,7 @@ public: }; } })) - .then>([specialPurposeFolders, folder, imap, parentFolder, rid]() -> KAsync::Job { + .then([specialPurposeFolders, folder, imap, parentFolder, rid]() -> KAsync::Job { for (const auto &purpose : folder.getSpecialPurpose()) { if (specialPurposeFolders->contains(purpose)) { auto f = specialPurposeFolders->value(purpose); @@ -446,13 +440,13 @@ public: } SinkTrace() << "No match found for merging, creating a new folder"; return imap->createSubfolder(parentFolder, folder.getName()) - .then([imap, rid](const QString &createdFolder) { + .syncThen([imap, rid](const QString &createdFolder) { SinkTrace() << "Finished creating a new folder: " << createdFolder; *rid = createdFolder.toUtf8(); }); }) - .then([rid](){ + .syncThen([rid](){ return *rid; }); return mergeJob; @@ -460,7 +454,7 @@ public: } else if (operation == Sink::Operation_Removal) { SinkTrace() << "Removing a folder: " << oldRemoteId; return login.then(imap->remove(oldRemoteId)) - .then([oldRemoteId, imap]() { + .syncThen([oldRemoteId, imap]() { SinkTrace() << "Finished removing a folder: " << oldRemoteId; return QByteArray(); }); @@ -468,11 +462,11 @@ public: SinkTrace() << "Renaming a folder: " << oldRemoteId << folder.getName(); auto rid = QSharedPointer::create(); return login.then(imap->renameSubfolder(oldRemoteId, folder.getName())) - .then([imap, rid](const QString &createdFolder) { + .syncThen([imap, rid](const QString &createdFolder) { SinkTrace() << "Finished renaming a folder: " << createdFolder; *rid = createdFolder.toUtf8(); }) - .then([rid](){ + .syncThen([rid](){ return *rid; }); } @@ -566,7 +560,8 @@ KAsync::Job ImapResource::inspect(int inspectionType, const QByteArray &in SinkTrace() << "Connecting to:" << mServer << mPort; SinkTrace() << "as:" << mUser; auto inspectionJob = imap->login(mUser, mPassword) - .then(imap->select(folderRemoteId).then([](){})) + .then(imap->select(folderRemoteId)) + .syncThen([](Imap::SelectResult){}) .then(imap->fetch(set, scope, [imap, messageByUid](const QVector &messages) { for (const auto &m : messages) { messageByUid->insert(m.uid, m); @@ -575,7 +570,7 @@ KAsync::Job ImapResource::inspect(int inspectionType, const QByteArray &in if (inspectionType == Sink::ResourceControl::Inspection::PropertyInspectionType) { if (property == "unread") { - return inspectionJob.then>([=]() { + return inspectionJob.then([=]() { auto msg = messageByUid->value(uid); if (expectedValue.toBool() && msg.flags.contains(Imap::Flags::Seen)) { return KAsync::error(1, "Expected unread but couldn't find it."); @@ -587,7 +582,7 @@ KAsync::Job ImapResource::inspect(int inspectionType, const QByteArray &in }); } if (property == "subject") { - return inspectionJob.then>([=]() { + return inspectionJob.then([=]() { auto msg = messageByUid->value(uid); if (msg.msg->subject(true)->asUnicodeString() != expectedValue.toString()) { return KAsync::error(1, "Subject not as expected: " + msg.msg->subject(true)->asUnicodeString()); @@ -597,7 +592,7 @@ KAsync::Job ImapResource::inspect(int inspectionType, const QByteArray &in } } if (inspectionType == Sink::ResourceControl::Inspection::ExistenceInspectionType) { - return inspectionJob.then>([=]() { + return inspectionJob.then([=]() { if (!messageByUid->contains(uid)) { SinkWarning() << "Existing messages are: " << messageByUid->keys(); SinkWarning() << "We're looking for: " << uid; @@ -628,20 +623,19 @@ KAsync::Job ImapResource::inspect(int inspectionType, const QByteArray &in scope.mode = KIMAP::FetchJob::FetchScope::Headers; auto imap = QSharedPointer::create(mServer, mPort); auto messageByUid = QSharedPointer>::create(); - auto inspectionJob = imap->login(mUser, mPassword) - .then(imap->select(remoteId).then([](){})) + return imap->login(mUser, mPassword) + .then(imap->select(remoteId).syncThen([](){})) .then(imap->fetch(set, scope, [=](const QVector &messages) { for (const auto &m : messages) { messageByUid->insert(m.uid, m); } })) - .then>([imap, messageByUid, expectedCount]() { + .then([imap, messageByUid, expectedCount]() { if (messageByUid->size() != expectedCount) { return KAsync::error(1, QString("Wrong number of messages on the server; found %1 instead of %2.").arg(messageByUid->size()).arg(expectedCount)); } return KAsync::null(); }); - return inspectionJob; } if (inspectionType == Sink::ResourceControl::Inspection::ExistenceInspectionType) { auto folderByPath = QSharedPointer>::create(); @@ -655,7 +649,7 @@ KAsync::Job ImapResource::inspect(int inspectionType, const QByteArray &in *folderByName << f.pathParts.last(); } })) - .then>([this, folderByName, folderByPath, folder, remoteId, imap]() { + .then([this, folderByName, folderByPath, folder, remoteId, imap]() { if (!folderByName->contains(folder.getName())) { SinkWarning() << "Existing folders are: " << *folderByPath; SinkWarning() << "We're looking for: " << folder.getName(); diff --git a/examples/imapresource/imapserverproxy.cpp b/examples/imapresource/imapserverproxy.cpp index a3d8d16..94367d8 100644 --- a/examples/imapresource/imapserverproxy.cpp +++ b/examples/imapresource/imapserverproxy.cpp @@ -161,7 +161,7 @@ KAsync::Job ImapServerProxy::login(const QString &username, const QString auto namespaceJob = new KIMAP::NamespaceJob(mSession); //FIXME The ping is only required because the login job doesn't fail after the configured timeout - return ping().then(runJob(loginJob)).then(runJob(capabilitiesJob)).then([this](){ + return ping().then(runJob(loginJob)).then(runJob(capabilitiesJob)).syncThen([this](){ SinkTrace() << "Supported capabilities: " << mCapabilities; QStringList requiredExtensions = QStringList() << "UIDPLUS" << "NAMESPACE"; for (const auto &requiredExtension : requiredExtensions) { @@ -170,7 +170,7 @@ KAsync::Job ImapServerProxy::login(const QString &username, const QString //TODO fail the job } } - }).then(runJob(namespaceJob)).then([this, namespaceJob](){ + }).then(runJob(namespaceJob)).syncThen([this, namespaceJob] { for (const auto &ns :namespaceJob->personalNamespaces()) { mPersonalNamespaces << ns.name; mPersonalNamespaceSeparator = ns.separator; @@ -363,7 +363,7 @@ KAsync::Job> ImapServerProxy::fetchHeaders(const QString &mailbox, list->append(uids.value(id)); } }) - .then>([list](){ + .syncThen>([list](){ return *list; }); } @@ -402,35 +402,34 @@ KAsync::Job ImapServerProxy::move(const QString &mailbox, const KIMAP::Ima KAsync::Job ImapServerProxy::createSubfolder(const QString &parentMailbox, const QString &folderName) { - auto folder = QSharedPointer::create(); - return KAsync::start>([this, parentMailbox, folderName, folder]() { + return KAsync::start([this, parentMailbox, folderName]() { Q_ASSERT(!mPersonalNamespaceSeparator.isNull()); + auto folder = QSharedPointer::create(); if (parentMailbox.isEmpty()) { *folder = mPersonalNamespaces.toList().first() + folderName; } else { *folder = parentMailbox + mPersonalNamespaceSeparator + folderName; } SinkTrace() << "Creating subfolder: " << *folder; - return create(*folder); - }) - .then([=]() { - return *folder; + return create(*folder) + .syncThen([=]() { + return *folder; + }); }); } KAsync::Job ImapServerProxy::renameSubfolder(const QString &oldMailbox, const QString &newName) { - auto folder = QSharedPointer::create(); - return KAsync::start>([this, oldMailbox, newName, folder]() { + return KAsync::start([this, oldMailbox, newName] { Q_ASSERT(!mPersonalNamespaceSeparator.isNull()); auto parts = oldMailbox.split(mPersonalNamespaceSeparator); parts.removeLast(); - *folder = parts.join(mPersonalNamespaceSeparator) + mPersonalNamespaceSeparator + newName; + auto folder = QSharedPointer::create(parts.join(mPersonalNamespaceSeparator) + mPersonalNamespaceSeparator + newName); SinkTrace() << "Renaming subfolder: " << oldMailbox << *folder; - return rename(oldMailbox, *folder); - }) - .then([=]() { - return *folder; + return rename(oldMailbox, *folder) + .syncThen([=]() { + return *folder; + }); }); } @@ -461,7 +460,7 @@ KAsync::Job ImapServerProxy::fetchMessages(const Folder &folder, qint64 ui auto time = QSharedPointer::create(); time->start(); Q_ASSERT(!mPersonalNamespaceSeparator.isNull()); - return select(mailboxFromFolder(folder)).then, SelectResult>([this, callback, folder, time, progress, uidNext](const SelectResult &selectResult) -> KAsync::Job { + return select(mailboxFromFolder(folder)).then([this, callback, folder, time, progress, uidNext](const SelectResult &selectResult) -> KAsync::Job { SinkLog() << "UIDNEXT " << selectResult.uidNext << uidNext; if (selectResult.uidNext == (uidNext + 1)) { @@ -469,7 +468,7 @@ KAsync::Job ImapServerProxy::fetchMessages(const Folder &folder, qint64 ui return KAsync::null(); } - return fetchHeaders(mailboxFromFolder(folder), (uidNext + 1)).then, QList>([this, callback, time, progress](const QList &uidsToFetch){ + return fetchHeaders(mailboxFromFolder(folder), (uidNext + 1)).then>([this, callback, time, progress](const QList &uidsToFetch){ SinkTrace() << "Fetched headers"; SinkTrace() << " Total: " << uidsToFetch.size(); SinkTrace() << " Uids to fetch: " << uidsToFetch; diff --git a/examples/maildirresource/maildirresource.cpp b/examples/maildirresource/maildirresource.cpp index 392b422..e69d822 100644 --- a/examples/maildirresource/maildirresource.cpp +++ b/examples/maildirresource/maildirresource.cpp @@ -367,7 +367,7 @@ public: KAsync::Job synchronizeWithSource() Q_DECL_OVERRIDE { SinkLog() << " Synchronizing"; - return KAsync::start >([this]() { + return KAsync::start([this]() { KPIM::Maildir maildir(mMaildirPath, true); if (!maildir.isValid(false)) { return KAsync::error(1, "Maildir path doesn't point to a valid maildir: " + mMaildirPath); @@ -402,18 +402,14 @@ public: if (operation == Sink::Operation_Creation) { const auto remoteId = getFilePathFromMimeMessagePath(mail.getMimeMessagePath()); SinkTrace() << "Mail created: " << remoteId; - return KAsync::start([=]() -> QByteArray { - return remoteId.toUtf8(); - }); + return KAsync::value(remoteId.toUtf8()); } else if (operation == Sink::Operation_Removal) { SinkTrace() << "Removing a mail: " << oldRemoteId; return KAsync::null(); } else if (operation == Sink::Operation_Modification) { SinkTrace() << "Modifying a mail: " << oldRemoteId; const auto remoteId = getFilePathFromMimeMessagePath(mail.getMimeMessagePath()); - return KAsync::start([=]() -> QByteArray { - return remoteId.toUtf8(); - }); + return KAsync::value(remoteId.toUtf8()); } return KAsync::null(); } @@ -427,9 +423,7 @@ public: SinkTrace() << "Creating a new folder: " << path; KPIM::Maildir maildir(path, false); maildir.create(); - return KAsync::start([=]() -> QByteArray { - return path.toUtf8(); - }); + return KAsync::value(path.toUtf8()); } else if (operation == Sink::Operation_Removal) { const auto path = oldRemoteId; SinkTrace() << "Removing a folder: " << path; @@ -438,9 +432,7 @@ public: return KAsync::null(); } else if (operation == Sink::Operation_Modification) { SinkWarning() << "Folder modifications are not implemented"; - return KAsync::start([=]() -> QByteArray { - return oldRemoteId; - }); + return KAsync::value(oldRemoteId); } return KAsync::null(); } diff --git a/examples/mailtransportresource/mailtransportresource.cpp b/examples/mailtransportresource/mailtransportresource.cpp index a729d4d..be4e4e0 100644 --- a/examples/mailtransportresource/mailtransportresource.cpp +++ b/examples/mailtransportresource/mailtransportresource.cpp @@ -124,17 +124,14 @@ public: }); auto job = KAsync::null(); for (const auto &m : toSend) { - job = job.then(send(m, mSettings)).then([this, m]() { + job = job.then(send(m, mSettings)).syncThen([this, m] { auto modifiedMail = ApplicationDomain::Mail(mResourceInstanceIdentifier, m.identifier(), m.revision(), QSharedPointer::create()); modifiedMail.setSent(true); modify(modifiedMail); //TODO copy to a sent mail folder as well }); } - job = job.then([&future]() { - future.setFinished(); - }, - [&future](int errorCode, const QString &errorString) { + job = job.syncThen([&future](const KAsync::Error &) { future.setFinished(); }); job.exec(); -- cgit v1.2.3