2008-05-11 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>

Changed method signature:
	PostDownloadHandler::getNextRequestGroups
	Metalink2RequestGroup::generate
	RequestGroup::postDownloadProcessing
	* src/BtPostDownloadHandler.cc
	* src/BtPostDownloadHandler.h
	* src/Metalink2RequestGroup.cc
	* src/Metalink2RequestGroup.h
	* src/MetalinkPostDownloadHandler.cc
	* src/MetalinkPostDownloadHandler.h
	* src/PostDownloadHandler.h
	* src/RequestGroup.cc
	* src/RequestGroup.h
	* src/RequestGroupMan.cc
	* src/main.cc
	* test/BtPostDownloadHandlerTest.cc
	* test/Metalink2RequestGroupTest.cc
	* test/MetalinkPostDownloadHandlerTest.cc
pull/1/head
Tatsuhiro Tsujikawa 2008-05-11 13:59:27 +00:00
parent 3884d710d3
commit b96eb7fd79
15 changed files with 73 additions and 42 deletions

View File

@ -1,3 +1,24 @@
2008-05-11 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Changed method signature:
PostDownloadHandler::getNextRequestGroups
Metalink2RequestGroup::generate
RequestGroup::postDownloadProcessing
* src/BtPostDownloadHandler.cc
* src/BtPostDownloadHandler.h
* src/Metalink2RequestGroup.cc
* src/Metalink2RequestGroup.h
* src/MetalinkPostDownloadHandler.cc
* src/MetalinkPostDownloadHandler.h
* src/PostDownloadHandler.h
* src/RequestGroup.cc
* src/RequestGroup.h
* src/RequestGroupMan.cc
* src/main.cc
* test/BtPostDownloadHandlerTest.cc
* test/Metalink2RequestGroupTest.cc
* test/MetalinkPostDownloadHandlerTest.cc
2008-05-11 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com> 2008-05-11 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Rewritten AccRequestGroup Rewritten AccRequestGroup

View File

@ -58,7 +58,9 @@ BtPostDownloadHandler::BtPostDownloadHandler()
BtPostDownloadHandler::~BtPostDownloadHandler() {} BtPostDownloadHandler::~BtPostDownloadHandler() {}
RequestGroups BtPostDownloadHandler::getNextRequestGroups(RequestGroup* requestGroup) void BtPostDownloadHandler::getNextRequestGroups
(std::deque<SharedHandle<RequestGroup> >& groups,
RequestGroup* requestGroup)
{ {
const Option* op = requestGroup->getOption(); const Option* op = requestGroup->getOption();
_logger->debug("Generating RequestGroups for Torrent file %s", _logger->debug("Generating RequestGroups for Torrent file %s",
@ -83,9 +85,7 @@ RequestGroups BtPostDownloadHandler::getNextRequestGroups(RequestGroup* requestG
rg->setDownloadContext(btContext); rg->setDownloadContext(btContext);
btContext->setOwnerRequestGroup(rg.get()); btContext->setOwnerRequestGroup(rg.get());
RequestGroups groups;
groups.push_back(rg); groups.push_back(rg);
return groups;
} }
} // namespace aria2 } // namespace aria2

View File

@ -46,8 +46,9 @@ public:
virtual ~BtPostDownloadHandler(); virtual ~BtPostDownloadHandler();
virtual std::deque<SharedHandle<RequestGroup> > virtual void
getNextRequestGroups(RequestGroup* requestGroup); getNextRequestGroups(std::deque<SharedHandle<RequestGroup> >& groups,
RequestGroup* requestGroup);
}; };
typedef SharedHandle<BtPostDownloadHandler> BtPostDownloadHandlerHandle; typedef SharedHandle<BtPostDownloadHandler> BtPostDownloadHandlerHandle;

View File

