From f8425bf516d45bee03f4a8e54fa4ec6a0a5dbdcb Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Thu, 7 Sep 2017 14:23:29 +0200 Subject: Ignore kolab groupware folders. --- examples/imapresource/imapserverproxy.cpp | 35 +++++++++++++++++++++++++++++-- examples/imapresource/imapserverproxy.h | 1 + 2 files changed, 34 insertions(+), 2 deletions(-) (limited to 'examples') diff --git a/examples/imapresource/imapserverproxy.cpp b/examples/imapresource/imapserverproxy.cpp index 5c2e07c..16887b1 100644 --- a/examples/imapresource/imapserverproxy.cpp +++ b/examples/imapresource/imapserverproxy.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include @@ -479,14 +480,33 @@ static void reportFolder(const Folder &f, QSharedPointer> reported } } +KAsync::Job ImapServerProxy::getMetaData(std::function > &metadata)> callback) +{ + if (!mCapabilities.contains("METADATA")) { + return KAsync::null(); + } + KIMAP2::GetMetaDataJob *meta = new KIMAP2::GetMetaDataJob(mSession); + meta->setMailBox(QLatin1String("*")); + meta->setServerCapability( KIMAP2::MetaDataJobBase::Metadata ); + meta->setDepth(KIMAP2::GetMetaDataJob::AllLevels); + meta->addRequestedEntry("/shared/vendor/kolab/folder-type"); + meta->addRequestedEntry("/private/vendor/kolab/folder-type"); + return runJob(meta).then([callback, meta] () { + callback(meta->allMetaDataForMailboxes()); + }); +} + KAsync::Job ImapServerProxy::fetchFolders(std::function callback) { SinkTrace() << "Fetching folders"; auto subscribedList = QSharedPointer>::create() ; auto reportedList = QSharedPointer>::create() ; - return list(KIMAP2::ListJob::NoOption, [=](const KIMAP2::MailBoxDescriptor &mailbox, const QList &){ + auto metaData = QSharedPointer>>::create() ; + return getMetaData([=] (const QHash> &m) { + *metaData = m; + }).then(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) { + })).then(list(KIMAP2::ListJob::IncludeUnsubscribed, [=](const KIMAP2::MailBoxDescriptor &mailbox, const QList &flags) { bool noselect = caseInsensitiveContains(FolderFlags::Noselect, flags); bool subscribed = subscribedList->contains(mailbox.name); if (isGmail()) { @@ -502,6 +522,17 @@ KAsync::Job ImapServerProxy::fetchFolders(std::functioncontains(mailbox.name)) { + auto m = metaData->value(mailbox.name); + auto sharedType = m.value("/shared/vendor/kolab/folder-type"); + auto privateType = m.value("/private/vendor/kolab/folder-type"); + auto type = !privateType.isEmpty() ? privateType : sharedType; + if (!type.isEmpty() && !type.contains("mail")) { + SinkLog() << "Skipping due to folder type: " << type; + return; + } + } auto ns = getNamespace(mailbox.name); auto folder = Folder{mailbox.name, ns, mailbox.separator, noselect, subscribed, flags}; diff --git a/examples/imapresource/imapserverproxy.h b/examples/imapresource/imapserverproxy.h index f9b854b..86e3378 100644 --- a/examples/imapresource/imapserverproxy.h +++ b/examples/imapresource/imapserverproxy.h @@ -294,6 +294,7 @@ public: KAsync::Job> fetchUids(const Folder &folder); private: + KAsync::Job getMetaData(std::function > &metadata)> callback); bool isGmail() const; QString getNamespace(const QString &name); -- cgit v1.2.3