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>
Rewritten AccRequestGroup

View File

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

View File

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

View File

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

View File

@ -54,16 +54,19 @@ private:
Logger* _logger;
std::deque<SharedHandle<RequestGroup> >
createRequestGroup(std::deque<SharedHandle<MetalinkEntry> > entries);
void
createRequestGroup(std::deque<SharedHandle<RequestGroup> >& groups,
std::deque<SharedHandle<MetalinkEntry> > entries);
public:
Metalink2RequestGroup(const Option* option);
~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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -117,7 +117,8 @@ void RequestGroupMan::removeStoppedGroup()
} else {
(*itr)->getProgressInfoFile()->save();
}
RequestGroups nextGroups = (*itr)->postDownloadProcessing();
RequestGroups nextGroups;
(*itr)->postDownloadProcessing(nextGroups);
if(nextGroups.size() > 0) {
_logger->debug("Adding %u RequestGroups as a result of PostDownloadHandler.", nextGroups.size());
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
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()) {
throw FatalException("No files to download.");
}
@ -234,9 +235,7 @@ public:
#ifdef ENABLE_METALINK
else if(_detector.guessMetalinkFile(uri)) {
try {
std::deque<SharedHandle<RequestGroup> > metalinkGroups =
Metalink2RequestGroup(_op).generate(uri);
_requestGroups.insert(_requestGroups.end(), metalinkGroups.begin(), metalinkGroups.end());
Metalink2RequestGroup(_op).generate(_requestGroups, uri);
} catch(RecoverableException& e) {
// error occurred while parsing metalink file.
// We simply ignore it.

View File

@ -71,7 +71,8 @@ void BtPostDownloadHandlerTest::testGetNextRequestGroups()
rg.initPieceStorage();
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());
SharedHandle<BtContext> btctx
(dynamic_pointer_cast<BtContext>(groups.front()->getDownloadContext()));

View File

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

View File

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