aboutsummaryrefslogtreecommitdiff
path: root/src/base
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2012-07-18 10:33:33 +0200
committerJeremy Lainé <jeremy.laine@m4x.org>2012-07-18 10:33:33 +0200
commite4b6ead714de4912a5a8d10177843eed6c448a28 (patch)
treef1143790174ba17507575291ca481ab14151c49b /src/base
parent0ed84be38b159a32790cb074dc04760313ba27c2 (diff)
downloadqxmpp-e4b6ead714de4912a5a8d10177843eed6c448a28.tar.gz
add support for XEP-0221: Data Forms Media Element
Diffstat (limited to 'src/base')
-rw-r--r--src/base/QXmppConstants.cpp2
-rw-r--r--src/base/QXmppConstants.h1
-rw-r--r--src/base/QXmppDataForm.cpp130
-rw-r--r--src/base/QXmppDataForm.h30
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);