aboutsummaryrefslogtreecommitdiff
path: root/src/base/QXmppPubSubBaseItem.h
diff options
context:
space:
mode:
authorLinus Jahn <lnj@kaidan.im>2023-03-11 00:29:02 +0100
committerLinus Jahn <lnj@kaidan.im>2023-03-11 00:29:02 +0100
commit463111576fb1476192acd2d8fe415b8482a8a696 (patch)
treee87e3bb8f8724f019954692ac22b0d6386dfa5e7 /src/base/QXmppPubSubBaseItem.h
parent6ea3edfd83a0bf1558d43e48eac563730276c175 (diff)
parent4897c9b6a36e961fb44d2bce04a698f979a423d5 (diff)
downloadqxmpp-463111576fb1476192acd2d8fe415b8482a8a696.tar.gz
Merge branch '1.5'
Diffstat (limited to 'src/base/QXmppPubSubBaseItem.h')
-rw-r--r--src/base/QXmppPubSubBaseItem.h87
1 files changed, 87 insertions, 0 deletions
diff --git a/src/base/QXmppPubSubBaseItem.h b/src/base/QXmppPubSubBaseItem.h
new file mode 100644
index 00000000..20702662
--- /dev/null
+++ b/src/base/QXmppPubSubBaseItem.h
@@ -0,0 +1,87 @@
+// SPDX-FileCopyrightText: 2019 Jeremy Lainé <jeremy.laine@m4x.org>
+// SPDX-FileCopyrightText: 2019 Linus Jahn <lnj@kaidan.im>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
+#pragma once
+
+#include "QXmppGlobal.h"
+
+#include <QDomElement>
+#include <QMetaType>
+#include <QSharedDataPointer>
+
+class QXmlStreamWriter;
+class QXmppPubSubBaseItemPrivate;
+
+class QXMPP_EXPORT QXmppPubSubBaseItem
+{
+public:
+ QXmppPubSubBaseItem(const QString &id = {}, const QString &publisher = {});
+ QXmppPubSubBaseItem(const QXmppPubSubBaseItem &);
+ QXmppPubSubBaseItem(QXmppPubSubBaseItem &&);
+ virtual ~QXmppPubSubBaseItem();
+
+ QXmppPubSubBaseItem &operator=(const QXmppPubSubBaseItem &);
+ QXmppPubSubBaseItem &operator=(QXmppPubSubBaseItem &&);
+
+ QString id() const;
+ void setId(const QString &id);
+
+ QString publisher() const;
+ void setPublisher(const QString &publisher);
+
+ /// \cond
+ void parse(const QDomElement &element);
+ void toXml(QXmlStreamWriter *writer) const;
+ /// \endcond
+
+ static bool isItem(const QDomElement &element);
+
+protected:
+ virtual void parsePayload(const QDomElement &payloadElement);
+ virtual void serializePayload(QXmlStreamWriter *writer) const;
+
+ template<typename PayloadChecker>
+ static bool isItem(const QDomElement &element, PayloadChecker isPayloadValid);
+
+private:
+ QSharedDataPointer<QXmppPubSubBaseItemPrivate> d;
+};
+
+///
+/// Returns true, if the element is a valid PubSub item and (if existant) the
+/// payload is correct.
+///
+/// \param element The element to be checked to be an &lt;item/&gt; element.
+/// \param isPayloadValid A function that validates the payload element (first
+/// child element). The functions needs to return true, if the payload is valid.
+/// In case there is no payload, the function is not called.
+///
+/// Here is an example covering how this could be used to check for the
+/// \xep{0118, User Tune} payload:
+/// \code
+/// auto isPayloadValid = [](const QDomElement &payload) -> bool {
+/// return payload.tagName() == "tune" && payload.namespaceURI() == ns_tune;
+/// };
+///
+/// bool valid = QXmppPubSubItem::isItem(itemElement, isPayloadValid);
+/// \endcode
+///
+template<typename PayloadChecker>
+bool QXmppPubSubBaseItem::isItem(const QDomElement &element, PayloadChecker isPayloadValid)
+{
+ if (!isItem(element)) {
+ return false;
+ }
+
+ const QDomElement payload = element.firstChildElement();
+
+ // we can only check the payload if it's existant
+ if (!payload.isNull()) {
+ return isPayloadValid(payload);
+ }
+ return true;
+}
+
+Q_DECLARE_METATYPE(QXmppPubSubBaseItem)