From 2f8e184fe5c8b8264fd0219ba2001be84c148d54 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sun, 15 Jun 2008 16:19:06 +0000 Subject: 2008-06-16 Tatsuhiro Tsujikawa Create only requested files and files which shares a piece with requested file in multi-torrent downloads. Directory structures are also created in the same rule. MultiDiskAdaptor::fileExists() now uses FileEntry instead of DiskWriterEntry as in the previous implementation. * src/MultiDiskWriter.cc * src/MultiFileAllocationIterator.cc * src/MultiFileAllocationIterator.h * test/MultiFileAllocationIteratorTest.cc --- src/MultiFileAllocationIterator.cc | 43 ++------------------------------------ 1 file changed, 2 insertions(+), 41 deletions(-) (limited to 'src/MultiFileAllocationIterator.cc') diff --git a/src/MultiFileAllocationIterator.cc b/src/MultiFileAllocationIterator.cc index 349d174f..1f541361 100644 --- a/src/MultiFileAllocationIterator.cc +++ b/src/MultiFileAllocationIterator.cc @@ -42,11 +42,9 @@ namespace aria2 { MultiFileAllocationIterator::MultiFileAllocationIterator(MultiDiskAdaptor* diskAdaptor): _diskAdaptor(diskAdaptor), + _entries(_diskAdaptor->diskWriterEntries), _offset(0) -{ - makeDiskWriterEntries(_entries, diskAdaptor->diskWriterEntries, - diskAdaptor->getPieceLength()); -} +{} MultiFileAllocationIterator::~MultiFileAllocationIterator() {} @@ -106,41 +104,4 @@ const DiskWriterEntries& MultiFileAllocationIterator::getDiskWriterEntries() con return _entries; } -void MultiFileAllocationIterator::makeDiskWriterEntries -(std::deque >& dwEntries, - const DiskWriterEntries& srcEntries, size_t pieceLength) const -{ - if(pieceLength == 0) { - for(DiskWriterEntries::const_iterator itr = srcEntries.begin(); itr != srcEntries.end(); ++itr) { - if((*itr)->getFileEntry()->isRequested()) { - dwEntries.push_back(*itr); - } - } - } else { - DiskWriterEntries temp(srcEntries); - { - SharedHandle f(new FileEntry()); - SharedHandle e(new DiskWriterEntry(f)); - temp.push_front(e); - } - DiskWriterEntries::const_iterator done = temp.begin(); - for(DiskWriterEntries::const_iterator itr = temp.begin()+1; itr != temp.end(); ++itr) { - const FileEntryHandle& fileEntry = (*itr)->getFileEntry(); - if(!fileEntry->isRequested()) { - continue; - } - off_t pieceStartOffset = (fileEntry->getOffset()/pieceLength)*pieceLength; - for(DiskWriterEntries::const_iterator i = itr-1; i != done; --i) { - if((uint64_t)pieceStartOffset < (*i)->getFileEntry()->getOffset()+(*i)->getFileEntry()->getLength()) { - dwEntries.push_back(*i); - } else { - break; - } - } - dwEntries.push_back(*itr); - done = itr; - } - } -} - } // namespace aria2 -- cgit