aboutsummaryrefslogtreecommitdiff
path: root/src/base/QXmppStream.cpp
diff options
context:
space:
mode:
authorLinus Jahn <lnj@kaidan.im>2021-09-05 16:02:37 +0200
committerLinus Jahn <lnj@kaidan.im>2021-09-28 17:08:08 +0200
commit22be2464b5d253e840d4731fbc86e9633a394e8c (patch)
tree341eea345bd621cd4ef045a79aca57129075ee8d /src/base/QXmppStream.cpp
parent21a198fd66e7c35622fce0b08c306553a4e4ff5a (diff)
downloadqxmpp-22be2464b5d253e840d4731fbc86e9633a394e8c.tar.gz
QXmppStream: Allow to use existing future interface
Diffstat (limited to 'src/base/QXmppStream.cpp')
-rw-r--r--src/base/QXmppStream.cpp62
1 files changed, 52 insertions, 10 deletions
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<QXmpp::SendResult> 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<QXmpp::SendResult> QXmppStream::send(QXmppPacket &&packet)
+{
+ bool success;
+ return send(std::move(packet), success);
}
-QFuture<QXmpp::SendResult> QXmppStream::send(QXmppNonza &&nonza, bool &writtenToSocket)
+QFuture<QXmpp::SendResult> 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::IqResult> 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::IqResult> QXmppStream::sendIq(QXmppPacket &&packet, const QString &id)
+{
+ using namespace QXmpp;
+
+ if (id.isEmpty() || d->runningIqs.contains(id)) {
+ return makeReadyFuture<IqResult>(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<SendError>(sendFuture.result())) {
// early exit (saves QFutureWatcher)
@@ -246,7 +278,7 @@ QFuture<QXmppStream::IqResult> QXmppStream::sendIq(QXmppIq &&iq)
}
IqState interface(IqState::Started);
- d->runningIqs.insert(iq.id(), interface);
+ d->runningIqs.insert(id, interface);
return interface.future();
}
@@ -268,6 +300,16 @@ void QXmppStream::cancelOngoingIqs()
}
///
+/// 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.
///
/// This can be done to prevent that packages from the last connection are being