|
@@ -92,13 +92,13 @@ static void splitURI(std::deque<std::string>& result,
|
|
}
|
|
}
|
|
|
|
|
|
static SharedHandle<RequestGroup> createRequestGroup
|
|
static SharedHandle<RequestGroup> createRequestGroup
|
|
-(const Option* op, const std::deque<std::string>& uris,
|
|
|
|
|
|
+(const Option& op, const std::deque<std::string>& uris,
|
|
const Option& requestOption,
|
|
const Option& requestOption,
|
|
bool useOutOption = false)
|
|
bool useOutOption = false)
|
|
{
|
|
{
|
|
- SharedHandle<RequestGroup> rg(new RequestGroup(op, uris));
|
|
|
|
|
|
+ SharedHandle<RequestGroup> rg(new RequestGroup(&op, uris));
|
|
SharedHandle<SingleFileDownloadContext> dctx
|
|
SharedHandle<SingleFileDownloadContext> dctx
|
|
- (new SingleFileDownloadContext(op->getAsInt(PREF_SEGMENT_SIZE),
|
|
|
|
|
|
+ (new SingleFileDownloadContext(op.getAsInt(PREF_SEGMENT_SIZE),
|
|
0,
|
|
0,
|
|
A2STR::NIL,
|
|
A2STR::NIL,
|
|
useOutOption&&!requestOption.blank(PREF_OUT)?
|
|
useOutOption&&!requestOption.blank(PREF_OUT)?
|
|
@@ -114,16 +114,16 @@ static SharedHandle<RequestGroup> createRequestGroup
|
|
static
|
|
static
|
|
SharedHandle<RequestGroup>
|
|
SharedHandle<RequestGroup>
|
|
createBtRequestGroup(const std::string& torrentFilePath,
|
|
createBtRequestGroup(const std::string& torrentFilePath,
|
|
- Option* op,
|
|
|
|
|
|
+ const Option& op,
|
|
const std::deque<std::string>& auxUris,
|
|
const std::deque<std::string>& auxUris,
|
|
const Option& requestOption)
|
|
const Option& requestOption)
|
|
{
|
|
{
|
|
- 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));
|
|
btContext->load(torrentFilePath);// may throw exception
|
|
btContext->load(torrentFilePath);// may throw exception
|
|
- if(op->defined(PREF_PEER_ID_PREFIX)) {
|
|
|
|
- btContext->setPeerIdPrefix(op->get(PREF_PEER_ID_PREFIX));
|
|
|
|
|
|
+ if(op.defined(PREF_PEER_ID_PREFIX)) {
|
|
|
|
+ btContext->setPeerIdPrefix(op.get(PREF_PEER_ID_PREFIX));
|
|
}
|
|
}
|
|
btContext->setFileFilter
|
|
btContext->setFileFilter
|
|
(Util::parseIntRange(requestOption.get(PREF_SELECT_FILE)));
|
|
(Util::parseIntRange(requestOption.get(PREF_SELECT_FILE)));
|
|
@@ -141,21 +141,21 @@ createBtRequestGroup(const std::string& torrentFilePath,
|
|
}
|
|
}
|
|
|
|
|
|
void createRequestGroupForBitTorrent
|
|
void createRequestGroupForBitTorrent
|
|
-(std::deque<SharedHandle<RequestGroup> >& result, Option* op,
|
|
|
|
|
|
+(std::deque<SharedHandle<RequestGroup> >& result, const Option& op,
|
|
const std::deque<std::string>& uris)
|
|
const std::deque<std::string>& uris)
|
|
{
|
|
{
|
|
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) {
|
|
unfoldURI(nargs, uris);
|
|
unfoldURI(nargs, uris);
|
|
} else {
|
|
} else {
|
|
nargs = uris;
|
|
nargs = uris;
|
|
}
|
|
}
|
|
// we ignore -Z option here
|
|
// we ignore -Z option here
|
|
- size_t numSplit = op->getAsInt(PREF_SPLIT);
|
|
|
|
|
|
+ size_t numSplit = op.getAsInt(PREF_SPLIT);
|
|
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);
|
|
rg->setNumConcurrentCommand(numSplit);
|
|
rg->setNumConcurrentCommand(numSplit);
|
|
result.push_back(rg);
|
|
result.push_back(rg);
|
|
}
|
|
}
|
|
@@ -164,9 +164,9 @@ void createRequestGroupForBitTorrent
|
|
|
|
|
|
#ifdef ENABLE_METALINK
|
|
#ifdef ENABLE_METALINK
|
|
void createRequestGroupForMetalink
|
|
void createRequestGroupForMetalink
|
|
-(std::deque<SharedHandle<RequestGroup> >& result, Option* op)
|
|
|
|
|
|
+(std::deque<SharedHandle<RequestGroup> >& result, const Option& op)
|
|
{
|
|
{
|
|
- Metalink2RequestGroup(op).generate(result, op->get(PREF_METALINK_FILE), *op);
|
|
|
|
|
|
+ Metalink2RequestGroup(&op).generate(result, op.get(PREF_METALINK_FILE), op);
|
|
if(result.empty()) {
|
|
if(result.empty()) {
|
|
throw FatalException(MSG_NO_FILES_TO_DOWNLOAD);
|
|
throw FatalException(MSG_NO_FILES_TO_DOWNLOAD);
|
|
}
|
|
}
|
|
@@ -177,11 +177,11 @@ class AccRequestGroup {
|
|
private:
|
|
private:
|
|
std::deque<SharedHandle<RequestGroup> >& _requestGroups;
|
|
std::deque<SharedHandle<RequestGroup> >& _requestGroups;
|
|
ProtocolDetector _detector;
|
|
ProtocolDetector _detector;
|
|
- Option* _op;
|
|
|
|
|
|
+ const Option& _op;
|
|
const Option& _requestOption;
|
|
const Option& _requestOption;
|
|
public:
|
|
public:
|
|
AccRequestGroup(std::deque<SharedHandle<RequestGroup> >& requestGroups,
|
|
AccRequestGroup(std::deque<SharedHandle<RequestGroup> >& requestGroups,
|
|
- Option* op,
|
|
|
|
|
|
+ const Option& op,
|
|
const Option& requestOption):
|
|
const Option& requestOption):
|
|
_requestGroups(requestGroups), _op(op), _requestOption(requestOption) {}
|
|
_requestGroups(requestGroups), _op(op), _requestOption(requestOption) {}
|
|
|
|
|
|
@@ -190,7 +190,7 @@ public:
|
|
{
|
|
{
|
|
if(_detector.isStreamProtocol(uri)) {
|
|
if(_detector.isStreamProtocol(uri)) {
|
|
std::deque<std::string> streamURIs;
|
|
std::deque<std::string> streamURIs;
|
|
- size_t numSplit = _op->getAsInt(PREF_SPLIT);
|
|
|
|
|
|
+ size_t numSplit = _op.getAsInt(PREF_SPLIT);
|
|
for(size_t i = 0; i < numSplit; ++i) {
|
|
for(size_t i = 0; i < numSplit; ++i) {
|
|
streamURIs.push_back(uri);
|
|
streamURIs.push_back(uri);
|
|
}
|
|
}
|
|
@@ -215,7 +215,7 @@ public:
|
|
#ifdef ENABLE_METALINK
|
|
#ifdef ENABLE_METALINK
|
|
else if(_detector.guessMetalinkFile(uri)) {
|
|
else if(_detector.guessMetalinkFile(uri)) {
|
|
try {
|
|
try {
|
|
- Metalink2RequestGroup(_op).generate(_requestGroups, uri,
|
|
|
|
|
|
+ Metalink2RequestGroup(&_op).generate(_requestGroups, uri,
|
|
_requestOption);
|
|
_requestOption);
|
|
} catch(RecoverableException& e) {
|
|
} catch(RecoverableException& e) {
|
|
// error occurred while parsing metalink file.
|
|
// error occurred while parsing metalink file.
|
|
@@ -247,16 +247,16 @@ static void copyIfndef(Option& dest, const Option& src, const std::string& name)
|
|
}
|
|
}
|
|
|
|
|
|
static void createRequestGroupForUri
|
|
static void createRequestGroupForUri
|
|
-(std::deque<SharedHandle<RequestGroup> >& result, Option* op,
|
|
|
|
|
|
+(std::deque<SharedHandle<RequestGroup> >& result, const Option& op,
|
|
const std::deque<std::string>& uris, const Option& requestOption)
|
|
const std::deque<std::string>& uris, const Option& requestOption)
|
|
{
|
|
{
|
|
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) {
|
|
unfoldURI(nargs, uris);
|
|
unfoldURI(nargs, uris);
|
|
} else {
|
|
} else {
|
|
nargs = uris;
|
|
nargs = uris;
|
|
}
|
|
}
|
|
- if(op->get(PREF_FORCE_SEQUENTIAL) == V_TRUE) {
|
|
|
|
|
|
+ if(op.get(PREF_FORCE_SEQUENTIAL) == V_TRUE) {
|
|
std::for_each(nargs.begin(), nargs.end(),
|
|
std::for_each(nargs.begin(), nargs.end(),
|
|
AccRequestGroup(result, op, requestOption));
|
|
AccRequestGroup(result, op, requestOption));
|
|
} else {
|
|
} else {
|
|
@@ -264,7 +264,7 @@ static void createRequestGroupForUri
|
|
std::stable_partition(nargs.begin(), nargs.end(), StreamProtocolFilter());
|
|
std::stable_partition(nargs.begin(), nargs.end(), StreamProtocolFilter());
|
|
// let's process http/ftp protocols first.
|
|
// let's process http/ftp protocols first.
|
|
if(nargs.begin() != strmProtoEnd) {
|
|
if(nargs.begin() != strmProtoEnd) {
|
|
- size_t numSplit = op->getAsInt(PREF_SPLIT);
|
|
|
|
|
|
+ size_t numSplit = op.getAsInt(PREF_SPLIT);
|
|
std::deque<std::string> streamURIs;
|
|
std::deque<std::string> streamURIs;
|
|
splitURI(streamURIs, nargs.begin(), strmProtoEnd,
|
|
splitURI(streamURIs, nargs.begin(), strmProtoEnd,
|
|
numSplit);
|
|
numSplit);
|
|
@@ -280,10 +280,10 @@ static void createRequestGroupForUri
|
|
}
|
|
}
|
|
|
|
|
|
void createRequestGroupForUri
|
|
void createRequestGroupForUri
|
|
-(std::deque<SharedHandle<RequestGroup> >& result, Option* op,
|
|
|
|
|
|
+(std::deque<SharedHandle<RequestGroup> >& result, const Option& op,
|
|
const std::deque<std::string>& uris)
|
|
const std::deque<std::string>& uris)
|
|
{
|
|
{
|
|
- createRequestGroupForUri(result, op, uris, *op);
|
|
|
|
|
|
+ createRequestGroupForUri(result, op, uris, op);
|
|
}
|
|
}
|
|
|
|
|
|
template<typename InputIterator>
|
|
template<typename InputIterator>
|
|
@@ -296,7 +296,8 @@ static void foreachCopyIfndef(InputIterator first, InputIterator last,
|
|
}
|
|
}
|
|
|
|
|
|
static void createRequestGroupForUriList
|
|
static void createRequestGroupForUriList
|
|
-(std::deque<SharedHandle<RequestGroup> >& result, Option* op, std::istream& in)
|
|
|
|
|
|
+(std::deque<SharedHandle<RequestGroup> >& result, const Option& op,
|
|
|
|
+ std::istream& in)
|
|
{
|
|
{
|
|
UriListParser p(in);
|
|
UriListParser p(in);
|
|
while(p.hasNext()) {
|
|
while(p.hasNext()) {
|
|
@@ -316,24 +317,24 @@ static void createRequestGroupForUriList
|
|
};
|
|
};
|
|
foreachCopyIfndef(&REQUEST_OPTIONS[0],
|
|
foreachCopyIfndef(&REQUEST_OPTIONS[0],
|
|
&REQUEST_OPTIONS[arrayLength(REQUEST_OPTIONS)],
|
|
&REQUEST_OPTIONS[arrayLength(REQUEST_OPTIONS)],
|
|
- requestOption, *op);
|
|
|
|
|
|
+ requestOption, op);
|
|
|
|
|
|
createRequestGroupForUri(result, op, uris, requestOption);
|
|
createRequestGroupForUri(result, op, uris, requestOption);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void createRequestGroupForUriList
|
|
void createRequestGroupForUriList
|
|
-(std::deque<SharedHandle<RequestGroup> >& result, Option* op)
|
|
|
|
|
|
+(std::deque<SharedHandle<RequestGroup> >& result, const Option& op)
|
|
{
|
|
{
|
|
- if(op->get(PREF_INPUT_FILE) == "-") {
|
|
|
|
|
|
+ if(op.get(PREF_INPUT_FILE) == "-") {
|
|
createRequestGroupForUriList(result, op, std::cin);
|
|
createRequestGroupForUriList(result, op, std::cin);
|
|
} else {
|
|
} else {
|
|
- if(!File(op->get(PREF_INPUT_FILE)).isFile()) {
|
|
|
|
|
|
+ if(!File(op.get(PREF_INPUT_FILE)).isFile()) {
|
|
throw FatalException
|
|
throw FatalException
|
|
- (StringFormat(EX_FILE_OPEN, op->get(PREF_INPUT_FILE).c_str(),
|
|
|
|
|
|
+ (StringFormat(EX_FILE_OPEN, op.get(PREF_INPUT_FILE).c_str(),
|
|
"No such file").str());
|
|
"No such file").str());
|
|
}
|
|
}
|
|
- std::ifstream f(op->get(PREF_INPUT_FILE).c_str(), std::ios::binary);
|
|
|
|
|
|
+ std::ifstream f(op.get(PREF_INPUT_FILE).c_str(), std::ios::binary);
|
|
createRequestGroupForUriList(result, op, f);
|
|
createRequestGroupForUriList(result, op, f);
|
|
}
|
|
}
|
|
}
|
|
}
|