diff options
Diffstat (limited to 'src/XmlRpcResponse.cc')
| -rw-r--r-- | src/XmlRpcResponse.cc | 61 |
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 |
