aboutsummaryrefslogtreecommitdiff
path: root/src/base
diff options
context:
space:
mode:
authorLinus Jahn <lnj@kaidan.im>2021-09-05 15:46:53 +0200
committerLinus Jahn <lnj@kaidan.im>2021-09-28 17:08:08 +0200
commit21a198fd66e7c35622fce0b08c306553a4e4ff5a (patch)
tree4f6721fa737e109c9aa0ecdf1f4fb6897be0e299 /src/base
parenteffe99a4c0006cf159ab7342cc27b13c2d1cf2e6 (diff)
downloadqxmpp-21a198fd66e7c35622fce0b08c306553a4e4ff5a.tar.gz
Client: Require moving the packets/iqs for sending
Diffstat (limited to 'src/base')
-rw-r--r--src/base/QXmppStream.cpp25
-rw-r--r--src/base/QXmppStream.h6
2 files changed, 14 insertions, 17 deletions
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<QXmpp::SendResult> QXmppStream::send(const QXmppNonza &nonza)
+QFuture<QXmpp::SendResult> QXmppStream::send(QXmppNonza &&nonza)
{
bool success;
- return send(nonza, success);
+ return send(std::move(nonza), success);
}
-QFuture<QXmpp::SendResult> QXmppStream::send(const QXmppNonza &nonza, bool &writtenToSocket)
+QFuture<QXmpp::SendResult> QXmppStream::send(QXmppNonza &&nonza, bool &writtenToSocket)
{
QXmppPacket packet(nonza);
writtenToSocket = sendData(packet.data());
@@ -210,33 +210,30 @@ QFuture<QXmpp::SendResult> QXmppStream::send(const QXmppNonza &nonza, bool &writ
///
/// \since QXmpp 1.5
///
-QFuture<QXmppStream::IqResult> QXmppStream::sendIq(const QXmppIq &iq)
+QFuture<QXmppStream::IqResult> 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<SendError>(sendFuture.result())) {
// early exit (saves QFutureWatcher)
return makeReadyFuture<IqResult>(std::get<SendError>(sendFuture.result()));
}
} else {
- awaitLast(sendFuture, this, [this, id = iq.id()](SendResult result) {
+ awaitLast(sendFuture, this, [this, id](SendResult result) {
if (std::holds_alternative<SendError>(result)) {
if (auto itr = d->runningIqs.find(id); itr != d->runningIqs.end()) {
itr.value().reportResult(std::get<SendError>(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<QXmpp::SendResult> send(const QXmppNonza &);
+ QFuture<QXmpp::SendResult> send(QXmppNonza &&);
using IqResult = std::variant<QDomElement, QXmpp::SendError>;
- QFuture<IqResult> sendIq(const QXmppIq &);
+ QFuture<IqResult> sendIq(QXmppIq &&);
void cancelOngoingIqs();
void resetPacketCache();
@@ -110,7 +110,7 @@ private:
friend class tst_QXmppStream;
friend class TestClient;
- QFuture<QXmpp::SendResult> send(const QXmppNonza &, bool &);
+ QFuture<QXmpp::SendResult> send(QXmppNonza &&, bool &);
void processData(const QString &data);
bool handleIqResponse(const QDomElement &);