From 5b0870ddaac421af2639058648a218c7061cdd6f Mon Sep 17 00:00:00 2001 From: Ian Geiser Date: Sun, 8 Nov 2009 22:02:28 +0000 Subject: Added start of XEP-009. This is only the inteface, being able to invoke remote methods is next. --- source/QXmppRpcIq.cpp | 173 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 source/QXmppRpcIq.cpp (limited to 'source/QXmppRpcIq.cpp') 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 + +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; +} -- cgit v1.2.3