From 2a856cc4a2edc2496eed674f7c2912619738522a Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Wed, 14 Sep 2022 00:06:51 +0200 Subject: Add extra class for HttpFileSource instead of using QUrl Before just QUrl was used, which was okay. This should make it better recognizable and it makes clear it is only used for HTTP urls. --- src/base/QXmppFileShare.cpp | 17 +++++------ src/base/QXmppFileShare.h | 5 ++-- src/base/QXmppHttpFileSource.cpp | 64 ++++++++++++++++++++++++++++++++++++++++ src/base/QXmppHttpFileSource.h | 35 ++++++++++++++++++++++ 4 files changed, 110 insertions(+), 11 deletions(-) create mode 100644 src/base/QXmppHttpFileSource.cpp create mode 100644 src/base/QXmppHttpFileSource.h (limited to 'src/base') diff --git a/src/base/QXmppFileShare.cpp b/src/base/QXmppFileShare.cpp index 8d73dbe5..c8975ba1 100644 --- a/src/base/QXmppFileShare.cpp +++ b/src/base/QXmppFileShare.cpp @@ -6,6 +6,7 @@ #include "QXmppConstants_p.h" #include "QXmppFileMetadata.h" +#include "QXmppHttpFileSource.h" #include @@ -42,7 +43,7 @@ class QXmppFileSharePrivate : public QSharedData { public: QXmppFileMetadata metadata; - QVector httpSources; + QVector httpSources; QXmppFileShare::Disposition disposition = Disposition::Inline; }; /// \endcond @@ -92,12 +93,12 @@ void QXmppFileShare::setMetadata(const QXmppFileMetadata &metadata) d->metadata = metadata; } -const QVector &QXmppFileShare::httpSources() const +const QVector &QXmppFileShare::httpSources() const { return d->httpSources; } -void QXmppFileShare::setHttpSources(const QVector &newHttpSources) +void QXmppFileShare::setHttpSources(const QVector &newHttpSources) { d->httpSources = newHttpSources; } @@ -123,8 +124,9 @@ bool QXmppFileShare::parse(const QDomElement &el) for (auto urlEl = sources.firstChildElement("url-data"); !urlEl.isNull(); urlEl = urlEl.nextSiblingElement("url-data")) { - if (urlEl.namespaceURI() == "http://jabber.org/protocol/url-data") { - d->httpSources.append(QUrl(urlEl.attribute("target"))); + QXmppHttpFileSource source; + if (source.parse(urlEl)) { + d->httpSources.push_back(std::move(source)); } } return true; @@ -140,10 +142,7 @@ void QXmppFileShare::toXml(QXmlStreamWriter *writer) const d->metadata.toXml(writer); writer->writeStartElement("sources"); for (const auto &source : d->httpSources) { - writer->writeStartElement("url-data"); - writer->writeDefaultNamespace(ns_url_data); - writer->writeAttribute("target", source.toString()); - writer->writeEndElement(); + source.toXml(writer); } writer->writeEndElement(); writer->writeEndElement(); diff --git a/src/base/QXmppFileShare.h b/src/base/QXmppFileShare.h index 7d38df23..f2055576 100644 --- a/src/base/QXmppFileShare.h +++ b/src/base/QXmppFileShare.h @@ -14,6 +14,7 @@ class QUrl; class QXmlStreamWriter; class QXmppFileSharePrivate; class QXmppFileMetadata; +class QXmppHttpFileSource; class QXMPP_EXPORT QXmppFileShare { @@ -37,8 +38,8 @@ public: const QXmppFileMetadata &metadata() const; void setMetadata(const QXmppFileMetadata &); - const QVector &httpSources() const; - void setHttpSources(const QVector &newHttpSources); + const QVector &httpSources() const; + void setHttpSources(const QVector &newHttpSources); /// \cond bool parse(const QDomElement &el); diff --git a/src/base/QXmppHttpFileSource.cpp b/src/base/QXmppHttpFileSource.cpp new file mode 100644 index 00000000..77870160 --- /dev/null +++ b/src/base/QXmppHttpFileSource.cpp @@ -0,0 +1,64 @@ +// SPDX-FileCopyrightText: 2022 Linus Jahn +// +// SPDX-License-Identifier: LGPL-2.1-or-later + +#include "QXmppHttpFileSource.h" + +#include "QXmppConstants_p.h" + +#include +#include + +/// +/// \class QXmppHttpFileSource +/// +/// Represents an HTTP File source for file sharing. +/// +/// \since QXmpp 1.5 +/// + +/// Default constructor. +QXmppHttpFileSource::QXmppHttpFileSource() = default; + +/// Default constructor. +QXmppHttpFileSource::QXmppHttpFileSource(QUrl url) + : m_url(std::move(url)) +{ +} + +QXMPP_PRIVATE_DEFINE_RULE_OF_SIX(QXmppHttpFileSource) + +/// +/// Returns the HTTP url. +/// +const QUrl &QXmppHttpFileSource::url() const +{ + return m_url; +} + +/// +/// Sets the HTTP url. +/// +void QXmppHttpFileSource::setUrl(QUrl url) +{ + m_url = std::move(url); +} + +/// \cond +bool QXmppHttpFileSource::parse(const QDomElement &el) +{ + if (el.tagName() == "url-data" && el.namespaceURI() == ns_url_data) { + m_url = QUrl(el.attribute("target")); + return true; + } + return false; +} + +void QXmppHttpFileSource::toXml(QXmlStreamWriter *writer) const +{ + writer->writeStartElement("url-data"); + writer->writeDefaultNamespace(ns_url_data); + writer->writeAttribute("target", m_url.toString()); + writer->writeEndElement(); +} +/// \endcond diff --git a/src/base/QXmppHttpFileSource.h b/src/base/QXmppHttpFileSource.h new file mode 100644 index 00000000..af914fb2 --- /dev/null +++ b/src/base/QXmppHttpFileSource.h @@ -0,0 +1,35 @@ +// SPDX-FileCopyrightText: 2022 Linus Jahn +// +// SPDX-License-Identifier: LGPL-2.1-or-later + +#ifndef QXMPPHTTPFILESOURCE_H +#define QXMPPHTTPFILESOURCE_H + +#include "QXmppGlobal.h" + +#include + +class QDomElement; +class QXmlStreamWriter; + +class QXMPP_EXPORT QXmppHttpFileSource +{ +public: + QXmppHttpFileSource(); + QXmppHttpFileSource(QUrl url); + QXMPP_PRIVATE_DECLARE_RULE_OF_SIX(QXmppHttpFileSource) + + const QUrl &url() const; + void setUrl(QUrl url); + + /// \cond + bool parse(const QDomElement &el); + void toXml(QXmlStreamWriter *writer) const; + /// \endcond + +private: + static_assert(sizeof(QUrl) == sizeof(void *)); + QUrl m_url; +}; + +#endif // QXMPPHTTPFILESOURCE_H -- cgit v1.2.3