@ -98,28 +98,32 @@ public:
} }
}; };
std::deque<SharedHandle<RequestGroup> > void
Metalink2RequestGroup::generate(const std::string& metalinkFile) Metalink2RequestGroup::generate(std::deque<SharedHandle<RequestGroup> >& groups,
const std::string& metalinkFile)
{ {
std::deque<SharedHandle<MetalinkEntry> > entries = MetalinkHelper::parseAndQuery(metalinkFile, std::deque<SharedHandle<MetalinkEntry> > entries = MetalinkHelper::parseAndQuery(metalinkFile,
_option); _option);
return createRequestGroup(entries); createRequestGroup(groups, entries);
} }
std::deque<SharedHandle<RequestGroup> > void
Metalink2RequestGroup::generate(const SharedHandle<BinaryStream>& binaryStream) Metalink2RequestGroup::generate(std::deque<SharedHandle<RequestGroup> >& groups,
const SharedHandle<BinaryStream>& binaryStream)
{ {
std::deque<SharedHandle<MetalinkEntry> > entries = MetalinkHelper::parseAndQuery(binaryStream, std::deque<SharedHandle<MetalinkEntry> > entries = MetalinkHelper::parseAndQuery(binaryStream,
_option); _option);
return createRequestGroup(entries); createRequestGroup(groups, entries);
} }
std::deque<SharedHandle<RequestGroup> > void
Metalink2RequestGroup::createRequestGroup(std::deque<SharedHandle<MetalinkEntry> > entries) Metalink2RequestGroup::createRequestGroup
(std::deque<SharedHandle<RequestGroup> >& groups,
std::deque<SharedHandle<MetalinkEntry> > entries)
{ {
if(entries.size() == 0) { if(entries.size() == 0) {
_logger->notice(EX_NO_RESULT_WITH_YOUR_PREFS); _logger->notice(EX_NO_RESULT_WITH_YOUR_PREFS);
return std::deque<SharedHandle<RequestGroup> >(); return;
} }
std::deque<int32_t> selectIndexes = Util::parseIntRange(_option->get(PREF_SELECT_FILE)).flush(); std::deque<int32_t> selectIndexes = Util::parseIntRange(_option->get(PREF_SELECT_FILE)).flush();
bool useIndex; bool useIndex;
@ -128,7 +132,6 @@ Metalink2RequestGroup::createRequestGroup(std::deque<SharedHandle<MetalinkEntry>
} else { } else {
useIndex = false; useIndex = false;
} }
std::deque<SharedHandle<RequestGroup> > groups;
unsigned int count = 0; unsigned int count = 0;
for(std::deque<SharedHandle<MetalinkEntry> >::iterator itr = entries.begin(); itr != entries.end(); for(std::deque<SharedHandle<MetalinkEntry> >::iterator itr = entries.begin(); itr != entries.end();
itr++, ++count) { itr++, ++count) {
@ -235,7 +238,6 @@ Metalink2RequestGroup::createRequestGroup(std::deque<SharedHandle<MetalinkEntry>
#endif // ENABLE_BITTORRENT #endif // ENABLE_BITTORRENT
groups.push_back(rg); groups.push_back(rg);
} }
return groups;
} }
} // namespace aria2 } // namespace aria2

View File

@ -54,16 +54,19 @@ private:
Logger* _logger; Logger* _logger;
std::deque<SharedHandle<RequestGroup> > void
createRequestGroup(std::deque<SharedHandle<MetalinkEntry> > entries); createRequestGroup(std::deque<SharedHandle<RequestGroup> >& groups,
std::deque<SharedHandle<MetalinkEntry> > entries);
public: public:
Metalink2RequestGroup(const Option* option); Metalink2RequestGroup(const Option* option);
~Metalink2RequestGroup(); ~Metalink2RequestGroup();
std::deque<SharedHandle<RequestGroup> > generate(const std::string& metalinkFile); void generate(std::deque<SharedHandle<RequestGroup> >& groups,
const std::string& metalinkFile);
std::deque<SharedHandle<RequestGroup> > generate(const SharedHandle<BinaryStream>& binaryStream); void generate(std::deque<SharedHandle<RequestGroup> >& groups,
const SharedHandle<BinaryStream>& binaryStream);
}; };
} // namespace aria2 } // namespace aria2

View File

