aboutsummaryrefslogtreecommitdiff
path: root/src/base/QXmppDataForm.cpp
diff options
context:
space:
mode:
authorLinus Jahn <lnj@kaidan.im>2019-10-20 16:43:50 +0200
committerLNJ <lnj@kaidan.im>2019-10-23 13:19:32 +0200
commit979918a40759064c01f31bc099217086b81936d9 (patch)
tree29b5803c7d816af2d3cf42a4fd7651a8d9c1cd5c /src/base/QXmppDataForm.cpp
parent86ca79a0d5480a307e6117798e3c216ad23fca51 (diff)
downloadqxmpp-979918a40759064c01f31bc099217086b81936d9.tar.gz
Refactor data form media element
* Add QXmppDataForm::MediaSource instead of using a QPair<QString, QString> to save the URIs and content types. * Deprecate QXmppDataForm::Media: The extra class was useless: Each Field has exactly one media element and the media element has only two attributes (size and media sources) * Add mediaSources and mediaSize attributes to the QXmppDataForm::Field * Deprecate getters/setters for the Media element of QXmppDataForm::Field (they are still working and tested)
Diffstat (limited to 'src/base/QXmppDataForm.cpp')
-rw-r--r--src/base/QXmppDataForm.cpp287
1 files changed, 247 insertions, 40 deletions
diff --git a/src/base/QXmppDataForm.cpp b/src/base/QXmppDataForm.cpp
index 0e909259..4e588a3e 100644
--- a/src/base/QXmppDataForm.cpp
+++ b/src/base/QXmppDataForm.cpp
@@ -3,6 +3,7 @@
*
* Author:
* Jeremy Lainé
+ * Linus Jahn
*
* Source:
* https://github.com/qxmpp-project/qxmpp
@@ -23,8 +24,11 @@
#include <QDebug>
#include <QDomElement>
+#include <QMimeDatabase>
+#include <QMimeType>
#include <QSize>
#include <QStringList>
+#include <QUrl>
#include "QXmppConstants_p.h"
#include "QXmppDataForm.h"
@@ -49,14 +53,77 @@ static field_type field_types[] = {
{static_cast<QXmppDataForm::Field::Type>(-1), nullptr},
};
+class QXmppDataFormMediaSourcePrivate : public QSharedData
+{
+public:
+ QUrl uri;
+ QMimeType contentType;
+};
+
+QXmppDataForm::MediaSource::MediaSource()
+ : d(new QXmppDataFormMediaSourcePrivate)
+{
+}
+
+QXmppDataForm::MediaSource::MediaSource(const QUrl &uri, const QMimeType &contentType)
+ : d(new QXmppDataFormMediaSourcePrivate)
+{
+ d->uri = uri;
+ d->contentType = contentType;
+}
+
+QXmppDataForm::MediaSource::MediaSource(const QXmppDataForm::MediaSource&) = default;
+
+QXmppDataForm::MediaSource::~MediaSource() = default;
+
+QXmppDataForm::MediaSource &QXmppDataForm::MediaSource::operator=(const QXmppDataForm::MediaSource&) = default;
+
+/// Returns the media URI as QUrl. This can be i.e. a \c http:// URL or a
+/// \c cid: Bits of Binary URI.
+
+QUrl QXmppDataForm::MediaSource::uri() const
+{
+ return d->uri;
+}
+
+/// Sets the URI.
+
+void QXmppDataForm::MediaSource::setUri(const QUrl& uri)
+{
+ d->uri = uri;
+}
+
+/// Returns the content type of the source
+
+QMimeType QXmppDataForm::MediaSource::contentType() const
+{
+ return d->contentType;
+}
+
+/// Sets the content type of the media source.
+
+void QXmppDataForm::MediaSource::setContentType(const QMimeType &contentType)
+{
+ d->contentType = contentType;
+}
+
+/// Returns true if two media sources are identical.
+
+bool QXmppDataForm::MediaSource::operator==(const QXmppDataForm::MediaSource &other) const
+{
+ return d->uri == other.uri() && d->contentType == other.contentType();
+}
+
class QXmppDataFormMediaPrivate : public QSharedData
{
public:
QSize size;
- QList<QPair<QString, QString> > uris;
+ QList<QPair<QString, QString>> uris;
};
/// Constructs an empty QXmppDataForm::Media.
+///
+/// \deprecated This class is deprecated since QXmpp 1.1.
QXmppDataForm::Media::Media()
: d(new QXmppDataFormMediaPrivate)
@@ -64,27 +131,27 @@ QXmppDataForm::Media::Media()
}
/// Constructs a copy of \a other.
+///
+/// \deprecated This class is deprecated since QXmpp 1.1.
-QXmppDataForm::Media::Media(const QXmppDataForm::Media &other)
- : d(other.d)
-{
-}
+QXmppDataForm::Media::Media(const QXmppDataForm::Media &other) = default;
/// Destroys the media.
+///
+/// \deprecated This class is deprecated since QXmpp 1.1.
-QXmppDataForm::Media::~Media()
-{
-}
+QXmppDataForm::Media::~Media() = default;
/// Assigns \a other to this media.
+///
+/// \deprecated This class is deprecated since QXmpp 1.1.
-QXmppDataForm::Media& QXmppDataForm::Media::operator=(const QXmppDataForm::Media &other)
-{
- d = other.d;
- return *this;
-}
+QXmppDataForm::Media& QXmppDataForm::Media::operator=(const QXmppDataForm::Media &other) = default;
/// Returns media's height.
+///
+/// \deprecated This method is deprecated since QXmpp 1.1. Use
+/// \c QXmppDataForm::Field::mediaSize().height() instead.
int QXmppDataForm::Media::height() const
{
@@ -92,6 +159,9 @@ int QXmppDataForm::Media::height() const
}
/// Sets media's \a height.
+///
+/// \deprecated This method is deprecated since QXmpp 1.1. Use
+/// \c QXmppDataForm::Field::mediaSize().setHeight() instead.
void QXmppDataForm::Media::setHeight(int height)
{
@@ -99,6 +169,9 @@ void QXmppDataForm::Media::setHeight(int height)
}
/// Returns media's width.
+///
+/// \deprecated This method is deprecated since QXmpp 1.1. Use
+/// \c QXmppDataForm::Field::mediaSize().width() instead.
int QXmppDataForm::Media::width() const
{
@@ -106,6 +179,9 @@ int QXmppDataForm::Media::width() const
}
/// Sets media's \a width.
+///
+/// \deprecated This method is deprecated since QXmpp 1.1. Use
+/// \c QXmppDataForm::Field::mediaSize().setWidth() instead.
void QXmppDataForm::Media::setWidth(int width)
{
@@ -113,6 +189,9 @@ void QXmppDataForm::Media::setWidth(int width)
}
/// Returns media's uris.
+///
+/// \deprecated This method is deprecated since QXmpp 1.1. Use
+/// \c QXmppDataForm::Field::mediaSources() instead.
QList< QPair< QString, QString > > QXmppDataForm::Media::uris() const
{
@@ -120,6 +199,9 @@ QList< QPair< QString, QString > > QXmppDataForm::Media::uris() const
}
/// Sets media's \a uris.
+///
+/// \deprecated This method is deprecated since QXmpp 1.1. Use
+/// \c QXmppDataForm::Media::setMediaSources() instead.
void QXmppDataForm::Media::setUris(const QList< QPair< QString, QString > > &uris)
{
@@ -130,7 +212,7 @@ void QXmppDataForm::Media::setUris(const QList< QPair< QString, QString > > &uri
bool QXmppDataForm::Media::isNull() const
{
- return d->uris.empty();
+ return d->uris.isEmpty();
}
class QXmppDataFormFieldPrivate : public QSharedData
@@ -141,11 +223,12 @@ public:
QString description;
QString key;
QString label;
- QXmppDataForm::Media media;
QList<QPair<QString, QString> > options;
bool required;
QXmppDataForm::Field::Type type;
QVariant value;
+ QSize mediaSize;
+ QVector<QXmppDataForm::MediaSource> mediaSources;
};
QXmppDataFormFieldPrivate::QXmppDataFormFieldPrivate()
@@ -232,17 +315,53 @@ void QXmppDataForm::Field::setLabel(const QString &label)
}
/// Returns the field's media.
+///
+/// \deprecated This method is deprecated since QXmpp 1.1. Use
+/// \c QXmppDataForm::Field::mediaSources() or
+/// \c QXmppDataForm::Field::mediaSize() instead.
QXmppDataForm::Media QXmppDataForm::Field::media() const
{
- return d->media;
+ Media media;
+ QList<QPair<QString, QString>> pairUris;
+ pairUris.reserve(d->mediaSources.size());
+
+ // TODO: use qAsConst()
+ for (const auto &source : d->mediaSources) {
+ pairUris << qMakePair<QString, QString>(
+ source.contentType().name(),
+ source.uri().toString()
+ );
+ }
+
+ media.setHeight(d->mediaSize.height());
+ media.setWidth(d->mediaSize.width());
+ media.setUris(pairUris);
+ return media;
}
/// Sets the field's \a media.
+///
+/// \deprecated This method is deprecated since QXmpp 1.1. Use
+/// \c QXmppDataForm::Field::setMediaSources() or
+/// \c QXmppDataForm::Field::setMediaSize() instead.
void QXmppDataForm::Field::setMedia(const QXmppDataForm::Media &media)
{
- d->media = media;
+ const QList<QPair<QString, QString>> &uris = media.uris();
+
+ QVector<QXmppDataForm::MediaSource> sources;
+ sources.reserve(uris.size());
+
+ for (const auto &pairUri : uris) {
+ sources << QXmppDataForm::MediaSource(
+ QUrl(pairUri.second),
+ QMimeDatabase().mimeTypeForName(pairUri.first)
+ );
+ }
+
+ d->mediaSources = sources;
+ d->mediaSize = QSize(media.width(), media.height());
}
/// Returns the field's options.
@@ -309,6 +428,83 @@ void QXmppDataForm::Field::setValue(const QVariant &value)
d->value = value;
}
+/// Returns the size of the attached media according to XEP-0221: Data Forms
+/// Media Element.
+///
+/// \since QXmpp 1.1
+
+QSize QXmppDataForm::Field::mediaSize() const
+{
+ return d->mediaSize;
+}
+
+/// Returns the size of the attached media according to XEP-0221: Data Forms
+/// Media Element.
+///
+/// \since QXmpp 1.1
+
+QSize &QXmppDataForm::Field::mediaSize()
+{
+ return d->mediaSize;
+}
+
+/// Sets the size of the attached media according to XEP-0221: Data Forms Media
+/// Element.
+///
+/// \since QXmpp 1.1
+
+void QXmppDataForm::Field::setMediaSize(const QSize &size)
+{
+ d->mediaSize = size;
+}
+
+/// Returns the sources for the attached media according to XEP-0221: Data
+/// Forms Media Element.
+///
+/// \since QXmpp 1.1
+
+QVector<QXmppDataForm::MediaSource> QXmppDataForm::Field::mediaSources() const
+{
+ return d->mediaSources;
+}
+
+/// Returns the sources for the attached media according to XEP-0221: Data
+/// Forms Media Element.
+///
+/// \since QXmpp 1.1
+
+QVector<QXmppDataForm::MediaSource> &QXmppDataForm::Field::mediaSources()
+{
+ return d->mediaSources;
+}
+
+/// Sets the sources to the attached media of the field according to XEP-0221:
+/// Data Forms Media Element.
+///
+/// \since QXmpp 1.1
+
+void QXmppDataForm::Field::setMediaSources(const QVector<QXmppDataForm::MediaSource> &mediaSources)
+{
+ d->mediaSources = mediaSources;
+}
+
+/// Returns true if the other field is identical to this one.
+///
+/// \since QXmpp 1.1
+
+bool QXmppDataForm::Field::operator==(const QXmppDataForm::Field& other) const
+{
+ return d->description == other.description() &&
+ d->key == other.key() &&
+ d->label == other.label() &&
+ d->options == other.options() &&
+ d->required == other.isRequired() &&
+ d->type == other.type() &&
+ d->value == other.value() &&
+ d->mediaSources == other.mediaSources() &&
+ d->mediaSize == other.mediaSize();
+}
+
class QXmppDataFormPrivate : public QSharedData
{
public:
@@ -507,20 +703,21 @@ void QXmppDataForm::parse(const QDomElement &element)
/* field media */
QDomElement mediaElement = fieldElement.firstChildElement("media");
- if (!mediaElement.isNull()) {
- Media media;
- media.setHeight(mediaElement.attribute("height", "-1").toInt());
- media.setWidth(mediaElement.attribute("width", "-1").toInt());
+ if (!mediaElement.isNull() && mediaElement.namespaceURI() == ns_media_element) {
+ field.mediaSize().setHeight(mediaElement.attribute("height", "-1").toInt());
+ field.mediaSize().setWidth(mediaElement.attribute("width", "-1").toInt());
+
+ QDomElement uriElement = mediaElement.firstChildElement(QStringLiteral("uri"));
- QList<QPair<QString, QString> > uris;
- QDomElement uriElement = mediaElement.firstChildElement("uri");
while (!uriElement.isNull()) {
- uris.append(QPair<QString, QString>(uriElement.attribute("type"),
- uriElement.text()));
- uriElement = uriElement.nextSiblingElement("uri");
+ field.mediaSources() << MediaSource(
+ QUrl(uriElement.text()),
+ QMimeDatabase().mimeTypeForName(
+ uriElement.attribute(QStringLiteral("type"))
+ )
+ );
+ uriElement = uriElement.nextSiblingElement(QStringLiteral("uri"));
}
- media.setUris(uris);
- field.setMedia(media);
}
/* field options */
@@ -613,22 +810,32 @@ void QXmppDataForm::toXml(QXmlStreamWriter *writer) const
}
/* field media */
- Media media = field.media();
- if (!media.isNull()) {
+ if (!field.mediaSources().isEmpty()) {
writer->writeStartElement("media");
helperToXmlAddAttribute(writer, "xmlns", ns_media_element);
- if (media.height() > 0)
- helperToXmlAddAttribute(writer, "height", QString::number(media.height()));
- if (media.width() > 0)
- helperToXmlAddAttribute(writer, "width", QString::number(media.width()));
-
- QPair<QString, QString> uri;
- foreach(uri, media.uris()) {
- writer->writeStartElement("uri");
- helperToXmlAddAttribute(writer, "type", uri.first);
- writer->writeCharacters(uri.second);
+
+ // media width and height
+ if (field.mediaSize().width() > 0)
+ helperToXmlAddAttribute(
+ writer,
+ QStringLiteral("width"),
+ QString::number(field.mediaSize().width())
+ );
+ if (field.mediaSize().height() > 0)
+ helperToXmlAddAttribute(
+ writer,
+ QStringLiteral("height"),
+ QString::number(field.mediaSize().height())
+ );
+
+ const QVector<MediaSource> &sources = field.mediaSources();
+ for (const auto &source : sources) {
+ writer->writeStartElement(QStringLiteral("uri"));
+ helperToXmlAddAttribute(writer, QStringLiteral("type"), source.contentType().name());
+ writer->writeCharacters(source.uri().toString());
writer->writeEndElement();
}
+
writer->writeEndElement();
}