diff --git a/ChangeLog b/ChangeLog index 10f8fa83..dfbcfc6f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2007-11-03 Tatsuhiro Tsujikawa + + Re-implemented a file listing for Metalink, which was dropped while + http/ftp/torrent integration was being implemented. + * src/MetalinkHelper.{h, cc}: New class. + * test/MetalinkHelperTest.cc + * src/main.cc + * src/Metalink2RequestGroup.cc + 2007-11-03 Tatsuhiro Tsujikawa Added the ability to display the detailed torrent file information. diff --git a/src/Makefile.am b/src/Makefile.am index 2ccafab6..eb3db74b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -250,7 +250,8 @@ SRCS += Metalinker.cc Metalinker.h\ MetalinkProcessor.h\ Xml2MetalinkProcessor.cc Xml2MetalinkProcessor.h\ Metalink2RequestGroup.cc Metalink2RequestGroup.h\ - MetalinkPostDownloadHandler.cc MetalinkPostDownloadHandler.h + MetalinkPostDownloadHandler.cc MetalinkPostDownloadHandler.h\ + MetalinkHelper.cc MetalinkHelper.h endif # ENABLE_METALINK if !HAVE_BASENAME diff --git a/src/Makefile.in b/src/Makefile.in index ea417584..62afcf35 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -157,7 +157,8 @@ bin_PROGRAMS = aria2c$(EXEEXT) @ENABLE_METALINK_TRUE@ MetalinkProcessor.h\ @ENABLE_METALINK_TRUE@ Xml2MetalinkProcessor.cc Xml2MetalinkProcessor.h\ @ENABLE_METALINK_TRUE@ Metalink2RequestGroup.cc Metalink2RequestGroup.h\ -@ENABLE_METALINK_TRUE@ MetalinkPostDownloadHandler.cc MetalinkPostDownloadHandler.h +@ENABLE_METALINK_TRUE@ MetalinkPostDownloadHandler.cc MetalinkPostDownloadHandler.h\ +@ENABLE_METALINK_TRUE@ MetalinkHelper.cc MetalinkHelper.h @HAVE_BASENAME_FALSE@am__append_4 = libgen.c libgen.h @HAVE_GETADDRINFO_FALSE@am__append_5 = getaddrinfo.c getaddrinfo.h @@ -344,10 +345,11 @@ am__libaria2c_a_SOURCES_DIST = Socket.h SocketCore.cc SocketCore.h \ Xml2MetalinkProcessor.cc Xml2MetalinkProcessor.h \ Metalink2RequestGroup.cc Metalink2RequestGroup.h \ MetalinkPostDownloadHandler.cc MetalinkPostDownloadHandler.h \ - libgen.c libgen.h getaddrinfo.c getaddrinfo.h gai_strerror.c \ - gai_strerror.h gettimeofday.c gettimeofday.h inet_aton.c \ - inet_aton.h localtime_r.c localtime_r.h strptime.c strptime.h \ - timegm.c timegm.h + MetalinkHelper.cc MetalinkHelper.h libgen.c libgen.h \ + getaddrinfo.c getaddrinfo.h gai_strerror.c gai_strerror.h \ + gettimeofday.c gettimeofday.h inet_aton.c inet_aton.h \ + localtime_r.c localtime_r.h strptime.c strptime.h timegm.c \ + timegm.h @ENABLE_MESSAGE_DIGEST_TRUE@am__objects_1 = IteratableChunkChecksumValidator.$(OBJEXT) \ @ENABLE_MESSAGE_DIGEST_TRUE@ IteratableChecksumValidator.$(OBJEXT) \ @ENABLE_MESSAGE_DIGEST_TRUE@ ChecksumCommand.$(OBJEXT) \ @@ -425,7 +427,8 @@ am__libaria2c_a_SOURCES_DIST = Socket.h SocketCore.cc SocketCore.h \ @ENABLE_METALINK_TRUE@ MetalinkResource.$(OBJEXT) \ @ENABLE_METALINK_TRUE@ Xml2MetalinkProcessor.$(OBJEXT) \ @ENABLE_METALINK_TRUE@ Metalink2RequestGroup.$(OBJEXT) \ -@ENABLE_METALINK_TRUE@ MetalinkPostDownloadHandler.$(OBJEXT) +@ENABLE_METALINK_TRUE@ MetalinkPostDownloadHandler.$(OBJEXT) \ +@ENABLE_METALINK_TRUE@ MetalinkHelper.$(OBJEXT) @HAVE_BASENAME_FALSE@am__objects_4 = libgen.$(OBJEXT) @HAVE_GETADDRINFO_FALSE@am__objects_5 = getaddrinfo.$(OBJEXT) @HAVE_GAI_STRERROR_FALSE@am__objects_6 = gai_strerror.$(OBJEXT) @@ -959,6 +962,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MetaFileUtil.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Metalink2RequestGroup.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MetalinkEntry.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MetalinkHelper.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MetalinkPostDownloadHandler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MetalinkResource.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Metalinker.Po@am__quote@ diff --git a/src/Metalink2RequestGroup.cc b/src/Metalink2RequestGroup.cc index 86f1f951..1b1f2653 100644 --- a/src/Metalink2RequestGroup.cc +++ b/src/Metalink2RequestGroup.cc @@ -42,6 +42,7 @@ #include "message.h" #include "BtDependency.h" #include "SingleFileDownloadContext.h" +#include "MetalinkHelper.h" Metalink2RequestGroup::Metalink2RequestGroup(const Option* option):_option(option), _logger(LogFactory::getInstance()) {} @@ -92,16 +93,8 @@ public: RequestGroups Metalink2RequestGroup::generate(const string& metalinkFile) { - Xml2MetalinkProcessor proc; - - MetalinkerHandle metalinker = proc.parseFile(metalinkFile); - if(metalinker->entries.empty()) { - throw new DlAbortEx("No file entry found. Probably, the metalink file is not configured properly or broken."); - } - MetalinkEntries entries = - metalinker->queryEntry(_option->get(PREF_METALINK_VERSION), - _option->get(PREF_METALINK_LANGUAGE), - _option->get(PREF_METALINK_OS)); + MetalinkEntries entries = MetalinkHelper::parseAndQuery(metalinkFile, + _option); if(entries.size() == 0) { _logger->notice(EX_NO_RESULT_WITH_YOUR_PREFS); return RequestGroups(); diff --git a/src/MetalinkHelper.cc b/src/MetalinkHelper.cc new file mode 100644 index 00000000..76bde09a --- /dev/null +++ b/src/MetalinkHelper.cc @@ -0,0 +1,59 @@ +/* */ +#include "MetalinkHelper.h" +#include "Option.h" +#include "MetalinkEntry.h" +#include "Xml2MetalinkProcessor.h" +#include "Metalinker.h" +#include "prefs.h" + +MetalinkHelper::MetalinkHelper() {} + +MetalinkHelper::~MetalinkHelper() {} + +MetalinkEntries MetalinkHelper::parseAndQuery(const string& filename, const Option* option) +{ + Xml2MetalinkProcessor proc; + + MetalinkerHandle metalinker = proc.parseFile(filename); + if(metalinker->entries.empty()) { + throw new DlAbortEx("No file entry found. Probably, the metalink file is not configured properly or broken."); + } + MetalinkEntries entries = + metalinker->queryEntry(option->get(PREF_METALINK_VERSION), + option->get(PREF_METALINK_LANGUAGE), + option->get(PREF_METALINK_OS)); + return entries; +} diff --git a/src/MetalinkHelper.h b/src/MetalinkHelper.h new file mode 100644 index 00000000..15ca83cc --- /dev/null +++ b/src/MetalinkHelper.h @@ -0,0 +1,54 @@ +/* */ +#ifndef _D_METALINK_HELPER_H_ +#define _D_METALINK_HELPER_H_ + +#include "common.h" + +class Option; +class MetalinkEntry; +extern typedef SharedHandle MetalinkEntryHandle; +extern typedef deque MetalinkEntries; + +class MetalinkHelper { +private: + MetalinkHelper(); + + ~MetalinkHelper(); +public: + static MetalinkEntries parseAndQuery(const string& filename, const Option* option); +}; + +#endif // _D_METALINK_HELPER_H_ diff --git a/src/main.cc b/src/main.cc index b2bd3b6e..547e1702 100644 --- a/src/main.cc +++ b/src/main.cc @@ -59,6 +59,7 @@ #include "DefaultBtContext.h" #include "RequestGroup.h" #include "Option.h" +#include "MetalinkHelper.h" #include #include #include @@ -300,7 +301,11 @@ int main(int argc, char* argv[]) { #endif // ENABLE_BITTORRENT #ifdef ENABLE_METALINK if(op->defined(PREF_METALINK_FILE)) { - downloadMetalink(op); + if(op->get(PREF_SHOW_FILES) == V_TRUE) { + Util::toStream(cout, MetalinkEntry::toFileEntry(MetalinkHelper::parseAndQuery(op->get(PREF_METALINK_FILE), op))); + } else { + downloadMetalink(op); + } } else #endif // ENABLE_METALINK diff --git a/test/Makefile.am b/test/Makefile.am index 2f20d08b..4fc2fa06 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -98,7 +98,8 @@ aria2c_SOURCES += MetalinkerTest.cc\ MetalinkEntryTest.cc\ Xml2MetalinkProcessorTest.cc\ Metalink2RequestGroupTest.cc\ - MetalinkPostDownloadHandlerTest.cc + MetalinkPostDownloadHandlerTest.cc\ + MetalinkHelperTest.cc endif # ENABLE_METALINK diff --git a/test/Makefile.in b/test/Makefile.in index aacf3788..d29bf0a0 100644 --- a/test/Makefile.in +++ b/test/Makefile.in @@ -88,7 +88,8 @@ check_PROGRAMS = $(am__EXEEXT_1) @ENABLE_METALINK_TRUE@ MetalinkEntryTest.cc\ @ENABLE_METALINK_TRUE@ Xml2MetalinkProcessorTest.cc\ @ENABLE_METALINK_TRUE@ Metalink2RequestGroupTest.cc\ -@ENABLE_METALINK_TRUE@ MetalinkPostDownloadHandlerTest.cc +@ENABLE_METALINK_TRUE@ MetalinkPostDownloadHandlerTest.cc\ +@ENABLE_METALINK_TRUE@ MetalinkHelperTest.cc subdir = test DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in @@ -152,7 +153,7 @@ am__aria2c_SOURCES_DIST = AllTest.cc PieceTest.cc \ BtPostDownloadHandlerTest.cc TimeSeedCriteriaTest.cc \ MetalinkerTest.cc MetalinkEntryTest.cc \ Xml2MetalinkProcessorTest.cc Metalink2RequestGroupTest.cc \ - MetalinkPostDownloadHandlerTest.cc + MetalinkPostDownloadHandlerTest.cc MetalinkHelperTest.cc @ENABLE_MESSAGE_DIGEST_TRUE@am__objects_1 = \ @ENABLE_MESSAGE_DIGEST_TRUE@ MessageDigestHelperTest.$(OBJEXT) \ @ENABLE_MESSAGE_DIGEST_TRUE@ IteratableChunkChecksumValidatorTest.$(OBJEXT) @@ -200,7 +201,8 @@ am__aria2c_SOURCES_DIST = AllTest.cc PieceTest.cc \ @ENABLE_METALINK_TRUE@ MetalinkEntryTest.$(OBJEXT) \ @ENABLE_METALINK_TRUE@ Xml2MetalinkProcessorTest.$(OBJEXT) \ @ENABLE_METALINK_TRUE@ Metalink2RequestGroupTest.$(OBJEXT) \ -@ENABLE_METALINK_TRUE@ MetalinkPostDownloadHandlerTest.$(OBJEXT) +@ENABLE_METALINK_TRUE@ MetalinkPostDownloadHandlerTest.$(OBJEXT) \ +@ENABLE_METALINK_TRUE@ MetalinkHelperTest.$(OBJEXT) am_aria2c_OBJECTS = AllTest.$(OBJEXT) PieceTest.$(OBJEXT) \ DefaultPieceStorageTest.$(OBJEXT) SegmentTest.$(OBJEXT) \ GrowSegmentTest.$(OBJEXT) \ @@ -551,6 +553,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MetaFileUtilTest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Metalink2RequestGroupTest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MetalinkEntryTest.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MetalinkHelperTest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MetalinkPostDownloadHandlerTest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MetalinkerTest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MultiDiskAdaptorTest.Po@am__quote@ diff --git a/test/MetalinkHelperTest.cc b/test/MetalinkHelperTest.cc new file mode 100644 index 00000000..2a50d801 --- /dev/null +++ b/test/MetalinkHelperTest.cc @@ -0,0 +1,44 @@ +#include "MetalinkHelper.h" +#include "MetalinkEntry.h" +#include "Option.h" +#include "prefs.h" +#include + +using namespace std; + +class MetalinkHelperTest:public CppUnit::TestFixture { + + CPPUNIT_TEST_SUITE(MetalinkHelperTest); + CPPUNIT_TEST(testParseAndQuery); + CPPUNIT_TEST(testParseAndQuery_version); + CPPUNIT_TEST_SUITE_END(); +private: + +public: + void setUp() {} + + void tearDown() {} + + void testParseAndQuery(); + void testParseAndQuery_version(); +}; + + +CPPUNIT_TEST_SUITE_REGISTRATION( MetalinkHelperTest ); + +void MetalinkHelperTest::testParseAndQuery() +{ + Option option; + MetalinkEntries entries = MetalinkHelper::parseAndQuery("test.xml", &option); + CPPUNIT_ASSERT_EQUAL((size_t)5, entries.size()); +} + +void MetalinkHelperTest::testParseAndQuery_version() +{ + Option option; + option.put(PREF_METALINK_VERSION, "0.5.1"); + MetalinkEntries entries = MetalinkHelper::parseAndQuery("test.xml", &option); + CPPUNIT_ASSERT_EQUAL((size_t)1, entries.size()); + MetalinkEntryHandle entry = entries.front(); + CPPUNIT_ASSERT_EQUAL(string("aria2-0.5.1.tar.bz2"), entry->getPath()); +}