aboutsummaryrefslogtreecommitdiff
path: root/src/client
diff options
context:
space:
mode:
authorLinus Jahn <lnj@kaidan.im>2023-03-14 21:12:43 +0100
committerLinus Jahn <lnj@kaidan.im>2023-03-14 22:39:14 +0100
commit672af91550cbfbe622a058de32df58e805468f1e (patch)
tree1432f2cbd3c0185384254106e0025c26b4e6f3d0 /src/client
parentfa45d75aaadfe9e1d07911cd9483932abaa55117 (diff)
MamManager: Flatten retrieveMessages code
Diffstat (limited to 'src/client')
-rw-r--r--src/client/QXmppMamManager.cpp108
1 files changed, 58 insertions, 50 deletions
diff --git a/src/client/QXmppMamManager.cpp b/src/client/QXmppMamManager.cpp
index d96b2791..2bd0db23 100644
--- a/src/client/QXmppMamManager.cpp
+++ b/src/client/QXmppMamManager.cpp
@@ -265,64 +265,72 @@ QXmppTask<QXmppMamManager::RetrieveResult> QXmppMamManager::retrieveMessages(con
if (itr == d->ongoingRequests.end()) {
return;
}
+ auto &state = itr->second;
- if (std::holds_alternative<QDomElement>(result)) {
- auto &iq = itr->second.iq;
- iq.parse(std::get<QDomElement>(result));
+ // handle IQ sending errors
+ if (std::holds_alternative<QXmppError>(result)) {
+ state.promise.finish(std::get<QXmppError>(result));
+ d->ongoingRequests.erase(itr);
+ return;
+ }
- if (iq.type() == QXmppIq::Error) {
- itr->second.promise.finish(QXmppError { iq.error().text(), iq.error() });
- d->ongoingRequests.erase(itr);
- return;
- }
+ // parse IQ
+ auto &iq = state.iq;
+ iq.parse(std::get<QDomElement>(result));
+
+ // handle MAM error result IQ
+ if (iq.type() == QXmppIq::Error) {
+ state.promise.finish(QXmppError { iq.error().text(), iq.error() });
+ d->ongoingRequests.erase(itr);
+ return;
+ }
- // decrypt encrypted messages
- if (auto *e2eeExt = client()->encryptionExtension()) {
- auto &messages = itr->second.messages;
- auto running = std::make_shared<uint>(0);
- // handle case when no message is encrypted
- auto hasEncryptedMessages = false;
+ // decrypt encrypted messages
+ if (auto *e2eeExt = client()->encryptionExtension()) {
+ auto &messages = state.messages;
+ auto running = std::make_shared<uint>(0);
- for (auto i = 0; i < messages.size(); i++) {
- if (!e2eeExt->isEncrypted(messages.at(i))) {
- continue;
- }
- hasEncryptedMessages = true;
-
- auto message = messages.at(i);
- (*running)++;
- e2eeExt->decryptMessage(std::move(message)).then(this, [this, i, running, queryId](auto result) {
- (*running)--;
- auto itr = d->ongoingRequests.find(queryId.toStdString());
- if (itr == d->ongoingRequests.end()) {
- return;
- }
-
- if (std::holds_alternative<QXmppMessage>(result)) {
- itr->second.messages[i] = std::get<QXmppMessage>(std::move(result));
- } else {
- warning(QStringLiteral("Error decrypting message."));
- }
- if (*running == 0) {
- itr->second.finish();
- d->ongoingRequests.erase(itr);
- }
- });
- }
+ // handle case when no message is encrypted
+ auto hasEncryptedMessages = false;
- if (!hasEncryptedMessages) {
- // finish here, no decryptMessage callback will do it
- itr->second.finish();
- d->ongoingRequests.erase(itr);
+ for (auto i = 0; i < messages.size(); i++) {
+ if (!e2eeExt->isEncrypted(messages.at(i))) {
+ continue;
}
- } else {
- itr->second.finish();
- d->ongoingRequests.erase(itr);
+ hasEncryptedMessages = true;
+
+ auto message = messages.at(i);
+ (*running)++;
+ e2eeExt->decryptMessage(std::move(message)).then(this, [this, i, running, queryId](auto result) {
+ (*running)--;
+
+ auto itr = d->ongoingRequests.find(queryId.toStdString());
+ if (itr == d->ongoingRequests.end()) {
+ return;
+ }
+ auto &state = itr->second;
+
+ if (std::holds_alternative<QXmppMessage>(result)) {
+ state.messages[i] = std::get<QXmppMessage>(std::move(result));
+ } else {
+ warning(QStringLiteral("Error decrypting message."));
+ }
+
+ if (*running == 0) {
+ state.finish();
+ d->ongoingRequests.erase(itr);
+ }
+ });
+ }
+
+ // finishing the promise is done after decryptMessage()
+ if (hasEncryptedMessages) {
+ return;
}
- } else {
- itr->second.promise.finish(std::get<QXmppError>(result));
- d->ongoingRequests.erase(itr);
}
+
+ state.finish();
+ d->ongoingRequests.erase(itr);
});
return task;