diff options
| author | Jeremy Lainé <jeremy.laine@m4x.org> | 2012-07-18 10:33:33 +0200 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2012-07-18 10:33:33 +0200 |
| commit | e4b6ead714de4912a5a8d10177843eed6c448a28 (patch) | |
| tree | f1143790174ba17507575291ca481ab14151c49b /src/base/QXmppDataForm.cpp | |
| parent | 0ed84be38b159a32790cb074dc04760313ba27c2 (diff) | |
add support for XEP-0221: Data Forms Media Element
Diffstat (limited to 'src/base/QXmppDataForm.cpp')
| -rw-r--r-- | src/base/QXmppDataForm.cpp | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/src/base/QXmppDataForm.cpp b/src/base/QXmppDataForm.cpp index ef6f7317..36e2c53d 100644 --- a/src/base/QXmppDataForm.cpp +++ b/src/base/QXmppDataForm.cpp @@ -23,6 +23,7 @@ #include <QDebug> #include <QDomElement> +#include <QSize> #include <QStringList> #include "QXmppConstants.h" @@ -48,6 +49,82 @@ static field_type field_types[] = { {static_cast<QXmppDataForm::Field::Type>(-1), NULL}, }; +class QXmppDataFormMediaPrivate : public QSharedData +{ +public: + QSize size; + QList<QPair<QString, QString> > uris; +}; + +/// Constructs an empty QXmppDataForm::Media. + +QXmppDataForm::Media::Media() + : d(new QXmppDataFormMediaPrivate) +{ +} + +/// Constructs a copy of \a other. + +QXmppDataForm::Media::Media(const QXmppDataForm::Media &other) + : d(other.d) +{ +} + +/// Destroys the media. + +QXmppDataForm::Media::~Media() +{ +} + +/// Returns media's height. + +int QXmppDataForm::Media::height() const +{ + return d->size.height(); +} + +/// Sets media's \a height. + +void QXmppDataForm::Media::setHeight(int height) +{ + d->size.setHeight(height); +} + +/// Returns media's width. + +int QXmppDataForm::Media::width() const +{ + return d->size.width(); +} + +/// Sets media's \a width. + +void QXmppDataForm::Media::setWidth(int width) +{ + d->size.setWidth(width); +} + +/// Returns media's uris. + +QList< QPair< QString, QString > > QXmppDataForm::Media::uris() const +{ + return d->uris; +} + +/// Sets media's \a uris. + +void QXmppDataForm::Media::setUris(const QList< QPair< QString, QString > > &uris) +{ + d->uris = uris; +} + +/// Returns true if no media tag present. + +bool QXmppDataForm::Media::isNull() const +{ + return d->uris.empty(); +} + class QXmppDataFormFieldPrivate : public QSharedData { public: @@ -56,6 +133,7 @@ public: QString description; QString key; QString label; + QXmppDataForm::Media media; QList<QPair<QString, QString> > options; bool required; QXmppDataForm::Field::Type type; @@ -145,6 +223,20 @@ void QXmppDataForm::Field::setLabel(const QString &label) d->label = label; } +/// Returns the field's media. + +QXmppDataForm::Media QXmppDataForm::Field::media() const +{ + return d->media; +} + +/// Sets the field's \a media. + +void QXmppDataForm::Field::setMedia(const QXmppDataForm::Media &media) +{ + d->media = media; +} + /// Returns the field's options. QList<QPair<QString, QString> > QXmppDataForm::Field::options() const @@ -404,6 +496,24 @@ void QXmppDataForm::parse(const QDomElement &element) field.setValue(fieldElement.firstChildElement("value").text()); } + /* 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()); + + 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"); + } + media.setUris(uris); + field.setMedia(media); + } + /* field options */ if (type == QXmppDataForm::Field::ListMultiField || type == QXmppDataForm::Field::ListSingleField) @@ -493,6 +603,26 @@ void QXmppDataForm::toXml(QXmlStreamWriter *writer) const helperToXmlAddTextElement(writer, "value", field.value().toString()); } + /* field media */ + Media media = field.media(); + if (!media.isNull()) { + 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); + writer->writeEndElement(); + } + writer->writeEndElement(); + } + /* field options */ if (type == QXmppDataForm::Field::ListMultiField || type == QXmppDataForm::Field::ListSingleField) |
