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 | |
| parent | 0ed84be38b159a32790cb074dc04760313ba27c2 (diff) | |
| download | qxmpp-e4b6ead714de4912a5a8d10177843eed6c448a28.tar.gz | |
add support for XEP-0221: Data Forms Media Element
Diffstat (limited to 'src/base')
| -rw-r--r-- | src/base/QXmppConstants.cpp | 2 | ||||
| -rw-r--r-- | src/base/QXmppConstants.h | 1 | ||||
| -rw-r--r-- | src/base/QXmppDataForm.cpp | 130 | ||||
| -rw-r--r-- | src/base/QXmppDataForm.h | 30 |
4 files changed, 163 insertions, 0 deletions
diff --git a/src/base/QXmppConstants.cpp b/src/base/QXmppConstants.cpp index 4663158d..3a70c9e1 100644 --- a/src/base/QXmppConstants.cpp +++ b/src/base/QXmppConstants.cpp @@ -75,5 +75,7 @@ const char *ns_jingle_rtp_audio = "urn:xmpp:jingle:apps:rtp:audio"; const char *ns_jingle_rtp_video = "urn:xmpp:jingle:apps:rtp:video"; // XEP-0202: Entity Time const char *ns_entity_time = "urn:xmpp:time"; +// XEP-0221: Data Forms Media Element +const char *ns_media_element = "urn:xmpp:media-element"; // XEP-0224: Attention const char *ns_attention = "urn:xmpp:attention:0"; diff --git a/src/base/QXmppConstants.h b/src/base/QXmppConstants.h index 2245b361..61c1da81 100644 --- a/src/base/QXmppConstants.h +++ b/src/base/QXmppConstants.h @@ -71,6 +71,7 @@ extern const char *ns_jingle_rtp; extern const char *ns_jingle_rtp_audio; extern const char *ns_jingle_rtp_video; extern const char *ns_entity_time; +extern const char *ns_media_element; extern const char *ns_attention; #endif // QXMPPCONSTANTS_H 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) diff --git a/src/base/QXmppDataForm.h b/src/base/QXmppDataForm.h index 70095844..ca249bc8 100644 --- a/src/base/QXmppDataForm.h +++ b/src/base/QXmppDataForm.h @@ -35,6 +35,7 @@ class QDomElement; class QXmppDataFormPrivate; class QXmppDataFormFieldPrivate; +class QXmppDataFormMediaPrivate; /// \brief The QXmppDataForm class represents a data form as defined by /// XEP-0004: Data Forms. @@ -43,6 +44,32 @@ class QXmppDataFormFieldPrivate; class QXMPP_EXPORT QXmppDataForm { public: + /// \brief The QXmppDataForm::Media class represents a media field + /// as defined by XEP-0221: Data Forms Media Element. + /// + + class QXMPP_EXPORT Media + { + public: + Media(); + Media(const QXmppDataForm::Media &other); + ~Media(); + + int height() const; + void setHeight(int height); + + int width() const; + void setWidth(int width); + + QList<QPair<QString, QString> > uris() const; + void setUris(const QList<QPair<QString, QString> > &uris); + + bool isNull() const; + + private: + QSharedDataPointer<QXmppDataFormMediaPrivate> d; + }; + /// \brief The QXmppDataForm::Field class represents a data form field /// as defined by XEP-0004: Data Forms. /// @@ -80,6 +107,9 @@ public: QString label() const; void setLabel(const QString &label); + Media media() const; + void setMedia(const Media &media); + QList<QPair<QString, QString> > options() const; void setOptions(const QList<QPair<QString, QString> > &options); |
