aboutsummaryrefslogtreecommitdiff
path: root/source/QXmppRpcIq.cpp
diff options
context:
space:
mode:
authorIan Geiser <ian.geiser@gmail.com>2009-11-08 22:02:28 +0000
committerIan Geiser <ian.geiser@gmail.com>2009-11-08 22:02:28 +0000
commit5b0870ddaac421af2639058648a218c7061cdd6f (patch)
tree351dd9d9ecb92fb1db4ded641a986066ad888914 /source/QXmppRpcIq.cpp
parent89e052995997c9a372d7deee6a9d31e100e10533 (diff)
downloadqxmpp-5b0870ddaac421af2639058648a218c7061cdd6f.tar.gz
Added start of XEP-009. This is only the inteface, being able to invoke remote methods is next.
Diffstat (limited to 'source/QXmppRpcIq.cpp')
-rw-r--r--source/QXmppRpcIq.cpp173
1 files changed, 173 insertions, 0 deletions
diff --git a/source/QXmppRpcIq.cpp b/source/QXmppRpcIq.cpp
new file mode 100644
index 00000000..8e7a6b99
--- /dev/null
+++ b/source/QXmppRpcIq.cpp
@@ -0,0 +1,173 @@
+#include "QXmppRpcIq.h"
+#include "QXmppConstants.h"
+#include "xmlrpc.h"
+
+#include <QDomElement>
+
+QXmppRpcErrorIq::QXmppRpcErrorIq() : QXmppIq( QXmppIq::Error )
+{
+
+}
+
+void QXmppRpcErrorIq::toXmlElementFromChild(QXmlStreamWriter *writer) const
+{
+ m_query.toXmlElementFromChild(writer);
+}
+
+void QXmppRpcErrorIq::setQuery(const QXmppRpcInvokeIq &query )
+{
+ m_query = query;
+}
+
+QXmppRpcInvokeIq QXmppRpcErrorIq::getQuery() const
+{
+ return m_query;
+}
+
+void QXmppRpcErrorIq::parse( QDomElement &element )
+{
+ QDomElement errorElement = element.firstChildElement("error");
+ setId( element.attribute("id"));
+ setTo( element.attribute("to"));
+ setFrom( element.attribute("from"));
+ setTypeFromStr( element.attribute("type"));
+
+ QXmppStanza::Error error;
+ error.setTypeFromStr( errorElement.attribute("type"));
+
+ QDomElement conditionElement = errorElement.firstChildElement();
+ while(!conditionElement.isNull())
+ {
+ if(conditionElement.namespaceURI() == ns_stanza)
+ {
+ error.setConditionFromStr( conditionElement.tagName() );
+ }
+ conditionElement = conditionElement.nextSiblingElement();
+ }
+
+ setError( error );
+}
+
+bool QXmppRpcErrorIq::isRpcErrorIq( QDomElement &element )
+{
+ QString type = element.attribute("type");
+ QDomElement errorElement = element.firstChildElement("error");
+ QDomElement queryElement = element.firstChildElement("query");
+ return (type == "error") &&
+ !errorElement.isNull() &&
+ queryElement.namespaceURI() == ns_rpc;
+}
+
+QXmppRpcResponseIq::QXmppRpcResponseIq() : QXmppIq( QXmppIq::Result )
+{
+}
+
+void QXmppRpcResponseIq::toXmlElementFromChild(QXmlStreamWriter *writer) const
+{
+ XMLRPC::ResponseMessage message( m_payload );
+ writer->writeStartElement(ns_rpc, "query");
+ message.writeXml(writer);
+ writer->writeEndElement();
+}
+
+void QXmppRpcResponseIq::parse( QDomElement &element )
+{
+ QDomElement queryElement = element.firstChildElement("query");
+ setId( element.attribute("id"));
+ setTo( element.attribute("to"));
+ setFrom( element.attribute("from"));
+ setTypeFromStr( element.attribute("type"));
+
+ QDomElement methodElement = queryElement.firstChildElement("methodResponse");
+
+ XMLRPC::ResponseMessage message( methodElement );
+ m_payload = message.value();
+
+}
+
+bool QXmppRpcResponseIq::isRpcResponseIq( QDomElement &element )
+{
+ QString type = element.attribute("type");
+ QDomElement dataElement = element.firstChildElement("query");
+ return dataElement.namespaceURI() == ns_rpc &&
+ type == "result";
+}
+
+QVariant QXmppRpcResponseIq::getPayload() const
+{
+ return m_payload;
+}
+
+void QXmppRpcResponseIq::setPayload( const QVariant &payload )
+{
+ m_payload = payload;
+}
+
+
+QXmppRpcInvokeIq::QXmppRpcInvokeIq() : QXmppIq( QXmppIq::Set )
+{
+}
+
+void QXmppRpcInvokeIq::toXmlElementFromChild(QXmlStreamWriter *writer) const
+{
+ QString methodName = m_interface + "." + m_method;
+ XMLRPC::RequestMessage message( methodName.toLatin1() ,m_payload );
+ writer->writeStartElement(ns_rpc, "query");
+ message.writeXml(writer);
+ writer->writeEndElement();
+}
+
+void QXmppRpcInvokeIq::parse( QDomElement &element )
+{
+ QDomElement queryElement = element.firstChildElement("query");
+ setId( element.attribute("id"));
+ setTo( element.attribute("to"));
+ setFrom( element.attribute("from"));
+ setTypeFromStr( element.attribute("type"));
+
+ QDomElement methodElement = queryElement.firstChildElement("methodCall");
+
+ XMLRPC::RequestMessage message( methodElement );
+
+ m_interface = message.method().split('.').value(0);
+ m_method = message.method().split('.').value(1);
+ m_payload = message.args();
+
+}
+
+bool QXmppRpcInvokeIq::isRpcInvokeIq( QDomElement &element )
+{
+ QString type = element.attribute("type");
+ QDomElement dataElement = element.firstChildElement("query");
+ return dataElement.namespaceURI() == ns_rpc &&
+ type == "set";
+}
+
+
+QVariantList QXmppRpcInvokeIq::getPayload() const
+{
+ return m_payload;
+}
+
+void QXmppRpcInvokeIq::setPayload( const QVariantList &payload )
+{
+ m_payload = payload;
+}
+
+QString QXmppRpcInvokeIq::getMethod() const
+{
+ return m_method;
+}
+void QXmppRpcInvokeIq::setMethod( const QString &method )
+{
+ m_method = method;
+}
+
+QString QXmppRpcInvokeIq::getInterface() const
+{
+ return m_interface;
+}
+void QXmppRpcInvokeIq::setInterface( const QString &interface )
+{
+ m_interface = interface;
+}