summaryrefslogtreecommitdiff
path: root/src/BtDependency.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/BtDependency.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/BtDependency.cc')
-rw-r--r--src/BtDependency.cc62
1 files changed, 45 insertions, 17 deletions
diff --git a/src/BtDependency.cc b/src/BtDependency.cc
index a2009087..3c70804c 100644
--- a/src/BtDependency.cc
+++ b/src/BtDependency.cc
@@ -47,6 +47,7 @@
#include "File.h"
#include "bittorrent_helper.h"
#include "DlAbortEx.h"
+#include "StringFormat.h"
namespace aria2 {
@@ -58,6 +59,18 @@ BtDependency::BtDependency(const RequestGroupWeakHandle& dependant,
BtDependency::~BtDependency() {}
+static void copyValues(const SharedHandle<FileEntry>& d,
+ const SharedHandle<FileEntry>& s)
+{
+ d->setRequested(true);
+ d->setPath(s->getPath());
+ d->addUris(s->getRemainingUris().begin(),
+ s->getRemainingUris().end());
+ if(!s->isSingleHostMultiConnectionEnabled()) {
+ d->disableSingleHostMultiConnection();
+ }
+}
+
bool BtDependency::resolve()
{
if(_dependee->getNumCommand() == 0 && _dependee->downloadFinished()) {
@@ -80,23 +93,38 @@ bool BtDependency::resolve()
bittorrent::loadFromMemory
(content, context, File(dependee->getFirstFilePath()).getBasename());
}
- if(context->getFileEntries().size() !=
- _dependant->getDownloadContext()->getFileEntries().size()) {
- throw DL_ABORT_EX("The number of file in torrent doesn't match to"
- " the dependent.");
- }
- // Copy file path in _dependant's FileEntries to newly created
- // context's FileEntries to endorse the path structure of
- // _dependant. URIs and singleHostMultiConnection are also copied.
- for(std::vector<SharedHandle<FileEntry> >::const_iterator s =
- _dependant->getDownloadContext()->getFileEntries().begin(),
- d = context->getFileEntries().begin();
- d != context->getFileEntries().end(); ++s, ++d) {
- (*d)->setPath((*s)->getPath());
- (*d)->addUris((*s)->getRemainingUris().begin(),
- (*s)->getRemainingUris().end());
- if(!(*s)->isSingleHostMultiConnectionEnabled()) {
- (*d)->disableSingleHostMultiConnection();
+ const std::vector<SharedHandle<FileEntry> >& fileEntries =
+ context->getFileEntries();
+ const std::vector<SharedHandle<FileEntry> >& dependantFileEntries =
+ _dependant->getDownloadContext()->getFileEntries();
+ // If dependant's FileEntry::getOriginalName() is empty, we
+ // assume that torrent is single file. In Metalink3, this is
+ // always assumed.
+ if(fileEntries.size() == 1 && dependantFileEntries.size() == 1 &&
+ dependantFileEntries[0]->getOriginalName().empty()) {
+ copyValues(fileEntries[0], dependantFileEntries[0]);
+ } else {
+ std::for_each(fileEntries.begin(), fileEntries.end(),
+ std::bind2nd(mem_fun_sh(&FileEntry::setRequested),false));
+ // Copy file path in _dependant's FileEntries to newly created
+ // context's FileEntries to endorse the path structure of
+ // _dependant. URIs and singleHostMultiConnection are also copied.
+ for(std::vector<SharedHandle<FileEntry> >::const_iterator s =
+ dependantFileEntries.begin(); s != dependantFileEntries.end();
+ ++s){
+ std::vector<SharedHandle<FileEntry> >::const_iterator d =
+ context->getFileEntries().begin();
+ for(; d != context->getFileEntries().end(); ++d) {
+ if((*d)->getOriginalName() == (*s)->getOriginalName()) {
+ break;
+ }
+ }
+ if(d == context->getFileEntries().end()) {
+ throw DL_ABORT_EX
+ (StringFormat("No entry %s in torrent file",
+ (*s)->getOriginalName().c_str()).str());
+ }
+ copyValues(*d, *s);
}
}
} catch(RecoverableException& e) {