aboutsummaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2010-03-17 10:29:39 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2010-03-17 10:29:39 +0000
commitba0c25c412c88c829075e56b498edb898480b80e (patch)
tree7a0c936831fd412a4969406aaf2f72801addb73a /source
parentd1d22f604378c37e7e5582d31b90f8c6d8a2c4ae (diff)
downloadqxmpp-ba0c25c412c88c829075e56b498edb898480b80e.tar.gz
parse contents of Discovery iqs instead of returning raw QXmppElement's
Diffstat (limited to 'source')
-rw-r--r--source/QXmppDiscoveryIq.cpp133
-rw-r--r--source/QXmppDiscoveryIq.h50
-rw-r--r--source/QXmppInformationRequestResult.cpp26
3 files changed, 182 insertions, 27 deletions
diff --git a/source/QXmppDiscoveryIq.cpp b/source/QXmppDiscoveryIq.cpp
index c3f3f9cc..8cbe5b6e 100644
--- a/source/QXmppDiscoveryIq.cpp
+++ b/source/QXmppDiscoveryIq.cpp
@@ -27,14 +27,94 @@
#include <QDomElement>
-QXmppElementList QXmppDiscoveryIq::queryItems() const
+QString QXmppDiscoveryIq::Identity::category() const
{
- return m_queryItems;
+ return m_category;
}
-void QXmppDiscoveryIq::setQueryItems(const QXmppElementList &items)
+void QXmppDiscoveryIq::Identity::setCategory(const QString &category)
{
- m_queryItems = items;
+ m_category = category;
+}
+
+QString QXmppDiscoveryIq::Identity::name() const
+{
+ return m_name;
+}
+
+void QXmppDiscoveryIq::Identity::setName(const QString &name)
+{
+ m_name = name;
+}
+
+QString QXmppDiscoveryIq::Identity::type() const
+{
+ return m_type;
+}
+
+void QXmppDiscoveryIq::Identity::setType(const QString &type)
+{
+ m_type = type;
+}
+
+QString QXmppDiscoveryIq::Item::jid() const
+{
+ return m_jid;
+}
+
+void QXmppDiscoveryIq::Item::setJid(const QString &jid)
+{
+ m_jid = jid;
+}
+
+QString QXmppDiscoveryIq::Item::name() const
+{
+ return m_name;
+}
+
+void QXmppDiscoveryIq::Item::setName(const QString &name)
+{
+ m_name = name;
+}
+
+QString QXmppDiscoveryIq::Item::node() const
+{
+ return m_node;
+}
+
+void QXmppDiscoveryIq::Item::setNode(const QString &node)
+{
+ m_node = node;
+}
+
+QStringList QXmppDiscoveryIq::features() const
+{
+ return m_features;
+}
+
+void QXmppDiscoveryIq::setFeatures(const QStringList &features)
+{
+ m_features = features;
+}
+
+QList<QXmppDiscoveryIq::Identity> QXmppDiscoveryIq::identities() const
+{
+ return m_identities;
+}
+
+void QXmppDiscoveryIq::setIdentities(const QList<QXmppDiscoveryIq::Identity> &identities)
+{
+ m_identities = identities;
+}
+
+QList<QXmppDiscoveryIq::Item> QXmppDiscoveryIq::items() const
+{
+ return m_items;
+}
+
+void QXmppDiscoveryIq::setItems(const QList<QXmppDiscoveryIq::Item> &items)
+{
+ m_items = items;
}
QString QXmppDiscoveryIq::queryNode() const
@@ -79,7 +159,22 @@ void QXmppDiscoveryIq::parse(const QDomElement &element)
QDomElement itemElement = queryElement.firstChildElement();
while (!itemElement.isNull())
{
- m_queryItems.append(QXmppElement(itemElement));
+ if (itemElement.tagName() == "feature")
+ {
+ m_features.append(itemElement.attribute("var"));
+ } else if (itemElement.tagName() == "identity") {
+ QXmppDiscoveryIq::Identity identity;
+ identity.setCategory(itemElement.attribute("category"));
+ identity.setName(itemElement.attribute("name"));
+ identity.setType(itemElement.attribute("type"));
+ m_identities.append(identity);
+ } else if (itemElement.tagName() == "item") {
+ QXmppDiscoveryIq::Item item;
+ item.setJid(itemElement.attribute("jid"));
+ item.setName(itemElement.attribute("name"));
+ item.setNode(itemElement.attribute("node"));
+ m_items.append(item);
+ }
itemElement = itemElement.nextSiblingElement();
}
}
@@ -90,8 +185,32 @@ void QXmppDiscoveryIq::toXmlElementFromChild(QXmlStreamWriter *writer) const
helperToXmlAddAttribute(writer, "xmlns",
m_queryType == InfoQuery ? ns_disco_info : ns_disco_items);
helperToXmlAddAttribute(writer, "node", m_queryNode);
- foreach (const QXmppElement &item, m_queryItems)
- item.toXml(writer);
+
+ foreach (const QString &feature, m_features)
+ {
+ writer->writeStartElement("feature");
+ helperToXmlAddAttribute(writer, "var", feature);
+ writer->writeEndElement();
+ }
+
+ foreach (const QXmppDiscoveryIq::Identity& identity, m_identities)
+ {
+ writer->writeStartElement("identity");
+ helperToXmlAddAttribute(writer, "category", identity.category());
+ helperToXmlAddAttribute(writer, "name", identity.name());
+ helperToXmlAddAttribute(writer, "type", identity.type());
+ writer->writeEndElement();
+ }
+
+ foreach (const QXmppDiscoveryIq::Item& item, m_items)
+ {
+ writer->writeStartElement("item");
+ helperToXmlAddAttribute(writer, "jid", item.jid());
+ helperToXmlAddAttribute(writer, "name", item.name());
+ helperToXmlAddAttribute(writer, "node", item.node());
+ writer->writeEndElement();
+ }
+
writer->writeEndElement();
}
diff --git a/source/QXmppDiscoveryIq.h b/source/QXmppDiscoveryIq.h
index cc4f556c..c5af21a9 100644
--- a/source/QXmppDiscoveryIq.h
+++ b/source/QXmppDiscoveryIq.h
@@ -32,13 +32,55 @@ class QDomElement;
class QXmppDiscoveryIq : public QXmppIq
{
public:
+ class Identity
+ {
+ public:
+ QString category() const;
+ void setCategory(const QString &category);
+
+ QString name() const;
+ void setName(const QString &name);
+
+ QString type() const;
+ void setType(const QString &type);
+
+ private:
+ QString m_category;
+ QString m_name;
+ QString m_type;
+ };
+
+ class Item
+ {
+ public:
+ QString jid() const;
+ void setJid(const QString &jid);
+
+ QString name() const;
+ void setName(const QString &name);
+
+ QString node() const;
+ void setNode(const QString &node);
+
+ private:
+ QString m_jid;
+ QString m_name;
+ QString m_node;
+ };
+
enum QueryType {
InfoQuery,
ItemsQuery,
};
- QXmppElementList queryItems() const;
- void setQueryItems(const QXmppElementList &items);
+ QStringList features() const;
+ void setFeatures(const QStringList &features);
+
+ QList<QXmppDiscoveryIq::Identity> identities() const;
+ void setIdentities(const QList<QXmppDiscoveryIq::Identity> &identities);
+
+ QList<QXmppDiscoveryIq::Item> items() const;
+ void setItems(const QList<QXmppDiscoveryIq::Item> &items);
QString queryNode() const;
void setQueryNode(const QString &node);
@@ -51,7 +93,9 @@ public:
void toXmlElementFromChild(QXmlStreamWriter *writer) const;
private:
- QXmppElementList m_queryItems;
+ QStringList m_features;
+ QList<QXmppDiscoveryIq::Identity> m_identities;
+ QList<QXmppDiscoveryIq::Item> m_items;
QString m_queryNode;
enum QueryType m_queryType;
};
diff --git a/source/QXmppInformationRequestResult.cpp b/source/QXmppInformationRequestResult.cpp
index c5e35dab..3a3d1df9 100644
--- a/source/QXmppInformationRequestResult.cpp
+++ b/source/QXmppInformationRequestResult.cpp
@@ -1,12 +1,12 @@
#include "QXmppInformationRequestResult.h"
#include "QXmppConstants.h"
-#include <QXmlStreamWriter>
QXmppInformationRequestResult::QXmppInformationRequestResult()
{
setType(QXmppIq::Result);
setQueryType(QXmppDiscoveryIq::InfoQuery);
+ // features
QStringList features;
features
<< ns_rpc // XEP-0009: Jabber-RPC
@@ -19,22 +19,14 @@ QXmppInformationRequestResult::QXmppInformationRequestResult()
<< ns_stream_initiation // XEP-0095: Stream Initiation
<< ns_stream_initiation_file_transfer // XEP-0096: SI File Transfer
<< ns_ping; // XEP-0199: XMPP Ping
+ setFeatures(features);
- // build query items
- QList<QXmppElement> queryItems;
- foreach (const QString &var, features)
- {
- QXmppElement feature;
- feature.setTagName("feature");
- feature.setAttribute("var", var);
- queryItems.append(feature);
- }
+ // identities
+ QList<QXmppDiscoveryIq::Identity> identities;
+ QXmppDiscoveryIq::Identity identity;
+ identity.setCategory("automation");
+ identity.setType("rpc");
+ identities.append(identity);
- QXmppElement identity;
- identity.setTagName("identity");
- identity.setAttribute("category", "automation");
- identity.setAttribute("type", "rpc");
- queryItems.append(identity);
-
- setQueryItems(queryItems);
+ setIdentities(identities);
}