2009-05-08 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

Added addTorrentFile xml-rpc command which receives uploaded
	torrent file and add download for it.
	* src/RequestGroupMan.cc
	* src/XmlRpcMethodFactory.cc
	* src/XmlRpcMethodImpl.cc
	* src/XmlRpcMethodImpl.h
	* src/download_helper.cc
	* src/download_helper.h
pull/1/head
Tatsuhiro Tsujikawa 2009-05-08 12:23:04 +00:00
parent c659b07b86
commit c45ff588d1
7 changed files with 68 additions and 11 deletions

View File

@ -1,3 +1,14 @@
2009-05-08 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Added addTorrentFile xml-rpc command which receives uploaded
torrent file and add download for it.
* src/RequestGroupMan.cc
* src/XmlRpcMethodFactory.cc
* src/XmlRpcMethodImpl.cc
* src/XmlRpcMethodImpl.h
* src/download_helper.cc
* src/download_helper.h
2009-05-08 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net> 2009-05-08 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Added remove xml-rpc command which removes specified download. Added remove xml-rpc command which removes specified download.

View File

@ -346,6 +346,7 @@ void RequestGroupMan::fillRequestGroupFromReserver(DownloadEngine* e)
e->addCommand(commands); e->addCommand(commands);
} catch(RecoverableException& ex) { } catch(RecoverableException& ex) {
_logger->error(EX_EXCEPTION_CAUGHT, ex); _logger->error(EX_EXCEPTION_CAUGHT, ex);
groupToAdd->releaseRuntimeResource(e);
_downloadResults.push_back(groupToAdd->createDownloadResult()); _downloadResults.push_back(groupToAdd->createDownloadResult());
} }
} }

View File

