/* */ #include "XmlRpcResponse.h" #include #include #include "util.h" #ifdef HAVE_LIBZ # include "GZipEncoder.h" #endif // HAVE_LIBZ namespace aria2 { namespace xmlrpc { namespace { template void encodeValue(const SharedHandle& value, OutputStream& o) { class XmlValueBaseVisitor:public ValueBaseVisitor { private: OutputStream& o_; public: XmlValueBaseVisitor(OutputStream& o):o_(o) {} virtual ~XmlValueBaseVisitor() {} virtual void visit(const String& v) { o_ << "" << util::htmlEscape(v.s()) << ""; } virtual void visit(const Integer& v) { o_ << "" << v.i() << ""; } virtual void visit(const List& v) { o_ << ""; for(List::ValueType::const_iterator i = v.begin(), eoi = v.end(); i != eoi; ++i) { (*i)->accept(*this); } o_ << ""; } virtual void visit(const Dict& v) { o_ << ""; for(Dict::ValueType::const_iterator i = v.begin(), eoi = v.end(); i != eoi; ++i) { o_ << "" << util::htmlEscape((*i).first) << ""; (*i).second->accept(*this); o_ << ""; } o_ << ""; } }; XmlValueBaseVisitor visitor(o); value->accept(visitor); } } // namespace namespace { template std::string encodeAll (OutputStream& o, int code, const SharedHandle& param) { o << "" << ""; if(code == 0) { o << "" << ""; encodeValue(param, o); o << "" << ""; } else { o << ""; encodeValue(param, o); o << ""; } o << ""; return o.str(); } } // namespace std::string XmlRpcResponse::toXml(bool gzip) const { if(gzip) { #ifdef HAVE_LIBZ GZipEncoder o; o.init(); return encodeAll(o, code, param); #else // !HAVE_LIBZ abort(); #endif // !HAVE_LIBZ } else { std::stringstream o; return encodeAll(o, code, param); } } } // namespace xmlrpc } // namespace aria2