aboutsummaryrefslogtreecommitdiff
path: root/src/client/QXmppClient.cpp
diff options
context:
space:
mode:
authorLinus Jahn <lnj@kaidan.im>2022-04-07 16:22:34 +0200
committerLinus Jahn <lnj@kaidan.im>2022-05-20 17:27:13 +0200
commit62e2248c30d72ff9c8e2a9acc265d8c39f3c83ca (patch)
tree1281cfa9d4d2363c569ccac9ee8718e13afaf4d6 /src/client/QXmppClient.cpp
parentf10146c7b298ef0cb04794452b0807c2b7a6910d (diff)
downloadqxmpp-62e2248c30d72ff9c8e2a9acc265d8c39f3c83ca.tar.gz
Add MessageHandler interface
Diffstat (limited to 'src/client/QXmppClient.cpp')
-rw-r--r--src/client/QXmppClient.cpp43
1 files changed, 42 insertions, 1 deletions
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<QXmppClientExtension *> &extensions, const QDomElement
}
+namespace QXmpp::Private::MessagePipeline {
+
+bool process(QXmppClient *client, const QList<QXmppClientExtension *> &extensions, QXmppMessage &&message)
+{
+ for (auto *extension : extensions) {
+ if (auto *messageHandler = dynamic_cast<QXmppMessageHandler *>(extension)) {
+ if (messageHandler->handleMessage(message)) {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+bool process(QXmppClient *client, const QList<QXmppClientExtension *> &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
///
@@ -808,13 +835,27 @@ void QXmppClient::injectIq(const QDomElement &element, const std::optional<QXmpp
}
///
+/// Processes the message with message handlers and emits messageReceived as a fallback.
+///
+bool QXmppClient::injectMessage(QXmppMessage &&message)
+{
+ auto handled = MessagePipeline::process(this, d->extensions, std::move(message));
+ if (!handled) {
+ // no extension handled the message
+ emit messageReceived(message);
+ }
+ return handled;
+}
+
+///
/// Give extensions a chance to handle incoming stanzas.
///
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()