@ -54,8 +54,9 @@ MetalinkPostDownloadHandler::MetalinkPostDownloadHandler()
MetalinkPostDownloadHandler::~MetalinkPostDownloadHandler() {} MetalinkPostDownloadHandler::~MetalinkPostDownloadHandler() {}
std::deque<SharedHandle<RequestGroup> > void MetalinkPostDownloadHandler::getNextRequestGroups
MetalinkPostDownloadHandler::getNextRequestGroups(RequestGroup* requestGroup) (std::deque<SharedHandle<RequestGroup> >& groups,
RequestGroup* requestGroup)
{ {
const Option* op = requestGroup->getOption(); const Option* op = requestGroup->getOption();
_logger->debug("Generating RequestGroups for Metalink file %s", _logger->debug("Generating RequestGroups for Metalink file %s",
@ -63,9 +64,8 @@ MetalinkPostDownloadHandler::getNextRequestGroups(RequestGroup* requestGroup)
SharedHandle<DiskAdaptor> diskAdaptor = requestGroup->getPieceStorage()->getDiskAdaptor(); SharedHandle<DiskAdaptor> diskAdaptor = requestGroup->getPieceStorage()->getDiskAdaptor();
try { try {
diskAdaptor->openExistingFile(); diskAdaptor->openExistingFile();
std::deque<SharedHandle<RequestGroup> > rgs = Metalink2RequestGroup(op).generate(diskAdaptor); Metalink2RequestGroup(op).generate(groups, diskAdaptor);
diskAdaptor->closeFile(); diskAdaptor->closeFile();
return rgs;
} catch(Exception& e) { } catch(Exception& e) {
diskAdaptor->closeFile(); diskAdaptor->closeFile();
throw; throw;

View File

@ -46,8 +46,9 @@ public:
virtual ~MetalinkPostDownloadHandler(); virtual ~MetalinkPostDownloadHandler();
virtual std::deque<SharedHandle<RequestGroup> > virtual void
getNextRequestGroups(RequestGroup* requestGroup); getNextRequestGroups(std::deque<SharedHandle<RequestGroup> >& groups,
RequestGroup* requestGroup);
}; };
typedef SharedHandle<MetalinkPostDownloadHandler> MetalinkPostDownloadHandlerHandle; typedef SharedHandle<MetalinkPostDownloadHandler> MetalinkPostDownloadHandlerHandle;

View File

@ -46,8 +46,9 @@ public:
virtual ~PostDownloadHandler() {} virtual ~PostDownloadHandler() {}
virtual std::deque<SharedHandle<RequestGroup> > virtual void
getNextRequestGroups(RequestGroup* requestGroup) = 0; getNextRequestGroups(std::deque<SharedHandle<RequestGroup> >& groups,
RequestGroup* requestGroup) = 0;
}; };
typedef SharedHandle<PostDownloadHandler> PostDownloadHandlerHandle; typedef SharedHandle<PostDownloadHandler> PostDownloadHandlerHandle;

View File

@ -706,22 +706,22 @@ void RequestGroup::preDownloadProcessing()
return; return;
} }
RequestGroups RequestGroup::postDownloadProcessing() void RequestGroup::postDownloadProcessing
(std::deque<SharedHandle<RequestGroup> >& groups)
{ {
_logger->debug("Finding PostDownloadHandler for path %s.", getFilePath().c_str()); _logger->debug("Finding PostDownloadHandler for path %s.", getFilePath().c_str());
try { try {
for(PostDownloadHandlers::const_iterator itr = _postDownloadHandlers.begin(); for(PostDownloadHandlers::const_iterator itr = _postDownloadHandlers.begin();
itr != _postDownloadHandlers.end(); ++itr) { itr != _postDownloadHandlers.end(); ++itr) {
if((*itr)->canHandle(this)) { if((*itr)->canHandle(this)) {
return (*itr)->getNextRequestGroups(this); (*itr)->getNextRequestGroups(groups, this);
return;
} }
} }
} catch(RecoverableException& ex) { } catch(RecoverableException& ex) {
_logger->error(EX_EXCEPTION_CAUGHT, ex); _logger->error(EX_EXCEPTION_CAUGHT, ex);
return RequestGroups();
} }
_logger->debug("No PostDownloadHandler found."); _logger->debug("No PostDownloadHandler found.");
return RequestGroups();
} }
void RequestGroup::initializePreDownloadHandler() void RequestGroup::initializePreDownloadHandler()

View File

@ -283,7 +283,7 @@ public:
void releaseRuntimeResource(); void releaseRuntimeResource();
std::deque<SharedHandle<RequestGroup> > postDownloadProcessing(); void postDownloadProcessing(std::deque<SharedHandle<RequestGroup> >& groups);
void addPostDownloadHandler(const SharedHandle<PostDownloadHandler>& handler); void addPostDownloadHandler(const SharedHandle<PostDownloadHandler>& handler);

View File

