From 3e465fd0d273c52c66b3aeb3dc4ae147c914bdd6 Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Sun, 1 Aug 2021 20:53:05 +0200 Subject: Introduce data form parsing abstractions --- src/base/QXmppDataFormBase.h | 140 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 src/base/QXmppDataFormBase.h (limited to 'src/base/QXmppDataFormBase.h') diff --git a/src/base/QXmppDataFormBase.h b/src/base/QXmppDataFormBase.h new file mode 100644 index 00000000..b46dfe5e --- /dev/null +++ b/src/base/QXmppDataFormBase.h @@ -0,0 +1,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 + +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 parseUInt(const QVariant &variant) + { + bool ok; + if (const auto result = variant.toString().toUInt(&ok); ok) { + return result; + } + return std::nullopt; + } + + std::optional parseULongLong(const QVariant &variant) + { + bool ok; + if (const auto result = variant.toString().toULongLong(&ok); ok) { + return result; + } + return std::nullopt; + } + + std::optional parseBool(const QVariant &variant) + { + if (variant.type() == QVariant::Bool) { + return variant.toBool(); + } + return std::nullopt; + } + + template + static void serializeValue(QXmppDataForm &form, QXmppDataForm::Field::Type type, const QString &name, const T &value) + { + form.fields() << QXmppDataForm::Field(type, name, value); + } + + template + static void serializeNullable(QXmppDataForm &form, QXmppDataForm::Field::Type type, const QString &name, const T &value) + { + if (!value.isNull()) { + serializeValue(form, type, name, value); + } + } + + template + static void serializeEmptyable(QXmppDataForm &form, QXmppDataForm::Field::Type type, const QString &name, const T &value) + { + if (!value.isEmpty()) { + serializeValue(form, type, name, value); + } + } + + template + static void serializeOptional(QXmppDataForm &form, QXmppDataForm::Field::Type type, const QString &name, const std::optional &optional, ValueConverter convert = [](T a) { return a; }) + { + if (optional.has_value()) { + serializeValue(form, type, name, convert(*optional)); + } + } + + template + static void serializeOptionalNumber(QXmppDataForm &form, QXmppDataForm::Field::Type type, const QString &name, std::optional 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 unknownFields() const; + void setUnknownFields(const QList &unknownFields); + +protected: + void parseForm(const QXmppDataForm &) override; + void serializeForm(QXmppDataForm &) const override; + + virtual bool parseField(const QXmppDataForm::Field &); + +private: + QSharedDataPointer d; +}; + +#endif // QXMPPDATAFORMBASED_H -- cgit v1.2.3