/* */ #include "RpcMethod.h" #include "DownloadEngine.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 "RpcRequest.h" #include "RpcResponse.h" #include "prefs.h" #include "fmt.h" #include "DlAbortEx.h" #include "a2functional.h" namespace aria2 { namespace rpc { RpcMethod::RpcMethod() : optionParser_(OptionParser::getInstance()) {} RpcMethod::~RpcMethod() {} SharedHandle RpcMethod::createErrorResponse (const Exception& e, const RpcRequest& req) { SharedHandle params = Dict::g(); params->put((req.jsonRpc ? "code" : "faultCode"), Integer::g(1)); params->put((req.jsonRpc ? "message" : "faultString"), std::string(e.what())); return params; } RpcResponse RpcMethod::execute (const RpcRequest& req, DownloadEngine* e) { try { return RpcResponse(0, process(req, e), req.id); } catch(RecoverableException& ex) { A2_LOG_DEBUG_EX(EX_EXCEPTION_CAUGHT, ex); return RpcResponse(1, createErrorResponse(ex, req), req.id); } } namespace { template void gatherOption (InputIterator first, InputIterator last, Pred pred, Option* option, const SharedHandle& optionParser) { for(; first != last; ++first) { const std::string& optionName = (*first).first; const Pref* pref = option::k2p(optionName); if(!pref) { throw DL_ABORT_EX (fmt("We don't know how to deal with %s option", optionName.c_str())); } const SharedHandle& handler = optionParser->find(pref); if(!handler || !pred(handler)) { throw DL_ABORT_EX (fmt("%s option cannot be used in this context.", optionName.c_str())); } const String* opval = downcast((*first).second); if(opval) { handler->parse(*option, opval->s()); } else if(handler->getCumulative()) { // header and index-out option can take array as value const List* oplist = downcast((*first).second); if(oplist) { for(List::ValueType::const_iterator argiter = oplist->begin(), eoi = oplist->end(); argiter != eoi; ++argiter) { const String* opval = downcast(*argiter); if(opval) { handler->parse(*option, opval->s()); } } } } } } } // namespace void RpcMethod::gatherRequestOption(Option* option, const Dict* optionsDict) { if(optionsDict) { gatherOption(optionsDict->begin(), optionsDict->end(), mem_fun_sh(&OptionHandler::getInitialOption), option, optionParser_); } } void RpcMethod::gatherChangeableOption(Option* option, const Dict* optionsDict) { if(optionsDict) { gatherOption(optionsDict->begin(), optionsDict->end(), mem_fun_sh(&OptionHandler::getChangeOption), option, optionParser_); } } void RpcMethod::gatherChangeableOptionForReserved (Option* option, const Dict* optionsDict) { if(optionsDict) { gatherOption(optionsDict->begin(), optionsDict->end(), mem_fun_sh(&OptionHandler::getChangeOptionForReserved), option, optionParser_); } } void RpcMethod::gatherChangeableGlobalOption (Option* option, const Dict* optionsDict) { if(optionsDict) { gatherOption(optionsDict->begin(), optionsDict->end(), mem_fun_sh(&OptionHandler::getChangeGlobalOption), option, optionParser_); } } } // namespace rpc } // namespace aria2