diff options
| author | Linus Jahn <lnj@kaidan.im> | 2020-07-05 01:28:27 +0200 |
|---|---|---|
| committer | Linus Jahn <lnj@kaidan.im> | 2021-08-22 16:09:02 +0200 |
| commit | 5cd52a0a979feaf8953f8583076f8df639b3481d (patch) | |
| tree | 2fb8118d6f2475cdf920a41085e671b8af8aed95 /src/base/QXmppPubSubItem.h | |
| parent | a245371ed2ad363bece0b6de3d760bce937637d1 (diff) | |
| download | qxmpp-5cd52a0a979feaf8953f8583076f8df639b3481d.tar.gz | |
Add new QXmppPubSubItem
Specialization of pubsub items now works via inheritance.
Parsing has been extended, now also supports the 'publisher' attribute.
Diffstat (limited to 'src/base/QXmppPubSubItem.h')
| -rw-r--r-- | src/base/QXmppPubSubItem.h | 67 |
1 files changed, 55 insertions, 12 deletions
diff --git a/src/base/QXmppPubSubItem.h b/src/base/QXmppPubSubItem.h index dc470f59..eb697a0f 100644 --- a/src/base/QXmppPubSubItem.h +++ b/src/base/QXmppPubSubItem.h @@ -3,6 +3,7 @@ * * Author: * Jeremy Lainé + * Linus Jahn * * Source: * https://github.com/qxmpp-project/qxmpp @@ -26,39 +27,81 @@ #include "QXmppGlobal.h" +#include <QDomElement> +#include <QMetaType> #include <QSharedDataPointer> -class QDomElement; class QXmlStreamWriter; - -class QXmppElement; class QXmppPubSubItemPrivate; -/// \brief The QXmppPubSubItem class represents a publish-subscribe item -/// as defined by \xep{0060}: Publish-Subscribe. - class QXMPP_EXPORT QXmppPubSubItem { public: - QXmppPubSubItem(); - QXmppPubSubItem(const QXmppPubSubItem &iq); - ~QXmppPubSubItem(); + QXmppPubSubItem(const QString &id = {}, const QString &publisher = {}); + QXmppPubSubItem(const QXmppPubSubItem &); + virtual ~QXmppPubSubItem(); - QXmppPubSubItem &operator=(const QXmppPubSubItem &iq); + QXmppPubSubItem &operator=(const QXmppPubSubItem &); QString id() const; void setId(const QString &id); - QXmppElement contents() const; - void setContents(const QXmppElement &contents); + 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<QXmppPubSubItemPrivate> 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 QXmppPubSubItem::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(QXmppPubSubItem) + #endif // QXMPPPUBSUBITEM_H |
