summaryrefslogtreecommitdiff
path: root/src/MetalinkHelper.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-02-26 15:37:08 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-02-26 15:37:08 +0000
commit2a6775e80b1a9ff1b5ccb5e65cb7e8f8d6e5adb9 (patch)
tree1f3c74f121ba9c635b42964259838343bb68747e /src/MetalinkHelper.cc
parent5032394c6ad8ae85b65183009afadf4e9ba5a178 (diff)
2010-02-27 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Supported name attribute of metalink::metaurl element and multi-file torrent with Metalink4. Files with same metaurl are grouped and downloaded in one RequestGroup. * src/BtDependency.cc * src/FileEntry.h * src/Metalink2RequestGroup.cc * src/Metalink2RequestGroup.h * src/MetalinkEntry.cc * src/MetalinkEntry.h * src/MetalinkHelper.cc * src/MetalinkHelper.h * src/MetalinkMetaurl.cc * src/MetalinkMetaurl.h * src/MetalinkParserController.cc * src/RequestGroup.cc * src/RequestGroup.h * src/bittorrent_helper.cc * test/BittorrentHelperTest.cc * test/BtDependencyTest.cc * test/MetalinkHelperTest.cc
Diffstat (limited to 'src/MetalinkHelper.cc')
-rw-r--r--src/MetalinkHelper.cc38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/MetalinkHelper.cc b/src/MetalinkHelper.cc
index c26d1d03..abfbc99a 100644
--- a/src/MetalinkHelper.cc
+++ b/src/MetalinkHelper.cc
@@ -41,6 +41,7 @@
#include "prefs.h"
#include "DlAbortEx.h"
#include "BinaryStream.h"
+#include "MetalinkMetaurl.h"
namespace aria2 {
@@ -79,4 +80,41 @@ void MetalinkHelper::query
option->get(PREF_METALINK_OS));
}
+void MetalinkHelper::groupEntryByMetaurlName
+(std::vector<
+ std::pair<std::string, std::vector<SharedHandle<MetalinkEntry> > > >& result,
+ const std::vector<SharedHandle<MetalinkEntry> >& entries)
+{
+ for(std::vector<SharedHandle<MetalinkEntry> >::const_iterator eiter =
+ entries.begin(); eiter != entries.end(); ++eiter) {
+ if((*eiter)->metaurls.empty()) {
+ std::pair<std::string, std::vector<SharedHandle<MetalinkEntry> > > p;
+ p.second.push_back(*eiter);
+ result.push_back(p);
+ } else {
+ std::vector<
+ std::pair<std::string,
+ std::vector<SharedHandle<MetalinkEntry> > > >::iterator i =
+ result.begin();
+ if((*eiter)->metaurls[0]->name.empty() ||
+ !(*eiter)->sizeKnown) {
+ i = result.end();
+ }
+ for(; i != result.end(); ++i) {
+ if((*i).first == (*eiter)->metaurls[0]->url &&
+ !(*i).second[0]->metaurls[0]->name.empty()) {
+ (*i).second.push_back(*eiter);
+ break;
+ }
+ }
+ if(i == result.end()) {
+ std::pair<std::string, std::vector<SharedHandle<MetalinkEntry> > > p;
+ p.first = (*eiter)->metaurls[0]->url;
+ p.second.push_back(*eiter);
+ result.push_back(p);
+ }
+ }
+ }
+}
+
} // namespace aria2