aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2010-08-10 08:31:00 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2010-08-10 08:31:00 +0000
commitd98bbdffd9f45ff8ecd1fece04cad2d93f5d0a9e (patch)
tree1e371d69c010daf60dae5e04121a897394306115
parent064a65d8d2bde24369bb83d8393da1344035ad83 (diff)
downloadqxmpp-d98bbdffd9f45ff8ecd1fece04cad2d93f5d0a9e.tar.gz
parse/serialise XML-RPC faults
-rw-r--r--example/tests/tests.cpp38
-rw-r--r--example/tests/tests.h1
-rw-r--r--source/QXmppRpcIq.cpp82
-rw-r--r--source/QXmppRpcIq.h18
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: