diff options
| author | Linus Jahn <lnj@kaidan.im> | 2022-04-07 16:22:34 +0200 |
|---|---|---|
| committer | Linus Jahn <lnj@kaidan.im> | 2022-05-20 17:27:13 +0200 |
| commit | 62e2248c30d72ff9c8e2a9acc265d8c39f3c83ca (patch) | |
| tree | 1281cfa9d4d2363c569ccac9ee8718e13afaf4d6 /src/client/QXmppClient.cpp | |
| parent | f10146c7b298ef0cb04794452b0807c2b7a6910d (diff) | |
| download | qxmpp-62e2248c30d72ff9c8e2a9acc265d8c39f3c83ca.tar.gz | |
Add MessageHandler interface
Diffstat (limited to 'src/client/QXmppClient.cpp')
| -rw-r--r-- | src/client/QXmppClient.cpp | 43 |
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() |
