/* */ #include "MultiFileAllocationIterator.h" #include "MultiDiskAdaptor.h" #include "FileEntry.h" #include "SingleFileAllocationIterator.h" #include "DiskWriter.h" namespace aria2 { MultiFileAllocationIterator::MultiFileAllocationIterator(MultiDiskAdaptor* diskAdaptor): _diskAdaptor(diskAdaptor), _entries(_diskAdaptor->diskWriterEntries), _offset(0) {} MultiFileAllocationIterator::~MultiFileAllocationIterator() {} void MultiFileAllocationIterator::allocateChunk() { while(_fileAllocationIterator.isNull() || _fileAllocationIterator->finished()) { if(_entries.empty()) { break; } DiskWriterEntryHandle entry = _entries.front(); _entries.pop_front(); FileEntryHandle fileEntry = entry->getFileEntry(); // Open file before calling DiskWriterEntry::size() _diskAdaptor->openIfNot(entry, &DiskWriterEntry::openFile, _diskAdaptor->getTopDirPath()); entry->enableDirectIO(); if(entry->size() < fileEntry->getLength()) { // Calling private function of MultiDiskAdaptor. _fileAllocationIterator.reset (new SingleFileAllocationIterator(entry->getDiskWriter().get(), entry->size(), fileEntry->getLength())); _fileAllocationIterator->init(); } } if(finished()) { return; } _fileAllocationIterator->allocateChunk(); } bool MultiFileAllocationIterator::finished() { return _entries.empty() && (_fileAllocationIterator.isNull() || _fileAllocationIterator->finished()); } off_t MultiFileAllocationIterator::getCurrentLength() { if(_fileAllocationIterator.isNull()) { return 0; } else { return _fileAllocationIterator->getCurrentLength(); } } uint64_t MultiFileAllocationIterator::getTotalLength() { if(_fileAllocationIterator.isNull()) { return 0; } else { return _fileAllocationIterator->getTotalLength(); } } const DiskWriterEntries& MultiFileAllocationIterator::getDiskWriterEntries() const { return _entries; } } // namespace aria2