1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
/*
* 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 QXMPPDATAFORMBASED_H
#define QXMPPDATAFORMBASED_H
#include "QXmppDataForm.h"
#include <optional>
class QXmppDataForm;
class QXMPP_EXPORT QXmppDataFormBase
{
public:
virtual ~QXmppDataFormBase() = default;
virtual QXmppDataForm toDataForm() const;
protected:
static bool fromDataForm(const QXmppDataForm &form, QXmppDataFormBase &parent);
virtual QString formType() const = 0;
virtual void parseForm(const QXmppDataForm &) = 0;
virtual void serializeForm(QXmppDataForm &) const = 0;
std::optional<quint32> parseUInt(const QVariant &variant)
{
bool ok;
if (const auto result = variant.toString().toUInt(&ok); ok) {
return result;
}
return std::nullopt;
}
std::optional<quint64> parseULongLong(const QVariant &variant)
{
bool ok;
if (const auto result = variant.toString().toULongLong(&ok); ok) {
return result;
}
return std::nullopt;
}
std::optional<bool> parseBool(const QVariant &variant)
{
if (variant.type() == QVariant::Bool) {
return variant.toBool();
}
return std::nullopt;
}
template<typename T>
static void serializeValue(QXmppDataForm &form, QXmppDataForm::Field::Type type, const QString &name, const T &value)
{
form.fields() << QXmppDataForm::Field(type, name, value);
}
template<typename T>
static void serializeNullable(QXmppDataForm &form, QXmppDataForm::Field::Type type, const QString &name, const T &value)
{
if (!value.isNull()) {
serializeValue(form, type, name, value);
}
}
template<typename T>
static void serializeEmptyable(QXmppDataForm &form, QXmppDataForm::Field::Type type, const QString &name, const T &value)
{
if (!value.isEmpty()) {
serializeValue(form, type, name, value);
}
}
template<typename T, typename ValueConverter = T (*)(T)>
static void serializeOptional(QXmppDataForm &form, QXmppDataForm::Field::Type type, const QString &name, const std::optional<T> &optional, ValueConverter convert = [](T a) { return a; })
{
if (optional.has_value()) {
serializeValue(form, type, name, convert(*optional));
}
}
template<typename T>
static void serializeOptionalNumber(QXmppDataForm &form, QXmppDataForm::Field::Type type, const QString &name, std::optional<T> optional)
{
if (optional.has_value()) {
serializeValue(form, type, name, QString::number(*optional));
}
}
static void serializeDatetime(QXmppDataForm &form, const QString &name, const QDateTime &datetime, QXmppDataForm::Field::Type type = QXmppDataForm::Field::TextSingleField);
};
class QXmppExtensibleDataFormBasePrivate;
class QXMPP_EXPORT QXmppExtensibleDataFormBase : public QXmppDataFormBase
{
public:
QXmppExtensibleDataFormBase();
/// \cond
QXmppExtensibleDataFormBase(const QXmppExtensibleDataFormBase &);
virtual ~QXmppExtensibleDataFormBase();
QXmppExtensibleDataFormBase &operator=(const QXmppExtensibleDataFormBase &);
/// \endcond
QList<QXmppDataForm::Field> unknownFields() const;
void setUnknownFields(const QList<QXmppDataForm::Field> &unknownFields);
protected:
void parseForm(const QXmppDataForm &) override;
void serializeForm(QXmppDataForm &) const override;
virtual bool parseField(const QXmppDataForm::Field &);
private:
QSharedDataPointer<QXmppExtensibleDataFormBasePrivate> d;
};
#endif // QXMPPDATAFORMBASED_H
|