diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/AbstractDiskWriter.cc | 58 | ||||
| -rw-r--r-- | src/AbstractDiskWriter.h | 10 | ||||
| -rw-r--r-- | src/AbstractSingleDiskAdaptor.cc | 8 | ||||
| -rw-r--r-- | src/AbstractSingleDiskAdaptor.h | 2 | ||||
| -rw-r--r-- | src/ByteArrayDiskWriter.cc | 11 | ||||
| -rw-r--r-- | src/ByteArrayDiskWriter.h | 6 | ||||
| -rw-r--r-- | src/ByteArrayDiskWriterFactory.cc | 3 | ||||
| -rw-r--r-- | src/ByteArrayDiskWriterFactory.h | 2 | ||||
| -rw-r--r-- | src/DefaultDiskWriter.cc | 8 | ||||
| -rw-r--r-- | src/DefaultDiskWriter.h | 4 | ||||
| -rw-r--r-- | src/DefaultDiskWriterFactory.cc | 5 | ||||
| -rw-r--r-- | src/DefaultDiskWriterFactory.h | 2 | ||||
| -rw-r--r-- | src/DefaultPieceStorage.cc | 13 | ||||
| -rw-r--r-- | src/DirectDiskAdaptor.cc | 2 | ||||
| -rw-r--r-- | src/DirectDiskAdaptor.h | 2 | ||||
| -rw-r--r-- | src/DiskAdaptor.h | 5 | ||||
| -rw-r--r-- | src/DiskWriter.h | 16 | ||||
| -rw-r--r-- | src/DiskWriterFactory.h | 2 | ||||
| -rw-r--r-- | src/MessageDigestHelper.cc | 4 | ||||
| -rw-r--r-- | src/MultiDiskAdaptor.cc | 15 | ||||
| -rw-r--r-- | src/RequestGroup.cc | 33 | ||||
| -rw-r--r-- | src/UnknownLengthPieceStorage.cc | 14 | ||||
| -rw-r--r-- | src/Util.cc | 8 |
23 files changed, 105 insertions, 128 deletions
diff --git a/src/AbstractDiskWriter.cc b/src/AbstractDiskWriter.cc index 1c8d070f..224eac38 100644 --- a/src/AbstractDiskWriter.cc +++ b/src/AbstractDiskWriter.cc @@ -56,7 +56,8 @@ namespace aria2 { -AbstractDiskWriter::AbstractDiskWriter(): +AbstractDiskWriter::AbstractDiskWriter(const std::string& filename): + _filename(filename), fd(-1), _readOnly(false), logger(LogFactory::getInstance()) {} @@ -66,13 +67,12 @@ AbstractDiskWriter::~AbstractDiskWriter() closeFile(); } -void AbstractDiskWriter::openFile(const std::string& filename, uint64_t totalLength) +void AbstractDiskWriter::openFile(uint64_t totalLength) { - File f(filename); - if(f.exists()) { - openExistingFile(filename, totalLength); + if(File(_filename).exists()) { + openExistingFile(totalLength); } else { - initAndOpenFile(filename, totalLength); + initAndOpenFile(totalLength); } } @@ -84,14 +84,11 @@ void AbstractDiskWriter::closeFile() } } -void AbstractDiskWriter::openExistingFile(const std::string& filename, - uint64_t totalLength) +void AbstractDiskWriter::openExistingFile(uint64_t totalLength) { - this->filename = filename; - File f(filename); - if(!f.exists()) { + if(!File(_filename).exists()) { throw DlAbortEx - (StringFormat(EX_FILE_OPEN, filename.c_str(), MSG_FILE_NOT_FOUND).str()); + (StringFormat(EX_FILE_OPEN, _filename.c_str(), MSG_FILE_NOT_FOUND).str()); } int flags = O_BINARY; @@ -101,19 +98,20 @@ void AbstractDiskWriter::openExistingFile(const std::string& filename, flags |= O_RDWR; } - if((fd = open(filename.c_str(), flags, OPEN_MODE)) < 0) { + if((fd = open(_filename.c_str(), flags, OPEN_MODE)) < 0) { throw DlAbortEx - (StringFormat(EX_FILE_OPEN, filename.c_str(), strerror(errno)).str()); + (StringFormat(EX_FILE_OPEN, _filename.c_str(), strerror(errno)).str()); } } -void AbstractDiskWriter::createFile(const std::string& filename, int addFlags) +void AbstractDiskWriter::createFile(int addFlags) { - this->filename = filename; - assert(filename.size()); - Util::mkdirs(File(filename).getDirname()); - if((fd = open(filename.c_str(), O_CREAT|O_RDWR|O_TRUNC|O_BINARY|addFlags, OPEN_MODE)) < 0) { - throw DlAbortEx(StringFormat(EX_FILE_OPEN, filename.c_str(), strerror(errno)).str()); + assert(!_filename.empty()); + Util::mkdirs(File(_filename).getDirname()); + if((fd = open(_filename.c_str(), O_CREAT|O_RDWR|O_TRUNC|O_BINARY|addFlags, + OPEN_MODE)) < 0) { + throw DlAbortEx(StringFormat(EX_FILE_OPEN, + _filename.c_str(), strerror(errno)).str()); } } @@ -142,7 +140,7 @@ void AbstractDiskWriter::seek(off_t offset) { if(lseek(fd, offset, SEEK_SET) == (off_t)-1) { throw DlAbortEx - (StringFormat(EX_FILE_SEEK, filename.c_str(), strerror(errno)).str()); + (StringFormat(EX_FILE_SEEK, _filename.c_str(), strerror(errno)).str()); } } @@ -154,9 +152,10 @@ void AbstractDiskWriter::writeData(const unsigned char* data, size_t len, off_t // DownloadFailureException and abort download instantly. if(errno == ENOSPC) { throw DownloadFailureException - (StringFormat(EX_FILE_WRITE, filename.c_str(), strerror(errno)).str()); + (StringFormat(EX_FILE_WRITE, _filename.c_str(), strerror(errno)).str()); } - throw DlAbortEx(StringFormat(EX_FILE_WRITE, filename.c_str(), strerror(errno)).str()); + throw DlAbortEx(StringFormat(EX_FILE_WRITE, + _filename.c_str(), strerror(errno)).str()); } } @@ -165,7 +164,8 @@ ssize_t AbstractDiskWriter::readData(unsigned char* data, size_t len, off_t offs ssize_t ret; seek(offset); if((ret = readDataInternal(data, len)) < 0) { - throw DlAbortEx(StringFormat(EX_FILE_READ, filename.c_str(), strerror(errno)).str()); + throw DlAbortEx(StringFormat(EX_FILE_READ, + _filename.c_str(), strerror(errno)).str()); } return ret; } @@ -206,17 +206,9 @@ void AbstractDiskWriter::allocate(off_t offset, uint64_t length) } #endif // HAVE_POSIX_FALLOCATE -// TODO the file descriptor fd must be opened before calling this function. uint64_t AbstractDiskWriter::size() { - if(fd == -1) { - throw DlAbortEx("File not opened."); - } - a2_struct_stat fileStat; - if(fstat(fd, &fileStat) < 0) { - return 0; - } - return fileStat.st_size; + return File(_filename).size(); } void AbstractDiskWriter::enableDirectIO() diff --git a/src/AbstractDiskWriter.h b/src/AbstractDiskWriter.h index ff9f3ca1..0a55e141 100644 --- a/src/AbstractDiskWriter.h +++ b/src/AbstractDiskWriter.h @@ -44,14 +44,14 @@ class Logger; class AbstractDiskWriter : public DiskWriter { protected: - std::string filename; + std::string _filename; int fd; bool _readOnly; Logger* logger; - void createFile(const std::string& filename, int addFlags = 0); + void createFile(int addFlags = 0); private: ssize_t writeDataInternal(const unsigned char* data, size_t len); @@ -59,14 +59,14 @@ private: void seek(off_t offset); public: - AbstractDiskWriter(); + AbstractDiskWriter(const std::string& filename); virtual ~AbstractDiskWriter(); - virtual void openFile(const std::string& filename, uint64_t totalLength = 0); + virtual void openFile(uint64_t totalLength = 0); virtual void closeFile(); - virtual void openExistingFile(const std::string& filename, uint64_t totalLength = 0); + virtual void openExistingFile(uint64_t totalLength = 0); virtual void writeData(const unsigned char* data, size_t len, off_t offset); diff --git a/src/AbstractSingleDiskAdaptor.cc b/src/AbstractSingleDiskAdaptor.cc index 695eab7c..488c9fa1 100644 --- a/src/AbstractSingleDiskAdaptor.cc +++ b/src/AbstractSingleDiskAdaptor.cc @@ -49,12 +49,12 @@ AbstractSingleDiskAdaptor::~AbstractSingleDiskAdaptor() {} void AbstractSingleDiskAdaptor::initAndOpenFile() { - diskWriter->initAndOpenFile(getFilePath(), totalLength); + diskWriter->initAndOpenFile(totalLength); } void AbstractSingleDiskAdaptor::openFile() { - diskWriter->openFile(getFilePath(), totalLength); + diskWriter->openFile(totalLength); } void AbstractSingleDiskAdaptor::closeFile() @@ -64,7 +64,7 @@ void AbstractSingleDiskAdaptor::closeFile() void AbstractSingleDiskAdaptor::openExistingFile() { - diskWriter->openExistingFile(getFilePath(), totalLength); + diskWriter->openExistingFile(totalLength); } void AbstractSingleDiskAdaptor::writeData(const unsigned char* data, size_t len, off_t offset) @@ -84,7 +84,7 @@ bool AbstractSingleDiskAdaptor::fileExists() uint64_t AbstractSingleDiskAdaptor::size() { - return diskWriter->size(); + return File(getFilePath()).size(); } void AbstractSingleDiskAdaptor::truncate(uint64_t length) diff --git a/src/AbstractSingleDiskAdaptor.h b/src/AbstractSingleDiskAdaptor.h index f8c9e3a1..5ba80f2d 100644 --- a/src/AbstractSingleDiskAdaptor.h +++ b/src/AbstractSingleDiskAdaptor.h @@ -89,7 +89,7 @@ public: virtual void cutTrailingGarbage(); - virtual std::string getFilePath() = 0; + virtual const std::string& getFilePath() = 0; void setDiskWriter(const SharedHandle<DiskWriter>& diskWriter); diff --git a/src/ByteArrayDiskWriter.cc b/src/ByteArrayDiskWriter.cc index dbe22cc3..612f9db1 100644 --- a/src/ByteArrayDiskWriter.cc +++ b/src/ByteArrayDiskWriter.cc @@ -47,21 +47,18 @@ void ByteArrayDiskWriter::clear() buf.str(A2STR::NIL); } -void ByteArrayDiskWriter::initAndOpenFile(const std::string& filename, - uint64_t totalLength) +void ByteArrayDiskWriter::initAndOpenFile(uint64_t totalLength) { clear(); } -void ByteArrayDiskWriter::openFile(const std::string& filename, - uint64_t totalLength) {} +void ByteArrayDiskWriter::openFile(uint64_t totalLength) {} void ByteArrayDiskWriter::closeFile() {} -void ByteArrayDiskWriter::openExistingFile(const std::string& filename, - uint64_t totalLength) +void ByteArrayDiskWriter::openExistingFile(uint64_t totalLength) { - openFile(filename); + openFile(); } void ByteArrayDiskWriter::writeData(const unsigned char* data, size_t dataLength, off_t position) diff --git a/src/ByteArrayDiskWriter.h b/src/ByteArrayDiskWriter.h index 2ac323d8..a82423ba 100644 --- a/src/ByteArrayDiskWriter.h +++ b/src/ByteArrayDiskWriter.h @@ -49,13 +49,13 @@ public: ByteArrayDiskWriter(); virtual ~ByteArrayDiskWriter(); - virtual void initAndOpenFile(const std::string& filename, uint64_t totalLength = 0); + virtual void initAndOpenFile(uint64_t totalLength = 0); - virtual void openFile(const std::string& filename, uint64_t totalLength = 0); + virtual void openFile(uint64_t totalLength = 0); virtual void closeFile(); - virtual void openExistingFile(const std::string& filename, uint64_t totalLength = 0); + virtual void openExistingFile(uint64_t totalLength = 0); virtual void writeData(const unsigned char* data, size_t len, off_t position); virtual ssize_t readData(unsigned char* data, size_t len, off_t position); diff --git a/src/ByteArrayDiskWriterFactory.cc b/src/ByteArrayDiskWriterFactory.cc index d2eb9de0..a252ec79 100644 --- a/src/ByteArrayDiskWriterFactory.cc +++ b/src/ByteArrayDiskWriterFactory.cc @@ -37,7 +37,8 @@ namespace aria2 { -DiskWriterHandle ByteArrayDiskWriterFactory::newDiskWriter() +DiskWriterHandle ByteArrayDiskWriterFactory::newDiskWriter +(const std::string& filename) { return SharedHandle<DiskWriter>(new ByteArrayDiskWriter()); } diff --git a/src/ByteArrayDiskWriterFactory.h b/src/ByteArrayDiskWriterFactory.h index 7af26018..4ec4277e 100644 --- a/src/ByteArrayDiskWriterFactory.h +++ b/src/ByteArrayDiskWriterFactory.h @@ -44,7 +44,7 @@ class ByteArrayDiskWriter; class ByteArrayDiskWriterFactory:public DiskWriterFactory { public: - SharedHandle<DiskWriter> newDiskWriter(); + SharedHandle<DiskWriter> newDiskWriter(const std::string& filename); }; typedef SharedHandle<ByteArrayDiskWriterFactory> ByteArrayDiskWriterFactoryHandle; diff --git a/src/DefaultDiskWriter.cc b/src/DefaultDiskWriter.cc index df4fe1b7..2ef52d84 100644 --- a/src/DefaultDiskWriter.cc +++ b/src/DefaultDiskWriter.cc @@ -36,14 +36,14 @@ namespace aria2 { -DefaultDiskWriter::DefaultDiskWriter():AbstractDiskWriter() {} +DefaultDiskWriter::DefaultDiskWriter(const std::string& filename): + AbstractDiskWriter(filename) {} DefaultDiskWriter::~DefaultDiskWriter() {} -void DefaultDiskWriter::initAndOpenFile(const std::string& filename, - uint64_t totalLength) +void DefaultDiskWriter::initAndOpenFile(uint64_t totalLength) { - createFile(filename); + createFile(); } } // namespace aria2 diff --git a/src/DefaultDiskWriter.h b/src/DefaultDiskWriter.h index 6fd47e35..db355ba0 100644 --- a/src/DefaultDiskWriter.h +++ b/src/DefaultDiskWriter.h @@ -41,11 +41,11 @@ namespace aria2 { class DefaultDiskWriter:public AbstractDiskWriter { public: - DefaultDiskWriter(); + DefaultDiskWriter(const std::string& filename); virtual ~DefaultDiskWriter(); - virtual void initAndOpenFile(const std::string& filename, uint64_t totalLength = 0); + virtual void initAndOpenFile(uint64_t totalLength = 0); }; typedef SharedHandle<DefaultDiskWriter> DefaultDiskWriterHandle; diff --git a/src/DefaultDiskWriterFactory.cc b/src/DefaultDiskWriterFactory.cc index 235e5d89..96d2aed3 100644 --- a/src/DefaultDiskWriterFactory.cc +++ b/src/DefaultDiskWriterFactory.cc @@ -37,9 +37,10 @@ namespace aria2 { -SharedHandle<DiskWriter> DefaultDiskWriterFactory::newDiskWriter() +SharedHandle<DiskWriter> DefaultDiskWriterFactory::newDiskWriter +(const std::string& filename) { - return SharedHandle<DiskWriter>(new DefaultDiskWriter()); + return SharedHandle<DiskWriter>(new DefaultDiskWriter(filename)); } } // namespace aria2 diff --git a/src/DefaultDiskWriterFactory.h b/src/DefaultDiskWriterFactory.h index c8b38ece..5371f47c 100644 --- a/src/DefaultDiskWriterFactory.h +++ b/src/DefaultDiskWriterFactory.h @@ -44,7 +44,7 @@ class DiskWriter; class DefaultDiskWriterFactory:public DiskWriterFactory { public: - virtual SharedHandle<DiskWriter> newDiskWriter(); + virtual SharedHandle<DiskWriter> newDiskWriter(const std::string& filename); }; typedef SharedHandle<DefaultDiskWriterFactory> DefaultDiskWriterFactoryHandle; diff --git a/src/DefaultPieceStorage.cc b/src/DefaultPieceStorage.cc index ff6e7877..f557c3b5 100644 --- a/src/DefaultPieceStorage.cc +++ b/src/DefaultPieceStorage.cc @@ -485,23 +485,26 @@ void DefaultPieceStorage::initStorage() { if(downloadContext->getFileMode() == DownloadContext::SINGLE) { logger->debug("Instantiating DirectDiskAdaptor"); - DiskWriterHandle writer = _diskWriterFactory->newDiskWriter(); - writer->setDirectIOAllowed(option->getAsBool(PREF_ENABLE_DIRECT_IO)); DirectDiskAdaptorHandle directDiskAdaptor(new DirectDiskAdaptor()); - directDiskAdaptor->setDiskWriter(writer); directDiskAdaptor->setTotalLength(downloadContext->getTotalLength()); + directDiskAdaptor->setFileEntries(downloadContext->getFileEntries()); + + DiskWriterHandle writer = + _diskWriterFactory->newDiskWriter(directDiskAdaptor->getFilePath()); + writer->setDirectIOAllowed(option->getAsBool(PREF_ENABLE_DIRECT_IO)); + + directDiskAdaptor->setDiskWriter(writer); this->diskAdaptor = directDiskAdaptor; } else { // file mode == DownloadContext::MULTI logger->debug("Instantiating MultiDiskAdaptor"); MultiDiskAdaptorHandle multiDiskAdaptor(new MultiDiskAdaptor()); + multiDiskAdaptor->setFileEntries(downloadContext->getFileEntries()); multiDiskAdaptor->setDirectIOAllowed(option->getAsBool(PREF_ENABLE_DIRECT_IO)); multiDiskAdaptor->setPieceLength(downloadContext->getPieceLength()); multiDiskAdaptor->setMaxOpenFiles(option->getAsInt(PREF_BT_MAX_OPEN_FILES)); this->diskAdaptor = multiDiskAdaptor; } - diskAdaptor->setStoreDir(downloadContext->getDir()); - diskAdaptor->setFileEntries(downloadContext->getFileEntries()); #ifdef HAVE_POSIX_FALLOCATE if(option->get(PREF_FILE_ALLOCATION) == V_FALLOC) { diskAdaptor->enableFallocate(); diff --git a/src/DirectDiskAdaptor.cc b/src/DirectDiskAdaptor.cc index a02d0f27..8f5d1ad3 100644 --- a/src/DirectDiskAdaptor.cc +++ b/src/DirectDiskAdaptor.cc @@ -38,7 +38,7 @@ namespace aria2 { -std::string DirectDiskAdaptor::getFilePath() +const std::string& DirectDiskAdaptor::getFilePath() { return fileEntries.front()->getPath(); } diff --git a/src/DirectDiskAdaptor.h b/src/DirectDiskAdaptor.h index e215c243..333de585 100644 --- a/src/DirectDiskAdaptor.h +++ b/src/DirectDiskAdaptor.h @@ -44,7 +44,7 @@ public: DirectDiskAdaptor() {}; virtual ~DirectDiskAdaptor() {}; - virtual std::string getFilePath(); + virtual const std::string& getFilePath(); virtual void onDownloadComplete(); diff --git a/src/DiskAdaptor.h b/src/DiskAdaptor.h index 959f430b..e234086c 100644 --- a/src/DiskAdaptor.h +++ b/src/DiskAdaptor.h @@ -48,7 +48,6 @@ class FileAllocationIterator; class DiskAdaptor:public BinaryStream { protected: - std::string storeDir; std::deque<SharedHandle<FileEntry> > fileEntries; #ifdef HAVE_POSIX_FALLOCATE bool _fallocate; @@ -86,10 +85,6 @@ public: void removeAllDownloadEntry(); - void setStoreDir(const std::string& storeDir) { this->storeDir = storeDir; } - - const std::string& getStoreDir() const { return this->storeDir; } - virtual SharedHandle<FileAllocationIterator> fileAllocationIterator() = 0; virtual void enableDirectIO() {} diff --git a/src/DiskWriter.h b/src/DiskWriter.h index ede90fcf..663e3407 100644 --- a/src/DiskWriter.h +++ b/src/DiskWriter.h @@ -52,13 +52,11 @@ public: virtual ~DiskWriter() {} /** - * Creates a file output stream to write to the file with the specified name. - * If the file exists, then it is truncated to 0 length. - * @param filename the file name to be opened. + * Opens file. If the file exists, then it is truncated to 0 length. */ - virtual void initAndOpenFile(const std::string& filename, uint64_t totalLength = 0) = 0; + virtual void initAndOpenFile(uint64_t totalLength = 0) = 0; - virtual void openFile(const std::string& filename, uint64_t totalLength = 0) = 0; + virtual void openFile(uint64_t totalLength = 0) = 0; /** * Closes this output stream. @@ -67,12 +65,10 @@ public: virtual void closeFile() = 0; /** - * Opens a file output stream to write to the file with the specified name. - * If the file doesnot exists, an exception may be throwed. - * - * @param filename the file name to be opened. + * Opens a file. If the file doesnot exists, an exception may be + * thrown. */ - virtual void openExistingFile(const std::string& filename, uint64_t totalLength = 0) = 0; + virtual void openExistingFile(uint64_t totalLength = 0) = 0; // Returns file length virtual uint64_t size() = 0; diff --git a/src/DiskWriterFactory.h b/src/DiskWriterFactory.h index ffedd667..6cb3ae24 100644 --- a/src/DiskWriterFactory.h +++ b/src/DiskWriterFactory.h @@ -46,7 +46,7 @@ class DiskWriterFactory { public: virtual ~DiskWriterFactory() {} - virtual SharedHandle<DiskWriter> newDiskWriter() = 0; + virtual SharedHandle<DiskWriter> newDiskWriter(const std::string& filename)=0; }; typedef SharedHandle<DiskWriterFactory> DiskWriterFactoryHandle; diff --git a/src/MessageDigestHelper.cc b/src/MessageDigestHelper.cc index cb6ebb67..dfd66fe6 100644 --- a/src/MessageDigestHelper.cc +++ b/src/MessageDigestHelper.cc @@ -111,8 +111,8 @@ std::string MessageDigestHelper::digest(MessageDigestContext* ctx, std::string MessageDigestHelper::digest(const std::string& algo, const std::string& filename) { - DiskWriterHandle writer(new DefaultDiskWriter()); - writer->openExistingFile(filename); + DiskWriterHandle writer(new DefaultDiskWriter(filename)); + writer->openExistingFile(); return digest(algo, writer, 0, writer->size()); } diff --git a/src/MultiDiskAdaptor.cc b/src/MultiDiskAdaptor.cc index a24f70c2..ac9f0b4b 100644 --- a/src/MultiDiskAdaptor.cc +++ b/src/MultiDiskAdaptor.cc @@ -66,7 +66,7 @@ const std::string& DiskWriterEntry::getFilePath() const void DiskWriterEntry::initAndOpenFile() { if(!diskWriter.isNull()) { - diskWriter->initAndOpenFile(getFilePath(), fileEntry->getLength()); + diskWriter->initAndOpenFile(fileEntry->getLength()); if(_directIO) { diskWriter->enableDirectIO(); } @@ -77,7 +77,7 @@ void DiskWriterEntry::initAndOpenFile() void DiskWriterEntry::openFile() { if(!diskWriter.isNull()) { - diskWriter->openFile(getFilePath(), fileEntry->getLength()); + diskWriter->openFile(fileEntry->getLength()); if(_directIO) { diskWriter->enableDirectIO(); } @@ -88,7 +88,7 @@ void DiskWriterEntry::openFile() void DiskWriterEntry::openExistingFile() { if(!diskWriter.isNull()) { - diskWriter->openExistingFile(getFilePath(), fileEntry->getLength()); + diskWriter->openExistingFile(fileEntry->getLength()); if(_directIO) { diskWriter->enableDirectIO(); } @@ -116,11 +116,7 @@ bool DiskWriterEntry::fileExists() uint64_t DiskWriterEntry::size() const { - if(diskWriter.isNull()) { - return File(getFilePath()).size(); - } else { - return diskWriter->size(); - } + return File(getFilePath()).size(); } SharedHandle<FileEntry> DiskWriterEntry::getFileEntry() const @@ -276,7 +272,7 @@ void MultiDiskAdaptor::resetDiskWriterEntries() (*i)->fileExists()) { logger->debug("Creating DiskWriter for filename=%s", (*i)->getFilePath().c_str()); - (*i)->setDiskWriter(dwFactory.newDiskWriter()); + (*i)->setDiskWriter(dwFactory.newDiskWriter((*i)->getFilePath())); (*i)->getDiskWriter()->setDirectIOAllowed(_directIOAllowed); if(_readOnly) { (*i)->getDiskWriter()->enableReadOnly(); @@ -479,7 +475,6 @@ bool MultiDiskAdaptor::fileExists() return false; } -// TODO call DiskWriter::openFile() before calling this function. uint64_t MultiDiskAdaptor::size() { uint64_t size = 0; diff --git a/src/RequestGroup.cc b/src/RequestGroup.cc index d65a687d..697009d7 100644 --- a/src/RequestGroup.cc +++ b/src/RequestGroup.cc @@ -282,9 +282,21 @@ void RequestGroup::createInitialCommand(std::deque<Command*>& commands, progressInfoFile->getFilename().c_str(), getFilePath().c_str()); } - // First, make DiskAdaptor read-only mode. - _pieceStorage->getDiskAdaptor()->enableReadOnly(); - + { + uint64_t actualFileSize = _pieceStorage->getDiskAdaptor()->size(); + if(actualFileSize == btContext->getTotalLength()) { + // First, make DiskAdaptor read-only mode to allow the + // program to seed file in read-only media. + _pieceStorage->getDiskAdaptor()->enableReadOnly(); + } else { + // Open file in writable mode to allow the program + // truncate the file to btContext->getTotalLength() + _logger->debug("File size not match. File is opened in writable mode." + " Expected:%s Actual:%s", + Util::uitos(btContext->getTotalLength()).c_str(), + Util::uitos(actualFileSize).c_str()); + } + } // Call Load, Save and file allocation command here if(progressInfoFile->exists()) { // load .aria2 file if it exists. @@ -311,20 +323,7 @@ void RequestGroup::createInitialCommand(std::deque<Command*>& commands, } } _progressInfoFile = progressInfoFile; - { - uint64_t actualFileSize = _pieceStorage->getDiskAdaptor()->size(); - if(actualFileSize != btContext->getTotalLength()) { - // Re-open file in writable mode to allow the program - // truncate the file to the specified length - _logger->debug("File size not match. Re-open file in writable mode." - " Expected:%s Actual:%s", - Util::uitos(btContext->getTotalLength()).c_str(), - Util::uitos(actualFileSize).c_str()); - _pieceStorage->getDiskAdaptor()->closeFile(); - _pieceStorage->getDiskAdaptor()->disableReadOnly(); - _pieceStorage->getDiskAdaptor()->openFile(); - } - } + if(!btContext->isPrivate() && _option->getAsBool(PREF_ENABLE_DHT)) { std::deque<Command*> commands; DHTSetup().setup(commands, e, _option); diff --git a/src/UnknownLengthPieceStorage.cc b/src/UnknownLengthPieceStorage.cc index 8169abc9..f39870ff 100644 --- a/src/UnknownLengthPieceStorage.cc +++ b/src/UnknownLengthPieceStorage.cc @@ -56,17 +56,15 @@ UnknownLengthPieceStorage::~UnknownLengthPieceStorage() {} void UnknownLengthPieceStorage::initStorage() { - DiskWriterHandle writer = _diskWriterFactory->newDiskWriter(); DirectDiskAdaptorHandle directDiskAdaptor(new DirectDiskAdaptor()); - directDiskAdaptor->setDiskWriter(writer); directDiskAdaptor->setTotalLength(_downloadContext->getTotalLength()); + directDiskAdaptor->setFileEntries(_downloadContext->getFileEntries()); + + DiskWriterHandle writer = + _diskWriterFactory->newDiskWriter(directDiskAdaptor->getFilePath()); + directDiskAdaptor->setDiskWriter(writer); + _diskAdaptor = directDiskAdaptor; - std::string storeDir = _downloadContext->getDir(); -// if(storeDir == "") { -// storeDir = "."; -// } - _diskAdaptor->setStoreDir(storeDir); - _diskAdaptor->setFileEntries(_downloadContext->getFileEntries()); } bool UnknownLengthPieceStorage::hasMissingPiece(const SharedHandle<Peer>& peer) diff --git a/src/Util.cc b/src/Util.cc index 64810ff4..f4a261da 100644 --- a/src/Util.cc +++ b/src/Util.cc @@ -303,11 +303,11 @@ void Util::rangedFileCopy(const std::string& dest, const std::string& src, off_t { size_t bufSize = 4096; unsigned char buf[bufSize]; - DefaultDiskWriter srcdw; - DefaultDiskWriter destdw; + DefaultDiskWriter srcdw(src); + DefaultDiskWriter destdw(dest); - srcdw.openExistingFile(src); - destdw.initAndOpenFile(dest); + srcdw.openExistingFile(); + destdw.initAndOpenFile(); lldiv_t res = lldiv(length, bufSize); unsigned int x = res.quot; |
