From b17284ee7d674416e0d11f1699f73fcc606262d4 Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Tue, 16 Aug 2022 21:00:15 +0200 Subject: Introduce QXmppTask & QXmppPromise MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #502. Co-authored-by: Jonah BrĂ¼chert --- src/base/QXmppStream.cpp | 38 +++++++++++++++++--------------------- 1 file changed, 17 insertions(+), 21 deletions(-) (limited to 'src/base/QXmppStream.cpp') diff --git a/src/base/QXmppStream.cpp b/src/base/QXmppStream.cpp index cbe40b8a..d1a5ccd2 100644 --- a/src/base/QXmppStream.cpp +++ b/src/base/QXmppStream.cpp @@ -35,7 +35,7 @@ static bool randomSeeded = false; struct IqState { - QFutureInterface interface; + QXmppPromise interface; QString jid; }; @@ -172,7 +172,7 @@ bool QXmppStream::sendPacket(const QXmppNonza &nonza) /// /// \since QXmpp 1.5 /// -QFuture QXmppStream::send(QXmppNonza &&nonza) +QXmppTask QXmppStream::send(QXmppNonza &&nonza) { bool success; return send(QXmppPacket(nonza), success); @@ -183,13 +183,13 @@ QFuture QXmppStream::send(QXmppNonza &&nonza) /// /// \since QXmpp 1.5 /// -QFuture QXmppStream::send(QXmppPacket &&packet) +QXmppTask QXmppStream::send(QXmppPacket &&packet) { bool success; return send(std::move(packet), success); } -QFuture QXmppStream::send(QXmppPacket &&packet, bool &writtenToSocket) +QXmppTask QXmppStream::send(QXmppPacket &&packet, bool &writtenToSocket) { // the writtenToSocket parameter is just for backwards compat (see // QXmppStream::sendPacket()) @@ -198,7 +198,7 @@ QFuture QXmppStream::send(QXmppPacket &&packet, bool &written // handle stream management d->streamManager.handlePacketSent(packet, writtenToSocket); - return packet.future(); + return packet.task(); } /// @@ -208,7 +208,7 @@ QFuture QXmppStream::send(QXmppPacket &&packet, bool &written /// /// \since QXmpp 1.5 /// -QFuture QXmppStream::sendIq(QXmppIq &&iq) +QXmppTask QXmppStream::sendIq(QXmppIq &&iq) { using namespace QXmpp; @@ -233,18 +233,18 @@ QFuture QXmppStream::sendIq(QXmppIq &&iq) /// /// \since QXmpp 1.5 /// -QFuture QXmppStream::sendIq(QXmppPacket &&packet, const QString &id, const QString &to) +QXmppTask QXmppStream::sendIq(QXmppPacket &&packet, const QString &id, const QString &to) { using namespace QXmpp; if (id.isEmpty() || d->runningIqs.contains(id)) { - return makeReadyFuture(QXmppError { + return makeReadyTask(QXmppError { QStringLiteral("Invalid IQ id: empty or in use."), SendError::Disconnected }); } if (to.isEmpty()) { - return makeReadyFuture(QXmppError { + return makeReadyTask(QXmppError { QStringLiteral("The 'to' address must be set so the stream can match the response."), SendError::Disconnected }); } @@ -253,15 +253,13 @@ QFuture QXmppStream::sendIq(QXmppPacket &&packet, const Q if (sendFuture.isFinished()) { if (std::holds_alternative(sendFuture.result())) { // early exit (saves QFutureWatcher) - return makeReadyFuture(std::get(sendFuture.result())); + return makeReadyTask(std::get(sendFuture.result())); } } else { - awaitLast(sendFuture, this, [this, id](SendResult result) { + sendFuture.then(this, [this, id](SendResult result) { if (std::holds_alternative(result)) { if (auto itr = d->runningIqs.find(id); itr != d->runningIqs.end()) { - itr.value().interface.reportResult(std::get(result)); - itr.value().interface.reportFinished(); - + itr.value().interface.finish(std::get(result)); d->runningIqs.erase(itr); } } @@ -269,12 +267,12 @@ QFuture QXmppStream::sendIq(QXmppPacket &&packet, const Q } IqState state { - QFutureInterface(QFutureInterfaceBase::Started), + {}, to, }; - auto future = state.interface.future(); + auto task = state.interface.task(); d->runningIqs.insert(id, std::move(state)); - return future; + return task; } /// @@ -285,10 +283,9 @@ QFuture QXmppStream::sendIq(QXmppPacket &&packet, const Q void QXmppStream::cancelOngoingIqs() { for (auto &state : d->runningIqs) { - state.interface.reportResult(QXmppError { + state.interface.finish(QXmppError { QStringLiteral("IQ has been cancelled."), QXmpp::SendError::Disconnected }); - state.interface.reportFinished(); } d->runningIqs.clear(); } @@ -494,8 +491,7 @@ bool QXmppStream::handleIqResponse(const QDomElement &stanza) return false; } - itr.value().interface.reportResult(stanza); - itr.value().interface.reportFinished(); + itr.value().interface.finish(stanza); d->runningIqs.erase(itr); return true; -- cgit v1.2.3