summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/AbstractDiskWriter.cc58
-rw-r--r--src/AbstractDiskWriter.h10
-rw-r--r--src/AbstractSingleDiskAdaptor.cc8
-rw-r--r--src/AbstractSingleDiskAdaptor.h2
-rw-r--r--src/ByteArrayDiskWriter.cc11
-rw-r--r--src/ByteArrayDiskWriter.h6
-rw-r--r--src/ByteArrayDiskWriterFactory.cc3
-rw-r--r--src/ByteArrayDiskWriterFactory.h2
-rw-r--r--src/DefaultDiskWriter.cc8
-rw-r--r--src/DefaultDiskWriter.h4
-rw-r--r--src/DefaultDiskWriterFactory.cc5
-rw-r--r--src/DefaultDiskWriterFactory.h2
-rw-r--r--src/DefaultPieceStorage.cc13
-rw-r--r--src/DirectDiskAdaptor.cc2
-rw-r--r--src/DirectDiskAdaptor.h2
-rw-r--r--src/DiskAdaptor.h5
-rw-r--r--src/DiskWriter.h16
-rw-r--r--src/DiskWriterFactory.h2
-rw-r--r--src/MessageDigestHelper.cc4
-rw-r--r--src/MultiDiskAdaptor.cc15
-rw-r--r--src/RequestGroup.cc33
-rw-r--r--src/UnknownLengthPieceStorage.cc14
-rw-r--r--src/Util.cc8
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;