/* */ #include "XmlRpcMethod.h" #include #include #include "DownloadEngine.h" #include "BDE.h" #include "LogFactory.h" #include "RecoverableException.h" #include "message.h" #include "OptionParser.h" #include "OptionHandler.h" #include "Option.h" #include "array_fun.h" #include "download_helper.h" #include "XmlRpcRequest.h" namespace aria2 { namespace xmlrpc { XmlRpcMethod::XmlRpcMethod(): _optionParser(OptionParser::getInstance()), _logger(LogFactory::getInstance()) {} static BDE createErrorResponse(const Exception& e) { BDE params = BDE::dict(); params["faultCode"] = BDE(1); params["faultString"] = BDE(e.what()); return params; } static void encodeValue(const BDE& value, std::ostream& o); template static void encodeArray (InputIterator first, InputIterator last, std::ostream& o) { o << "" << ""; for(; first != last; ++first) { encodeValue(*first, o); } o << "" << ""; } template static void encodeStruct (InputIterator first, InputIterator last, std::ostream& o) { o << ""; for(; first != last; ++first) { o << "" << "" << (*first).first << ""; encodeValue((*first).second, o); o << ""; } o << ""; } static void encodeValue(const BDE& value, std::ostream& o) { o << ""; if(value.isString()) { o << "" << value.s() << ""; } else if(value.isInteger()) { o << "" << value.i() << ""; } else if(value.isList()) { encodeArray(value.listBegin(), value.listEnd(), o); } else if(value.isDict()) { encodeStruct(value.dictBegin(), value.dictEnd(), o); } o << ""; } template static void encodeParams (InputIterator first, InputIterator last, std::ostream& o) { o << ""; for(; first != last; ++first) { o << ""; encodeValue(*first, o); o << ""; } o << ""; } static std::string encodeXml(const BDE& params) { assert(params.isList()); std::stringstream o; o << "" << ""; encodeParams(params.listBegin(), params.listEnd(), o); o << ""; return o.str(); } static void encodeFault(const BDE& faultValue, std::ostream& o) { o << ""; encodeValue(faultValue, o); o << ""; } static std::string encodeErrorXml(const BDE& faultValue) { assert(faultValue.isDict()); std::stringstream o; o << "" << ""; encodeFault(faultValue, o); o << ""; return o.str(); } std::string XmlRpcMethod::execute(const XmlRpcRequest& req, DownloadEngine* e) { try { BDE retparams = process(req, e); return encodeXml(retparams); } catch(RecoverableException& e) { _logger->debug(EX_EXCEPTION_CAUGHT, e); return encodeErrorXml(createErrorResponse(e)); } } void XmlRpcMethod::gatherRequestOption (const SharedHandle