diff options
| author | Linus Jahn <lnj@kaidan.im> | 2023-03-09 18:48:21 +0100 |
|---|---|---|
| committer | Linus Jahn <lnj@kaidan.im> | 2023-03-09 20:16:42 +0100 |
| commit | fcd8224256e38d50d4ec67b71c504dcb6e480e95 (patch) | |
| tree | 5753ff003919d3815698c630d96f92d824df546a /src/base/QXmppPubSubBaseItem.h | |
| parent | 18353901a2215376e2f0274a408ce2213c180f16 (diff) | |
| download | qxmpp-fcd8224256e38d50d4ec67b71c504dcb6e480e95.tar.gz | |
Rename PubSubItem -> PubSubBaseItem to be able to include old PubSubItem
Diffstat (limited to 'src/base/QXmppPubSubBaseItem.h')
| -rw-r--r-- | src/base/QXmppPubSubBaseItem.h | 87 |
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 <item/> 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) |
