2007-12-04 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>

Added --allow-piece-length-change option.
	* src/DefaultBtProgressInfoFile.cc
	* test/DefaultBtProgressInfoFileTest.cc
	* src/OptionHandlerFactory.cc
	* src/option_processing.cc
	* src/prefs.h
	* src/version_usage.cc
	* doc/aria2c.1.txt
	* doc/aria2c.1
	
	Fixed: duplicated result entry appears when exception is thrown 
in
	RequestGroup::createInitiateConnectionCommand().
	* src/RequestGroupMan.cc (fillRequestGroupFromReserver):
	Add RequestGroup to _requestGroup after RequetGroup::
	createInitiateConnectionCommand() succeeds.

	Externalized  message
	* src/XML2SAXMetalinkProcessor.cc
	* src/message.h
pull/1/head
Tatsuhiro Tsujikawa 2007-12-04 14:52:46 +00:00
parent ed3ebb7c22
commit 24bdbf9aa6
12 changed files with 66 additions and 9 deletions

View File

@ -1,3 +1,25 @@
2007-12-04 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Added --allow-piece-length-change option.
* src/DefaultBtProgressInfoFile.cc
* test/DefaultBtProgressInfoFileTest.cc
* src/OptionHandlerFactory.cc
* src/option_processing.cc
* src/prefs.h
* src/version_usage.cc
* doc/aria2c.1.txt
* doc/aria2c.1
Fixed: duplicated result entry appears when exception is thrown in
RequestGroup::createInitiateConnectionCommand().
* src/RequestGroupMan.cc (fillRequestGroupFromReserver):
Add RequestGroup to _requestGroup after RequetGroup::
createInitiateConnectionCommand() succeeds.
Externalized message
* src/XML2SAXMetalinkProcessor.cc
* src/message.h
2007-12-04 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Forced download abort when received negative response from http/ftp

View File

@ -1,11 +1,11 @@
.\" Title: aria2c
.\" Author:
.\" Generator: DocBook XSL Stylesheets v1.73.1 <http://docbook.sf.net/>
.\" Date: 11/29/2007
.\" Date: 12/04/2007
.\" Manual:
.\" Source:
.\"
.TH "ARIA2C" "1" "11/29/2007" "" ""
.TH "ARIA2C" "1" "12/04/2007" "" ""
.\" disable hyphenation
.nh
.\" disable justification (adjust text to left margin only)
@ -231,6 +231,12 @@ then, file name will be renamed\. See \-\-auto\-file\-renaming for details\. Def
\fIfalse\fR
.RE
.PP
\-\-allow\-piece\-length\-change=\fItrue\fR|\fIfalse\fR
.RS 4
If false is given, aria2 aborts download when a piece length is different from one in a control file\. If true is given, you can proceed but some download progress will be lost\. Default:
\fIfalse\fR
.RE
.PP
\-Z, \-\-force\-sequential[=\fItrue\fR|\fIfalse\fR]
.RS 4
Fetch URIs in the command\-line sequentially and download each URI in a separate session, like the usual command\-line download utilities\. Default:

View File

@ -147,6 +147,12 @@ OPTIONS
file name will be renamed. See --auto-file-renaming for details.
Default: 'false'
--allow-piece-length-change='true'|'false'::
If false is given, aria2 aborts download when a piece length is different
from one in a control file.
If true is given, you can proceed but some download progress will be lost.
Default: 'false'
-Z, --force-sequential[='true'|'false']::
Fetch URIs in the command-line sequentially and download each URI in a
separate session, like the usual command-line download utilities.

View File

@ -44,6 +44,7 @@
#include "File.h"
#include "Util.h"
#include "a2io.h"
#include "DownloadFailureException.h"
#include <fstream>
#include <errno.h>
@ -256,8 +257,14 @@ void DefaultBtProgressInfoFile::load()
}
_pieceStorage->addInFlightPiece(inFlightPieces);
} else {
int32_t numInFlightPiece;
in.read(reinterpret_cast<char*>(&numInFlightPiece), sizeof(numInFlightPiece));
BitfieldMan src(pieceLength, totalLength);
src.setBitfield(savedBitfield, bitfieldLength);
if((src.getCompletedLength() || numInFlightPiece) &&
!_option->getAsBool(PREF_ALLOW_PIECE_LENGTH_CHANGE)) {
throw new DownloadFailureException("WARNING: Detected a change in piece length. You can proceed with --allow-piece-length-change=true, but you may lose some download progress.");
}
BitfieldMan dest(_dctx->getPieceLength(), totalLength);
Util::convertBitfield(&dest, &src);
_pieceStorage->setBitfield(dest.getBitfield(), dest.getBitfieldLength());

View File

@ -101,6 +101,7 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers()
handlers.push_back(new BooleanOptionHandler(PREF_ENABLE_HTTP_PIPELINING));
handlers.push_back(new UnitNumberOptionHandler(PREF_NO_FILE_ALLOCATION_LIMIT, 0));
handlers.push_back(new BooleanOptionHandler(PREF_ENABLE_DIRECT_IO));
handlers.push_back(new BooleanOptionHandler(PREF_ALLOW_PIECE_LENGTH_CHANGE));
return handlers;
}

View File

