Ver Fonte

2007-11-03 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>

	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
Tatsuhiro Tsujikawa há 18 anos atrás
pai
commit
166f7aa8c2

+ 9 - 0
ChangeLog

@@ -1,3 +1,12 @@
+2007-11-03  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
+
+	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  <tujikawa at rednoah dot com>
 
 	Added the ability to display the detailed torrent file information.

+ 2 - 1
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

+ 10 - 6
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@

+ 3 - 10
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();

+ 59 - 0
src/MetalinkHelper.cc

@@ -0,0 +1,59 @@
+/* <!-- copyright */
+/*
+ * aria2 - The high speed download utility
+ *
+ * Copyright (C) 2006 Tatsuhiro Tsujikawa
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL.  If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so.  If you
+ * do not wish to do so, delete this exception statement from your
+ * version.  If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+/* copyright --> */
+#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;
+}

+ 54 - 0
src/MetalinkHelper.h

@@ -0,0 +1,54 @@
+/* <!-- copyright */
+/*
+ * aria2 - The high speed download utility
+ *
+ * Copyright (C) 2006 Tatsuhiro Tsujikawa
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL.  If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so.  If you
+ * do not wish to do so, delete this exception statement from your
+ * version.  If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+/* copyright --> */
+#ifndef _D_METALINK_HELPER_H_
+#define _D_METALINK_HELPER_H_
+
+#include "common.h"
+
+class Option;
+class MetalinkEntry;
+extern typedef SharedHandle<MetalinkEntry> MetalinkEntryHandle;
+extern typedef deque<MetalinkEntryHandle> MetalinkEntries;
+
+class MetalinkHelper {
+private:
+  MetalinkHelper();
+
+  ~MetalinkHelper();
+public:
+  static MetalinkEntries parseAndQuery(const string& filename, const Option* option);
+};
+
+#endif // _D_METALINK_HELPER_H_

+ 6 - 1
src/main.cc

@@ -59,6 +59,7 @@
 #include "DefaultBtContext.h"
 #include "RequestGroup.h"
 #include "Option.h"
+#include "MetalinkHelper.h"
 #include <deque>
 #include <algorithm>
 #include <signal.h>
@@ -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

+ 2 - 1
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
 
 

+ 6 - 3
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@

+ 44 - 0
test/MetalinkHelperTest.cc

@@ -0,0 +1,44 @@
+#include "MetalinkHelper.h"
+#include "MetalinkEntry.h"
+#include "Option.h"
+#include "prefs.h"
+#include <cppunit/extensions/HelperMacros.h>
+
+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());
+}