diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-02-26 15:37:08 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-02-26 15:37:08 +0000 |
| commit | 2a6775e80b1a9ff1b5ccb5e65cb7e8f8d6e5adb9 (patch) | |
| tree | 1f3c74f121ba9c635b42964259838343bb68747e /src/BtDependency.cc | |
| parent | 5032394c6ad8ae85b65183009afadf4e9ba5a178 (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.cc | 62 |
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) { |
