aboutsummaryrefslogtreecommitdiff
path: root/src/omemo/QXmppOmemoManager_p.cpp
diff options
context:
space:
mode:
authorLinus Jahn <lnj@kaidan.im>2022-12-31 23:29:59 +0100
committerLinus Jahn <lnj@kaidan.im>2022-12-31 23:40:35 +0100
commitbf078ff6342b052e36995defcf641edea6bb2b8c (patch)
tree422c4644f284c5c87c4a96707bd05c8a2d0c7108 /src/omemo/QXmppOmemoManager_p.cpp
parent6efebe555d30170c2ecfc2372113f342c513b0c2 (diff)
downloadqxmpp-bf078ff6342b052e36995defcf641edea6bb2b8c.tar.gz
OmemoManager: Replace multi-result futures with single result futures
QXmppTask won't support multi-result and in the case of the OmemoManager it's not really needed. If you want to know when each single request is finished you can just subscribe/unsubscribe from each jid in a single request. Part of #502.
Diffstat (limited to 'src/omemo/QXmppOmemoManager_p.cpp')
-rw-r--r--src/omemo/QXmppOmemoManager_p.cpp38
1 files changed, 21 insertions, 17 deletions
diff --git a/src/omemo/QXmppOmemoManager_p.cpp b/src/omemo/QXmppOmemoManager_p.cpp
index 01981fad..722211a8 100644
--- a/src/omemo/QXmppOmemoManager_p.cpp
+++ b/src/omemo/QXmppOmemoManager_p.cpp
@@ -3154,32 +3154,36 @@ QFuture<QXmppPubSubManager::Result> ManagerPrivate::subscribeToDeviceList(const
//
// \return the results of each unsubscribe request
//
-QFuture<Manager::DevicesResult> ManagerPrivate::unsubscribeFromDeviceLists(const QList<QString> &jids)
+QFuture<QVector<Manager::DevicesResult>> ManagerPrivate::unsubscribeFromDeviceLists(const QList<QString> &jids)
{
- QFutureInterface<Manager::DevicesResult> interface = (QFutureInterfaceBase::Started);
+ if (jids.isEmpty()) {
+ return makeReadyFuture(QVector<Manager::DevicesResult>());
+ }
- const auto jidsCount = jids.size();
- auto processedJidsCount = std::make_shared<int>(0);
+ struct State {
+ int processed = 0;
+ int jidsCount = 0;
+ QFutureInterface<QVector<Manager::DevicesResult>> interface;
+ QVector<Manager::DevicesResult> devicesResults;
+ };
- if (jidsCount == 0) {
- interface.reportFinished();
- }
+ auto state = std::make_shared<State>();
+ state->jidsCount = jids.count();
for (const auto &jid : jids) {
- auto future = unsubscribeFromDeviceList(jid);
- await(future, q, [=](QXmppPubSubManager::Result result) mutable {
- Manager::DevicesResult devicesResult;
- devicesResult.jid = jid;
- devicesResult.result = result;
- interface.reportResult(devicesResult);
-
- if (++(*processedJidsCount) == jidsCount) {
- interface.reportFinished();
+ await(unsubscribeFromDeviceList(jid), q, [jid, state](QXmppPubSubManager::Result result) mutable {
+ state->devicesResults << Manager::DevicesResult {
+ jid, result
+ };
+
+ if (++(state->processed) == state->jidsCount) {
+ state->interface.reportResult(state->devicesResults);
+ state->interface.reportFinished();
}
});
}
- return interface.future();
+ return state->interface.future();
}
//