From 672af91550cbfbe622a058de32df58e805468f1e Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Tue, 14 Mar 2023 21:12:43 +0100 Subject: MamManager: Flatten retrieveMessages code --- src/client/QXmppMamManager.cpp | 108 ++++++++++++++++++++++------------------- 1 file changed, 58 insertions(+), 50 deletions(-) (limited to 'src/client/QXmppMamManager.cpp') 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::retrieveMessages(con if (itr == d->ongoingRequests.end()) { return; } + auto &state = itr->second; - if (std::holds_alternative(result)) { - auto &iq = itr->second.iq; - iq.parse(std::get(result)); + // handle IQ sending errors + if (std::holds_alternative(result)) { + state.promise.finish(std::get(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(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(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(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(result)) { - itr->second.messages[i] = std::get(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(result)) { + state.messages[i] = std::get(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(result)); - d->ongoingRequests.erase(itr); } + + state.finish(); + d->ongoingRequests.erase(itr); }); return task; -- cgit v1.2.3