2008-06-09 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>

Changed -s options behavior. Now it means the number of 
connections
	made simultaneously in each http/ftp download.
	If 1 URL is specified, the behavior is the same with old 
implementation.
	If -s N is given and more than N URLs are specified, first N 
URLs are
	used and remaining URLs are used for backup. If less than N URLs 
are
	specified, some of URLs are used more than once so that totally 
N
	connections are made simultaneously.
	* src/main.cc
pull/1/head
Tatsuhiro Tsujikawa 2008-06-09 13:08:17 +00:00
parent b68fa9ea33
commit 32edb40d7d
2 changed files with 57 additions and 21 deletions

View File

@ -1,3 +1,14 @@
2008-06-09 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Changed -s options behavior. Now it means the number of connections
made simultaneously in each http/ftp download.
If 1 URL is specified, the behavior is the same with old implementation.
If -s N is given and more than N URLs are specified, first N URLs are
used and remaining URLs are used for backup. If less than N URLs are
specified, some of URLs are used more than once so that totally N
connections are made simultaneously.
* src/main.cc
2008-06-09 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Included missing iosfwd or ostream header.

View File

@ -168,23 +168,32 @@ createBtRequestGroup(const std::string& torrentFilePath,
return rg;
}
int32_t downloadBitTorrent(Option* op, const std::deque<std::string>& uri)
int32_t downloadBitTorrent(Option* op, const std::deque<std::string>& uris)
{
std::deque<std::string> nargs;
if(op->get(PREF_PARAMETERIZED_URI) == V_TRUE) {
nargs = unfoldURI(uri);
nargs = unfoldURI(uris);
} else {
nargs = uri;
nargs = uris;
}
std::deque<std::string> xargs;
ncopy(nargs.begin(), nargs.end(), op->getAsInt(PREF_SPLIT),
std::back_inserter(xargs));
RequestGroupHandle rg = createBtRequestGroup(op->get(PREF_TORRENT_FILE),
op, xargs);
RequestGroups groups;
groups.push_back(rg);
size_t numSplit = op->getAsInt(PREF_SPLIT);
if(nargs.size() >= numSplit) {
RequestGroupHandle rg = createBtRequestGroup(op->get(PREF_TORRENT_FILE),
op, nargs);
rg->setNumConcurrentCommand(numSplit);
groups.push_back(rg);
} else {
std::deque<std::string> xargs;
if(!nargs.empty()) {
ncopy(nargs.begin(), nargs.end(), numSplit, std::back_inserter(xargs));
xargs.erase(xargs.begin()+numSplit, xargs.end());
}
RequestGroupHandle rg = createBtRequestGroup(op->get(PREF_TORRENT_FILE),
op, xargs);
rg->setNumConcurrentCommand(numSplit);
groups.push_back(rg);
}
return MultiUrlRequestInfo(groups, op, getStatCalc(op), getSummaryOut(op)).execute();
}
#endif // ENABLE_BITTORRENT
@ -263,12 +272,20 @@ int32_t downloadUriList(Option* op, std::istream& in)
AccRequestGroup(groups, op));
} else if(uris.size() == 1) {
std::for_each(uris.begin(), uris.end(), AccRequestGroup(groups, op));
} else if(uris.size() > 0) {
std::deque<std::string> xuris;
ncopy(uris.begin(), uris.end(), op->getAsInt(PREF_SPLIT),
std::back_inserter(xuris));
SharedHandle<RequestGroup> rg = createRequestGroup(op, xuris);
groups.push_back(rg);
} else if(!uris.empty()) {
size_t numSplit = op->getAsInt(PREF_SPLIT);
if(uris.size() >= numSplit) {
SharedHandle<RequestGroup> rg = createRequestGroup(op, uris);
rg->setNumConcurrentCommand(numSplit);
groups.push_back(rg);
} else {
std::deque<std::string> xuris;
ncopy(uris.begin(), uris.end(), numSplit, std::back_inserter(xuris));
xuris.erase(xuris.begin()+numSplit, xuris.end());
SharedHandle<RequestGroup> rg = createRequestGroup(op, xuris);
rg->setNumConcurrentCommand(numSplit);
groups.push_back(rg);
}
}
}
return MultiUrlRequestInfo(groups, op, getStatCalc(op), getSummaryOut(op)).execute();
@ -313,11 +330,19 @@ int32_t downloadUri(Option* op, const std::deque<std::string>& uris)
std::deque<std::string>::iterator strmProtoEnd =
std::stable_partition(nargs.begin(), nargs.end(), StreamProtocolFilter());
// let's process http/ftp protocols first.
std::deque<std::string> xargs;
ncopy(nargs.begin(), strmProtoEnd, op->getAsInt(PREF_SPLIT),
std::back_inserter(xargs));
if(xargs.size()) {
size_t numSplit = op->getAsInt(PREF_SPLIT);
size_t numURIs = std::distance(nargs.begin(), strmProtoEnd);
if(numURIs >= numSplit) {
std::deque<std::string> xargs(nargs.begin(), strmProtoEnd);
RequestGroupHandle rg = createRequestGroup(op, xargs, op->get(PREF_OUT));
rg->setNumConcurrentCommand(numSplit);
groups.push_back(rg);
} else if(numURIs > 0) {
std::deque<std::string> xargs;
ncopy(nargs.begin(), strmProtoEnd, numSplit, std::back_inserter(xargs));
xargs.erase(xargs.begin()+numSplit, xargs.end());
RequestGroupHandle rg = createRequestGroup(op, xargs, op->get(PREF_OUT));
rg->setNumConcurrentCommand(numSplit);
groups.push_back(rg);
}
// process remaining URIs(local metalink, BitTorrent files)