From 21a198fd66e7c35622fce0b08c306553a4e4ff5a Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Sun, 5 Sep 2021 15:46:53 +0200 Subject: Client: Require moving the packets/iqs for sending --- src/base/QXmppStream.cpp | 25 +++++++++++-------------- src/base/QXmppStream.h | 6 +++--- 2 files changed, 14 insertions(+), 17 deletions(-) (limited to 'src/base') diff --git a/src/base/QXmppStream.cpp b/src/base/QXmppStream.cpp index 3443d6d4..1cac8740 100644 --- a/src/base/QXmppStream.cpp +++ b/src/base/QXmppStream.cpp @@ -177,8 +177,8 @@ bool QXmppStream::sendData(const QByteArray &data) bool QXmppStream::sendPacket(const QXmppNonza &stanza) { bool success; - send(stanza, success); - return success; +// send(stanza, success); + return false; } /// @@ -186,13 +186,13 @@ bool QXmppStream::sendPacket(const QXmppNonza &stanza) /// /// \since QXmpp 1.5 /// -QFuture QXmppStream::send(const QXmppNonza &nonza) +QFuture QXmppStream::send(QXmppNonza &&nonza) { bool success; - return send(nonza, success); + return send(std::move(nonza), success); } -QFuture QXmppStream::send(const QXmppNonza &nonza, bool &writtenToSocket) +QFuture QXmppStream::send(QXmppNonza &&nonza, bool &writtenToSocket) { QXmppPacket packet(nonza); writtenToSocket = sendData(packet.data()); @@ -210,33 +210,30 @@ QFuture QXmppStream::send(const QXmppNonza &nonza, bool &writ /// /// \since QXmpp 1.5 /// -QFuture QXmppStream::sendIq(const QXmppIq &iq) +QFuture QXmppStream::sendIq(QXmppIq &&iq) { using namespace QXmpp; if (iq.id().isEmpty()) { warning(QStringLiteral("QXmppStream::sendIq() error: ID is empty. Using random ID.")); - auto newIq = iq; - newIq.setId(QXmppUtils::generateStanzaUuid()); - return sendIq(newIq); + iq.setId(QXmppUtils::generateStanzaUuid()); } if (d->runningIqs.contains(iq.id())) { warning(QStringLiteral("QXmppStream::sendIq() error:" "The IQ's ID (\"%1\") is already in use. Using random ID.") .arg(iq.id())); - auto newIq = iq; - newIq.setId(QXmppUtils::generateStanzaUuid()); - return sendIq(newIq); + iq.setId(QXmppUtils::generateStanzaUuid()); } - auto sendFuture = send(iq); + const auto id = iq.id(); + auto sendFuture = send(std::move(iq)); if (sendFuture.isFinished()) { if (std::holds_alternative(sendFuture.result())) { // early exit (saves QFutureWatcher) return makeReadyFuture(std::get(sendFuture.result())); } } else { - awaitLast(sendFuture, this, [this, id = iq.id()](SendResult result) { + awaitLast(sendFuture, this, [this, id](SendResult result) { if (std::holds_alternative(result)) { if (auto itr = d->runningIqs.find(id); itr != d->runningIqs.end()) { itr.value().reportResult(std::get(result)); diff --git a/src/base/QXmppStream.h b/src/base/QXmppStream.h index b5bfb95a..e1fd31ac 100644 --- a/src/base/QXmppStream.h +++ b/src/base/QXmppStream.h @@ -57,10 +57,10 @@ public: virtual bool isConnected() const; bool sendPacket(const QXmppNonza &); - QFuture send(const QXmppNonza &); + QFuture send(QXmppNonza &&); using IqResult = std::variant; - QFuture sendIq(const QXmppIq &); + QFuture sendIq(QXmppIq &&); void cancelOngoingIqs(); void resetPacketCache(); @@ -110,7 +110,7 @@ private: friend class tst_QXmppStream; friend class TestClient; - QFuture send(const QXmppNonza &, bool &); + QFuture send(QXmppNonza &&, bool &); void processData(const QString &data); bool handleIqResponse(const QDomElement &); -- cgit v1.2.3