diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2017-01-11 14:46:04 +0100 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2017-01-11 15:59:24 +0100 |
commit | 489d5b72696d5c5f802ee206bdde0693ba172018 (patch) | |
tree | 057a02663a11ac9f031d7e91b1b12f85cd5c0216 /examples | |
parent | 051a0be95cbe4fe5eb0c7431e13987a2aa56bcc0 (diff) | |
download | sink-489d5b72696d5c5f802ee206bdde0693ba172018.tar.gz sink-489d5b72696d5c5f802ee206bdde0693ba172018.zip |
Set enabled state from subscription
Diffstat (limited to 'examples')
-rw-r--r-- | examples/imapresource/imapresource.cpp | 43 | ||||
-rw-r--r-- | examples/imapresource/imapserverproxy.cpp | 14 | ||||
-rw-r--r-- | examples/imapresource/imapserverproxy.h | 6 |
3 files changed, 32 insertions, 31 deletions
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: | |||
96 | 96 | ||
97 | } | 97 | } |
98 | 98 | ||
99 | QByteArray createFolder(const QString &folderName, const QByteArray &folderRemoteId, const QByteArray &parentFolderRid, const QByteArray &icon) | 99 | QByteArray createFolder(const Imap::Folder &f) |
100 | { | 100 | { |
101 | SinkTrace() << "Creating folder: " << folderName << parentFolderRid; | 101 | const auto parentFolderRid = parentRid(f); |
102 | const auto remoteId = folderRemoteId; | 102 | SinkTrace() << "Creating folder: " << f.name() << parentFolderRid; |
103 | const auto bufferType = ENTITY_TYPE_FOLDER; | 103 | |
104 | const auto remoteId = folderRid(f); | ||
104 | Sink::ApplicationDomain::Folder folder; | 105 | Sink::ApplicationDomain::Folder folder; |
105 | folder.setName(folderName); | 106 | folder.setName(f.name()); |
106 | folder.setIcon(icon); | 107 | folder.setIcon("folder"); |
108 | folder.setEnabled(f.subscribed); | ||
107 | QHash<QByteArray, Query::Comparator> mergeCriteria; | 109 | QHash<QByteArray, Query::Comparator> mergeCriteria; |
108 | if (SpecialPurpose::isSpecialPurposeFolderName(folderName)) { | 110 | if (SpecialPurpose::isSpecialPurposeFolderName(f.name())) { |
109 | auto type = SpecialPurpose::getSpecialPurposeType(folderName); | 111 | auto type = SpecialPurpose::getSpecialPurposeType(f.name()); |
110 | folder.setSpecialPurpose(QByteArrayList() << type); | 112 | folder.setSpecialPurpose(QByteArrayList() << type); |
111 | mergeCriteria.insert(ApplicationDomain::Folder::SpecialPurpose::name, Query::Comparator(type, Query::Comparator::Contains)); | 113 | mergeCriteria.insert(ApplicationDomain::Folder::SpecialPurpose::name, Query::Comparator(type, Query::Comparator::Contains)); |
112 | } | 114 | } |
@@ -114,16 +116,15 @@ public: | |||
114 | if (!parentFolderRid.isEmpty()) { | 116 | if (!parentFolderRid.isEmpty()) { |
115 | folder.setParent(syncStore().resolveRemoteId(ENTITY_TYPE_FOLDER, parentFolderRid)); | 117 | folder.setParent(syncStore().resolveRemoteId(ENTITY_TYPE_FOLDER, parentFolderRid)); |
116 | } | 118 | } |
117 | createOrModify(bufferType, remoteId, folder, mergeCriteria); | 119 | createOrModify(ENTITY_TYPE_FOLDER, remoteId, folder, mergeCriteria); |
118 | return remoteId; | 120 | return remoteId; |
119 | } | 121 | } |
120 | 122 | ||
121 | void synchronizeFolders(const QVector<Folder> &folderList) | 123 | void synchronizeFolders(const QVector<Folder> &folderList) |
122 | { | 124 | { |
123 | const QByteArray bufferType = ENTITY_TYPE_FOLDER; | ||
124 | SinkTrace() << "Found folders " << folderList.size(); | 125 | SinkTrace() << "Found folders " << folderList.size(); |
125 | 126 | ||
126 | scanForRemovals(bufferType, | 127 | scanForRemovals(ENTITY_TYPE_FOLDER, |
127 | [&folderList](const QByteArray &remoteId) -> bool { | 128 | [&folderList](const QByteArray &remoteId) -> bool { |
128 | // folderList.contains(remoteId) | 129 | // folderList.contains(remoteId) |
129 | for (const auto &folder : folderList) { | 130 | for (const auto &folder : folderList) { |
@@ -136,7 +137,7 @@ public: | |||
136 | ); | 137 | ); |
137 | 138 | ||
138 | for (const auto &f : folderList) { | 139 | for (const auto &f : folderList) { |
139 | createFolder(f.name(), folderRid(f), parentRid(f), "folder"); | 140 | createFolder(f); |
140 | } | 141 | } |
141 | } | 142 | } |
142 | 143 | ||
@@ -162,8 +163,6 @@ public: | |||
162 | { | 163 | { |
163 | auto time = QSharedPointer<QTime>::create(); | 164 | auto time = QSharedPointer<QTime>::create(); |
164 | time->start(); | 165 | time->start(); |
165 | const QByteArray bufferType = ENTITY_TYPE_MAIL; | ||
166 | |||
167 | SinkTrace() << "Importing new mail." << folderRid; | 166 | SinkTrace() << "Importing new mail." << folderRid; |
168 | 167 | ||
169 | const auto folderLocalId = syncStore().resolveRemoteId(ENTITY_TYPE_FOLDER, folderRid); | 168 | const auto folderLocalId = syncStore().resolveRemoteId(ENTITY_TYPE_FOLDER, folderRid); |
@@ -179,7 +178,7 @@ public: | |||
179 | mail.setExtractedFullPayloadAvailable(message.fullPayload); | 178 | mail.setExtractedFullPayloadAvailable(message.fullPayload); |
180 | setFlags(mail, message.flags); | 179 | setFlags(mail, message.flags); |
181 | 180 | ||
182 | createOrModify(bufferType, remoteId, mail); | 181 | createOrModify(ENTITY_TYPE_MAIL, remoteId, mail); |
183 | // const auto elapsed = time->elapsed(); | 182 | // const auto elapsed = time->elapsed(); |
184 | // SinkTrace() << "Synchronized " << count << " mails in " << folderRid << Sink::Log::TraceTime(elapsed) << " " << elapsed/qMax(count, 1) << " [ms/mail]"; | 183 | // SinkTrace() << "Synchronized " << count << " mails in " << folderRid << Sink::Log::TraceTime(elapsed) << " " << elapsed/qMax(count, 1) << " [ms/mail]"; |
185 | } | 184 | } |
@@ -188,7 +187,6 @@ public: | |||
188 | { | 187 | { |
189 | auto time = QSharedPointer<QTime>::create(); | 188 | auto time = QSharedPointer<QTime>::create(); |
190 | time->start(); | 189 | time->start(); |
191 | const QByteArray bufferType = ENTITY_TYPE_MAIL; | ||
192 | const auto folderLocalId = syncStore().resolveRemoteId(ENTITY_TYPE_FOLDER, folderRid); | 190 | const auto folderLocalId = syncStore().resolveRemoteId(ENTITY_TYPE_FOLDER, folderRid); |
193 | if (folderLocalId.isEmpty()) { | 191 | if (folderLocalId.isEmpty()) { |
194 | SinkWarning() << "Failed to lookup local id of: " << folderRid; | 192 | SinkWarning() << "Failed to lookup local id of: " << folderRid; |
@@ -199,7 +197,7 @@ public: | |||
199 | 197 | ||
200 | int count = 0; | 198 | int count = 0; |
201 | 199 | ||
202 | scanForRemovals(bufferType, | 200 | scanForRemovals(ENTITY_TYPE_MAIL, |
203 | [&](const std::function<void(const QByteArray &)> &callback) { | 201 | [&](const std::function<void(const QByteArray &)> &callback) { |
204 | store().indexLookup<ApplicationDomain::Mail, ApplicationDomain::Mail::Folder>(folderLocalId, callback); | 202 | store().indexLookup<ApplicationDomain::Mail, ApplicationDomain::Mail::Folder>(folderLocalId, callback); |
205 | }, | 203 | }, |
@@ -436,23 +434,18 @@ public: | |||
436 | auto imap = QSharedPointer<ImapServerProxy>::create(mServer, mPort); | 434 | auto imap = QSharedPointer<ImapServerProxy>::create(mServer, mPort); |
437 | if (query.type() == ApplicationDomain::getTypeName<ApplicationDomain::Folder>()) { | 435 | if (query.type() == ApplicationDomain::getTypeName<ApplicationDomain::Folder>()) { |
438 | return login(imap) | 436 | return login(imap) |
439 | .then<QVector<Folder>>([=]() { | 437 | .then<void>([=]() { |
440 | auto folderList = QSharedPointer<QVector<Folder>>::create(); | 438 | auto folderList = QSharedPointer<QVector<Folder>>::create(); |
441 | return imap->fetchFolders([folderList](const Folder &folder) { | 439 | return imap->fetchFolders([folderList](const Folder &folder) { |
442 | *folderList << folder; | 440 | *folderList << folder; |
443 | }) | 441 | }) |
444 | .onError([](const KAsync::Error &error) { | 442 | .syncThen<void>([this, folderList]() { |
445 | SinkWarning() << "Folder list sync failed."; | ||
446 | }) | ||
447 | .syncThen<QVector<Folder>>([this, folderList]() { | ||
448 | synchronizeFolders(*folderList); | 443 | synchronizeFolders(*folderList); |
449 | commit(); | ||
450 | return *folderList; | ||
451 | }); | 444 | }); |
452 | }) | 445 | }) |
453 | .then<void>([=] (const KAsync::Error &error) { | 446 | .then<void>([=] (const KAsync::Error &error) { |
454 | if (error) { | 447 | if (error) { |
455 | SinkWarning() << "Error during sync: " << error.errorMessage; | 448 | SinkWarning() << "Error during folder sync: " << error.errorMessage; |
456 | } | 449 | } |
457 | return imap->logout() | 450 | return imap->logout() |
458 | .then(KAsync::error(error)); | 451 | .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<QString> ImapServerProxy::renameSubfolder(const QString &oldMailbox, | |||
395 | KAsync::Job<void> ImapServerProxy::fetchFolders(std::function<void(const Folder &)> callback) | 395 | KAsync::Job<void> ImapServerProxy::fetchFolders(std::function<void(const Folder &)> callback) |
396 | { | 396 | { |
397 | SinkTrace() << "Fetching folders"; | 397 | SinkTrace() << "Fetching folders"; |
398 | return list(KIMAP2::ListJob::IncludeUnsubscribed, [callback](const KIMAP2::MailBoxDescriptor &mailbox, const QList<QByteArray> &flags){ | 398 | auto subscribedList = QSharedPointer<QSet<QString>>::create() ; |
399 | bool noselect = flags.contains(QByteArray(FolderFlags::Noselect).toLower()) || flags.contains(QByteArray(FolderFlags::Noselect)); | 399 | return list(KIMAP2::ListJob::NoOption, [=](const KIMAP2::MailBoxDescriptor &mailbox, const QList<QByteArray> &){ |
400 | SinkLog() << "Found mailbox: " << mailbox.name << flags << FolderFlags::Noselect << noselect; | 400 | *subscribedList << mailbox.name; |
401 | callback(Folder{mailbox.name, mailbox.separator, noselect}); | 401 | }).then(list(KIMAP2::ListJob::IncludeUnsubscribed, [=](const KIMAP2::MailBoxDescriptor &mailbox, const QList<QByteArray> &flags) { |
402 | }); | 402 | bool noselect = flags.contains(QByteArray(FolderFlags::Noselect).toLower()) || flags.contains(QByteArray(FolderFlags::Noselect)); |
403 | bool subscribed = subscribedList->contains(mailbox.name); | ||
404 | SinkLog() << "Found mailbox: " << mailbox.name << flags << FolderFlags::Noselect << noselect << " sub: " << subscribed; | ||
405 | callback(Folder{mailbox.name, mailbox.separator, noselect, subscribed, flags}); | ||
406 | })); | ||
403 | } | 407 | } |
404 | 408 | ||
405 | QString ImapServerProxy::mailboxFromFolder(const Folder &folder) const | 409 | 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 { | |||
60 | 60 | ||
61 | struct Folder { | 61 | struct Folder { |
62 | Folder() = default; | 62 | Folder() = default; |
63 | Folder(const QString &path, const QChar &separator, bool noselect_) | 63 | Folder(const QString &path, const QChar &separator, bool noselect_, bool subscribed_, const QByteArrayList &flags_) |
64 | : noselect(noselect_), | 64 | : noselect(noselect_), |
65 | subscribed(subscribed_), | ||
66 | flags(flags_), | ||
65 | mPath(path), | 67 | mPath(path), |
66 | pathParts(path.split(separator)), | 68 | pathParts(path.split(separator)), |
67 | mSeparator(separator) | 69 | mSeparator(separator) |
@@ -94,6 +96,8 @@ struct Folder { | |||
94 | } | 96 | } |
95 | 97 | ||
96 | bool noselect = false; | 98 | bool noselect = false; |
99 | bool subscribed = false; | ||
100 | QByteArrayList flags; | ||
97 | 101 | ||
98 | private: | 102 | private: |
99 | QString mPath; | 103 | QString mPath; |