diff --git a/ChangeLog b/ChangeLog index 367b66b0..4cb2a5b4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2009-12-20 Tatsuhiro Tsujikawa + + Added getOption and getGlobalOption XML-RPC method. getOption + takes GID as a parameter and returns its options as struct. + getGlobalOption takes no parameter and returns global + options. Because global option is used as a template for the + option of newly added downloads, it includes options returned by + getOption. + * src/Option.h + * src/XmlRpcMethodFactory.cc + * src/XmlRpcMethodImpl.cc + * src/XmlRpcMethodImpl.h + 2009-12-20 Tatsuhiro Tsujikawa Sort _optionHandlers in OptionParser by name in ascending order. diff --git a/src/Option.h b/src/Option.h index 3b4751c3..aa198f59 100644 --- a/src/Option.h +++ b/src/Option.h @@ -64,6 +64,16 @@ public: void remove(const std::string& name); void clear(); + + std::map::const_iterator begin() const + { + return table.begin(); + } + + std::map::const_iterator end() const + { + return table.end(); + } }; } // namespace aria2 diff --git a/src/XmlRpcMethodFactory.cc b/src/XmlRpcMethodFactory.cc index 6b93721c..699b72e1 100644 --- a/src/XmlRpcMethodFactory.cc +++ b/src/XmlRpcMethodFactory.cc @@ -73,8 +73,12 @@ XmlRpcMethodFactory::create(const std::string& methodName) return SharedHandle(new TellActiveXmlRpcMethod()); } else if(methodName == "aria2.tellWaiting") { return SharedHandle(new TellWaitingXmlRpcMethod()); + } else if(methodName == "aria2.getOption") { + return SharedHandle(new GetOptionXmlRpcMethod()); } else if(methodName == "aria2.changeOption") { return SharedHandle(new ChangeOptionXmlRpcMethod()); + } else if(methodName == "aria2.getGlobalOption") { + return SharedHandle(new GetGlobalOptionXmlRpcMethod()); } else if(methodName == "aria2.changeGlobalOption") { return SharedHandle(new ChangeGlobalOptionXmlRpcMethod()); } else if(methodName == "aria2.purgeDownloadResult") { diff --git a/src/XmlRpcMethodImpl.cc b/src/XmlRpcMethodImpl.cc index 63819406..c99b5103 100644 --- a/src/XmlRpcMethodImpl.cc +++ b/src/XmlRpcMethodImpl.cc @@ -58,6 +58,7 @@ #include "prefs.h" #include "message.h" #include "FeatureConfig.h" +#include "array_fun.h" #ifdef ENABLE_BITTORRENT # include "bittorrent_helper.h" # include "BtRegistry.h" @@ -679,6 +680,53 @@ BDE GetVersionXmlRpcMethod::process return result; } +template +static void pushRequestOption +(BDE& dict, InputIterator optionFirst, InputIterator optionLast) +{ + const std::set& requestOptions = listRequestOptions(); + for(; optionFirst != optionLast; ++optionFirst) { + if(requestOptions.count((*optionFirst).first)) { + dict[(*optionFirst).first] = (*optionFirst).second; + } + } +} + +BDE GetOptionXmlRpcMethod::process +(const XmlRpcRequest& req, DownloadEngine* e) +{ + const BDE& params = req._params; + assert(params.isList()); + if(params.empty() || !params[0].isString()) { + throw DL_ABORT_EX(MSG_GID_NOT_PROVIDED); + } + int32_t gid = util::parseInt(params[0].s()); + + SharedHandle group = findRequestGroup(e->_requestGroupMan, gid); + if(group.isNull()) { + throw DL_ABORT_EX + (StringFormat("Cannot get option for GID#%d", gid).str()); + } + BDE result = BDE::dict(); + SharedHandle