From 22be2464b5d253e840d4731fbc86e9633a394e8c Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Sun, 5 Sep 2021 16:02:37 +0200 Subject: QXmppStream: Allow to use existing future interface --- src/base/QXmppStream.cpp | 62 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 52 insertions(+), 10 deletions(-) (limited to 'src/base/QXmppStream.cpp') diff --git a/src/base/QXmppStream.cpp b/src/base/QXmppStream.cpp index 1cac8740..895705a8 100644 --- a/src/base/QXmppStream.cpp +++ b/src/base/QXmppStream.cpp @@ -172,13 +172,13 @@ bool QXmppStream::sendData(const QByteArray &data) /// /// Sends an XMPP packet to the peer. /// -/// \param stanza +/// \param nonza /// -bool QXmppStream::sendPacket(const QXmppNonza &stanza) +bool QXmppStream::sendPacket(const QXmppNonza &nonza) { bool success; -// send(stanza, success); - return false; + send(nonza, success); + return success; } /// @@ -189,12 +189,24 @@ bool QXmppStream::sendPacket(const QXmppNonza &stanza) QFuture QXmppStream::send(QXmppNonza &&nonza) { bool success; - return send(std::move(nonza), success); + return send(QXmppPacket(nonza), success); +} + +/// +/// Sends an XMPP packet to the peer. +/// +/// \since QXmpp 1.5 +/// +QFuture QXmppStream::send(QXmppPacket &&packet) +{ + bool success; + return send(std::move(packet), success); } -QFuture QXmppStream::send(QXmppNonza &&nonza, bool &writtenToSocket) +QFuture QXmppStream::send(QXmppPacket &&packet, bool &writtenToSocket) { - QXmppPacket packet(nonza); + // the writtenToSocket parameter is just for backwards compat (see + // QXmppStream::sendPacket()) writtenToSocket = sendData(packet.data()); // handle stream management @@ -225,8 +237,28 @@ QFuture QXmppStream::sendIq(QXmppIq &&iq) iq.setId(QXmppUtils::generateStanzaUuid()); } - const auto id = iq.id(); - auto sendFuture = send(std::move(iq)); + return sendIq(QXmppPacket(iq), iq.id()); +} + +/// +/// Sends an IQ packet and returns the response asynchronously. +/// +/// \warning THIS API IS NOT FINALIZED YET! +/// +/// \since QXmpp 1.5 +/// +QFuture QXmppStream::sendIq(QXmppPacket &&packet, const QString &id) +{ + using namespace QXmpp; + + if (id.isEmpty() || d->runningIqs.contains(id)) { + return makeReadyFuture(QXmpp::SendError { + QStringLiteral("Invalid IQ id: empty or in use."), + SendError::Disconnected + }); + } + + auto sendFuture = send(std::move(packet)); if (sendFuture.isFinished()) { if (std::holds_alternative(sendFuture.result())) { // early exit (saves QFutureWatcher) @@ -246,7 +278,7 @@ QFuture QXmppStream::sendIq(QXmppIq &&iq) } IqState interface(IqState::Started); - d->runningIqs.insert(iq.id(), interface); + d->runningIqs.insert(id, interface); return interface.future(); } @@ -267,6 +299,16 @@ void QXmppStream::cancelOngoingIqs() d->runningIqs.clear(); } +/// +/// Returns whether the IQ ID is currently in use. +/// +/// \since QXmpp 1.5 +/// +bool QXmppStream::hasIqId(const QString &id) const +{ + return d->runningIqs.contains(id); +} + /// /// Resets the stream management packages cache. /// -- cgit v1.2.3