diff options
Diffstat (limited to 'src/omemo/QXmppOmemoManager_p.cpp')
| -rw-r--r-- | src/omemo/QXmppOmemoManager_p.cpp | 38 |
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(); } // |
