diff --git a/ChangeLog b/ChangeLog index 983bacf1..7d5f8cc6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2008-07-08 Tatsuhiro Tsujikawa + + Added --bt-seed option. If --bt-seed=true is given at the command-line, + aria2 seeds previously downloaded files without validating piece hashs. + * src/HelpItemFactory.cc + * src/OptionHandlerFactory.cc + * src/RequestGroup.cc + * src/option_processing.cc + * src/prefs.cc + * src/prefs.h + * src/usage_text.h + 2008-07-08 Tatsuhiro Tsujikawa Updated DESCRIPTION of man page. diff --git a/src/HelpItemFactory.cc b/src/HelpItemFactory.cc index e230b19a..29c8cf32 100644 --- a/src/HelpItemFactory.cc +++ b/src/HelpItemFactory.cc @@ -390,6 +390,13 @@ TagContainerHandle HelpItemFactory::createHelpItems(const Option* op) item->addTag(TAG_BITTORRENT); tc->addItem(item); } + { + HelpItemHandle item(new HelpItem(PREF_BT_SEED, + TEXT_BT_SEED, + op->get(PREF_BT_SEED))); + item->addTag(TAG_BITTORRENT); + tc->addItem(item); + } #endif // ENABLE_BITTORRENT #ifdef ENABLE_METALINK { diff --git a/src/OptionHandlerFactory.cc b/src/OptionHandlerFactory.cc index 78a9acc0..afeb53a0 100644 --- a/src/OptionHandlerFactory.cc +++ b/src/OptionHandlerFactory.cc @@ -142,6 +142,7 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers() std::deque(¶ms[0], ¶ms[arrayLength(params)])))); } + handlers.push_back(SH(new BooleanOptionHandler(PREF_BT_SEED))); return handlers; } diff --git a/src/RequestGroup.cc b/src/RequestGroup.cc index 84222272..b8fad1d6 100644 --- a/src/RequestGroup.cc +++ b/src/RequestGroup.cc @@ -239,15 +239,19 @@ void RequestGroup::createInitialCommand(std::deque& commands, } else { if(_pieceStorage->getDiskAdaptor()->fileExists()) { if(!_option->getAsBool(PREF_CHECK_INTEGRITY) && - !_option->getAsBool(PREF_ALLOW_OVERWRITE)) { + !_option->getAsBool(PREF_ALLOW_OVERWRITE) && + !_option->getAsBool(PREF_BT_SEED)) { // TODO we need this->haltRequested = true? throw DownloadFailureException - (StringFormat(MSG_FILE_ALREADY_EXISTS, - _pieceStorage->getDiskAdaptor()->getFilePath().c_str() - ).str()); + (StringFormat + (MSG_FILE_ALREADY_EXISTS, + _pieceStorage->getDiskAdaptor()->getFilePath().c_str()).str()); } else { _pieceStorage->getDiskAdaptor()->openFile(); } + if(_option->getAsBool(PREF_BT_SEED)) { + _pieceStorage->markAllPiecesDone(); + } } else { _pieceStorage->getDiskAdaptor()->openFile(); } @@ -269,8 +273,14 @@ void RequestGroup::createInitialCommand(std::deque& commands, } } CheckIntegrityEntryHandle entry(new BtCheckIntegrityEntry(this)); - - processCheckIntegrityEntry(commands, entry, e); + // --bt-seed=true is given and download has completed, skip validation for + // piece hashes. + if(_option->getAsBool(PREF_BT_SEED) && + _pieceStorage->downloadFinished()) { + entry->onDownloadFinished(commands, e); + } else { + processCheckIntegrityEntry(commands, entry, e); + } return; } } diff --git a/src/option_processing.cc b/src/option_processing.cc index 3dcd034e..8d8eda35 100644 --- a/src/option_processing.cc +++ b/src/option_processing.cc @@ -145,6 +145,7 @@ Option* createDefaultOption() op->put(PREF_BT_REQUIRE_CRYPTO, V_FALSE); op->put(PREF_BT_REQUEST_PEER_SPEED_LIMIT, "51200"); op->put(PREF_BT_MAX_OPEN_FILES, "100"); + op->put(PREF_BT_SEED, V_FALSE); op->put(PREF_QUIET, V_FALSE); op->put(PREF_STOP, "0"); #ifdef ENABLE_ASYNC_DNS @@ -255,7 +256,8 @@ Option* option_processing(int argc, char* const argv[]) { PREF_BT_MIN_CRYPTO_LEVEL.c_str(), required_argument, &lopt, 30 }, { PREF_BT_REQUIRE_CRYPTO.c_str(), required_argument, &lopt, 31 }, { PREF_BT_REQUEST_PEER_SPEED_LIMIT.c_str(), required_argument, &lopt, 32 }, - { PREF_BT_MAX_OPEN_FILES.c_str(), required_argument, &lopt, 33}, + { PREF_BT_MAX_OPEN_FILES.c_str(), required_argument, &lopt, 33 }, + { PREF_BT_SEED.c_str(), optional_argument, &lopt, 34 }, #endif // ENABLE_BITTORRENT #ifdef ENABLE_METALINK { PREF_METALINK_FILE.c_str(), required_argument, NULL, 'M' }, @@ -372,6 +374,9 @@ Option* option_processing(int argc, char* const argv[]) case 33: cmdstream << PREF_BT_MAX_OPEN_FILES << "=" << optarg << "\n"; break; + case 34: + cmdstream << PREF_BT_SEED << "=" << toBoolArg(optarg) << "\n"; + break; case 100: cmdstream << PREF_METALINK_VERSION << "=" << optarg << "\n"; break; diff --git a/src/prefs.cc b/src/prefs.cc index 86548f46..f7cbf79a 100644 --- a/src/prefs.cc +++ b/src/prefs.cc @@ -251,6 +251,8 @@ const std::string PREF_BT_REQUIRE_CRYPTO("bt-require-crypto"); const std::string PREF_BT_REQUEST_PEER_SPEED_LIMIT("bt-request-peer-speed-limit"); // values: 1*digit const std::string PREF_BT_MAX_OPEN_FILES("bt-max-open-files"); +// values: true | false +const std::string PREF_BT_SEED("bt-seed"); /** * Metalink related preferences diff --git a/src/prefs.h b/src/prefs.h index 6e87813a..43e9e057 100644 --- a/src/prefs.h +++ b/src/prefs.h @@ -255,6 +255,8 @@ extern const std::string PREF_BT_REQUIRE_CRYPTO; extern const std::string PREF_BT_REQUEST_PEER_SPEED_LIMIT; // values: 1*digit extern const std::string PREF_BT_MAX_OPEN_FILES; +// values: true | false +extern const std::string PREF_BT_SEED; /** * Metalink related preferences diff --git a/src/usage_text.h b/src/usage_text.h index 8377e0df..19fa3e02 100644 --- a/src/usage_text.h +++ b/src/usage_text.h @@ -284,6 +284,9 @@ _(" --bt-request-peer-speed-limit=SPEED In BitTorrent downloads, if the download #define TEXT_BT_MAX_OPEN_FILES \ _(" --bt-max-open-files=NUM Specify maximum number of files to open in each\n"\ " BitTorrent download.") +#define TEXT_BT_SEED \ +_(" --bt-seed[=true|false] Seed previously downloaded files without\n"\ + " validating piece hashes.") #define TEXT_METALINK_FILE \ _(" -M, --metalink-file=METALINK_FILE The file path to the .metalink file.") #define TEXT_METALINK_SERVERS \