diff --git a/ChangeLog b/ChangeLog index 9333ea4c..d03f945c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2009-05-10 Tatsuhiro Tsujikawa + + The information for files, URIs, peers are removed from the + reponse of TellaActive, TellStatus command because they tend to be + large. Instead they can be retrieved by the dedicated commands: + getFiles, getUris and getPeers respectively. + * src/XmlRpcMethodFactory.cc + * src/XmlRpcMethodImpl.cc + * src/XmlRpcMethodImpl.h + 2009-05-10 Tatsuhiro Tsujikawa Removed --max-overall-upload-limit and diff --git a/src/XmlRpcMethodFactory.cc b/src/XmlRpcMethodFactory.cc index 6c3710e3..ecc4f002 100644 --- a/src/XmlRpcMethodFactory.cc +++ b/src/XmlRpcMethodFactory.cc @@ -52,6 +52,12 @@ XmlRpcMethodFactory::create(const std::string& methodName) return SharedHandle(new RemoveXmlRpcMethod()); } else if(methodName == "aria2.tellStatus") { return SharedHandle(new TellStatusXmlRpcMethod()); + } else if(methodName == "aria2.getUris") { + return SharedHandle(new GetUrisXmlRpcMethod()); + } else if(methodName == "aria2.getFiles") { + return SharedHandle(new GetFilesXmlRpcMethod()); + } else if(methodName == "aria2.getPeers") { + return SharedHandle(new GetPeersXmlRpcMethod()); } else if(methodName == "aria2.tellActive") { return SharedHandle(new TellActiveXmlRpcMethod()); } else { diff --git a/src/XmlRpcMethodImpl.cc b/src/XmlRpcMethodImpl.cc index b06c4948..a83b5cd1 100644 --- a/src/XmlRpcMethodImpl.cc +++ b/src/XmlRpcMethodImpl.cc @@ -35,6 +35,7 @@ #include "XmlRpcMethodImpl.h" #include +#include #include "Logger.h" #include "BDE.h" @@ -179,19 +180,7 @@ static void gatherProgressCommon entryDict["bitfield"] = BDE(Util::toHex(ps->getBitfield(), ps->getBitfieldLength())); } - - if(!ps->getDiskAdaptor().isNull()) { - BDE files = BDE::list(); - const std::deque >& entries = - ps->getDiskAdaptor()->getFileEntries(); - for(std::deque >::const_iterator i = - entries.begin(); i != entries.end(); ++i) { - files << BDE((*i)->getPath()); - } - entryDict["files"] = files; - } } - entryDict["pieceLength"] = BDE(Util::uitos(group->getDownloadContext()->getPieceLength())); entryDict["numPieces"] = @@ -204,10 +193,8 @@ static void gatherProgressBitTorrent entryDict["infoHash"] = BDE(btctx->getInfoHashAsString()); } -static void gatherPeer(BDE& entryDict, const SharedHandle& ps) +static void gatherPeer(BDE& peers, const SharedHandle& ps) { - BDE peers = BDE::list(); - std::deque > activePeers; ps->getActivePeers(activePeers); for(std::deque >::const_iterator i = @@ -221,34 +208,16 @@ static void gatherPeer(BDE& entryDict, const SharedHandle& ps) (*i)->getBitfieldLength())); peers << peerEntry; } - entryDict["peers"] = peers; } static void gatherProgress (BDE& entryDict, const SharedHandle& group, DownloadEngine* e) { gatherProgressCommon(entryDict, group); - - BDE uriList = BDE::list(); - std::deque uris; - group->getURIs(uris); - for(std::deque::const_iterator i = uris.begin(); i != uris.end(); - ++i) { - uriList << *i; - } - entryDict["uris"] = uriList; - SharedHandle btctx = dynamic_pointer_cast(group->getDownloadContext()); if(!btctx.isNull()) { gatherProgressBitTorrent(entryDict, btctx); - - SharedHandle btreg = e->getBtRegistry(); - SharedHandle ps = - btreg->getPeerStorage(btctx->getInfoHashAsString()); - if(!ps.isNull()) { - gatherPeer(entryDict, ps); - } } } @@ -265,6 +234,138 @@ static void gatherStoppedDownload } } +static +SharedHandle +findRequestGroup(const SharedHandle& rgman, int32_t gid) +{ + SharedHandle group = rgman->findRequestGroup(gid); + if(group.isNull()) { + group = rgman->findReservedGroup(gid); + } + return group; +} + +BDE GetFilesXmlRpcMethod::process +(const XmlRpcRequest& req, DownloadEngine* e) +{ + const BDE& params = req._params; + assert(params.isList()); + + if(params.empty() || !params[0].isString()) { + throw DlAbortEx("GID is not provided."); + } + + int32_t gid = Util::parseInt(params[0].s()); + + SharedHandle group = findRequestGroup(e->_requestGroupMan, gid); + if(group.isNull()) { + throw DlAbortEx + (StringFormat("No file data is available for GID#%d", gid).str()); + } + BDE files = BDE::list(); + SharedHandle btctx = + dynamic_pointer_cast(group->getDownloadContext()); + if(btctx.isNull()) { + BDE entry = BDE::dict(); + entry["index"] = BDE("1"); + entry["path"] = group->getDownloadContext()->getActualBasePath(); + entry["selected"] = BDE("true"); + files << entry; + } else { + std::deque fileIndexes = btctx->getFileFilter().flush(); + std::sort(fileIndexes.begin(), fileIndexes.end()); + fileIndexes.erase(std::unique(fileIndexes.begin(), fileIndexes.end()), + fileIndexes.end()); + std::deque > fileEntries = + btctx->getFileEntries(); + + bool selectAll = fileIndexes.empty() || fileEntries.size() == 1; + + size_t index = 1; + for(std::deque >::const_iterator i = + fileEntries.begin(); i != fileEntries.end(); ++i, ++index) { + BDE entry = BDE::dict(); + entry["index"] = Util::uitos(index); + entry["path"] = (*i)->getPath(); + if(selectAll || + std::binary_search(fileIndexes.begin(), fileIndexes.end(), index)) { + entry["selected"] = BDE("true"); + } else { + entry["selected"] = BDE("false"); + } + files << entry; + } + } + BDE resParams = BDE::list(); + resParams << files; + return resParams; +} + +BDE GetUrisXmlRpcMethod::process +(const XmlRpcRequest& req, DownloadEngine* e) +{ + const BDE& params = req._params; + assert(params.isList()); + + if(params.empty() || !params[0].isString()) { + throw DlAbortEx("GID is not provided."); + } + + int32_t gid = Util::parseInt(params[0].s()); + + SharedHandle group = findRequestGroup(e->_requestGroupMan, gid); + if(group.isNull()) { + throw DlAbortEx + (StringFormat("No URI data is available for GID#%d", gid).str()); + } + BDE uriList = BDE::list(); + std::deque uris; + group->getURIs(uris); + for(std::deque::const_iterator i = uris.begin(); i != uris.end(); + ++i) { + BDE entry = BDE::dict(); + entry["uri"] = *i; + uriList << entry; + } + BDE resParams = BDE::list(); + resParams << uriList; + return resParams; +} + +BDE GetPeersXmlRpcMethod::process +(const XmlRpcRequest& req, DownloadEngine* e) +{ + const BDE& params = req._params; + assert(params.isList()); + + if(params.empty() || !params[0].isString()) { + throw DlAbortEx("GID is not provided."); + } + + int32_t gid = Util::parseInt(params[0].s()); + + SharedHandle group = findRequestGroup(e->_requestGroupMan, gid); + if(group.isNull()) { + throw DlAbortEx + (StringFormat("No peer data is available for GID#%d", gid).str()); + } + BDE peers = BDE::list(); + SharedHandle btctx = + dynamic_pointer_cast(group->getDownloadContext()); + if(!btctx.isNull()) { + SharedHandle btreg = e->getBtRegistry(); + SharedHandle ps = + btreg->getPeerStorage(btctx->getInfoHashAsString()); + if(!ps.isNull()) { + BDE entry = BDE::dict(); + gatherPeer(peers, ps); + } + } + BDE resParams = BDE::list(); + resParams << peers; + return resParams; +} + BDE TellStatusXmlRpcMethod::process (const XmlRpcRequest& req, DownloadEngine* e) { diff --git a/src/XmlRpcMethodImpl.h b/src/XmlRpcMethodImpl.h index 8fa220a2..ab4ab4f2 100644 --- a/src/XmlRpcMethodImpl.h +++ b/src/XmlRpcMethodImpl.h @@ -56,6 +56,21 @@ protected: virtual BDE process(const XmlRpcRequest& req, DownloadEngine* e); }; +class GetUrisXmlRpcMethod:public XmlRpcMethod { +protected: + virtual BDE process(const XmlRpcRequest& req, DownloadEngine* e); +}; + +class GetFilesXmlRpcMethod:public XmlRpcMethod { +protected: + virtual BDE process(const XmlRpcRequest& req, DownloadEngine* e); +}; + +class GetPeersXmlRpcMethod:public XmlRpcMethod { +protected: + virtual BDE process(const XmlRpcRequest& req, DownloadEngine* e); +}; + class TellStatusXmlRpcMethod:public XmlRpcMethod { protected: virtual BDE process(const XmlRpcRequest& req, DownloadEngine* e);