@ -151,8 +151,8 @@ void RequestGroupMan::fillRequestGroupFromReserver(DownloadEngine* e)
temp.push_front(groupToAdd);
continue;
}
_requestGroups.push_back(groupToAdd);
Commands commands = groupToAdd->createInitialCommand(e);
_requestGroups.push_back(groupToAdd);
++count;
e->addCommand(commands);
} catch(RecoverableException* ex) {

View File

@ -36,6 +36,7 @@
#include "BinaryStream.h"
#include "MetalinkParserStateMachine.h"
#include "Util.h"
#include "message.h"
class SessionData {
public:
@ -127,7 +128,7 @@ MetalinkerHandle XML2SAXMetalinkProcessor::parseFile(const string& filename)
int32_t retval = xmlSAXUserParseFile(&mySAXHandler, sessionData.get(),
filename.c_str());
if(retval != 0) {
throw new DlAbortEx("Cannot parse metalink XML file. XML may be malformed.");
throw new DlAbortEx(MSG_CANNOT_PARSE_METALINK);
}
return _stm->getResult();
}
@ -153,7 +154,7 @@ MetalinkerHandle XML2SAXMetalinkProcessor::parseFromBinaryStream(const BinaryStr
break;
}
if(xmlParseChunk(ctx, (const char*)buf, res, 0) != 0) {
throw new DlAbortEx("Cannot parse metalink XML file. XML may be malformed.");
throw new DlAbortEx(MSG_CANNOT_PARSE_METALINK);
}
readOffset += res;
}
@ -161,7 +162,7 @@ MetalinkerHandle XML2SAXMetalinkProcessor::parseFromBinaryStream(const BinaryStr
xmlFreeParserCtxt(ctx);
if(!_stm->finished()) {
throw new DlAbortEx("Cannot parse metalink XML file. XML may be malformed.");
throw new DlAbortEx(MSG_CANNOT_PARSE_METALINK);
}
return _stm->getResult();
}

View File

@ -130,6 +130,7 @@
#define MSG_STRING_INTEGER_CONVERSION_FAILURE _("Failed to convert string into value: %s")
#define MSG_RESOURCE_NOT_FOUND _("Resource not found")
#define MSG_FILE_RENAMED _("File already exists. Renamed to %s.")
#define MSG_CANNOT_PARSE_METALINK _("Cannot parse metalink XML file. XML may be malformed.")
#define EX_TIME_OUT _("Timeout.")
#define EX_INVALID_CHUNK_SIZE _("Invalid chunk size.")

View File

@ -127,6 +127,7 @@ Option* option_processing(int argc, char* const argv[])
op->put(PREF_MAX_HTTP_PIPELINING, "2");
op->put(PREF_SEED_RATIO, "1.0");
op->put(PREF_ENABLE_DIRECT_IO, V_FALSE);
op->put(PREF_ALLOW_PIECE_LENGTH_CHANGE, V_FALSE);
while(1) {
int optIndex = 0;
int lopt;
@ -178,6 +179,7 @@ Option* option_processing(int argc, char* const argv[])
#ifdef ENABLE_DIRECT_IO
{ PREF_ENABLE_DIRECT_IO, optional_argument, &lopt, 210 },
#endif // ENABLE_DIRECT_IO
{ PREF_ALLOW_PIECE_LENGTH_CHANGE, required_argument, &lopt, 211 },
#if defined ENABLE_BITTORRENT || ENABLE_METALINK
{ "show-files", no_argument, NULL, 'S' },
{ "select-file", required_argument, &lopt, 21 },
@ -331,6 +333,9 @@ Option* option_processing(int argc, char* const argv[])
case 210:
cmdstream << PREF_ENABLE_DIRECT_IO << "=" << toBoolArg(optarg) << "\n";
break;
case 211:
cmdstream << PREF_ALLOW_PIECE_LENGTH_CHANGE << "=" << optarg << "\n";
break;
}
break;
}

View File

@ -117,6 +117,8 @@
#define PREF_PARAMETERIZED_URI "parameterized-uri"
// value: true | false
#define PREF_ENABLE_DIRECT_IO "enable-direct-io"
// value: true | false
#define PREF_ALLOW_PIECE_LENGTH_CHANGE "allow-piece-length-change"
/**
* FTP related preferences

View File

@ -171,9 +171,14 @@ void showUsage() {
<< DEFAULT_MSG << "false" << "\n";
#endif // ENABLE_DIRECT_IO
cout << _(" --allow-overwrite=true|false If false, aria2 doesn't download a file which\n"
" already exists but the corresponding .aria2 file\n"
" doesn't exist.\n"
" Default: false") << endl;
" already exists but the corresponding .aria2 file\n"
" doesn't exist.\n"
" Default: false") << endl;
cout << _(" --allow-piece-length-change=true|false If false is given, aria2 aborts download\n"
" when a piece length is different from one in\n"
" a control file. If true is given, you can proceed\n"
" but some download progress will be lost.") << "\n"
<< DEFAULT_MSG << "false" << "\n";
cout << _(" -Z, --force-sequential[=true|false] Fetch URIs in the command-line sequentially\n"
" and download each URI in a separate session, like\n"
" the usual command-line download utilities.\n"

View File

@ -169,6 +169,7 @@ void DefaultBtProgressInfoFileTest::testLoad_nonBt()
void DefaultBtProgressInfoFileTest::testLoad_nonBt_pieceLengthShorter()
{
initializeMembers(512, 81920);
_option->put(PREF_ALLOW_PIECE_LENGTH_CHANGE, V_TRUE);
SingleFileDownloadContextHandle dctx =
new SingleFileDownloadContext(512, 81920, "load-nonBt");