QXmpp Version: 1.15.0
Loading...
Searching...
No Matches
QXmppDataFormBase.h
1// SPDX-FileCopyrightText: 2021 Linus Jahn <lnj@kaidan.im>
2//
3// SPDX-License-Identifier: LGPL-2.1-or-later
4
5#ifndef QXMPPDATAFORMBASED_H
6#define QXMPPDATAFORMBASED_H
7
8#include "QXmppDataForm.h"
9
10#include <optional>
11
12class QXmppDataForm;
13
14class QXMPP_EXPORT QXmppDataFormBase
15{
16public:
17 virtual QXmppDataForm toDataForm() const;
18
19protected:
20 static bool fromDataForm(const QXmppDataForm &form, QXmppDataFormBase &parent);
21
22 virtual QString formType() const = 0;
23 virtual void parseForm(const QXmppDataForm &) = 0;
24 virtual void serializeForm(QXmppDataForm &) const = 0;
25
26 std::optional<quint32> parseUInt(const QVariant &variant)
27 {
28 bool ok;
29 if (const auto result = variant.toString().toUInt(&ok); ok) {
30 return result;
31 }
32 return std::nullopt;
33 }
34
35 std::optional<quint64> parseULongLong(const QVariant &variant)
36 {
37 bool ok;
38 if (const auto result = variant.toString().toULongLong(&ok); ok) {
39 return result;
40 }
41 return std::nullopt;
42 }
43
44 std::optional<bool> parseBool(const QVariant &variant)
45 {
46 if (variant.typeId() == QMetaType::Type::Bool) {
47 return variant.toBool();
48 } else if (variant.typeId() == QMetaType::Type::QString) {
49 auto string = variant.toString();
50 if (string == u"1" || string == u"true") {
51 return true;
52 } else if (string == u"0" || string == u"false") {
53 return false;
54 }
55 }
56 return std::nullopt;
57 }
58
59 template<typename T>
60 static void serializeValue(QXmppDataForm &form, QXmppDataForm::Field::Type type, const QString &name, const T &value)
61 {
62 form.appendField(QXmppDataForm::Field(type, name, value));
63 }
64
65 template<typename T>
66 static void serializeNullable(QXmppDataForm &form, QXmppDataForm::Field::Type type, QStringView name, const T &value)
67 {
68 if (!value.isNull()) {
69 serializeValue(form, type, name.toString(), value);
70 }
71 }
72
73 template<typename T>
74 static void serializeEmptyable(QXmppDataForm &form, QXmppDataForm::Field::Type type, QStringView name, const T &value)
75 {
76 if (!value.isEmpty()) {
77 serializeValue(form, type, name.toString(), value);
78 }
79 }
80
81 template<typename T, typename ValueConverter = T (*)(T)>
82 static void serializeOptional(
83 QXmppDataForm &form, QXmppDataForm::Field::Type type, QStringView name, const std::optional<T> &optional, ValueConverter convert = [](T a) { return a; })
84 {
85 if (optional.has_value()) {
86 serializeValue(form, type, name.toString(), convert(*optional));
87 }
88 }
89
90 template<typename T>
91 static void serializeOptionalNumber(QXmppDataForm &form, QXmppDataForm::Field::Type type, QStringView name, std::optional<T> optional)
92 {
93 if (optional.has_value()) {
94 serializeValue(form, type, name.toString(), QString::number(*optional));
95 }
96 }
97
98 static void serializeDatetime(QXmppDataForm &form, const QString &name, const QDateTime &datetime, QXmppDataForm::Field::Type type = QXmppDataForm::Field::TextSingleField);
99};
100
101class QXmppExtensibleDataFormBasePrivate;
102
103class QXMPP_EXPORT QXmppExtensibleDataFormBase : public QXmppDataFormBase
104{
105public:
106 QXmppExtensibleDataFormBase();
108 QXmppExtensibleDataFormBase(const QXmppExtensibleDataFormBase &);
109 QXmppExtensibleDataFormBase(QXmppExtensibleDataFormBase &&);
110 virtual ~QXmppExtensibleDataFormBase();
111
112 QXmppExtensibleDataFormBase &operator=(const QXmppExtensibleDataFormBase &);
113 QXmppExtensibleDataFormBase &operator=(QXmppExtensibleDataFormBase &&);
115
116 QList<QXmppDataForm::Field> unknownFields() const;
117 void setUnknownFields(const QList<QXmppDataForm::Field> &unknownFields);
118
119protected:
120 void parseForm(const QXmppDataForm &) override;
121 void serializeForm(QXmppDataForm &) const override;
122
123 virtual bool parseField(const QXmppDataForm::Field &);
124
125private:
126 QSharedDataPointer<QXmppExtensibleDataFormBasePrivate> d;
127};
128
129namespace QXmpp::Private {
130
131template<typename T>
132concept DataFormConvertible = requires(const QXmppDataForm &form) {
133 { T::DataFormType };
134 { T::fromDataForm(form) } -> std::same_as<std::optional<T>>;
135};
136
137template<DataFormConvertible T>
138inline constexpr auto DataFormType = T::DataFormType;
139
140} // namespace QXmpp::Private
141
142#endif // QXMPPDATAFORMBASED_H
Definition QXmppDataFormBase.h:15
static bool fromDataForm(const QXmppDataForm &form, QXmppDataFormBase &parent)
Definition QXmppDataFormBase.cpp:55
std::optional< quint32 > parseUInt(const QVariant &variant)
Definition QXmppDataFormBase.h:26
static void serializeOptionalNumber(QXmppDataForm &form, QXmppDataForm::Field::Type type, QStringView name, std::optional< T > optional)
Definition QXmppDataFormBase.h:91
virtual void serializeForm(QXmppDataForm &) const =0
std::optional< bool > parseBool(const QVariant &variant)
Definition QXmppDataFormBase.h:44
static void serializeNullable(QXmppDataForm &form, QXmppDataForm::Field::Type type, QStringView name, const T &value)
Definition QXmppDataFormBase.h:66
virtual void parseForm(const QXmppDataForm &)=0
std::optional< quint64 > parseULongLong(const QVariant &variant)
Definition QXmppDataFormBase.h:35
static void serializeValue(QXmppDataForm &form, QXmppDataForm::Field::Type type, const QString &name, const T &value)
Definition QXmppDataFormBase.h:60
static void serializeOptional(QXmppDataForm &form, QXmppDataForm::Field::Type type, QStringView name, const std::optional< T > &optional, ValueConverter convert=[](T a) { return a;})
Definition QXmppDataFormBase.h:82
static void serializeEmptyable(QXmppDataForm &form, QXmppDataForm::Field::Type type, QStringView name, const T &value)
Definition QXmppDataFormBase.h:74
virtual QString formType() const =0
virtual QXmppDataForm toDataForm() const
Definition QXmppDataFormBase.cpp:39
Definition QXmppDataForm.h:93
Type
This enum is used to describe a field's type.
Definition QXmppDataForm.h:96
Definition QXmppDataForm.h:28
void appendField(QXmppDataForm::Field &&field)
Definition QXmppDataForm.cpp:775
void parseForm(const QXmppDataForm &) override
Definition QXmppDataFormBase.cpp:191
void serializeForm(QXmppDataForm &) const override
Definition QXmppDataFormBase.cpp:204
virtual bool parseField(const QXmppDataForm::Field &)
Definition QXmppDataFormBase.cpp:215
void setUnknownFields(const QList< QXmppDataForm::Field > &unknownFields)
Definition QXmppDataFormBase.cpp:186
QList< QXmppDataForm::Field > unknownFields() const
Definition QXmppDataFormBase.cpp:178