diff options
| author | Linus Jahn <lnj@kaidan.im> | 2020-07-05 01:26:10 +0200 |
|---|---|---|
| committer | Linus Jahn <lnj@kaidan.im> | 2021-08-22 16:09:02 +0200 |
| commit | a245371ed2ad363bece0b6de3d760bce937637d1 (patch) | |
| tree | 44874c03ba309d6e498b8aa7b47921f2a1f5f2e1 /src/base/QXmppPubSubIq.h | |
| parent | ef23bc8d63726b5702b02a7a3292531c77c5ac61 (diff) | |
| download | qxmpp-a245371ed2ad363bece0b6de3d760bce937637d1.tar.gz | |
Make QXmppPubSubIq a template class and extend
Diffstat (limited to 'src/base/QXmppPubSubIq.h')
| -rw-r--r-- | src/base/QXmppPubSubIq.h | 159 |
1 files changed, 125 insertions, 34 deletions
diff --git a/src/base/QXmppPubSubIq.h b/src/base/QXmppPubSubIq.h index 3fccfee4..7b402062 100644 --- a/src/base/QXmppPubSubIq.h +++ b/src/base/QXmppPubSubIq.h @@ -2,6 +2,7 @@ * Copyright (C) 2008-2021 The QXmpp developers * * Author: + * Linus Jahn * Jeremy Lainé * * Source: @@ -26,68 +27,158 @@ #include "QXmppIq.h" -#include <QSharedDataPointer> +#include <optional> -#if QXMPP_DEPRECATED_SINCE(1, 2) -#include "QXmppPubSubItem.h" -#endif +#include <QDomElement> +#include <QSharedDataPointer> +class QXmppDataForm; class QXmppPubSubIqPrivate; +class QXmppPubSubItem; +class QXmppPubSubSubscription; +class QXmppPubSubAffiliation; +class QXmppResultSetReply; -/// \brief The QXmppPubSubIq class represents an IQ used for the -/// publish-subscribe mechanisms defined by \xep{0060}: Publish-Subscribe. -/// -/// \ingroup Stanzas - -class QXMPP_EXPORT QXmppPubSubIq : public QXmppIq +class QXMPP_EXPORT QXmppPubSubIqBase : public QXmppIq { public: /// This enum is used to describe a publish-subscribe query type. - enum QueryType { - AffiliationsQuery, - DefaultQuery, - ItemsQuery, - PublishQuery, - RetractQuery, - SubscribeQuery, - SubscriptionQuery, - SubscriptionsQuery, - UnsubscribeQuery + enum QueryType : uint8_t { + Affiliations, + OwnerAffiliations, + Configure, + Create, + Default, + OwnerDefault, + Delete, + Items, + Options, + Publish, + Purge, + Retract, + Subscribe, + Subscription, + Subscriptions, + OwnerSubscriptions, + Unsubscribe, }; - QXmppPubSubIq(); - QXmppPubSubIq(const QXmppPubSubIq &iq); - ~QXmppPubSubIq(); + QXmppPubSubIqBase(); + QXmppPubSubIqBase(const QXmppPubSubIqBase &other); + ~QXmppPubSubIqBase(); - QXmppPubSubIq &operator=(const QXmppPubSubIq &iq); + QXmppPubSubIqBase &operator=(const QXmppPubSubIqBase &other); - QXmppPubSubIq::QueryType queryType() const; - void setQueryType(QXmppPubSubIq::QueryType queryType); + QueryType queryType() const; + void setQueryType(QueryType queryType); QString queryJid() const; - void setQueryJid(const QString &jid); + void setQueryJid(const QString &queryJid); QString queryNode() const; - void setQueryNode(const QString &node); - - QList<QXmppPubSubItem> items() const; - void setItems(const QList<QXmppPubSubItem> &items); + void setQueryNode(const QString &queryNode); QString subscriptionId() const; - void setSubscriptionId(const QString &id); + void setSubscriptionId(const QString &subscriptionId); + + QVector<QXmppPubSubSubscription> subscriptions() const; + void setSubscriptions(const QVector<QXmppPubSubSubscription> &); + + std::optional<QXmppPubSubSubscription> subscription() const; + void setSubscription(const std::optional<QXmppPubSubSubscription> &); + + QVector<QXmppPubSubAffiliation> affiliations() const; + void setAffiliations(const QVector<QXmppPubSubAffiliation> &); + + std::optional<uint32_t> maxItems() const; + void setMaxItems(std::optional<uint32_t>); + + std::optional<QXmppDataForm> dataForm() const; + void setDataForm(const std::optional<QXmppDataForm> &); + + std::optional<QXmppResultSetReply> itemsContinuation() const; + void setItemsContinuation(const std::optional<QXmppResultSetReply> &itemsContinuation); /// \cond static bool isPubSubIq(const QDomElement &element); - /// \endcond protected: - /// \cond + static bool isPubSubIq(const QDomElement &element, + bool (*isItemValid)(const QDomElement &)); + void parseElementFromChild(const QDomElement &) override; void toXmlElementFromChild(QXmlStreamWriter *writer) const override; + + virtual void parseItems(const QDomElement &queryElement) = 0; + virtual void serializeItems(QXmlStreamWriter *writer) const = 0; /// \endcond private: + static std::optional<QueryType> queryTypeFromDomElement(const QDomElement &element); + static bool queryTypeIsOwnerIq(QueryType type); + QSharedDataPointer<QXmppPubSubIqPrivate> d; }; +template<typename T = QXmppPubSubItem> +class QXmppPubSubIq : public QXmppPubSubIqBase +{ +public: + QVector<T> items() const; + void setItems(const QVector<T> &items); + + static bool isPubSubIq(const QDomElement &element); + +protected: + /// \cond + void parseItems(const QDomElement &queryElement) override; + void serializeItems(QXmlStreamWriter *writer) const override; + /// \endcond + +private: + QVector<T> m_items; +}; + +template<typename T> +QVector<T> QXmppPubSubIq<T>::items() const +{ + return m_items; +} + +template<typename T> +void QXmppPubSubIq<T>::setItems(const QVector<T> &items) +{ + m_items = items; +} + +template<typename T> +bool QXmppPubSubIq<T>::isPubSubIq(const QDomElement &element) +{ + return QXmppPubSubIqBase::isPubSubIq(element, [](const QDomElement &item) -> bool { + return T::isItem(item); + }); +} + +/// \cond +template<typename T> +void QXmppPubSubIq<T>::parseItems(const QDomElement &queryElement) +{ + for (auto childElement = queryElement.firstChildElement(QStringLiteral("item")); + !childElement.isNull(); + childElement = childElement.nextSiblingElement(QStringLiteral("item"))) { + T item; + item.parse(childElement); + m_items << std::move(item); + } +} + +template<typename T> +void QXmppPubSubIq<T>::serializeItems(QXmlStreamWriter *writer) const +{ + for (const auto &item : std::as_const(m_items)) { + item.toXml(writer); + } +} +/// \endcond + #endif // QXMPPPUBSUBIQ_H |