@ -46,6 +46,8 @@ XmlRpcMethodFactory::create(const std::string& methodName)
{ {
if(methodName == "aria2.addURI") { if(methodName == "aria2.addURI") {
return SharedHandle<XmlRpcMethod>(new AddURIXmlRpcMethod()); return SharedHandle<XmlRpcMethod>(new AddURIXmlRpcMethod());
} else if(methodName == "aria2.addTorrent") {
return SharedHandle<XmlRpcMethod>(new AddTorrentFileXmlRpcMethod());
} else if(methodName == "aria2.remove") { } else if(methodName == "aria2.remove") {
return SharedHandle<XmlRpcMethod>(new RemoveXmlRpcMethod()); return SharedHandle<XmlRpcMethod>(new RemoveXmlRpcMethod());
} else { } else {

View File

@ -54,6 +54,14 @@ namespace aria2 {
namespace xmlrpc { namespace xmlrpc {
static BDE createGIDResponse(int32_t gid)
{
BDE resParams = BDE::list();
resParams << BDE("OK");
resParams << BDE(Util::itos(gid));
return resParams;
}
BDE AddURIXmlRpcMethod::process(const XmlRpcRequest& req, DownloadEngine* e) BDE AddURIXmlRpcMethod::process(const XmlRpcRequest& req, DownloadEngine* e)
{ {
const BDE& params = req._params; const BDE& params = req._params;
@ -80,15 +88,35 @@ BDE AddURIXmlRpcMethod::process(const XmlRpcRequest& req, DownloadEngine* e)
if(!result.empty()) { if(!result.empty()) {
e->_requestGroupMan->addReservedGroup(result.front()); e->_requestGroupMan->addReservedGroup(result.front());
BDE resParams = BDE::list(); return createGIDResponse(result.front()->getGID());
resParams << BDE("OK");
resParams << BDE(Util::itos(result.front()->getGID()));
return resParams;
} else { } else {
throw DlAbortEx("No URI to download."); throw DlAbortEx("No URI to download.");
} }
} }
BDE AddTorrentFileXmlRpcMethod::process
(const XmlRpcRequest& req, DownloadEngine* e)
{
const BDE& params = req._params;
assert(params.isList());
if(params.empty() || !params[0].isString()) {
throw DlAbortEx("Torrent data is not provided.");
}
// TODO should accect uris from xml rpc request
std::deque<SharedHandle<RequestGroup> > result;
createRequestGroupForBitTorrent(result, *e->option,
std::deque<std::string>(),
params[0].s());
if(!result.empty()) {
e->_requestGroupMan->addReservedGroup(result.front());
return createGIDResponse(result.front()->getGID());
} else {
throw DlAbortEx("No Torrent to download.");
}
}
BDE RemoveXmlRpcMethod::process(const XmlRpcRequest& req, DownloadEngine* e) BDE RemoveXmlRpcMethod::process(const XmlRpcRequest& req, DownloadEngine* e)
{ {
const BDE& params = req._params; const BDE& params = req._params;

View File

@ -51,6 +51,11 @@ protected:
virtual BDE process(const XmlRpcRequest& req, DownloadEngine* e); virtual BDE process(const XmlRpcRequest& req, DownloadEngine* e);
}; };
class AddTorrentFileXmlRpcMethod:public XmlRpcMethod {
protected:
virtual BDE process(const XmlRpcRequest& req, DownloadEngine* e);
};
class FailXmlRpcMethod:public XmlRpcMethod { class FailXmlRpcMethod:public XmlRpcMethod {
protected: protected:
virtual BDE process(const XmlRpcRequest& req, DownloadEngine* e); virtual BDE process(const XmlRpcRequest& req, DownloadEngine* e);

View File

@ -132,12 +132,17 @@ SharedHandle<RequestGroup>
createBtRequestGroup(const std::string& torrentFilePath, createBtRequestGroup(const std::string& torrentFilePath,
const Option& op, const Option& op,
const std::deque<std::string>& auxUris, const std::deque<std::string>& auxUris,
const Option& requestOption) const Option& requestOption,
const std::string& torrentData = "")
{ {
SharedHandle<RequestGroup> rg(new RequestGroup(&op, auxUris)); SharedHandle<RequestGroup> rg(new RequestGroup(&op, auxUris));
SharedHandle<DefaultBtContext> btContext(new DefaultBtContext()); SharedHandle<DefaultBtContext> btContext(new DefaultBtContext());
btContext->setDir(requestOption.get(PREF_DIR)); btContext->setDir(requestOption.get(PREF_DIR));
if(torrentData.empty()) {
btContext->load(torrentFilePath);// may throw exception btContext->load(torrentFilePath);// may throw exception
} else {
btContext->loadFromMemory(torrentData, "default"); // may throw exception
}
if(op.defined(PREF_PEER_ID_PREFIX)) { if(op.defined(PREF_PEER_ID_PREFIX)) {
btContext->setPeerIdPrefix(op.get(PREF_PEER_ID_PREFIX)); btContext->setPeerIdPrefix(op.get(PREF_PEER_ID_PREFIX));
} }
@ -158,7 +163,8 @@ createBtRequestGroup(const std::string& torrentFilePath,
void createRequestGroupForBitTorrent void createRequestGroupForBitTorrent
(std::deque<SharedHandle<RequestGroup> >& result, const Option& op, (std::deque<SharedHandle<RequestGroup> >& result, const Option& op,
const std::deque<std::string>& uris) const std::deque<std::string>& uris,
const std::string& torrentData)
{ {
std::deque<std::string> nargs; std::deque<std::string> nargs;
if(op.get(PREF_PARAMETERIZED_URI) == V_TRUE) { if(op.get(PREF_PARAMETERIZED_URI) == V_TRUE) {
@ -171,7 +177,8 @@ void createRequestGroupForBitTorrent
std::deque<std::string> auxUris; std::deque<std::string> auxUris;
splitURI(auxUris, nargs.begin(), nargs.end(), numSplit); splitURI(auxUris, nargs.begin(), nargs.end(), numSplit);
SharedHandle<RequestGroup> rg = SharedHandle<RequestGroup> rg =
createBtRequestGroup(op.get(PREF_TORRENT_FILE), op, auxUris, op); createBtRequestGroup(op.get(PREF_TORRENT_FILE), op, auxUris, op,
torrentData);
rg->setNumConcurrentCommand(numSplit); rg->setNumConcurrentCommand(numSplit);
result.push_back(rg); result.push_back(rg);
} }

View File

@ -51,11 +51,14 @@ class Option;
const std::vector<std::string>& listRequestOptions(); const std::vector<std::string>& listRequestOptions();
#ifdef ENABLE_BITTORRENT #ifdef ENABLE_BITTORRENT
// Create RequestGroup object using torrent file specified by torrent-file // Create RequestGroup object using torrent file specified by
// option. In this function, force-sequential is ignored. // torrent-file option. If torrentData is specified, then it is used
// as a content of torrent file in stead. In this function,
// force-sequential is ignored.
void createRequestGroupForBitTorrent void createRequestGroupForBitTorrent
(std::deque<SharedHandle<RequestGroup> >& result, const Option& op, (std::deque<SharedHandle<RequestGroup> >& result, const Option& op,
const std::deque<std::string>& uris); const std::deque<std::string>& uris,
const std::string& torrentData = "");
#endif // ENABLE_BITTORRENT #endif // ENABLE_BITTORRENT
#ifdef ENABLE_METALINK #ifdef ENABLE_METALINK