From fcc89a201a06ede057dae86d4591199bf69fab50 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Fri, 21 Apr 2017 17:31:22 +0200 Subject: Make sure we always have a complete hierarchy from the IMAP server --- examples/imapresource/imapresource.cpp | 10 +++++----- examples/imapresource/imapserverproxy.cpp | 26 +++++++++++++++++++++++--- examples/imapresource/imapserverproxy.h | 9 +++++++++ 3 files changed, 37 insertions(+), 8 deletions(-) diff --git a/examples/imapresource/imapresource.cpp b/examples/imapresource/imapresource.cpp index 0b3dcf5..8577b8c 100644 --- a/examples/imapresource/imapresource.cpp +++ b/examples/imapresource/imapresource.cpp @@ -119,6 +119,8 @@ public: QByteArray createFolder(const Imap::Folder &f) { const auto parentFolderRid = parentRid(f); + bool isToplevel = parentFolderRid.isEmpty(); + SinkTraceCtx(mLogCtx) << "Creating folder: " << f.name() << parentFolderRid << f.flags; const auto remoteId = folderRid(f); @@ -126,22 +128,20 @@ public: folder.setName(f.name()); folder.setIcon("folder"); folder.setEnabled(f.subscribed); - QHash mergeCriteria; auto specialPurpose = [&] { if (hasSpecialPurposeFlag(f.flags)) { return getSpecialPurposeType(f.flags); - } else if (SpecialPurpose::isSpecialPurposeFolderName(f.name()) && parentFolderRid.isEmpty()) { + } else if (SpecialPurpose::isSpecialPurposeFolderName(f.name()) && isToplevel) { return SpecialPurpose::getSpecialPurposeType(f.name()); } return QByteArray{}; }(); if (!specialPurpose.isEmpty()) { folder.setSpecialPurpose(QByteArrayList() << specialPurpose); - mergeCriteria.insert(ApplicationDomain::Folder::SpecialPurpose::name, Query::Comparator(specialPurpose, Query::Comparator::Contains)); } - if (!parentFolderRid.isEmpty()) { - folder.setParent(syncStore().resolveRemoteId(ENTITY_TYPE_FOLDER, parentFolderRid)); + if (!isToplevel) { + folder.setParent(syncStore().resolveRemoteId(ApplicationDomain::Folder::name, parentFolderRid)); } createOrModify(ApplicationDomain::getTypeName(), remoteId, folder); return remoteId; diff --git a/examples/imapresource/imapserverproxy.cpp b/examples/imapresource/imapserverproxy.cpp index 08a0081..d3ad2d4 100644 --- a/examples/imapresource/imapserverproxy.cpp +++ b/examples/imapresource/imapserverproxy.cpp @@ -457,10 +457,23 @@ bool Imap::flagsContain(const QByteArray &f, const QByteArrayList &flags) return caseInsensitiveContains(f, flags); } +static void reportFolder(const Folder &f, QSharedPointer> reportedList, std::function callback) { + if (!reportedList->contains(f.path())) { + reportedList->insert(f.path()); + auto c = f; + c.noselect = true; + callback(c); + if (!f.parentPath().isEmpty()){ + reportFolder(f.parentFolder(), reportedList, callback); + } + } +} + 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 &){ *subscribedList << mailbox.name; }).then(list(KIMAP2::ListJob::IncludeUnsubscribed, [=](const KIMAP2::MailBoxDescriptor &mailbox, const QList &flags) { @@ -471,17 +484,24 @@ KAsync::Job ImapServerProxy::fetchFolders(std::functioncontains(folder.parentPath())) { + reportFolder(folder.parentFolder(), reportedList, callback); + } + reportedList->insert(folder.path()); + callback(folder); })); } diff --git a/examples/imapresource/imapserverproxy.h b/examples/imapresource/imapserverproxy.h index 0d70ba5..2d90f39 100644 --- a/examples/imapresource/imapserverproxy.h +++ b/examples/imapresource/imapserverproxy.h @@ -118,6 +118,15 @@ struct Folder { return parentPath; } + Folder parentFolder() const + { + Folder parent; + parent.mPath = parentPath(); + parent.mNamespace = mNamespace; + parent.mSeparator = mSeparator; + return parent; + } + QString name() const { auto pathParts = mPath.split(mSeparator); -- cgit v1.2.3