diff options
| author | Linus Jahn <lnj@kaidan.im> | 2019-10-20 16:43:50 +0200 |
|---|---|---|
| committer | LNJ <lnj@kaidan.im> | 2019-10-23 13:19:32 +0200 |
| commit | 979918a40759064c01f31bc099217086b81936d9 (patch) | |
| tree | 29b5803c7d816af2d3cf42a4fd7651a8d9c1cd5c /src/base/QXmppDataForm.cpp | |
| parent | 86ca79a0d5480a307e6117798e3c216ad23fca51 (diff) | |
| download | qxmpp-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.cpp | 287 |
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(); } |
