diff options
Diffstat (limited to 'src/base')
| -rw-r--r-- | src/base/QXmppFileShare.cpp | 17 | ||||
| -rw-r--r-- | src/base/QXmppFileShare.h | 5 | ||||
| -rw-r--r-- | src/base/QXmppHttpFileSource.cpp | 64 | ||||
| -rw-r--r-- | src/base/QXmppHttpFileSource.h | 35 |
4 files changed, 110 insertions, 11 deletions
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 <optional> @@ -42,7 +43,7 @@ class QXmppFileSharePrivate : public QSharedData { public: QXmppFileMetadata metadata; - QVector<QUrl> httpSources; + QVector<QXmppHttpFileSource> httpSources; QXmppFileShare::Disposition disposition = Disposition::Inline; }; /// \endcond @@ -92,12 +93,12 @@ void QXmppFileShare::setMetadata(const QXmppFileMetadata &metadata) d->metadata = metadata; } -const QVector<QUrl> &QXmppFileShare::httpSources() const +const QVector<QXmppHttpFileSource> &QXmppFileShare::httpSources() const { return d->httpSources; } -void QXmppFileShare::setHttpSources(const QVector<QUrl> &newHttpSources) +void QXmppFileShare::setHttpSources(const QVector<QXmppHttpFileSource> &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<QUrl> &httpSources() const; - void setHttpSources(const QVector<QUrl> &newHttpSources); + const QVector<QXmppHttpFileSource> &httpSources() const; + void setHttpSources(const QVector<QXmppHttpFileSource> &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 <lnj@kaidan.im> +// +// SPDX-License-Identifier: LGPL-2.1-or-later + +#include "QXmppHttpFileSource.h" + +#include "QXmppConstants_p.h" + +#include <QDomElement> +#include <QXmlStreamWriter> + +/// +/// \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 <lnj@kaidan.im> +// +// SPDX-License-Identifier: LGPL-2.1-or-later + +#ifndef QXMPPHTTPFILESOURCE_H +#define QXMPPHTTPFILESOURCE_H + +#include "QXmppGlobal.h" + +#include <QUrl> + +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 |
