summaryrefslogtreecommitdiff
path: root/src/XmlRpcResponse.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/XmlRpcResponse.cc')
-rw-r--r--src/XmlRpcResponse.cc61
1 files changed, 58 insertions, 3 deletions
diff --git a/src/XmlRpcResponse.cc b/src/XmlRpcResponse.cc
index 6cd47afc..107efa01 100644
--- a/src/XmlRpcResponse.cc
+++ b/src/XmlRpcResponse.cc
@@ -38,6 +38,7 @@
#include <sstream>
#include "util.h"
+#include "json.h"
#ifdef HAVE_ZLIB
# include "GZipEncoder.h"
#endif // HAVE_ZLIB
@@ -68,6 +69,10 @@ void encodeValue(const SharedHandle<ValueBase>& value, OutputStream& o)
o_ << "<value><int>" << v.i() << "</int></value>";
}
+ virtual void visit(const Bool& boolValue) {}
+
+ virtual void visit(const Null& nullValue) {}
+
virtual void visit(const List& v)
{
o_ << "<value><array><data>";
@@ -117,13 +122,16 @@ std::string encodeAll
} // namespace
XmlRpcResponse::XmlRpcResponse
-(int code, const SharedHandle<ValueBase>& param)
- : code(code), param(param)
+(int code,
+ const SharedHandle<ValueBase>& param,
+ const SharedHandle<ValueBase>& id)
+ : code(code), param(param), id(id)
{}
XmlRpcResponse::XmlRpcResponse(const XmlRpcResponse& c)
: code(c.code),
- param(c.param)
+ param(c.param),
+ id(c.id)
{}
XmlRpcResponse::~XmlRpcResponse() {}
@@ -153,6 +161,53 @@ std::string XmlRpcResponse::toXml(bool gzip) const
}
}
+namespace {
+template<typename OutputStream>
+OutputStream& encodeJsonAll
+(OutputStream& o,
+ int code,
+ const SharedHandle<ValueBase>& param,
+ const SharedHandle<ValueBase>& id,
+ const std::string& callback)
+{
+ if(!callback.empty()) {
+ o << callback << '(';
+ }
+ SharedHandle<Dict> dict = Dict::g();
+ dict->put("jsonrpc", "2.0");
+ // TODO id may be null?
+ if(id) {
+ dict->put("id", id);
+ }
+ if(code == 0) {
+ dict->put("result", param);
+ } else {
+ dict->put("error", param);
+ }
+ json::encode(o, dict).str();
+ if(!callback.empty()) {
+ o << ')';
+ }
+ return o;
+}
+} // namespace
+
+std::string XmlRpcResponse::toJson(const std::string& callback, bool gzip) const
+{
+ if(gzip) {
+#ifdef HAVE_ZLIB
+ GZipEncoder o;
+ o.init();
+ return encodeJsonAll(o, code, param, id, callback).str();
+#else // !HAVE_ZLIB
+ abort();
+#endif // !HAVE_ZLIB
+ } else {
+ std::stringstream o;
+ return encodeJsonAll(o, code, param, id, callback).str();
+ }
+}
+
} // namespace xmlrpc
} // namespace aria2