From 62e2248c30d72ff9c8e2a9acc265d8c39f3c83ca Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Thu, 7 Apr 2022 16:22:34 +0200 Subject: Add MessageHandler interface --- src/client/QXmppClient.cpp | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) (limited to 'src/client/QXmppClient.cpp') diff --git a/src/client/QXmppClient.cpp b/src/client/QXmppClient.cpp index a90fafed..104d94e4 100644 --- a/src/client/QXmppClient.cpp +++ b/src/client/QXmppClient.cpp @@ -14,6 +14,7 @@ #include "QXmppFutureUtils_p.h" #include "QXmppLogger.h" #include "QXmppMessage.h" +#include "QXmppMessageHandler.h" #include "QXmppOutgoingClient.h" #include "QXmppPacket_p.h" #include "QXmppRosterManager.h" @@ -126,6 +127,32 @@ bool process(const QList &extensions, const QDomElement } +namespace QXmpp::Private::MessagePipeline { + +bool process(QXmppClient *client, const QList &extensions, QXmppMessage &&message) +{ + for (auto *extension : extensions) { + if (auto *messageHandler = dynamic_cast(extension)) { + if (messageHandler->handleMessage(message)) { + return true; + } + } + } + return false; +} + +bool process(QXmppClient *client, const QList &extensions, const QDomElement &element) +{ + if (element.tagName() != "message") { + return false; + } + QXmppMessage message; + message.parse(element); + return process(client, extensions, std::move(message)); +} + +} + /// /// \typedef QXmppClient::IqResult /// @@ -807,6 +834,19 @@ void QXmppClient::injectIq(const QDomElement &element, const std::optionalextensions, std::move(message)); + if (!handled) { + // no extension handled the message + emit messageReceived(message); + } + return handled; +} + /// /// Give extensions a chance to handle incoming stanzas. /// @@ -814,7 +854,8 @@ void QXmppClient::_q_elementReceived(const QDomElement &element, bool &handled) { // The stanza comes directly from the XMPP stream, so it's not end-to-end // encrypted and there's no e2ee metadata (std::nullopt). - handled = StanzaPipeline::process(d->extensions, element, std::nullopt); + handled = StanzaPipeline::process(d->extensions, element, std::nullopt) || + MessagePipeline::process(this, d->extensions, element); } void QXmppClient::_q_reconnect() -- cgit v1.2.3