diff options
| author | Jeremy Lainé <jeremy.laine@m4x.org> | 2010-08-10 08:31:00 +0000 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2010-08-10 08:31:00 +0000 |
| commit | d98bbdffd9f45ff8ecd1fece04cad2d93f5d0a9e (patch) | |
| tree | 1e371d69c010daf60dae5e04121a897394306115 | |
| parent | 064a65d8d2bde24369bb83d8393da1344035ad83 (diff) | |
| download | qxmpp-d98bbdffd9f45ff8ecd1fece04cad2d93f5d0a9e.tar.gz | |
parse/serialise XML-RPC faults
| -rw-r--r-- | example/tests/tests.cpp | 38 | ||||
| -rw-r--r-- | example/tests/tests.h | 1 | ||||
| -rw-r--r-- | source/QXmppRpcIq.cpp | 82 | ||||
| -rw-r--r-- | source/QXmppRpcIq.h | 18 |
4 files changed, 127 insertions, 12 deletions
diff --git a/example/tests/tests.cpp b/example/tests/tests.cpp index d233004b..1da51be5 100644 --- a/example/tests/tests.cpp +++ b/example/tests/tests.cpp @@ -464,10 +464,48 @@ void TestXmlRpc::testResponse() QXmppRpcResponseIq iq; parsePacket(iq, xml); + QCOMPARE(iq.faultCode(), 0); + QCOMPARE(iq.faultString(), QString()); QCOMPARE(iq.values(), QVariantList() << QString("Colorado")); serializePacket(iq, xml); } +void TestXmlRpc::testResponseFault() +{ + const QByteArray xml( + "<iq" + " id=\"rpc1\"" + " to=\"requester@company-b.com/jrpc-client\"" + " from=\"responder@company-a.com/jrpc-server\"" + " type=\"result\">" + "<query xmlns=\"jabber:iq:rpc\">" + "<methodResponse>" + "<fault>" + "<value>" + "<struct>" + "<member>" + "<name>faultCode</name>" + "<value><i4>404</i4></value>" + "</member>" + "<member>" + "<name>faultString</name>" + "<value><string>Not found</string></value>" + "</member>" + "</struct>" + "</value>" + "</fault>" + "</methodResponse>" + "</query>" + "</iq>"); + + QXmppRpcResponseIq iq; + parsePacket(iq, xml); + QCOMPARE(iq.faultCode(), 404); + QCOMPARE(iq.faultString(), QLatin1String("Not found")); + QCOMPARE(iq.values(), QVariantList()); + serializePacket(iq, xml); +} + int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); diff --git a/example/tests/tests.h b/example/tests/tests.h index 9dc1a01c..2294339f 100644 --- a/example/tests/tests.h +++ b/example/tests/tests.h @@ -77,4 +77,5 @@ private slots: void testInvoke(); void testResponse(); + void testResponseFault(); }; diff --git a/source/QXmppRpcIq.cpp b/source/QXmppRpcIq.cpp index 94848010..def28458 100644 --- a/source/QXmppRpcIq.cpp +++ b/source/QXmppRpcIq.cpp @@ -22,7 +22,6 @@ * */ -#include <QDebug> #include <QDomElement> #include <QMap> #include <QVariant> @@ -221,15 +220,58 @@ void QXmppRpcErrorIq::toXmlElementFromChild(QXmlStreamWriter *writer) const m_query.toXmlElementFromChild(writer); } -QXmppRpcResponseIq::QXmppRpcResponseIq() : QXmppIq( QXmppIq::Result ) +QXmppRpcResponseIq::QXmppRpcResponseIq() + : QXmppIq(QXmppIq::Result), + m_faultCode(0) { } +/// Returns the fault code. +/// + +int QXmppRpcResponseIq::faultCode() const +{ + return m_faultCode; +} + +/// Sets the fault code. +/// +/// \param faultCode + +void QXmppRpcResponseIq::setFaultCode(int faultCode) +{ + m_faultCode = faultCode; +} + +/// Returns the fault string. +/// + +QString QXmppRpcResponseIq::faultString() const +{ + return m_faultString; +} + +/// Sets the fault string. +/// +/// \param faultString + +void QXmppRpcResponseIq::setFaultString(const QString& faultString) +{ + m_faultString = faultString; +} + +/// Returns the response values. +/// + QVariantList QXmppRpcResponseIq::values() const { return m_values; } +/// Sets the response values. +/// +/// \param values + void QXmppRpcResponseIq::setValues(const QVariantList &values) { m_values = values; @@ -255,7 +297,7 @@ void QXmppRpcResponseIq::parseElementFromChild(const QDomElement &element) while (!param.isNull()) { QStringList errors; - const QVariant value = XMLRPC::demarshall(param.firstChildElement(), errors); + const QVariant value = XMLRPC::demarshall(param.firstChildElement("value"), errors); if (!errors.isEmpty()) break; m_values << value; @@ -265,12 +307,12 @@ void QXmppRpcResponseIq::parseElementFromChild(const QDomElement &element) else if( contents.tagName().toLower() == "fault") { QStringList errors; - const QDomElement errElement = contents.firstChildElement(); + const QDomElement errElement = contents.firstChildElement("value"); const QVariant error = XMLRPC::demarshall(errElement, errors); - - qWarning() << QString("XMLRPC Fault %1: %2") - .arg(error.toMap()["faultCode"].toString() ) - .arg(error.toMap()["faultString"].toString() ); + if (!errors.isEmpty()) + return; + m_faultCode = error.toMap()["faultCode"].toInt(); + m_faultString = error.toMap()["faultString"].toString(); } } @@ -280,7 +322,16 @@ void QXmppRpcResponseIq::toXmlElementFromChild(QXmlStreamWriter *writer) const helperToXmlAddAttribute(writer, "xmlns", ns_rpc); writer->writeStartElement("methodResponse"); - if (!m_values.isEmpty()) + if (m_faultCode) + { + writer->writeStartElement("fault"); + QMap<QString,QVariant> fault; + fault["faultCode"] = m_faultCode; + fault["faultString"] = m_faultString; + XMLRPC::marshall(writer, fault); + writer->writeEndElement(); + } + else if (!m_values.isEmpty()) { writer->writeStartElement("params"); foreach (const QVariant &arg, m_values) @@ -296,15 +347,23 @@ void QXmppRpcResponseIq::toXmlElementFromChild(QXmlStreamWriter *writer) const writer->writeEndElement(); } -QXmppRpcInvokeIq::QXmppRpcInvokeIq() : QXmppIq( QXmppIq::Set ) +QXmppRpcInvokeIq::QXmppRpcInvokeIq() + : QXmppIq(QXmppIq::Set) { } +/// Returns the method arguments. +/// + QVariantList QXmppRpcInvokeIq::arguments() const { return m_arguments; } +/// Sets the method arguments. +/// +/// \param arguments + void QXmppRpcInvokeIq::setArguments(const QVariantList &arguments) { m_arguments = arguments; @@ -357,7 +416,7 @@ void QXmppRpcInvokeIq::parseElementFromChild(const QDomElement &element) while (!param.isNull()) { QStringList errors; - QVariant arg = XMLRPC::demarshall(param.firstChildElement(), errors); + QVariant arg = XMLRPC::demarshall(param.firstChildElement("value"), errors); if (!errors.isEmpty()) break; m_arguments << arg; @@ -389,4 +448,3 @@ void QXmppRpcInvokeIq::toXmlElementFromChild(QXmlStreamWriter *writer) const writer->writeEndElement(); } - diff --git a/source/QXmppRpcIq.h b/source/QXmppRpcIq.h index 1f92f086..d6cf63ab 100644 --- a/source/QXmppRpcIq.h +++ b/source/QXmppRpcIq.h @@ -37,11 +37,22 @@ namespace XMLRPC QVariant demarshall(const QDomElement &elem, QStringList &errors); } +/// \brief The QXmppResponseIq class represents an IQ used to carry +/// an RPC response as specified by XEP-0009: Jabber-RPC. +/// +/// \ingroup Stanzas + class QXmppRpcResponseIq : public QXmppIq { public: QXmppRpcResponseIq(); + int faultCode() const; + void setFaultCode(int faultCode); + + QString faultString() const; + void setFaultString(const QString &faultString); + QVariantList values() const; void setValues(const QVariantList &values); @@ -52,9 +63,16 @@ protected: void toXmlElementFromChild(QXmlStreamWriter *writer) const; private: + int m_faultCode; + QString m_faultString; QVariantList m_values; }; +/// \brief The QXmppInvokeIq class represents an IQ used to carry +/// an RPC invocation as specified by XEP-0009: Jabber-RPC. +/// +/// \ingroup Stanzas + class QXmppRpcInvokeIq : public QXmppIq { public: |
