aboutsummaryrefslogtreecommitdiff
path: root/src/base/QXmppDataForm.cpp
diff options
context:
space:
mode:
authorLinus Jahn <lnj@kaidan.im>2021-03-27 15:36:39 +0100
committerLinus Jahn <lnj@kaidan.im>2021-03-28 00:09:13 +0100
commit21e3e79422b123cb1639f7fb8e410a30790b3d75 (patch)
tree64cb599e8eab765a7b6e4fc935744f3c0e50d4cb /src/base/QXmppDataForm.cpp
parent4738cb1ad4113df2910ed75b1a040500e5fdce53 (diff)
downloadqxmpp-21e3e79422b123cb1639f7fb8e410a30790b3d75.tar.gz
Refactor and clean up QXmppDataForm
Diffstat (limited to 'src/base/QXmppDataForm.cpp')
-rw-r--r--src/base/QXmppDataForm.cpp203
1 files changed, 73 insertions, 130 deletions
diff --git a/src/base/QXmppDataForm.cpp b/src/base/QXmppDataForm.cpp
index faf0e4b6..a6c5cca9 100644
--- a/src/base/QXmppDataForm.cpp
+++ b/src/base/QXmppDataForm.cpp
@@ -27,6 +27,8 @@
#include "QXmppConstants_p.h"
#include "QXmppUtils.h"
+#include <optional>
+
#include <QDebug>
#include <QDomElement>
#include <QMimeDatabase>
@@ -316,24 +318,17 @@ bool QXmppDataForm::Media::isNull() const
class QXmppDataFormFieldPrivate : public QSharedData
{
public:
- QXmppDataFormFieldPrivate();
-
QString description;
QString key;
QString label;
QList<QPair<QString, QString>> options;
- bool required;
- QXmppDataForm::Field::Type type;
+ bool required = false;
+ QXmppDataForm::Field::Type type = QXmppDataForm::Field::TextSingleField;
QVariant value;
QSize mediaSize;
QVector<QXmppDataForm::MediaSource> mediaSources;
};
-QXmppDataFormFieldPrivate::QXmppDataFormFieldPrivate()
- : required(false), type(QXmppDataForm::Field::TextSingleField)
-{
-}
-
///
/// \class QXmppDataForm::Field
///
@@ -373,29 +368,14 @@ QXmppDataForm::Field::Field(QXmppDataForm::Field::Type type,
d->options = options;
}
-///
/// Constructs a copy of \a other.
-///
-QXmppDataForm::Field::Field(const QXmppDataForm::Field &other)
- : d(other.d)
-{
-}
+QXmppDataForm::Field::Field(const QXmppDataForm::Field &other) = default;
-///
/// Destroys the form field.
-///
-QXmppDataForm::Field::~Field()
-{
-}
+QXmppDataForm::Field::~Field() = default;
-///
/// Assigns \a other to this field.
-///
-QXmppDataForm::Field &QXmppDataForm::Field::operator=(const QXmppDataForm::Field &other)
-{
- d = other.d;
- return *this;
-}
+QXmppDataForm::Field &QXmppDataForm::Field::operator=(const QXmppDataForm::Field &other) = default;
///
/// Returns the field's description.
@@ -665,19 +645,12 @@ bool QXmppDataForm::Field::operator==(const QXmppDataForm::Field &other) const
class QXmppDataFormPrivate : public QSharedData
{
public:
- QXmppDataFormPrivate();
-
QString instructions;
QList<QXmppDataForm::Field> fields;
QString title;
- QXmppDataForm::Type type;
+ QXmppDataForm::Type type = QXmppDataForm::None;
};
-QXmppDataFormPrivate::QXmppDataFormPrivate()
- : type(QXmppDataForm::None)
-{
-}
-
///
/// \class QXmppDataForm
///
@@ -688,7 +661,7 @@ QXmppDataFormPrivate::QXmppDataFormPrivate()
///
/// Constructs a QXmppDataForm of the specified \a type.
///
-QXmppDataForm::QXmppDataForm(QXmppDataForm::Type type)
+QXmppDataForm::QXmppDataForm(Type type)
: d(new QXmppDataFormPrivate)
{
d->type = type;
@@ -711,29 +684,14 @@ QXmppDataForm::QXmppDataForm(Type type,
d->instructions = instructions;
}
-///
/// Constructs a copy of \a other.
-///
-QXmppDataForm::QXmppDataForm(const QXmppDataForm &other)
- : d(other.d)
-{
-}
+QXmppDataForm::QXmppDataForm(const QXmppDataForm &other) = default;
-///
/// Destroys the form.
-///
-QXmppDataForm::~QXmppDataForm()
-{
-}
+QXmppDataForm::~QXmppDataForm() = default;
-///
/// Assigns \a other to this form.
-///
-QXmppDataForm &QXmppDataForm::operator=(const QXmppDataForm &other)
-{
- d = other.d;
- return *this;
-}
+QXmppDataForm &QXmppDataForm::operator=(const QXmppDataForm &other) = default;
///
/// Returns the form's fields.
@@ -851,17 +809,10 @@ void QXmppDataForm::parse(const QDomElement &element)
return;
/* form type */
- const QString typeStr = element.attribute("type");
- if (typeStr == "form")
- d->type = QXmppDataForm::Form;
- else if (typeStr == "submit")
- d->type = QXmppDataForm::Submit;
- else if (typeStr == "cancel")
- d->type = QXmppDataForm::Cancel;
- else if (typeStr == "result")
- d->type = QXmppDataForm::Result;
- else {
- qWarning() << "Unknown form type" << typeStr;
+ if (const auto type = formTypeFromString(element.attribute("type"))) {
+ d->type = *type;
+ } else {
+ qWarning() << "Unknown form type" << element.attribute("type");
return;
}
@@ -869,41 +820,38 @@ void QXmppDataForm::parse(const QDomElement &element)
d->title = element.firstChildElement("title").text();
d->instructions = element.firstChildElement("instructions").text();
- QDomElement fieldElement = element.firstChildElement("field");
- while (!fieldElement.isNull()) {
+ for (auto fieldElement = element.firstChildElement("field");
+ !fieldElement.isNull();
+ fieldElement = fieldElement.nextSiblingElement("field")) {
QXmppDataForm::Field field;
/* field type */
- QXmppDataForm::Field::Type type = QXmppDataForm::Field::TextSingleField;
- const QString typeStr = fieldElement.attribute("type");
- struct field_type *ptr;
- for (ptr = field_types; ptr->str; ptr++) {
- if (typeStr == ptr->str) {
- type = ptr->type;
- break;
- }
- }
- field.setType(type);
+ field.setType(fieldTypeFromString(fieldElement.attribute("type")).value_or(Field::TextSingleField));
/* field attributes */
field.setLabel(fieldElement.attribute("label"));
field.setKey(fieldElement.attribute("var"));
/* field value(s) */
- if (type == QXmppDataForm::Field::BooleanField) {
- const QString valueStr = fieldElement.firstChildElement("value").text();
+ switch (field.type()) {
+ case Field::BooleanField: {
+ const auto valueStr = fieldElement.firstChildElement("value").text();
field.setValue(valueStr == "1" || valueStr == "true");
- } else if (type == QXmppDataForm::Field::ListMultiField ||
- type == QXmppDataForm::Field::JidMultiField ||
- type == QXmppDataForm::Field::TextMultiField) {
+ break;
+ }
+ case Field::ListMultiField:
+ case Field::JidMultiField:
+ case Field::TextMultiField: {
QStringList values;
- QDomElement valueElement = fieldElement.firstChildElement("value");
- while (!valueElement.isNull()) {
- values.append(valueElement.text());
- valueElement = valueElement.nextSiblingElement("value");
+ for (auto element = fieldElement.firstChildElement("value");
+ !element.isNull();
+ element = element.nextSiblingElement("value")) {
+ values << element.text();
}
field.setValue(values);
- } else {
+ break;
+ }
+ default:
field.setValue(fieldElement.firstChildElement("value").text());
}
@@ -925,25 +873,26 @@ void QXmppDataForm::parse(const QDomElement &element)
}
/* field options */
- if (type == QXmppDataForm::Field::ListMultiField ||
- type == QXmppDataForm::Field::ListSingleField) {
+ switch (field.type()) {
+ case Field::ListMultiField:
+ case Field::ListSingleField: {
QList<QPair<QString, QString>> options;
- QDomElement optionElement = fieldElement.firstChildElement("option");
- while (!optionElement.isNull()) {
- options.append(QPair<QString, QString>(optionElement.attribute("label"),
- optionElement.firstChildElement("value").text()));
- optionElement = optionElement.nextSiblingElement("option");
+ for (auto element = fieldElement.firstChildElement("option");
+ !element.isNull();
+ element = element.nextSiblingElement("option")) {
+ options << QPair(element.attribute("label"), element.firstChildElement("value").text());
}
field.setOptions(options);
}
+ default:
+ break;
+ }
/* other properties */
field.setDescription(fieldElement.firstChildElement("description").text());
field.setRequired(!fieldElement.firstChildElement("required").isNull());
d->fields.append(field);
-
- fieldElement = fieldElement.nextSiblingElement("field");
}
}
@@ -956,16 +905,7 @@ void QXmppDataForm::toXml(QXmlStreamWriter *writer) const
writer->writeDefaultNamespace(ns_data);
/* form type */
- QString typeStr;
- if (d->type == QXmppDataForm::Form)
- typeStr = "form";
- else if (d->type == QXmppDataForm::Submit)
- typeStr = "submit";
- else if (d->type == QXmppDataForm::Cancel)
- typeStr = "cancel";
- else if (d->type == QXmppDataForm::Result)
- typeStr = "result";
- writer->writeAttribute("type", typeStr);
+ writer->writeAttribute("type", formTypeToString(d->type));
/* form properties */
if (!d->title.isEmpty())
@@ -973,41 +913,40 @@ void QXmppDataForm::toXml(QXmlStreamWriter *writer) const
if (!d->instructions.isEmpty())
writer->writeTextElement("instructions", d->instructions);
- for (const QXmppDataForm::Field &field : d->fields) {
+ for (const auto &field : d->fields) {
writer->writeStartElement("field");
/* field type */
- const QXmppDataForm::Field::Type type = field.type();
- QString typeStr;
- struct field_type *ptr;
- for (ptr = field_types; ptr->str; ptr++) {
- if (type == ptr->type) {
- typeStr = ptr->str;
- break;
- }
- }
- writer->writeAttribute("type", typeStr);
+ writer->writeAttribute("type", fieldTypeToString(field.type()));
/* field attributes */
helperToXmlAddAttribute(writer, "label", field.label());
helperToXmlAddAttribute(writer, "var", field.key());
/* field value(s) */
- if (type == QXmppDataForm::Field::BooleanField) {
+ switch (field.type()) {
+ case Field::BooleanField:
helperToXmlAddTextElement(writer, "value", field.value().toBool() ? "1" : "0");
- } else if (type == QXmppDataForm::Field::ListMultiField ||
- type == QXmppDataForm::Field::JidMultiField ||
- type == QXmppDataForm::Field::TextMultiField) {
- for (const QString &value : field.value().toStringList())
+ break;
+ case Field::ListMultiField:
+ case Field::JidMultiField:
+ case Field::TextMultiField: {
+ const auto values = field.value().toStringList();
+ for (const QString &value : values) {
+ helperToXmlAddTextElement(writer, "value", value);
+ }
+ break;
+ }
+ default:
+ if (const auto value = field.value().toString(); !value.isEmpty()) {
helperToXmlAddTextElement(writer, "value", value);
- } else if (!field.value().toString().isEmpty()) {
- helperToXmlAddTextElement(writer, "value", field.value().toString());
+ }
}
/* field media */
if (!field.mediaSources().isEmpty()) {
writer->writeStartElement("media");
- helperToXmlAddAttribute(writer, "xmlns", ns_media_element);
+ writer->writeDefaultNamespace(ns_media_element);
// media width and height
if (field.mediaSize().width() > 0)
@@ -1021,7 +960,7 @@ void QXmppDataForm::toXml(QXmlStreamWriter *writer) const
QStringLiteral("height"),
QString::number(field.mediaSize().height()));
- const QVector<MediaSource> &sources = field.mediaSources();
+ const auto sources = field.mediaSources();
for (const auto &source : sources) {
writer->writeStartElement(QStringLiteral("uri"));
helperToXmlAddAttribute(writer, QStringLiteral("type"), source.contentType().name());
@@ -1033,16 +972,20 @@ void QXmppDataForm::toXml(QXmlStreamWriter *writer) const
}
/* field options */
- if (type == QXmppDataForm::Field::ListMultiField ||
- type == QXmppDataForm::Field::ListSingleField) {
- QPair<QString, QString> option;
- for (const auto &option : field.options()) {
+ switch (field.type()) {
+ case Field::ListMultiField:
+ case Field::ListSingleField: {
+ const auto options = field.options();
+ for (const auto &option : options) {
writer->writeStartElement("option");
helperToXmlAddAttribute(writer, "label", option.first);
helperToXmlAddTextElement(writer, "value", option.second);
writer->writeEndElement();
}
}
+ default:
+ break;
+ }
/* other properties */
if (!field.description().isEmpty())