@ -117,7 +117,8 @@ void RequestGroupMan::removeStoppedGroup()
} else { } else {
(*itr)->getProgressInfoFile()->save(); (*itr)->getProgressInfoFile()->save();
} }
RequestGroups nextGroups = (*itr)->postDownloadProcessing(); RequestGroups nextGroups;
(*itr)->postDownloadProcessing(nextGroups);
if(nextGroups.size() > 0) { if(nextGroups.size() > 0) {
_logger->debug("Adding %u RequestGroups as a result of PostDownloadHandler.", nextGroups.size()); _logger->debug("Adding %u RequestGroups as a result of PostDownloadHandler.", nextGroups.size());
std::copy(nextGroups.rbegin(), nextGroups.rend(), std::front_inserter(_reservedGroups)); std::copy(nextGroups.rbegin(), nextGroups.rend(), std::front_inserter(_reservedGroups));

View File

@ -190,7 +190,8 @@ int32_t downloadBitTorrent(Option* op, const std::deque<std::string>& uri)
#ifdef ENABLE_METALINK #ifdef ENABLE_METALINK
int32_t downloadMetalink(Option* op) int32_t downloadMetalink(Option* op)
{ {
RequestGroups groups = Metalink2RequestGroup(op).generate(op->get(PREF_METALINK_FILE)); RequestGroups groups;
Metalink2RequestGroup(op).generate(groups, op->get(PREF_METALINK_FILE));
if(groups.empty()) { if(groups.empty()) {
throw FatalException("No files to download."); throw FatalException("No files to download.");
} }
@ -234,9 +235,7 @@ public:
#ifdef ENABLE_METALINK #ifdef ENABLE_METALINK
else if(_detector.guessMetalinkFile(uri)) { else if(_detector.guessMetalinkFile(uri)) {
try { try {
std::deque<SharedHandle<RequestGroup> > metalinkGroups = Metalink2RequestGroup(_op).generate(_requestGroups, uri);
Metalink2RequestGroup(_op).generate(uri);
_requestGroups.insert(_requestGroups.end(), metalinkGroups.begin(), metalinkGroups.end());
} catch(RecoverableException& e) { } catch(RecoverableException& e) {
// error occurred while parsing metalink file. // error occurred while parsing metalink file.
// We simply ignore it. // We simply ignore it.

View File

@ -71,7 +71,8 @@ void BtPostDownloadHandlerTest::testGetNextRequestGroups()
rg.initPieceStorage(); rg.initPieceStorage();
BtPostDownloadHandler handler; BtPostDownloadHandler handler;
std::deque<SharedHandle<RequestGroup> > groups = handler.getNextRequestGroups(&rg); std::deque<SharedHandle<RequestGroup> > groups;
handler.getNextRequestGroups(groups, &rg);
CPPUNIT_ASSERT_EQUAL((size_t)1, groups.size()); CPPUNIT_ASSERT_EQUAL((size_t)1, groups.size());
SharedHandle<BtContext> btctx SharedHandle<BtContext> btctx
(dynamic_pointer_cast<BtContext>(groups.front()->getDownloadContext())); (dynamic_pointer_cast<BtContext>(groups.front()->getDownloadContext()));

View File

@ -32,8 +32,8 @@ CPPUNIT_TEST_SUITE_REGISTRATION( Metalink2RequestGroupTest );
void Metalink2RequestGroupTest::testGenerate() void Metalink2RequestGroupTest::testGenerate()
{ {
std::deque<SharedHandle<RequestGroup> > groups = std::deque<SharedHandle<RequestGroup> > groups;
Metalink2RequestGroup(_option.get()).generate("test.xml"); Metalink2RequestGroup(_option.get()).generate(groups, "test.xml");
// first file // first file
{ {
SharedHandle<RequestGroup> rg = groups[0]; SharedHandle<RequestGroup> rg = groups[0];

View File

@ -70,7 +70,8 @@ void MetalinkPostDownloadHandlerTest::testGetNextRequestGroups()
rg.initPieceStorage(); rg.initPieceStorage();
MetalinkPostDownloadHandler handler; MetalinkPostDownloadHandler handler;
RequestGroups groups = handler.getNextRequestGroups(&rg); RequestGroups groups;
handler.getNextRequestGroups(groups, &rg);
#ifdef ENABLE_BITTORRENT #ifdef ENABLE_BITTORRENT
CPPUNIT_ASSERT_EQUAL((size_t)6/* 5 + 1 torrent file download */, groups.size()); CPPUNIT_ASSERT_EQUAL((size_t)6/* 5 + 1 torrent file download */, groups.size());
#else #else