aboutsummaryrefslogtreecommitdiff
path: root/src/client
diff options
context:
space:
mode:
authorLinus Jahn <lnj@kaidan.im>2020-09-09 15:05:23 +0200
committerLinus Jahn <lnj@kaidan.im>2021-06-27 20:17:17 +0200
commit3caffcebf16680576d8dd785437eed16a6c5f36d (patch)
tree0805a42decacdda2ace8d43196c25fe21a6fad79 /src/client
parent7e936d200db4855ceaf9eabc1e84c3574a12ec98 (diff)
downloadqxmpp-3caffcebf16680576d8dd785437eed16a6c5f36d.tar.gz
Add reporting of IQ responses with QFutures
Diffstat (limited to 'src/client')
-rw-r--r--src/client/QXmppClient.cpp21
-rw-r--r--src/client/QXmppClient.h3
-rw-r--r--src/client/QXmppOutgoingClient.cpp16
3 files changed, 39 insertions, 1 deletions
diff --git a/src/client/QXmppClient.cpp b/src/client/QXmppClient.cpp
index 6933a0a6..4f8bfc26 100644
--- a/src/client/QXmppClient.cpp
+++ b/src/client/QXmppClient.cpp
@@ -38,6 +38,7 @@
#include "QXmppVCardManager.h"
#include "QXmppVersionManager.h"
+#include <QDomElement>
#include <QFuture>
#include <QSslSocket>
#include <QTimer>
@@ -109,6 +110,14 @@ QStringList QXmppClientPrivate::discoveryFeatures()
}
/// \endcond
+///
+/// \typedef QXmppClient::IqResult
+///
+/// Result of an IQ request, either contains the QDomElement of the IQ answer
+/// (with type 'error' or 'result') or it contains the packet error, if the
+/// request couldn't be sent.
+///
+
/// Creates a QXmppClient object.
/// \param parent is passed to the QObject's constructor.
/// The default value is 0.
@@ -333,6 +342,18 @@ QFuture<QXmpp::PacketState> QXmppClient::send(const QXmppStanza &stanza)
return d->stream->send(stanza);
}
+///
+/// Sends an IQ packet and returns the response asynchronously.
+///
+/// \warning THIS API IS NOT FINALIZED YET!
+///
+/// \since QXmpp 1.5
+///
+QFuture<QXmppClient::IqResult> QXmppClient::sendIq(const QXmppIq &iq)
+{
+ return d->stream->sendIq(iq);
+}
+
/// Disconnects the client and the current presence of client changes to
/// QXmppPresence::Unavailable and status text changes to "Logged out".
///
diff --git a/src/client/QXmppClient.h b/src/client/QXmppClient.h
index 56da95ee..202c9c5a 100644
--- a/src/client/QXmppClient.h
+++ b/src/client/QXmppClient.h
@@ -221,6 +221,9 @@ public:
QFuture<QXmpp::PacketState> send(const QXmppStanza &);
+ using IqResult = std::variant<QDomElement, QXmpp::PacketState>;
+ QFuture<IqResult> sendIq(const QXmppIq &);
+
#if QXMPP_DEPRECATED_SINCE(1, 1)
QT_DEPRECATED_X("Use QXmppClient::findExtension<QXmppRosterManager>() instead")
QXmppRosterManager &rosterManager();
diff --git a/src/client/QXmppOutgoingClient.cpp b/src/client/QXmppOutgoingClient.cpp
index a8bfb62d..6479f334 100644
--- a/src/client/QXmppOutgoingClient.cpp
+++ b/src/client/QXmppOutgoingClient.cpp
@@ -213,6 +213,20 @@ QXmppOutgoingClient::QXmppOutgoingClient(QObject *parent)
connect(this, &QXmppStream::connected, this, &QXmppOutgoingClient::pingStart);
connect(this, &QXmppStream::disconnected, this, &QXmppOutgoingClient::pingStop);
+
+ // IQ response handling
+ connect(this, &QXmppStream::connected, this, [=]() {
+ if (!d->streamResumed) {
+ // we can't expect a response because this is a new stream
+ cancelOngoingIqs();
+ }
+ });
+ connect(this, &QXmppStream::disconnected, this, [=]() {
+ if (!d->canResume) {
+ // this stream can't be resumed; we can cancel all ongoing IQs
+ cancelOngoingIqs();
+ }
+ });
}
/// Destroys an outgoing client stream.
@@ -510,7 +524,7 @@ void QXmppOutgoingClient::handleStanza(const QDomElement &nodeRecv)
d->bindModeAvailable = (features.bindMode() != QXmppStreamFeatures::Disabled);
d->streamManagementAvailable = (features.streamManagementMode() != QXmppStreamFeatures::Disabled);
- // chech whether the stream can be resumed
+ // check whether the stream can be resumed
if (d->streamManagementAvailable && d->canResume) {
d->isResuming = true;
QXmppStreamManagementResume streamManagementResume(lastIncomingSequenceNumber(), d->smId);