aboutsummaryrefslogtreecommitdiff
path: root/src/base/QXmppPubSubItem.h
diff options
context:
space:
mode:
authorLinus Jahn <lnj@kaidan.im>2020-07-05 01:28:27 +0200
committerLinus Jahn <lnj@kaidan.im>2021-08-22 16:09:02 +0200
commit5cd52a0a979feaf8953f8583076f8df639b3481d (patch)
tree2fb8118d6f2475cdf920a41085e671b8af8aed95 /src/base/QXmppPubSubItem.h
parenta245371ed2ad363bece0b6de3d760bce937637d1 (diff)
downloadqxmpp-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.h67
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 &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 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