diff options
| author | Ian Geiser <ian.geiser@gmail.com> | 2009-11-08 22:02:28 +0000 |
|---|---|---|
| committer | Ian Geiser <ian.geiser@gmail.com> | 2009-11-08 22:02:28 +0000 |
| commit | 5b0870ddaac421af2639058648a218c7061cdd6f (patch) | |
| tree | 351dd9d9ecb92fb1db4ded641a986066ad888914 /source/QXmppRpcIq.cpp | |
| parent | 89e052995997c9a372d7deee6a9d31e100e10533 (diff) | |
| download | qxmpp-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.cpp | 173 |
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; +} |
