aboutsummaryrefslogtreecommitdiff
path: root/src/base
diff options
context:
space:
mode:
authorLinus Jahn <lnj@kaidan.im>2020-07-06 22:11:05 +0200
committerLinus Jahn <lnj@kaidan.im>2021-08-22 16:09:02 +0200
commit87a265bb25169161e4f4515832eba61556a57ea5 (patch)
tree7fe1d1db0e20bf31d2a890a32995f2102285343e /src/base
parente01ce46971b85f6b2b778dc4ae41956a668f5b53 (diff)
downloadqxmpp-87a265bb25169161e4f4515832eba61556a57ea5.tar.gz
Add PubSubSubscribeOptions form
Diffstat (limited to 'src/base')
-rw-r--r--src/base/QXmppPubSubSubscribeOptions.cpp278
-rw-r--r--src/base/QXmppPubSubSubscribeOptions.h109
2 files changed, 387 insertions, 0 deletions
diff --git a/src/base/QXmppPubSubSubscribeOptions.cpp b/src/base/QXmppPubSubSubscribeOptions.cpp
new file mode 100644
index 00000000..84aa594e
--- /dev/null
+++ b/src/base/QXmppPubSubSubscribeOptions.cpp
@@ -0,0 +1,278 @@
+/*
+ * Copyright (C) 2008-2021 The QXmpp developers
+ *
+ * Author:
+ * Linus Jahn
+ *
+ * Source:
+ * https://github.com/qxmpp-project/qxmpp
+ *
+ * This file is a part of QXmpp library.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ */
+
+#include "QXmppPubSubSubscribeOptions.h"
+
+#include <QDateTime>
+
+const auto SUBSCRIBE_OPTIONS_FORM_TYPE = QStringLiteral("http://jabber.org/protocol/pubsub#subscribe_options");
+
+const auto NOTIFICATIONS_ENABLED = QStringLiteral("pubsub#deliver");
+const auto DIGESTS_ENABLED = QStringLiteral("pubsub#digest");
+const auto DIGEST_FREQUENCY_MS = QStringLiteral("pubsub#digest_frequency");
+const auto BODY_INCLUDED = QStringLiteral("pubsub#include_body");
+const auto EXPIRE = QStringLiteral("pubsub#expire");
+const auto NOTIFICATION_RULES = QStringLiteral("pubsub#show-values");
+const auto SUBSCRIPTION_TYPE = QStringLiteral("pubsub#subscription_type");
+const auto SUBSCRIPTION_DEPTH = QStringLiteral("pubsub#subscription_depth");
+
+class QXmppPubSubSubscribeOptionsPrivate : public QSharedData
+{
+public:
+ std::optional<bool> notificationsEnabled;
+ std::optional<bool> digestsEnabled;
+ std::optional<quint32> digestFrequencyMs;
+ std::optional<bool> bodyIncluded;
+ QDateTime expire;
+ QXmppPubSubSubscribeOptions::PresenceStates notificationRules;
+ std::optional<QXmppPubSubSubscribeOptions::SubscriptionType> subscriptionType;
+ std::optional<QXmppPubSubSubscribeOptions::SubscriptionDepth> subscriptionDepth;
+};
+
+QXmppPubSubSubscribeOptions::PresenceStates QXmppPubSubSubscribeOptions::presenceStatesFromStringList(const QStringList &values)
+{
+ PresenceStates states;
+ if (values.contains(QStringLiteral("away")))
+ states |= Away;
+ if (values.contains(QStringLiteral("chat")))
+ states |= Chat;
+ if (values.contains(QStringLiteral("dnd")))
+ states |= DoNotDisturb;
+ if (values.contains(QStringLiteral("online")))
+ states |= Online;
+ if (values.contains(QStringLiteral("xa")))
+ states |= ExtendedAway;
+ return states;
+}
+
+QStringList QXmppPubSubSubscribeOptions::presenceStatesToStringList(PresenceStates states)
+{
+ QStringList output;
+ if (states & Away)
+ output << QStringLiteral("away");
+ if (states & Chat)
+ output << QStringLiteral("chat");
+ if (states & DoNotDisturb)
+ output << QStringLiteral("dnd");
+ if (states & Online)
+ output << QStringLiteral("online");
+ if (states & ExtendedAway)
+ output << QStringLiteral("xa");
+ return output;
+}
+
+std::optional<QXmppPubSubSubscribeOptions> QXmppPubSubSubscribeOptions::fromDataForm(const QXmppDataForm &form)
+{
+ if (form.formType() == SUBSCRIBE_OPTIONS_FORM_TYPE) {
+ QXmppPubSubSubscribeOptions options;
+ options.parseForm(form);
+ return options;
+ }
+ return std::nullopt;
+}
+
+QXmppPubSubSubscribeOptions::QXmppPubSubSubscribeOptions()
+ : d(new QXmppPubSubSubscribeOptionsPrivate())
+{
+}
+
+QXmppPubSubSubscribeOptions::QXmppPubSubSubscribeOptions(const QXmppPubSubSubscribeOptions &) = default;
+
+QXmppPubSubSubscribeOptions::~QXmppPubSubSubscribeOptions() = default;
+
+QXmppPubSubSubscribeOptions &QXmppPubSubSubscribeOptions::operator=(const QXmppPubSubSubscribeOptions &) = default;
+
+std::optional<bool> QXmppPubSubSubscribeOptions::notificationsEnabled() const
+{
+ return d->notificationsEnabled;
+}
+
+void QXmppPubSubSubscribeOptions::setNotificationsEnabled(std::optional<bool> enabled)
+{
+ d->notificationsEnabled = enabled;
+}
+
+std::optional<bool> QXmppPubSubSubscribeOptions::digestsEnabled() const
+{
+ return d->digestsEnabled;
+}
+
+void QXmppPubSubSubscribeOptions::setDigestsEnabled(std::optional<bool> digestsEnabled)
+{
+ d->digestsEnabled = digestsEnabled;
+}
+
+std::optional<quint32> QXmppPubSubSubscribeOptions::digestFrequencyMs() const
+{
+ return d->digestFrequencyMs;
+}
+
+void QXmppPubSubSubscribeOptions::setDigestFrequencyMs(std::optional<quint32> digestFrequencyMs)
+{
+ d->digestFrequencyMs = digestFrequencyMs;
+}
+
+QDateTime QXmppPubSubSubscribeOptions::expire() const
+{
+ return d->expire;
+}
+
+void QXmppPubSubSubscribeOptions::setExpire(const QDateTime &expire)
+{
+ d->expire = expire;
+}
+
+std::optional<bool> QXmppPubSubSubscribeOptions::bodyIncluded() const
+{
+ return d->bodyIncluded;
+}
+
+void QXmppPubSubSubscribeOptions::setBodyIncluded(std::optional<bool> bodyIncluded)
+{
+ d->bodyIncluded = bodyIncluded;
+}
+
+QXmppPubSubSubscribeOptions::PresenceStates QXmppPubSubSubscribeOptions::notificationRules() const
+{
+ return d->notificationRules;
+}
+
+void QXmppPubSubSubscribeOptions::setNotificationRules(PresenceStates notificationRules)
+{
+ d->notificationRules = notificationRules;
+}
+
+std::optional<QXmppPubSubSubscribeOptions::SubscriptionType> QXmppPubSubSubscribeOptions::subscriptionType() const
+{
+ return d->subscriptionType;
+}
+
+void QXmppPubSubSubscribeOptions::setSubscriptionType(std::optional<SubscriptionType> subscriptionType)
+{
+ d->subscriptionType = subscriptionType;
+}
+
+std::optional<QXmppPubSubSubscribeOptions::SubscriptionDepth> QXmppPubSubSubscribeOptions::subscriptionDepth() const
+{
+ return d->subscriptionDepth;
+}
+
+void QXmppPubSubSubscribeOptions::setSubscriptionDepth(std::optional<SubscriptionDepth> subscriptionDepth)
+{
+ d->subscriptionDepth = subscriptionDepth;
+}
+
+QString QXmppPubSubSubscribeOptions::formType() const
+{
+ return SUBSCRIBE_OPTIONS_FORM_TYPE;
+}
+
+bool QXmppPubSubSubscribeOptions::parseField(const QXmppDataForm::Field &field)
+{
+ const auto subscriptionTypeFromString = [](const QString &value) -> std::optional<SubscriptionType> {
+ if (value == QStringLiteral("items")) {
+ return Items;
+ }
+ if (value == QStringLiteral("nodes")) {
+ return Nodes;
+ }
+ return {};
+ };
+
+ const auto subscriptionDepthFromString = [](const QString &value) -> std::optional<SubscriptionDepth> {
+ if (value == QChar(u'1')) {
+ return TopLevelOnly;
+ }
+ if (value == QStringLiteral("all")) {
+ return Recursive;
+ }
+ return {};
+ };
+
+ // ignore hidden fields
+ if (field.type() == QXmppDataForm::Field::Type::HiddenField) {
+ return false;
+ }
+
+ const auto key = field.key();
+ const auto value = field.value();
+
+ if (key == NOTIFICATIONS_ENABLED) {
+ d->notificationsEnabled = parseBool(value);
+ } else if (key == DIGESTS_ENABLED) {
+ d->digestsEnabled = parseBool(value);
+ } else if (key == DIGEST_FREQUENCY_MS) {
+ d->digestFrequencyMs = parseUInt(value);
+ } else if (key == BODY_INCLUDED) {
+ d->bodyIncluded = parseBool(value);
+ } else if (key == EXPIRE) {
+ d->expire = QDateTime::fromString(value.toString(), Qt::ISODate);
+ } else if (key == NOTIFICATION_RULES) {
+ d->notificationRules = presenceStatesFromStringList(value.toStringList());
+ } else if (key == SUBSCRIPTION_TYPE) {
+ d->subscriptionType = subscriptionTypeFromString(value.toString());
+ } else if (key == SUBSCRIPTION_DEPTH) {
+ d->subscriptionDepth = subscriptionDepthFromString(value.toString());
+ } else {
+ return false;
+ }
+ return true;
+}
+
+void QXmppPubSubSubscribeOptions::serializeForm(QXmppDataForm &form) const
+{
+ using Type = QXmppDataForm::Field::Type;
+
+ const auto numberToString = [](quint32 value) {
+ return QString::number(value);
+ };
+
+ const auto subscriptionTypeToString = [](SubscriptionType type) -> QString {
+ switch (type) {
+ case Items:
+ return QStringLiteral("items");
+ case Nodes:
+ return QStringLiteral("nodes");
+ }
+ return {};
+ };
+
+ const auto subscriptionDepthToString = [](SubscriptionDepth depth) -> QString {
+ switch (depth) {
+ case TopLevelOnly:
+ return QStringLiteral("1");
+ case Recursive:
+ return QStringLiteral("all");
+ };
+ return {};
+ };
+
+ serializeOptional(form, Type::BooleanField, NOTIFICATIONS_ENABLED, d->notificationsEnabled);
+ serializeOptional(form, Type::BooleanField, DIGESTS_ENABLED, d->digestsEnabled);
+ serializeOptional(form, Type::TextSingleField, DIGEST_FREQUENCY_MS, d->digestFrequencyMs, numberToString);
+ serializeDatetime(form, EXPIRE, d->expire);
+ serializeOptional(form, Type::BooleanField, BODY_INCLUDED, d->bodyIncluded);
+ serializeEmptyable(form, Type::ListMultiField, NOTIFICATION_RULES, presenceStatesToStringList(d->notificationRules));
+ serializeOptional(form, Type::ListSingleField, SUBSCRIPTION_TYPE, d->subscriptionType, subscriptionTypeToString);
+ serializeOptional(form, Type::ListSingleField, SUBSCRIPTION_DEPTH, d->subscriptionDepth, subscriptionDepthToString);
+}
diff --git a/src/base/QXmppPubSubSubscribeOptions.h b/src/base/QXmppPubSubSubscribeOptions.h
new file mode 100644
index 00000000..006eb951
--- /dev/null
+++ b/src/base/QXmppPubSubSubscribeOptions.h
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2008-2021 The QXmpp developers
+ *
+ * Author:
+ * Linus Jahn
+ *
+ * Source:
+ * https://github.com/qxmpp-project/qxmpp
+ *
+ * This file is a part of QXmpp library.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ */
+
+#ifndef QXMPPPUBSUBSUBSCRIBEOPTIONS_H
+#define QXMPPPUBSUBSUBSCRIBEOPTIONS_H
+
+#include "QXmppDataForm.h"
+#include "QXmppDataFormBase.h"
+#include "QXmppGlobal.h"
+
+#include <QFlags>
+#include <QSharedDataPointer>
+
+class QDateTime;
+class QDomElement;
+class QXmlStreamWriter;
+class QXmppDataForm;
+class QXmppPubSubSubscribeOptionsPrivate;
+
+class QXMPP_EXPORT QXmppPubSubSubscribeOptions : public QXmppExtensibleDataFormBase
+{
+public:
+ enum PresenceState : uint8_t {
+ Unset = 0x00,
+ Online = 0x01,
+ Away = 0x02,
+ Chat = 0x04,
+ DoNotDisturb = 0x08,
+ ExtendedAway = 0x10
+ };
+ Q_DECLARE_FLAGS(PresenceStates, PresenceState)
+ static PresenceStates presenceStatesFromStringList(const QStringList &);
+ static QStringList presenceStatesToStringList(PresenceStates);
+
+ enum SubscriptionType : uint8_t {
+ Items,
+ Nodes
+ };
+
+ enum SubscriptionDepth : uint8_t {
+ TopLevelOnly,
+ Recursive
+ };
+
+ static std::optional<QXmppPubSubSubscribeOptions> fromDataForm(const QXmppDataForm &form);
+
+ QXmppPubSubSubscribeOptions();
+ QXmppPubSubSubscribeOptions(const QXmppPubSubSubscribeOptions &);
+ virtual ~QXmppPubSubSubscribeOptions();
+
+ QXmppPubSubSubscribeOptions &operator=(const QXmppPubSubSubscribeOptions &);
+
+ std::optional<bool> notificationsEnabled() const;
+ void setNotificationsEnabled(std::optional<bool> notifying);
+
+ std::optional<bool> digestsEnabled() const;
+ void setDigestsEnabled(std::optional<bool> digestsEnabled);
+
+ std::optional<quint32> digestFrequencyMs() const;
+ void setDigestFrequencyMs(std::optional<quint32> digestFrequencyMs);
+
+ QDateTime expire() const;
+ void setExpire(const QDateTime &expire);
+
+ std::optional<bool> bodyIncluded() const;
+ void setBodyIncluded(std::optional<bool> bodyIncluded);
+
+ PresenceStates notificationRules() const;
+ void setNotificationRules(PresenceStates notificationRules);
+
+ std::optional<SubscriptionType> subscriptionType() const;
+ void setSubscriptionType(std::optional<SubscriptionType> subscriptionType);
+
+ std::optional<SubscriptionDepth> subscriptionDepth() const;
+ void setSubscriptionDepth(std::optional<SubscriptionDepth> subscriptionDepth);
+
+protected:
+ QString formType() const override;
+ bool parseField(const QXmppDataForm::Field &) override;
+ void serializeForm(QXmppDataForm &) const override;
+
+private:
+ QSharedDataPointer<QXmppPubSubSubscribeOptionsPrivate> d;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(QXmppPubSubSubscribeOptions::PresenceStates)
+Q_DECLARE_METATYPE(QXmppPubSubSubscribeOptions)
+
+#endif // QXMPPPUBSUBSUBSCRIBEOPTIONS_H