QXmpp  Version: 1.15.1
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 
12 class QXmppDataForm;
13 
14 class QXMPP_EXPORT QXmppDataFormBase
15 {
16 public:
17  virtual QXmppDataForm toDataForm() const;
18 
19 protected:
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 
101 class QXmppExtensibleDataFormBasePrivate;
102 
104 {
105 public:
110  virtual ~QXmppExtensibleDataFormBase();
111 
115 
116  QList<QXmppDataForm::Field> unknownFields() const;
117  void setUnknownFields(const QList<QXmppDataForm::Field> &unknownFields);
118 
119 protected:
120  void parseForm(const QXmppDataForm &) override;
121  void serializeForm(QXmppDataForm &) const override;
122 
123  virtual bool parseField(const QXmppDataForm::Field &);
124 
125 private:
126  QSharedDataPointer<QXmppExtensibleDataFormBasePrivate> d;
127 };
128 
129 namespace QXmpp::Private {
130 
131 template<typename T>
132 concept DataFormConvertible = requires(const QXmppDataForm &form) {
133  { T::DataFormType };
134  { T::fromDataForm(form) } -> std::same_as<std::optional<T>>;
135 };
136 
137 template<DataFormConvertible T>
138 inline constexpr auto DataFormType = T::DataFormType;
139 
140 } // namespace QXmpp::Private
141 
142 #endif // QXMPPDATAFORMBASED_H
virtual void serializeForm(QXmppDataForm &) const =0
virtual void parseForm(const QXmppDataForm &)=0
static void serializeOptionalNumber(QXmppDataForm &form, QXmppDataForm::Field::Type type, QStringView name, std::optional< T > optional)
Definition: QXmppDataFormBase.h:91
std::optional< quint32 > parseUInt(const QVariant &variant)
Definition: QXmppDataFormBase.h:26
Type
This enum is used to describe a field&#39;s type.
Definition: QXmppDataForm.h:96
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
Definition: QXmppDataForm.h:27
static void serializeNullable(QXmppDataForm &form, QXmppDataForm::Field::Type type, QStringView name, const T &value)
Definition: QXmppDataFormBase.h:66
Definition: QXmppDataFormBase.h:103
static void serializeValue(QXmppDataForm &form, QXmppDataForm::Field::Type type, const QString &name, const T &value)
Definition: QXmppDataFormBase.h:60
static void serializeEmptyable(QXmppDataForm &form, QXmppDataForm::Field::Type type, QStringView name, const T &value)
Definition: QXmppDataFormBase.h:74
std::optional< bool > parseBool(const QVariant &variant)
Definition: QXmppDataFormBase.h:44
std::optional< quint64 > parseULongLong(const QVariant &variant)
Definition: QXmppDataFormBase.h:35
void appendField(QXmppDataForm::Field &&field)
Definition: QXmppDataForm.cpp:775
Definition: Algorithms.h:14
Definition: QXmppDataForm.h:92
Definition: QXmppDataFormBase.h:14