5#ifndef QXMPPIQHANDLING_H
6#define QXMPPIQHANDLING_H
8#include "QXmppAsync_p.h"
9#include "QXmppClient.h"
10#include "QXmppE2eeMetadata.h"
12#include "QXmppUtils_p.h"
13#include "QXmppXmlTags_p.h"
15#include "StringLiterals.h"
24 const QString &requestId,
25 const QString &requestFrom,
26 const std::optional<QXmppE2eeMetadata> &e2eeMetadata,
29QXMPP_EXPORT std::tuple<bool, QString, QString> checkIsIqRequest(
const QDomElement &el);
31template<
typename... VariantTypes>
33 const QString &requestId,
34 const QString &requestFrom,
35 const std::optional<QXmppE2eeMetadata> &e2eeMetadata,
36 std::variant<VariantTypes...> &&result)
38 std::visit([&](
auto &&value) {
39 using T = std::decay_t<
decltype(value)>;
42 std::is_base_of_v<QXmppIq, T> || std::is_same_v<QXmppStanza::Error, T>,
43 "QXmppIq based type or QXmppStanza::Error required");
45 if constexpr (std::is_base_of_v<QXmppIq, T>) {
46 sendIqReply(client, requestId, requestFrom, e2eeMetadata, std::move(value));
47 }
else if constexpr (std::is_same_v<QXmppStanza::Error, T>) {
51 sendIqReply(client, requestId, requestFrom, e2eeMetadata, std::move(iq));
59 const QString &requestId,
60 const QString &requestFrom,
61 const std::optional<QXmppE2eeMetadata> &e2eeMetadata,
64 future.
then(client, [client, requestId, requestFrom, e2eeMetadata](T result) {
65 processHandleIqResult(client, requestId, requestFrom, e2eeMetadata, result);
69template<
typename T,
typename = std::enable_if_t<std::is_base_of_v<QXmppIq, T>,
void>>
71 const QString &requestId,
72 const QString &requestFrom,
73 const std::optional<QXmppE2eeMetadata> &e2eeMetadata,
76 sendIqReply(client, requestId, requestFrom, e2eeMetadata, std::move(result));
79template<
typename Handler,
typename IqType>
80auto invokeIqHandler(Handler handler, IqType &&iq)
82 if constexpr (std::is_invocable<Handler, IqType &&>()) {
83 return handler(std::move(iq));
85 return handler->handleIq(std::move(iq));
89template<
typename IqType,
typename Handler>
90bool handleIqType(Handler handler,
92 const QDomElement &element,
93 const std::optional<QXmppE2eeMetadata> &e2eeMetadata,
94 const QString &tagName,
95 const QString &xmlNamespace)
97 if (isPayloadType<IqType>(std::tuple { tagName, xmlNamespace })) {
98 if (
auto iq = parseElement<IqType>(element)) {
99 if constexpr (std::is_base_of_v<QXmppIq, IqType>) {
103 processHandleIqResult(client, element.attribute(u
"id"_s), element.attribute(u
"from"_s), e2eeMetadata,
104 invokeIqHandler(std::forward<Handler>(handler), std::move(*iq)));
189template<
typename... IqTypes,
typename Handler>
191 const std::optional<QXmppE2eeMetadata> &e2eeMetadata,
195 if (
auto [isRequest, tagName, xmlns] = Private::checkIsIqRequest(element); isRequest) {
196 return (Private::handleIqType<IqTypes>(handler, client, element, e2eeMetadata, tagName, xmlns) || ...);
272template<
typename... IqTypes,
typename Handler>
275 return handleIqRequests<IqTypes...>(element, std::nullopt, client, std::forward<Handler>(handler));
Main class for starting and managing connections to XMPP servers.
Definition QXmppClient.h:62
The QXmppIq class is the base class for all IQs.
Definition QXmppIq.h:23
void setType(QXmppIq::Type)
Definition QXmppIq.cpp:70
The Error class represents a stanza error.
Definition QXmppStanza.h:96
void setError(const QXmppStanza::Error &error)
Definition QXmppStanza.cpp:772
void setE2eeMetadata(const std::optional< QXmppE2eeMetadata > &e2eeMetadata)
Definition QXmppStanza.cpp:849
Definition QXmppTask.h:46
void then(const QObject *context, Continuation continuation)
Definition QXmppTask.h:89
Definition Algorithms.h:14
bool handleIqRequests(const QDomElement &element, const std::optional< QXmppE2eeMetadata > &e2eeMetadata, QXmppClient *client, Handler handler)
Definition QXmppIqHandling.h:190