From 489d5b72696d5c5f802ee206bdde0693ba172018 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Wed, 11 Jan 2017 14:46:04 +0100 Subject: Set enabled state from subscription --- examples/imapresource/imapresource.cpp | 43 +++++++++++++------------------ examples/imapresource/imapserverproxy.cpp | 14 ++++++---- examples/imapresource/imapserverproxy.h | 6 ++++- 3 files changed, 32 insertions(+), 31 deletions(-) (limited to 'examples/imapresource') diff --git a/examples/imapresource/imapresource.cpp b/examples/imapresource/imapresource.cpp index 4f7b9f3..8ada325 100644 --- a/examples/imapresource/imapresource.cpp +++ b/examples/imapresource/imapresource.cpp @@ -96,17 +96,19 @@ public: } - QByteArray createFolder(const QString &folderName, const QByteArray &folderRemoteId, const QByteArray &parentFolderRid, const QByteArray &icon) + QByteArray createFolder(const Imap::Folder &f) { - SinkTrace() << "Creating folder: " << folderName << parentFolderRid; - const auto remoteId = folderRemoteId; - const auto bufferType = ENTITY_TYPE_FOLDER; + const auto parentFolderRid = parentRid(f); + SinkTrace() << "Creating folder: " << f.name() << parentFolderRid; + + const auto remoteId = folderRid(f); Sink::ApplicationDomain::Folder folder; - folder.setName(folderName); - folder.setIcon(icon); + folder.setName(f.name()); + folder.setIcon("folder"); + folder.setEnabled(f.subscribed); QHash mergeCriteria; - if (SpecialPurpose::isSpecialPurposeFolderName(folderName)) { - auto type = SpecialPurpose::getSpecialPurposeType(folderName); + if (SpecialPurpose::isSpecialPurposeFolderName(f.name())) { + auto type = SpecialPurpose::getSpecialPurposeType(f.name()); folder.setSpecialPurpose(QByteArrayList() << type); mergeCriteria.insert(ApplicationDomain::Folder::SpecialPurpose::name, Query::Comparator(type, Query::Comparator::Contains)); } @@ -114,16 +116,15 @@ public: if (!parentFolderRid.isEmpty()) { folder.setParent(syncStore().resolveRemoteId(ENTITY_TYPE_FOLDER, parentFolderRid)); } - createOrModify(bufferType, remoteId, folder, mergeCriteria); + createOrModify(ENTITY_TYPE_FOLDER, remoteId, folder, mergeCriteria); return remoteId; } void synchronizeFolders(const QVector &folderList) { - const QByteArray bufferType = ENTITY_TYPE_FOLDER; SinkTrace() << "Found folders " << folderList.size(); - scanForRemovals(bufferType, + scanForRemovals(ENTITY_TYPE_FOLDER, [&folderList](const QByteArray &remoteId) -> bool { // folderList.contains(remoteId) for (const auto &folder : folderList) { @@ -136,7 +137,7 @@ public: ); for (const auto &f : folderList) { - createFolder(f.name(), folderRid(f), parentRid(f), "folder"); + createFolder(f); } } @@ -162,8 +163,6 @@ public: { auto time = QSharedPointer::create(); time->start(); - const QByteArray bufferType = ENTITY_TYPE_MAIL; - SinkTrace() << "Importing new mail." << folderRid; const auto folderLocalId = syncStore().resolveRemoteId(ENTITY_TYPE_FOLDER, folderRid); @@ -179,7 +178,7 @@ public: mail.setExtractedFullPayloadAvailable(message.fullPayload); setFlags(mail, message.flags); - createOrModify(bufferType, remoteId, mail); + createOrModify(ENTITY_TYPE_MAIL, remoteId, mail); // const auto elapsed = time->elapsed(); // SinkTrace() << "Synchronized " << count << " mails in " << folderRid << Sink::Log::TraceTime(elapsed) << " " << elapsed/qMax(count, 1) << " [ms/mail]"; } @@ -188,7 +187,6 @@ public: { auto time = QSharedPointer::create(); time->start(); - const QByteArray bufferType = ENTITY_TYPE_MAIL; const auto folderLocalId = syncStore().resolveRemoteId(ENTITY_TYPE_FOLDER, folderRid); if (folderLocalId.isEmpty()) { SinkWarning() << "Failed to lookup local id of: " << folderRid; @@ -199,7 +197,7 @@ public: int count = 0; - scanForRemovals(bufferType, + scanForRemovals(ENTITY_TYPE_MAIL, [&](const std::function &callback) { store().indexLookup(folderLocalId, callback); }, @@ -436,23 +434,18 @@ public: auto imap = QSharedPointer::create(mServer, mPort); if (query.type() == ApplicationDomain::getTypeName()) { return login(imap) - .then>([=]() { + .then([=]() { auto folderList = QSharedPointer>::create(); return imap->fetchFolders([folderList](const Folder &folder) { *folderList << folder; }) - .onError([](const KAsync::Error &error) { - SinkWarning() << "Folder list sync failed."; - }) - .syncThen>([this, folderList]() { + .syncThen([this, folderList]() { synchronizeFolders(*folderList); - commit(); - return *folderList; }); }) .then([=] (const KAsync::Error &error) { if (error) { - SinkWarning() << "Error during sync: " << error.errorMessage; + SinkWarning() << "Error during folder sync: " << error.errorMessage; } return imap->logout() .then(KAsync::error(error)); diff --git a/examples/imapresource/imapserverproxy.cpp b/examples/imapresource/imapserverproxy.cpp index 6f8d18b..f54eeb5 100644 --- a/examples/imapresource/imapserverproxy.cpp +++ b/examples/imapresource/imapserverproxy.cpp @@ -395,11 +395,15 @@ KAsync::Job ImapServerProxy::renameSubfolder(const QString &oldMailbox, KAsync::Job ImapServerProxy::fetchFolders(std::function callback) { SinkTrace() << "Fetching folders"; - return list(KIMAP2::ListJob::IncludeUnsubscribed, [callback](const KIMAP2::MailBoxDescriptor &mailbox, const QList &flags){ - bool noselect = flags.contains(QByteArray(FolderFlags::Noselect).toLower()) || flags.contains(QByteArray(FolderFlags::Noselect)); - SinkLog() << "Found mailbox: " << mailbox.name << flags << FolderFlags::Noselect << noselect; - callback(Folder{mailbox.name, mailbox.separator, noselect}); - }); + auto subscribedList = QSharedPointer>::create() ; + return list(KIMAP2::ListJob::NoOption, [=](const KIMAP2::MailBoxDescriptor &mailbox, const QList &){ + *subscribedList << mailbox.name; + }).then(list(KIMAP2::ListJob::IncludeUnsubscribed, [=](const KIMAP2::MailBoxDescriptor &mailbox, const QList &flags) { + bool noselect = flags.contains(QByteArray(FolderFlags::Noselect).toLower()) || flags.contains(QByteArray(FolderFlags::Noselect)); + bool subscribed = subscribedList->contains(mailbox.name); + SinkLog() << "Found mailbox: " << mailbox.name << flags << FolderFlags::Noselect << noselect << " sub: " << subscribed; + callback(Folder{mailbox.name, mailbox.separator, noselect, subscribed, flags}); + })); } QString ImapServerProxy::mailboxFromFolder(const Folder &folder) const diff --git a/examples/imapresource/imapserverproxy.h b/examples/imapresource/imapserverproxy.h index 5244cdc..a9e3d67 100644 --- a/examples/imapresource/imapserverproxy.h +++ b/examples/imapresource/imapserverproxy.h @@ -60,8 +60,10 @@ struct Message { struct Folder { Folder() = default; - Folder(const QString &path, const QChar &separator, bool noselect_) + Folder(const QString &path, const QChar &separator, bool noselect_, bool subscribed_, const QByteArrayList &flags_) : noselect(noselect_), + subscribed(subscribed_), + flags(flags_), mPath(path), pathParts(path.split(separator)), mSeparator(separator) @@ -94,6 +96,8 @@ struct Folder { } bool noselect = false; + bool subscribed = false; + QByteArrayList flags; private: QString mPath; -- cgit v1.2.3