aboutsummaryrefslogtreecommitdiff
path: root/src/base/QXmppPubSubIq.h
diff options
context:
space:
mode:
authorLinus Jahn <lnj@kaidan.im>2020-07-05 01:26:10 +0200
committerLinus Jahn <lnj@kaidan.im>2021-08-22 16:09:02 +0200
commita245371ed2ad363bece0b6de3d760bce937637d1 (patch)
tree44874c03ba309d6e498b8aa7b47921f2a1f5f2e1 /src/base/QXmppPubSubIq.h
parentef23bc8d63726b5702b02a7a3292531c77c5ac61 (diff)
downloadqxmpp-a245371ed2ad363bece0b6de3d760bce937637d1.tar.gz
Make QXmppPubSubIq a template class and extend
Diffstat (limited to 'src/base/QXmppPubSubIq.h')
-rw-r--r--src/base/QXmppPubSubIq.h159
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