From b64ba25c1465ff5df3dec4317f113c86a256ba24 Mon Sep 17 00:00:00 2001 From: Sergei Ilinykh Date: Sun, 13 Oct 2024 21:43:39 +0300 Subject: [PATCH] Introduce XData::findField --- src/xmpp/xmpp-im/httpfileupload.cpp | 9 ++++++--- src/xmpp/xmpp-im/types.cpp | 10 ++++++---- src/xmpp/xmpp-im/xmpp_vcard4.cpp | 3 ++- src/xmpp/xmpp-im/xmpp_xdata.cpp | 10 ++++++++-- src/xmpp/xmpp-im/xmpp_xdata.h | 11 ++++++++--- 5 files changed, 30 insertions(+), 13 deletions(-) diff --git a/src/xmpp/xmpp-im/httpfileupload.cpp b/src/xmpp/xmpp-im/httpfileupload.cpp index 4b7eed01..78cbbfac 100644 --- a/src/xmpp/xmpp-im/httpfileupload.cpp +++ b/src/xmpp/xmpp-im/httpfileupload.cpp @@ -118,9 +118,12 @@ void HttpFileUpload::start() } if (ver != XEP0363::vUnknown) { QVector> hosts; - const XData::Field field = item.registeredExtension(xmlns).getField(QLatin1String("max-file-size")); - if (field.isValid() && field.type() == XData::Field::Field_TextSingle) - sizeLimit = field.value().at(0).toULongLong(); + auto optField = item.registeredExtension(xmlns).findField(QLatin1String("max-file-size")); + if (optField) { + const XData::Field &field = *optField; + if (field.isValid() && field.type() == XData::Field::Field_TextSingle) + sizeLimit = field.value().value(0).toULongLong(); + } HttpHost host; host.ver = ver; host.jid = item.jid(); diff --git a/src/xmpp/xmpp-im/types.cpp b/src/xmpp/xmpp-im/types.cpp index 14e92c50..6b212b70 100644 --- a/src/xmpp/xmpp-im/types.cpp +++ b/src/xmpp/xmpp-im/types.cpp @@ -2902,20 +2902,22 @@ CaptchaChallenge::CaptchaChallenge(const Message &m) : d(new CaptchaChallengePri d->dt = QDateTime::currentDateTime(); } - if (m.getForm().registrarType() != "urn:xmpp:captcha" || m.getForm().type() != XData::Data_Form) + if (m.getForm().registrarType() != QLatin1String("urn:xmpp:captcha") || m.getForm().type() != XData::Data_Form + || m.id().isEmpty()) return; - if (m.id().isEmpty() || m.getForm().getField("challenge").value().value(0) != m.id()) + auto fieldOpt = m.getForm().findField("challenge"); + if (!fieldOpt || fieldOpt->value().value(0) != m.id()) return; - if (m.getForm().getField("from").value().value(0).isEmpty()) + if (fieldOpt = m.getForm().findField("from"); !fieldOpt || fieldOpt->value().value(0).isEmpty()) return; d->form = m.getForm(); d->explanation = m.body(); d->urls = m.urlList(); d->arbiter = m.from(); - d->offendedJid = Jid(m.getForm().getField("from").value().value(0)); + d->offendedJid = Jid(fieldOpt->value().value(0)); } CaptchaChallenge::~CaptchaChallenge() { } diff --git a/src/xmpp/xmpp-im/xmpp_vcard4.cpp b/src/xmpp/xmpp-im/xmpp_vcard4.cpp index 35e30d8c..26ad7ccf 100644 --- a/src/xmpp/xmpp-im/xmpp_vcard4.cpp +++ b/src/xmpp/xmpp-im/xmpp_vcard4.cpp @@ -1493,7 +1493,8 @@ void VCard::setPhoto(const PAdvUris &photo) Item &VCard::setPhoto(const UriValue &photo) { INIT_D(); - d->photo.append({ Parameters(), photo }); + PAdvUris l = { { PAdvUri { Parameters(), photo } } }; + d->photo = std::move(l); return d->photo.last(); } diff --git a/src/xmpp/xmpp-im/xmpp_xdata.cpp b/src/xmpp/xmpp-im/xmpp_xdata.cpp index 8af2def0..bdbb5fa1 100644 --- a/src/xmpp/xmpp-im/xmpp_xdata.cpp +++ b/src/xmpp/xmpp-im/xmpp_xdata.cpp @@ -338,7 +338,7 @@ void XData::setRegistrarType(const QString ®istrarType) { d->registrarType = const XData::FieldList &XData::fields() const { return d->fields; } -XData::Field XData::getField(const QString &var) const +std::optional XMPP::XData::findField(const QString &var) const { if (!d->fields.isEmpty()) { FieldList::ConstIterator it = d->fields.begin(); @@ -348,7 +348,13 @@ XData::Field XData::getField(const QString &var) const return f; } } - return Field(); + return {}; +} + +XData::Field XData::getField(const QString &var) const +{ + auto of = findField(var); + return of ? *of : XData::Field {}; } XData::Field &XData::fieldRef(const QString &var) diff --git a/src/xmpp/xmpp-im/xmpp_xdata.h b/src/xmpp/xmpp-im/xmpp_xdata.h index 2a46acce..0cecc582 100644 --- a/src/xmpp/xmpp-im/xmpp_xdata.h +++ b/src/xmpp/xmpp-im/xmpp_xdata.h @@ -28,6 +28,8 @@ #include #include +#include + class QDomDocument; class QDomElement; @@ -152,9 +154,12 @@ class XData { typedef QList FieldList; const FieldList &fields() const; - Field getField(const QString &var) const; - Field &fieldRef(const QString &var); - void setFields(const FieldList &fl); + + std::optional findField(const QString &var) const; + Field getField(const QString &var) const; + Field &fieldRef(const QString &var); // dangerous + + void setFields(const FieldList &fl); private: class Private : public QSharedData {