2009-03-10 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

FileEntry::getPath() contains store(top level) directory to
	simplify path handling operation.  In the previous
	implementation, store directory is concatenated to
	FileEntry::getPath() in DownloadContext.
	* src/BtDependency.cc
	* src/BtPostDownloadHandler.cc
	* src/CopyDiskAdaptor.cc
	* src/DefaultBtContext.cc
	* src/DirectDiskAdaptor.cc
	* src/FileEntry.cc
	* src/FileEntry.h
	* src/FtpNegotiationCommand.cc
	* src/HttpResponse.cc
	* src/HttpResponseCommand.cc
	* src/Metalink2RequestGroup.cc
	* src/MultiDiskAdaptor.cc
	* src/MultiDiskAdaptor.h
	* src/MultiFileAllocationIterator.cc
	* src/RequestGroup.cc
	* src/SingleFileDownloadContext.cc
	* src/SingleFileDownloadContext.h
	* src/download_helper.cc
	* test/BtDependencyTest.cc
	* test/CopyDiskAdaptorTest.cc
	* test/DefaultBtContextTest.cc
	* test/DefaultBtProgressInfoFileTest.cc
	* test/DirectDiskAdaptorTest.cc
	* test/DownloadHelperTest.cc
	* test/FileEntryTest.cc
	* test/MultiDiskAdaptorTest.cc
	* test/MultiFileAllocationIteratorTest.cc
	* test/RequestGroupTest.cc
	* test/SingleFileDownloadContextTest.cc
pull/1/head
Tatsuhiro Tsujikawa 2009-03-09 15:10:26 +00:00
parent ed6851636f
commit e2704bd823
30 changed files with 228 additions and 211 deletions

View File

@ -1,3 +1,39 @@
2009-03-10 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
FileEntry::getPath() contains store(top level) directory to
simplify path handling operation. In the previous implementation,
store directory is concatenated to FileEntry::getPath() in
DownloadContext.
* src/BtDependency.cc
* src/BtPostDownloadHandler.cc
* src/CopyDiskAdaptor.cc
* src/DefaultBtContext.cc
* src/DirectDiskAdaptor.cc
* src/FileEntry.cc
* src/FileEntry.h
* src/FtpNegotiationCommand.cc
* src/HttpResponse.cc
* src/HttpResponseCommand.cc
* src/Metalink2RequestGroup.cc
* src/MultiDiskAdaptor.cc
* src/MultiDiskAdaptor.h
* src/MultiFileAllocationIterator.cc
* src/RequestGroup.cc
* src/SingleFileDownloadContext.cc
* src/SingleFileDownloadContext.h
* src/download_helper.cc
* test/BtDependencyTest.cc
* test/CopyDiskAdaptorTest.cc
* test/DefaultBtContextTest.cc
* test/DefaultBtProgressInfoFileTest.cc
* test/DirectDiskAdaptorTest.cc
* test/DownloadHelperTest.cc
* test/FileEntryTest.cc
* test/MultiDiskAdaptorTest.cc
* test/MultiFileAllocationIteratorTest.cc
* test/RequestGroupTest.cc
* test/SingleFileDownloadContextTest.cc
2009-03-09 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net> 2009-03-09 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Fixed compiler warning Fixed compiler warning

View File

@ -65,17 +65,28 @@ bool BtDependency::resolve()
// cut reference here // cut reference here
_dependee.reset(); _dependee.reset();
DefaultBtContextHandle btContext(new DefaultBtContext()); DefaultBtContextHandle btContext(new DefaultBtContext());
btContext->setDir(_dependant->getDownloadContext()->getDir());
try { try {
DiskAdaptorHandle diskAdaptor = dependee->getPieceStorage()->getDiskAdaptor(); DiskAdaptorHandle diskAdaptor = dependee->getPieceStorage()->getDiskAdaptor();
diskAdaptor->openExistingFile(); diskAdaptor->openExistingFile();
std::string content = Util::toString(diskAdaptor); std::string content = Util::toString(diskAdaptor);
std::string overrideName;
if(Util::startsWith(_dependant->getDownloadContext()->getActualBasePath(),
_dependant->getDownloadContext()->getDir())) {
overrideName =
_dependant->getDownloadContext()->getActualBasePath().substr
(_dependant->getDownloadContext()->getDir().size());
if(Util::startsWith(overrideName, "/")) {
overrideName = overrideName.substr(1);
}
}
btContext->loadFromMemory(content, btContext->loadFromMemory(content,
File(dependee->getFilePath()).getBasename(), File(dependee->getFilePath()).getBasename(),
_dependant->getDownloadContext()->getName()); overrideName);
if(_option->defined(PREF_PEER_ID_PREFIX)) { if(_option->defined(PREF_PEER_ID_PREFIX)) {
btContext->setPeerIdPrefix(_option->get(PREF_PEER_ID_PREFIX)); btContext->setPeerIdPrefix(_option->get(PREF_PEER_ID_PREFIX));
} }
btContext->setDir(_dependant->getDownloadContext()->getDir());
} catch(RecoverableException& e) { } catch(RecoverableException& e) {
_logger->error(EX_EXCEPTION_CAUGHT, e); _logger->error(EX_EXCEPTION_CAUGHT, e);
_logger->debug("BtDependency for GID#%d failed. Go without Bt.", _logger->debug("BtDependency for GID#%d failed. Go without Bt.",

View File

@ -77,11 +77,11 @@ void BtPostDownloadHandler::getNextRequestGroups
throw; throw;
} }
DefaultBtContextHandle btContext(new DefaultBtContext()); DefaultBtContextHandle btContext(new DefaultBtContext());
btContext->setDir(requestGroup->getDownloadContext()->getDir());
btContext->loadFromMemory(content, File(requestGroup->getFilePath()).getBasename()); btContext->loadFromMemory(content, File(requestGroup->getFilePath()).getBasename());
if(op->defined(PREF_PEER_ID_PREFIX)) { if(op->defined(PREF_PEER_ID_PREFIX)) {
btContext->setPeerIdPrefix(op->get(PREF_PEER_ID_PREFIX)); btContext->setPeerIdPrefix(op->get(PREF_PEER_ID_PREFIX));
} }
btContext->setDir(requestGroup->getDownloadContext()->getDir());
rg->setDownloadContext(btContext); rg->setDownloadContext(btContext);
btContext->setOwnerRequestGroup(rg.get()); btContext->setOwnerRequestGroup(rg.get());

View File

@ -54,9 +54,8 @@ void CopyDiskAdaptor::fixFilename()
for(FileEntries::iterator itr = fileEntries.begin(); for(FileEntries::iterator itr = fileEntries.begin();
itr != fileEntries.end(); itr++) { itr != fileEntries.end(); itr++) {
if(!(*itr)->isExtracted() && (*itr)->isRequested()) { if(!(*itr)->isExtracted() && (*itr)->isRequested()) {
std::string topDirPath = storeDir+"/"+topDir; (*itr)->setupDir();
(*itr)->setupDir(topDirPath); std::string destFilePath = (*itr)->getPath();
std::string destFilePath = topDirPath+"/"+(*itr)->getPath();
logger->info(MSG_WRITING_FILE, destFilePath.c_str()); logger->info(MSG_WRITING_FILE, destFilePath.c_str());
Util::rangedFileCopy(destFilePath, getFilePath(), Util::rangedFileCopy(destFilePath, getFilePath(),
offset, (*itr)->getLength()); offset, (*itr)->getLength());
@ -74,11 +73,10 @@ std::string CopyDiskAdaptor::getFilePath()
size_t CopyDiskAdaptor::utime(const Time& actime, const Time& modtime) size_t CopyDiskAdaptor::utime(const Time& actime, const Time& modtime)
{ {
size_t numOK = 0; size_t numOK = 0;
std::string topDirPath = storeDir+"/"+topDir;
for(std::deque<SharedHandle<FileEntry> >::const_iterator i = for(std::deque<SharedHandle<FileEntry> >::const_iterator i =
fileEntries.begin(); i != fileEntries.end(); ++i) { fileEntries.begin(); i != fileEntries.end(); ++i) {
if((*i)->isExtracted() && (*i)->isRequested()) { if((*i)->isExtracted() && (*i)->isRequested()) {
File f(topDirPath+"/"+(*i)->getPath()); File f((*i)->getPath());
if(f.isFile() && f.utime(actime, modtime)) { if(f.isFile() && f.utime(actime, modtime)) {
++numOK; ++numOK;
} }

View File

@ -160,6 +160,7 @@ void DefaultBtContext::extractFileEntries(const bencode::BDE& infoDict,
std::deque<std::string> elements; std::deque<std::string> elements;
Util::slice(elements, path, '/'); Util::slice(elements, path, '/');
elements.push_front(name); elements.push_front(name);
elements.push_front(_dir);
path = Util::joinPath(elements.begin(), elements.end()); path = Util::joinPath(elements.begin(), elements.end());
std::deque<std::string> uris; std::deque<std::string> uris;
@ -180,7 +181,8 @@ void DefaultBtContext::extractFileEntries(const bencode::BDE& infoDict,
BtContext::C_LENGTH.c_str()).str()); BtContext::C_LENGTH.c_str()).str());
} }
totalLength = lengthData.i(); totalLength = lengthData.i();
FileEntryHandle fileEntry(new FileEntry(name, totalLength, 0, urlList)); // TODO slice name and apply Util::joinPath()
FileEntryHandle fileEntry(new FileEntry(_dir+"/"+name, totalLength, 0, urlList));
fileEntries.push_back(fileEntry); fileEntries.push_back(fileEntry);
} }
} }

View File

@ -40,7 +40,7 @@ namespace aria2 {
std::string DirectDiskAdaptor::getFilePath() std::string DirectDiskAdaptor::getFilePath()
{ {
return storeDir+"/"+fileEntries.front()->getPath(); return fileEntries.front()->getPath();
} }
void DirectDiskAdaptor::onDownloadComplete() void DirectDiskAdaptor::onDownloadComplete()

View File

@ -47,9 +47,9 @@ FileEntry::FileEntry(const std::string& path,
FileEntry::~FileEntry() {} FileEntry::~FileEntry() {}
void FileEntry::setupDir(const std::string& parentDir) void FileEntry::setupDir()
{ {
Util::mkdirs(File(parentDir+"/"+path).getDirname()); Util::mkdirs(File(path).getDirname());
} }
FileEntry& FileEntry::operator=(const FileEntry& entry) FileEntry& FileEntry::operator=(const FileEntry& entry)

View File

@ -91,7 +91,7 @@ public:
void setRequested(bool flag) { this->requested = flag; } void setRequested(bool flag) { this->requested = flag; }
void setupDir(const std::string& parentDir); void setupDir();
const std::deque<std::string>& getAssociatedUris() const const std::deque<std::string>& getAssociatedUris() const
{ {

View File

@ -327,7 +327,7 @@ bool FtpNegotiationCommand::onFileSizeDetermined(uint64_t totalLength)
SingleFileDownloadContextHandle dctx = SingleFileDownloadContextHandle dctx =
dynamic_pointer_cast<SingleFileDownloadContext>(_requestGroup->getDownloadContext()); dynamic_pointer_cast<SingleFileDownloadContext>(_requestGroup->getDownloadContext());
dctx->setTotalLength(totalLength); dctx->setTotalLength(totalLength);
dctx->setFilename(Util::urldecode(req->getFile())); dctx->setFilename(dctx->getDir()+"/"+Util::urldecode(req->getFile()));
_requestGroup->preDownloadProcessing(); _requestGroup->preDownloadProcessing();
if(e->_requestGroupMan->isSameFileBeingDownloaded(_requestGroup)) { if(e->_requestGroupMan->isSameFileBeingDownloaded(_requestGroup)) {
throw DownloadFailureException throw DownloadFailureException

View File

@ -101,7 +101,12 @@ std::string HttpResponse::determinFilename() const
Util::getContentDispositionFilename Util::getContentDispositionFilename
(httpHeader->getFirst(HttpHeader::CONTENT_DISPOSITION)); (httpHeader->getFirst(HttpHeader::CONTENT_DISPOSITION));
if(contentDisposition.empty()) { if(contentDisposition.empty()) {
return Util::urldecode(httpRequest->getFile()); std::string file = Util::urldecode(httpRequest->getFile());
if(file.empty()) {
return "index.html";
} else {
return file;
}
} else { } else {
logger->info(MSG_CONTENT_DISPOSITION_DETECTED, logger->info(MSG_CONTENT_DISPOSITION_DETECTED,
cuid, contentDisposition.c_str()); cuid, contentDisposition.c_str());

View File

@ -129,7 +129,7 @@ bool HttpResponseCommand::executeInternal()
SingleFileDownloadContextHandle dctx = SingleFileDownloadContextHandle dctx =
dynamic_pointer_cast<SingleFileDownloadContext>(_requestGroup->getDownloadContext()); dynamic_pointer_cast<SingleFileDownloadContext>(_requestGroup->getDownloadContext());
dctx->setTotalLength(totalLength); dctx->setTotalLength(totalLength);
dctx->setFilename(httpResponse->determinFilename()); dctx->setFilename(dctx->getDir()+"/"+httpResponse->determinFilename());
dctx->setContentType(httpResponse->getContentType()); dctx->setContentType(httpResponse->getContentType());
_requestGroup->preDownloadProcessing(); _requestGroup->preDownloadProcessing();
if(e->_requestGroupMan->isSameFileBeingDownloaded(_requestGroup)) { if(e->_requestGroupMan->isSameFileBeingDownloaded(_requestGroup)) {

View File

@ -212,6 +212,7 @@ Metalink2RequestGroup::createRequestGroup
(new SingleFileDownloadContext(pieceLength, (new SingleFileDownloadContext(pieceLength,
entry->getLength(), entry->getLength(),
A2STR::NIL, A2STR::NIL,
requestOption.get(PREF_DIR)+"/"+
entry->file->getPath())); entry->file->getPath()));
dctx->setDir(requestOption.get(PREF_DIR)); dctx->setDir(requestOption.get(PREF_DIR));
#ifdef ENABLE_MESSAGE_DIGEST #ifdef ENABLE_MESSAGE_DIGEST

View File

@ -58,15 +58,15 @@ DiskWriterEntry::DiskWriterEntry(const SharedHandle<FileEntry>& fileEntry):
DiskWriterEntry::~DiskWriterEntry() {} DiskWriterEntry::~DiskWriterEntry() {}
std::string DiskWriterEntry::getFilePath(const std::string& storeDir) const const std::string& DiskWriterEntry::getFilePath() const
{ {
return storeDir+"/"+fileEntry->getPath(); return fileEntry->getPath();
} }
void DiskWriterEntry::initAndOpenFile(const std::string& storeDir) void DiskWriterEntry::initAndOpenFile()
{ {
if(!diskWriter.isNull()) { if(!diskWriter.isNull()) {
diskWriter->initAndOpenFile(getFilePath(storeDir), fileEntry->getLength()); diskWriter->initAndOpenFile(getFilePath(), fileEntry->getLength());
if(_directIO) { if(_directIO) {
diskWriter->enableDirectIO(); diskWriter->enableDirectIO();
} }
@ -74,10 +74,10 @@ void DiskWriterEntry::initAndOpenFile(const std::string& storeDir)
} }
} }
void DiskWriterEntry::openFile(const std::string& storeDir) void DiskWriterEntry::openFile()
{ {
if(!diskWriter.isNull()) { if(!diskWriter.isNull()) {
diskWriter->openFile(getFilePath(storeDir), fileEntry->getLength()); diskWriter->openFile(getFilePath(), fileEntry->getLength());
if(_directIO) { if(_directIO) {
diskWriter->enableDirectIO(); diskWriter->enableDirectIO();
} }
@ -85,10 +85,10 @@ void DiskWriterEntry::openFile(const std::string& storeDir)
} }
} }
void DiskWriterEntry::openExistingFile(const std::string& storeDir) void DiskWriterEntry::openExistingFile()
{ {
if(!diskWriter.isNull()) { if(!diskWriter.isNull()) {
diskWriter->openExistingFile(getFilePath(storeDir), fileEntry->getLength()); diskWriter->openExistingFile(getFilePath(), fileEntry->getLength());
if(_directIO) { if(_directIO) {
diskWriter->enableDirectIO(); diskWriter->enableDirectIO();
} }
@ -109,9 +109,9 @@ void DiskWriterEntry::closeFile()
} }
} }
bool DiskWriterEntry::fileExists(const std::string& storeDir) bool DiskWriterEntry::fileExists()
{ {
return File(getFilePath(storeDir)).exists(); return File(getFilePath()).exists();
} }
uint64_t DiskWriterEntry::size() const uint64_t DiskWriterEntry::size() const
@ -270,9 +270,9 @@ void MultiDiskAdaptor::resetDiskWriterEntries()
diskWriterEntries.begin(); i != diskWriterEntries.end(); ++i) { diskWriterEntries.begin(); i != diskWriterEntries.end(); ++i) {
if((*i)->needsFileAllocation() || if((*i)->needsFileAllocation() ||
dwreq.find((*i)->getFileEntry()->getPath()) != dwreq.end() || dwreq.find((*i)->getFileEntry()->getPath()) != dwreq.end() ||
(*i)->fileExists(storeDir)) { (*i)->fileExists()) {
logger->debug("Creating DiskWriter for filename=%s", logger->debug("Creating DiskWriter for filename=%s",
(*i)->getFilePath(storeDir).c_str()); (*i)->getFilePath().c_str());
(*i)->setDiskWriter(dwFactory.newDiskWriter()); (*i)->setDiskWriter(dwFactory.newDiskWriter());
(*i)->getDiskWriter()->setDirectIOAllowed(_directIOAllowed); (*i)->getDiskWriter()->setDirectIOAllowed(_directIOAllowed);
if(_readOnly) { if(_readOnly) {
@ -287,25 +287,23 @@ std::string MultiDiskAdaptor::getTopDirPath() const
return storeDir+"/"+topDir; return storeDir+"/"+topDir;
} }
void MultiDiskAdaptor::mkdir(const std::string& storeDir) const void MultiDiskAdaptor::mkdir() const
{ {
for(std::deque<SharedHandle<DiskWriterEntry> >::const_iterator i = for(std::deque<SharedHandle<DiskWriterEntry> >::const_iterator i =
diskWriterEntries.begin(); i != diskWriterEntries.end(); ++i) { diskWriterEntries.begin(); i != diskWriterEntries.end(); ++i) {
(*i)->getFileEntry()->setupDir(storeDir); (*i)->getFileEntry()->setupDir();
} }
} }
void MultiDiskAdaptor::openIfNot void MultiDiskAdaptor::openIfNot
(const SharedHandle<DiskWriterEntry>& entry, (const SharedHandle<DiskWriterEntry>& entry, void (DiskWriterEntry::*open)())
void (DiskWriterEntry::*open)(const std::string&),
const std::string& storeDir)
{ {
if(!entry->isOpen()) { if(!entry->isOpen()) {
// logger->debug("DiskWriterEntry: Cache MISS. offset=%s", // logger->debug("DiskWriterEntry: Cache MISS. offset=%s",
// Util::itos(entry->getFileEntry()->getOffset()).c_str()); // Util::itos(entry->getFileEntry()->getOffset()).c_str());
size_t numOpened = _openedDiskWriterEntries.size(); size_t numOpened = _openedDiskWriterEntries.size();
(entry.get()->*open)(storeDir); (entry.get()->*open)();
if(numOpened >= _maxOpenFiles) { if(numOpened >= _maxOpenFiles) {
// Cache is full. // Cache is full.
// Choose one DiskWriterEntry randomly and close it. // Choose one DiskWriterEntry randomly and close it.
@ -327,23 +325,23 @@ void MultiDiskAdaptor::openIfNot
void MultiDiskAdaptor::openFile() void MultiDiskAdaptor::openFile()
{ {
resetDiskWriterEntries(); resetDiskWriterEntries();
mkdir(storeDir); mkdir();
// Call DiskWriterEntry::openFile to make sure that zero-length files are // Call DiskWriterEntry::openFile to make sure that zero-length files are
// created. // created.
for(DiskWriterEntries::iterator itr = diskWriterEntries.begin(); for(DiskWriterEntries::iterator itr = diskWriterEntries.begin();
itr != diskWriterEntries.end(); ++itr) { itr != diskWriterEntries.end(); ++itr) {
openIfNot(*itr, &DiskWriterEntry::openFile, storeDir); openIfNot(*itr, &DiskWriterEntry::openFile);
} }
} }
void MultiDiskAdaptor::initAndOpenFile() void MultiDiskAdaptor::initAndOpenFile()
{ {
resetDiskWriterEntries(); resetDiskWriterEntries();
mkdir(storeDir); mkdir();
// Call DiskWriterEntry::initAndOpenFile to make files truncated. // Call DiskWriterEntry::initAndOpenFile to make files truncated.
for(DiskWriterEntries::iterator itr = diskWriterEntries.begin(); for(DiskWriterEntries::iterator itr = diskWriterEntries.begin();
itr != diskWriterEntries.end(); ++itr) { itr != diskWriterEntries.end(); ++itr) {
openIfNot(*itr, &DiskWriterEntry::initAndOpenFile, storeDir); openIfNot(*itr, &DiskWriterEntry::initAndOpenFile);
} }
} }
@ -412,13 +410,12 @@ findFirstDiskWriterEntry(const DiskWriterEntries& diskWriterEntries, off_t offse
} }
static void throwOnDiskWriterNotOpened(const SharedHandle<DiskWriterEntry>& e, static void throwOnDiskWriterNotOpened(const SharedHandle<DiskWriterEntry>& e,
off_t offset, off_t offset)
const std::string& storeDir)
{ {
throw DlAbortEx throw DlAbortEx
(StringFormat("DiskWriter for offset=%s, filename=%s is not opened.", (StringFormat("DiskWriter for offset=%s, filename=%s is not opened.",
Util::itos(offset).c_str(), Util::itos(offset).c_str(),
e->getFilePath(storeDir).c_str()).str()); e->getFilePath().c_str()).str());
} }
void MultiDiskAdaptor::writeData(const unsigned char* data, size_t len, void MultiDiskAdaptor::writeData(const unsigned char* data, size_t len,
@ -431,10 +428,10 @@ void MultiDiskAdaptor::writeData(const unsigned char* data, size_t len,
for(DiskWriterEntries::const_iterator i = first; i != diskWriterEntries.end(); ++i) { for(DiskWriterEntries::const_iterator i = first; i != diskWriterEntries.end(); ++i) {
size_t writeLength = calculateLength(*i, fileOffset, rem); size_t writeLength = calculateLength(*i, fileOffset, rem);
openIfNot(*i, &DiskWriterEntry::openFile, storeDir); openIfNot(*i, &DiskWriterEntry::openFile);
if(!(*i)->isOpen()) { if(!(*i)->isOpen()) {
throwOnDiskWriterNotOpened(*i, offset+(len-rem), storeDir); throwOnDiskWriterNotOpened(*i, offset+(len-rem));
} }
(*i)->getDiskWriter()->writeData(data+(len-rem), writeLength, fileOffset); (*i)->getDiskWriter()->writeData(data+(len-rem), writeLength, fileOffset);
@ -456,10 +453,10 @@ ssize_t MultiDiskAdaptor::readData(unsigned char* data, size_t len, off_t offset
for(DiskWriterEntries::const_iterator i = first; i != diskWriterEntries.end(); ++i) { for(DiskWriterEntries::const_iterator i = first; i != diskWriterEntries.end(); ++i) {
size_t readLength = calculateLength(*i, fileOffset, rem); size_t readLength = calculateLength(*i, fileOffset, rem);
openIfNot(*i, &DiskWriterEntry::openFile, storeDir); openIfNot(*i, &DiskWriterEntry::openFile);
if(!(*i)->isOpen()) { if(!(*i)->isOpen()) {
throwOnDiskWriterNotOpened(*i, offset+(len-rem), storeDir); throwOnDiskWriterNotOpened(*i, offset+(len-rem));
} }
totalReadLength += totalReadLength +=
@ -481,7 +478,7 @@ bool MultiDiskAdaptor::fileExists()
// This method could be called before opening files. // This method could be called before opening files.
for(std::deque<SharedHandle<FileEntry> >::iterator i = for(std::deque<SharedHandle<FileEntry> >::iterator i =
fileEntries.begin(); i != fileEntries.end(); ++i) { fileEntries.begin(); i != fileEntries.end(); ++i) {
if(File(storeDir+"/"+(*i)->getPath()).exists()) { if(File((*i)->getPath()).exists()) {
return true; return true;
} }
} }
@ -494,7 +491,7 @@ uint64_t MultiDiskAdaptor::size()
uint64_t size = 0; uint64_t size = 0;
for(DiskWriterEntries::const_iterator itr = diskWriterEntries.begin(); for(DiskWriterEntries::const_iterator itr = diskWriterEntries.begin();
itr != diskWriterEntries.end(); ++itr) { itr != diskWriterEntries.end(); ++itr) {
openIfNot(*itr, &DiskWriterEntry::openFile, storeDir); openIfNot(*itr, &DiskWriterEntry::openFile);
size += (*itr)->size(); size += (*itr)->size();
} }
return size; return size;
@ -536,9 +533,9 @@ void MultiDiskAdaptor::cutTrailingGarbage()
for(std::deque<SharedHandle<DiskWriterEntry> >::const_iterator i = for(std::deque<SharedHandle<DiskWriterEntry> >::const_iterator i =
diskWriterEntries.begin(); i != diskWriterEntries.end(); ++i) { diskWriterEntries.begin(); i != diskWriterEntries.end(); ++i) {
uint64_t length = (*i)->getFileEntry()->getLength(); uint64_t length = (*i)->getFileEntry()->getLength();
if(File((*i)->getFilePath(storeDir)).size() > length) { if(File((*i)->getFilePath()).size() > length) {
// We need open file before calling DiskWriter::truncate(uint64_t) // We need open file before calling DiskWriter::truncate(uint64_t)
openIfNot(*i, &DiskWriterEntry::openFile, storeDir); openIfNot(*i, &DiskWriterEntry::openFile);
(*i)->getDiskWriter()->truncate(length); (*i)->getDiskWriter()->truncate(length);
} }
} }
@ -555,7 +552,7 @@ size_t MultiDiskAdaptor::utime(const Time& actime, const Time& modtime)
for(std::deque<SharedHandle<FileEntry> >::const_iterator i = for(std::deque<SharedHandle<FileEntry> >::const_iterator i =
fileEntries.begin(); i != fileEntries.end(); ++i) { fileEntries.begin(); i != fileEntries.end(); ++i) {
if((*i)->isRequested()) { if((*i)->isRequested()) {
File f(storeDir+"/"+(*i)->getPath()); File f((*i)->getPath());
if(f.isFile() && f.utime(actime, modtime)) { if(f.isFile() && f.utime(actime, modtime)) {
++numOK; ++numOK;
} }
@ -570,9 +567,4 @@ MultiDiskAdaptor::getDiskWriterEntries() const
return diskWriterEntries; return diskWriterEntries;
} }
const std::string& MultiDiskAdaptor::getStoreDir() const
{
return storeDir;
}
} // namespace aria2 } // namespace aria2

View File

@ -55,19 +55,19 @@ public:
~DiskWriterEntry(); ~DiskWriterEntry();
std::string getFilePath(const std::string& storeDir) const; const std::string& getFilePath() const;
void initAndOpenFile(const std::string& storeDir); void initAndOpenFile();
void openFile(const std::string& storeDir); void openFile();
void openExistingFile(const std::string& storeDir); void openExistingFile();
void closeFile(); void closeFile();
bool isOpen() const; bool isOpen() const;
bool fileExists(const std::string& storeDir); bool fileExists();
uint64_t size() const; uint64_t size() const;
@ -115,13 +115,12 @@ private:
void resetDiskWriterEntries(); void resetDiskWriterEntries();
void mkdir(const std::string& storeDir) const; void mkdir() const;
std::string getTopDirPath() const; std::string getTopDirPath() const;
void openIfNot(const SharedHandle<DiskWriterEntry>& entry, void openIfNot(const SharedHandle<DiskWriterEntry>& entry,
void (DiskWriterEntry::*f)(const std::string&), void (DiskWriterEntry::*f)());
const std::string& storeDir);
static const size_t DEFAULT_MAX_OPEN_FILES = 100; static const size_t DEFAULT_MAX_OPEN_FILES = 100;
@ -198,8 +197,6 @@ public:
const std::deque<SharedHandle<DiskWriterEntry> >& const std::deque<SharedHandle<DiskWriterEntry> >&
getDiskWriterEntries() const; getDiskWriterEntries() const;
const std::string& getStoreDir() const;
}; };
typedef SharedHandle<MultiDiskAdaptor> MultiDiskAdaptorHandle; typedef SharedHandle<MultiDiskAdaptor> MultiDiskAdaptorHandle;

View File

@ -58,8 +58,7 @@ void MultiFileAllocationIterator::allocateChunk()
_entries.pop_front(); _entries.pop_front();
FileEntryHandle fileEntry = entry->getFileEntry(); FileEntryHandle fileEntry = entry->getFileEntry();
// Open file before calling DiskWriterEntry::size() // Open file before calling DiskWriterEntry::size()
_diskAdaptor->openIfNot(entry, &DiskWriterEntry::openFile, _diskAdaptor->openIfNot(entry, &DiskWriterEntry::openFile);
_diskAdaptor->getStoreDir());
entry->enableDirectIO(); entry->enableDirectIO();
if(entry->needsFileAllocation() && entry->size() < fileEntry->getLength()) { if(entry->needsFileAllocation() && entry->size() < fileEntry->getLength()) {
// Calling private function of MultiDiskAdaptor. // Calling private function of MultiDiskAdaptor.

View File

@ -525,11 +525,10 @@ bool RequestGroup::tryAutoFileRenaming()
for(unsigned int i = 1; i < 10000; ++i) { for(unsigned int i = 1; i < 10000; ++i) {
File newfile(filepath+"."+Util::uitos(i)); File newfile(filepath+"."+Util::uitos(i));
std::string newFilename = newfile.getBasename(); tempCtx->setUFilename(newfile.getPath());
tempCtx->setUFilename(newFilename);
tempInfoFile.updateFilename(); tempInfoFile.updateFilename();
if(!newfile.exists() || (newfile.exists() && tempInfoFile.exists())) { if(!newfile.exists() || (newfile.exists() && tempInfoFile.exists())) {
ctx->setUFilename(newFilename); ctx->setUFilename(newfile.getPath());
return true; return true;
} }
} }

View File

@ -59,7 +59,7 @@ void SingleFileDownloadContext::updateFileEntry()
} else if(!_filename.empty()) { } else if(!_filename.empty()) {
_fileEntry->setPath(_filename); _fileEntry->setPath(_filename);
} else { } else {
_fileEntry->setPath(DEFAULT_FILENAME); _fileEntry->setPath("");
} }
} }
@ -94,7 +94,7 @@ size_t SingleFileDownloadContext::getNumPieces() const
std::string SingleFileDownloadContext::getActualBasePath() const std::string SingleFileDownloadContext::getActualBasePath() const
{ {
return _dir+"/"+_fileEntry->getPath(); return _fileEntry->getPath();
} }
void SingleFileDownloadContext::setTotalLength(uint64_t totalLength) void SingleFileDownloadContext::setTotalLength(uint64_t totalLength)

View File

@ -46,14 +46,11 @@ class SingleFileDownloadContext:public DownloadContext
{ {
private: private:
size_t _pieceLength; size_t _pieceLength;
/**
* Actual file path is _dir + _filename.
* If _ufilename is not zero-length string, then _dir + _ufilename.
*/
SharedHandle<FileEntry> _fileEntry; SharedHandle<FileEntry> _fileEntry;
/** /**
* _filename and _ufilename may contains directory path name. * _filename and _ufilename may contains directory path name. So
* So usr/local/aria2c is acceptable here. * /usr/local/aria2c is acceptable here. These should be complete
* file path.
*/ */
std::string _filename; std::string _filename;
std::string _ufilename; std::string _ufilename;

View File

@ -101,8 +101,9 @@ static SharedHandle<RequestGroup> createRequestGroup
(new SingleFileDownloadContext(op->getAsInt(PREF_SEGMENT_SIZE), (new SingleFileDownloadContext(op->getAsInt(PREF_SEGMENT_SIZE),
0, 0,
A2STR::NIL, A2STR::NIL,
useOutOption? useOutOption&&!requestOption.blank(PREF_OUT)?
requestOption.get(PREF_OUT):A2STR::NIL)); requestOption.get(PREF_DIR)+"/"+requestOption.get(PREF_OUT):A2STR::NIL));
dctx->setDir(requestOption.get(PREF_DIR)); dctx->setDir(requestOption.get(PREF_DIR));
rg->setDownloadContext(dctx); rg->setDownloadContext(dctx);
return rg; return rg;
@ -119,11 +120,11 @@ createBtRequestGroup(const std::string& torrentFilePath,
{ {
SharedHandle<RequestGroup> rg(new RequestGroup(op, auxUris)); SharedHandle<RequestGroup> rg(new RequestGroup(op, auxUris));
SharedHandle<DefaultBtContext> btContext(new DefaultBtContext()); SharedHandle<DefaultBtContext> btContext(new DefaultBtContext());
btContext->setDir(requestOption.get(PREF_DIR));
btContext->load(torrentFilePath);// may throw exception btContext->load(torrentFilePath);// may throw exception
if(op->defined(PREF_PEER_ID_PREFIX)) { if(op->defined(PREF_PEER_ID_PREFIX)) {
btContext->setPeerIdPrefix(op->get(PREF_PEER_ID_PREFIX)); btContext->setPeerIdPrefix(op->get(PREF_PEER_ID_PREFIX));
} }
btContext->setDir(requestOption.get(PREF_DIR));
btContext->setFileFilter btContext->setFileFilter
(Util::parseIntRange(requestOption.get(PREF_SELECT_FILE))); (Util::parseIntRange(requestOption.get(PREF_SELECT_FILE)));
std::istringstream indexOutIn(requestOption.get(PREF_INDEX_OUT)); std::istringstream indexOutIn(requestOption.get(PREF_INDEX_OUT));

View File

@ -29,7 +29,7 @@ class BtDependencyTest:public CppUnit::TestFixture {
{ {
SharedHandle<RequestGroup> dependant(new RequestGroup(option, std::deque<std::string>())); SharedHandle<RequestGroup> dependant(new RequestGroup(option, std::deque<std::string>()));
SharedHandle<SingleFileDownloadContext> dctx SharedHandle<SingleFileDownloadContext> dctx
(new SingleFileDownloadContext(0, 0, "outfile.path")); (new SingleFileDownloadContext(0, 0, "/tmp/outfile.path"));
dctx->setDir("/tmp"); dctx->setDir("/tmp");
dependant->setDownloadContext(dctx); dependant->setDownloadContext(dctx);
return dependant; return dependant;

View File

@ -28,22 +28,19 @@ CPPUNIT_TEST_SUITE_REGISTRATION( CopyDiskAdaptorTest );
void CopyDiskAdaptorTest::testUtime() void CopyDiskAdaptorTest::testUtime()
{ {
std::string storeDir = "/tmp"; std::string storeDir = "/tmp/aria2_CopyDiskAdaptorTest_testUtime";
std::string topDir = "aria2_CopyDiskAdaptorTest_testUtime";
std::string prefix = storeDir+"/"+topDir;
SharedHandle<FileEntry> entries[] = { SharedHandle<FileEntry> entries[] = {
SharedHandle<FileEntry>(new FileEntry("requested", 10, 0)), SharedHandle<FileEntry>(new FileEntry(storeDir+"/requested", 10, 0)),
SharedHandle<FileEntry>(new FileEntry("notFound", 10, 10)), SharedHandle<FileEntry>(new FileEntry(storeDir+"/notFound", 10, 10)),
SharedHandle<FileEntry>(new FileEntry("notRequested", 10, 20)), SharedHandle<FileEntry>(new FileEntry(storeDir+"/notRequested", 10, 20)),
SharedHandle<FileEntry>(new FileEntry("notExtracted", 10, 30)), SharedHandle<FileEntry>(new FileEntry(storeDir+"/notExtracted", 10, 30)),
SharedHandle<FileEntry>(new FileEntry("anotherRequested", 10, 40)), SharedHandle<FileEntry>(new FileEntry(storeDir+"/anotherRequested", 10, 40)),
}; };
std::deque<SharedHandle<FileEntry> > fileEntries std::deque<SharedHandle<FileEntry> > fileEntries
(&entries[0], &entries[arrayLength(entries)]); (&entries[0], &entries[arrayLength(entries)]);
CopyDiskAdaptor adaptor; CopyDiskAdaptor adaptor;
adaptor.setStoreDir(storeDir); adaptor.setStoreDir(storeDir);
adaptor.setTopDir(topDir);
adaptor.setFileEntries(fileEntries); adaptor.setFileEntries(fileEntries);
entries[0]->setExtracted(true); entries[0]->setExtracted(true);
@ -53,11 +50,11 @@ void CopyDiskAdaptorTest::testUtime()
entries[2]->setRequested(false); entries[2]->setRequested(false);
createFile(prefix+"/"+entries[0]->getPath(), entries[0]->getLength()); createFile(entries[0]->getPath(), entries[0]->getLength());
File(prefix+"/"+entries[1]->getPath()).remove(); File(entries[1]->getPath()).remove();
createFile(prefix+"/"+entries[2]->getPath(), entries[2]->getLength()); createFile(entries[2]->getPath(), entries[2]->getLength());
createFile(prefix+"/"+entries[3]->getPath(), entries[3]->getLength()); createFile(entries[3]->getPath(), entries[3]->getLength());
createFile(prefix+"/"+entries[4]->getPath(), entries[4]->getLength()); createFile(entries[4]->getPath(), entries[4]->getLength());
time_t atime = (time_t) 100000; time_t atime = (time_t) 100000;
time_t mtime = (time_t) 200000; time_t mtime = (time_t) 200000;
@ -65,19 +62,17 @@ void CopyDiskAdaptorTest::testUtime()
CPPUNIT_ASSERT_EQUAL((size_t)2, adaptor.utime(Time(atime), Time(mtime))); CPPUNIT_ASSERT_EQUAL((size_t)2, adaptor.utime(Time(atime), Time(mtime)));
CPPUNIT_ASSERT_EQUAL((time_t)mtime, CPPUNIT_ASSERT_EQUAL((time_t)mtime,
File(prefix+"/"+entries[0]->getPath()) File(entries[0]->getPath()).getModifiedTime().getTime());
.getModifiedTime().getTime());
CPPUNIT_ASSERT_EQUAL((time_t)mtime, CPPUNIT_ASSERT_EQUAL((time_t)mtime,
File(prefix+"/"+entries[4]->getPath()) File(entries[4]->getPath()).getModifiedTime().getTime());
.getModifiedTime().getTime());
CPPUNIT_ASSERT((time_t)mtime != File(prefix+"/"+entries[1]->getPath()) CPPUNIT_ASSERT((time_t)mtime !=
.getModifiedTime().getTime()); File(entries[1]->getPath()).getModifiedTime().getTime());
CPPUNIT_ASSERT((time_t)mtime != File(prefix+"/"+entries[2]->getPath()) CPPUNIT_ASSERT((time_t)mtime !=
.getModifiedTime().getTime()); File(entries[2]->getPath()).getModifiedTime().getTime());
CPPUNIT_ASSERT((time_t)mtime != File(prefix+"/"+entries[3]->getPath()) CPPUNIT_ASSERT((time_t)mtime !=
.getModifiedTime().getTime()); File(entries[3]->getPath()).getModifiedTime().getTime());
} }

View File

@ -126,7 +126,7 @@ void DefaultBtContextTest::testGetFileEntriesSingle() {
std::deque<SharedHandle<FileEntry> >::iterator itr = fileEntries.begin(); std::deque<SharedHandle<FileEntry> >::iterator itr = fileEntries.begin();
SharedHandle<FileEntry> fileEntry1 = *itr; SharedHandle<FileEntry> fileEntry1 = *itr;
CPPUNIT_ASSERT_EQUAL(std::string("aria2-0.8.2.tar.bz2"), CPPUNIT_ASSERT_EQUAL(std::string("./aria2-0.8.2.tar.bz2"),
fileEntry1->getPath()); fileEntry1->getPath());
} }
@ -319,7 +319,7 @@ void DefaultBtContextTest::testGetFileEntries_singleFileUrlList() {
CPPUNIT_ASSERT_EQUAL((size_t)1, fileEntries.size()); CPPUNIT_ASSERT_EQUAL((size_t)1, fileEntries.size());
SharedHandle<FileEntry> fileEntry1 = fileEntries.front(); SharedHandle<FileEntry> fileEntry1 = fileEntries.front();
CPPUNIT_ASSERT_EQUAL(std::string("aria2.tar.bz2"), CPPUNIT_ASSERT_EQUAL(std::string("./aria2.tar.bz2"),
fileEntry1->getPath()); fileEntry1->getPath());
std::deque<std::string> uris1 = fileEntry1->getAssociatedUris(); std::deque<std::string> uris1 = fileEntry1->getAssociatedUris();
CPPUNIT_ASSERT_EQUAL((size_t)1, uris1.size()); CPPUNIT_ASSERT_EQUAL((size_t)1, uris1.size());

View File

@ -70,6 +70,7 @@ public:
_btContext.reset(new MockBtContext()); _btContext.reset(new MockBtContext());
_btContext->setInfoHash(infoHash); _btContext->setInfoHash(infoHash);
_btContext->setDir(_option->get(PREF_DIR));
_peerStorage.reset(new MockPeerStorage()); _peerStorage.reset(new MockPeerStorage());
_btRuntime.reset(new BtRuntime()); _btRuntime.reset(new BtRuntime());
#endif // ENABLE_BITTORRENT #endif // ENABLE_BITTORRENT
@ -332,7 +333,7 @@ void DefaultBtProgressInfoFileTest::testLoad_nonBt_compat()
initializeMembers(1024, 81920); initializeMembers(1024, 81920);
SharedHandle<SingleFileDownloadContext> dctx SharedHandle<SingleFileDownloadContext> dctx
(new SingleFileDownloadContext(1024, 81920, "load-nonBt")); (new SingleFileDownloadContext(1024, 81920, "./load-nonBt"));
DefaultBtProgressInfoFile infoFile(dctx, _pieceStorage, _option.get()); DefaultBtProgressInfoFile infoFile(dctx, _pieceStorage, _option.get());
@ -377,7 +378,7 @@ void DefaultBtProgressInfoFileTest::testLoad_nonBt()
initializeMembers(1024, 81920); initializeMembers(1024, 81920);
SharedHandle<SingleFileDownloadContext> dctx SharedHandle<SingleFileDownloadContext> dctx
(new SingleFileDownloadContext(1024, 81920, "load-nonBt-v0001")); (new SingleFileDownloadContext(1024, 81920, "./load-nonBt-v0001"));
DefaultBtProgressInfoFile infoFile(dctx, _pieceStorage, _option.get()); DefaultBtProgressInfoFile infoFile(dctx, _pieceStorage, _option.get());
@ -422,7 +423,7 @@ void DefaultBtProgressInfoFileTest::testLoad_nonBt_pieceLengthShorter()
_option->put(PREF_ALLOW_PIECE_LENGTH_CHANGE, V_TRUE); _option->put(PREF_ALLOW_PIECE_LENGTH_CHANGE, V_TRUE);
SharedHandle<SingleFileDownloadContext> dctx SharedHandle<SingleFileDownloadContext> dctx
(new SingleFileDownloadContext(512, 81920, "load-nonBt-v0001")); (new SingleFileDownloadContext(512, 81920, "./load-nonBt-v0001"));
DefaultBtProgressInfoFile infoFile(dctx, _pieceStorage, _option.get()); DefaultBtProgressInfoFile infoFile(dctx, _pieceStorage, _option.get());
@ -447,7 +448,7 @@ void DefaultBtProgressInfoFileTest::testSave_nonBt()
initializeMembers(1024, 81920); initializeMembers(1024, 81920);
SharedHandle<SingleFileDownloadContext> dctx SharedHandle<SingleFileDownloadContext> dctx
(new SingleFileDownloadContext(1024, 81920, "save-temp")); (new SingleFileDownloadContext(1024, 81920, "./save-temp"));
_bitfield->setAllBit(); _bitfield->setAllBit();
_bitfield->unsetBit(79); _bitfield->unsetBit(79);
@ -554,7 +555,7 @@ void DefaultBtProgressInfoFileTest::testSave_nonBt()
void DefaultBtProgressInfoFileTest::testUpdateFilename() void DefaultBtProgressInfoFileTest::testUpdateFilename()
{ {
SharedHandle<SingleFileDownloadContext> dctx SharedHandle<SingleFileDownloadContext> dctx
(new SingleFileDownloadContext(1024, 81920, "file1")); (new SingleFileDownloadContext(1024, 81920, "./file1"));
DefaultBtProgressInfoFile infoFile(dctx, SharedHandle<MockPieceStorage>(), 0); DefaultBtProgressInfoFile infoFile(dctx, SharedHandle<MockPieceStorage>(), 0);
#ifdef ENABLE_BITTORRENT #ifdef ENABLE_BITTORRENT
@ -564,7 +565,7 @@ void DefaultBtProgressInfoFileTest::testUpdateFilename()
CPPUNIT_ASSERT_EQUAL(std::string("./file1.aria2"), infoFile.getFilename()); CPPUNIT_ASSERT_EQUAL(std::string("./file1.aria2"), infoFile.getFilename());
dctx->setUFilename("file1.1"); dctx->setUFilename("./file1.1");
CPPUNIT_ASSERT_EQUAL(std::string("./file1.aria2"), infoFile.getFilename()); CPPUNIT_ASSERT_EQUAL(std::string("./file1.aria2"), infoFile.getFilename());

View File

@ -29,9 +29,9 @@ void DirectDiskAdaptorTest::testCutTrailingGarbage()
{ {
std::string dir = "/tmp"; std::string dir = "/tmp";
SharedHandle<FileEntry> entry SharedHandle<FileEntry> entry
(new FileEntry("aria2_DirectDiskAdaptorTest_testCutTrailingGarbage", (new FileEntry(dir+"/aria2_DirectDiskAdaptorTest_testCutTrailingGarbage",
256, 0)); 256, 0));
createFile(dir+"/"+entry->getPath(), entry->getLength()+100); createFile(entry->getPath(), entry->getLength()+100);
std::deque<SharedHandle<FileEntry> > fileEntries; std::deque<SharedHandle<FileEntry> > fileEntries;
fileEntries.push_back(entry); fileEntries.push_back(entry);
@ -46,7 +46,7 @@ void DirectDiskAdaptorTest::testCutTrailingGarbage()
adaptor.cutTrailingGarbage(); adaptor.cutTrailingGarbage();
CPPUNIT_ASSERT_EQUAL((uint64_t)entry->getLength(), CPPUNIT_ASSERT_EQUAL((uint64_t)entry->getLength(),
File(dir+"/"+entry->getPath()).size()); File(entry->getPath()).size());
} }
} // namespace aria2 } // namespace aria2

View File

@ -144,11 +144,8 @@ void DownloadHelperTest::testCreateRequestGroupForUri()
alphaGroup->getNumConcurrentCommand()); alphaGroup->getNumConcurrentCommand());
SharedHandle<DownloadContext> alphaCtx = alphaGroup->getDownloadContext(); SharedHandle<DownloadContext> alphaCtx = alphaGroup->getDownloadContext();
CPPUNIT_ASSERT_EQUAL(std::string("/tmp"), alphaCtx->getDir()); CPPUNIT_ASSERT_EQUAL(std::string("/tmp"), alphaCtx->getDir());
// See the value of PREF_OUT is not used as a file name. // See filename is not assigned yet
CPPUNIT_ASSERT_EQUAL(std::string("/tmp/index.html"), CPPUNIT_ASSERT_EQUAL(std::string(""), alphaCtx->getActualBasePath());
alphaCtx->getActualBasePath());
} }
} }

View File

@ -19,17 +19,16 @@ CPPUNIT_TEST_SUITE_REGISTRATION( FileEntryTest );
void FileEntryTest::testSetupDir() void FileEntryTest::testSetupDir()
{ {
std::string topDir = "/tmp"; std::string dir = "/tmp/aria2-FileEntryTest-testSetupDir";
std::string dir = "aria2-FileEntryTest-testSetupDir";
std::string filename = "filename"; std::string filename = "filename";
std::string path = topDir+"/"+dir+"/"+filename; std::string path = dir+"/"+filename;
File d(topDir+"/"+dir); File d(dir);
if(d.exists()) { if(d.exists()) {
CPPUNIT_ASSERT(d.remove()); CPPUNIT_ASSERT(d.remove());
} }
CPPUNIT_ASSERT(!d.exists()); CPPUNIT_ASSERT(!d.exists());
FileEntry fileEntry(dir+"/"+filename, 0, 0); FileEntry fileEntry(path, 0, 0);
fileEntry.setupDir(topDir); fileEntry.setupDir();
CPPUNIT_ASSERT(d.isDir()); CPPUNIT_ASSERT(d.isDir());
File f(path); File f(path);
CPPUNIT_ASSERT(!f.exists()); CPPUNIT_ASSERT(!f.exists());

View File

@ -373,23 +373,19 @@ void MultiDiskAdaptorTest::testReadData() {
void MultiDiskAdaptorTest::testCutTrailingGarbage() void MultiDiskAdaptorTest::testCutTrailingGarbage()
{ {
std::string dir = "/tmp"; std::string dir = "/tmp";
std::string topDir = ".";
std::string topDirPath = dir+"/"+topDir;
std::string prefix = "aria2_MultiDiskAdaptorTest_testCutTrailingGarbage_"; std::string prefix = "aria2_MultiDiskAdaptorTest_testCutTrailingGarbage_";
SharedHandle<FileEntry> entries[] = { SharedHandle<FileEntry> entries[] = {
SharedHandle<FileEntry>(new FileEntry(prefix+"1", 256, 0)), SharedHandle<FileEntry>(new FileEntry(dir+"/"+prefix+"1", 256, 0)),
SharedHandle<FileEntry>(new FileEntry(prefix+"2", 512, 256)) SharedHandle<FileEntry>(new FileEntry(dir+"/"+prefix+"2", 512, 256))
}; };
for(size_t i = 0; i < arrayLength(entries); ++i) { for(size_t i = 0; i < arrayLength(entries); ++i) {
createFile(topDirPath+"/"+entries[i]->getPath(), createFile(entries[i]->getPath(), entries[i]->getLength()+100);
entries[i]->getLength()+100);
} }
std::deque<SharedHandle<FileEntry> > fileEntries std::deque<SharedHandle<FileEntry> > fileEntries
(&entries[0], &entries[arrayLength(entries)]); (&entries[0], &entries[arrayLength(entries)]);
MultiDiskAdaptor adaptor; MultiDiskAdaptor adaptor;
adaptor.setStoreDir(dir); adaptor.setStoreDir(dir);
adaptor.setTopDir(topDir);
adaptor.setFileEntries(fileEntries); adaptor.setFileEntries(fileEntries);
adaptor.setMaxOpenFiles(1); adaptor.setMaxOpenFiles(1);
adaptor.setPieceLength(1); adaptor.setPieceLength(1);
@ -399,30 +395,27 @@ void MultiDiskAdaptorTest::testCutTrailingGarbage()
adaptor.cutTrailingGarbage(); adaptor.cutTrailingGarbage();
CPPUNIT_ASSERT_EQUAL((uint64_t)256, CPPUNIT_ASSERT_EQUAL((uint64_t)256,
File(topDirPath+"/"+entries[0]->getPath()).size()); File(entries[0]->getPath()).size());
CPPUNIT_ASSERT_EQUAL((uint64_t)512, CPPUNIT_ASSERT_EQUAL((uint64_t)512,
File(topDirPath+"/"+entries[1]->getPath()).size()); File(entries[1]->getPath()).size());
} }
void MultiDiskAdaptorTest::testSize() void MultiDiskAdaptorTest::testSize()
{ {
std::string dir = "/tmp"; std::string dir = "/tmp";
std::string topDir = ".";
std::string topDirPath = dir+"/"+topDir;
std::string prefix = "aria2_MultiDiskAdaptorTest_testSize_"; std::string prefix = "aria2_MultiDiskAdaptorTest_testSize_";
SharedHandle<FileEntry> entries[] = { SharedHandle<FileEntry> entries[] = {
SharedHandle<FileEntry>(new FileEntry(prefix+"1", 1, 0)), SharedHandle<FileEntry>(new FileEntry(dir+"/"+prefix+"1", 1, 0)),
SharedHandle<FileEntry>(new FileEntry(prefix+"2", 1, 1)) SharedHandle<FileEntry>(new FileEntry(dir+"/"+prefix+"2", 1, 1))
}; };
for(size_t i = 0; i < arrayLength(entries); ++i) { for(size_t i = 0; i < arrayLength(entries); ++i) {
createFile(topDirPath+"/"+entries[i]->getPath(), entries[i]->getLength()); createFile(entries[i]->getPath(), entries[i]->getLength());
} }
std::deque<SharedHandle<FileEntry> > fileEntries std::deque<SharedHandle<FileEntry> > fileEntries
(&entries[0], &entries[arrayLength(entries)]); (&entries[0], &entries[arrayLength(entries)]);
MultiDiskAdaptor adaptor; MultiDiskAdaptor adaptor;
adaptor.setStoreDir(dir); adaptor.setStoreDir(dir);
adaptor.setTopDir(topDir);
adaptor.setFileEntries(fileEntries); adaptor.setFileEntries(fileEntries);
adaptor.setMaxOpenFiles(1); adaptor.setMaxOpenFiles(1);
adaptor.setPieceLength(1); adaptor.setPieceLength(1);
@ -436,16 +429,16 @@ void MultiDiskAdaptorTest::testUtime()
{ {
std::string storeDir = "/tmp/aria2_MultiDiskAdaptorTest_testUtime"; std::string storeDir = "/tmp/aria2_MultiDiskAdaptorTest_testUtime";
SharedHandle<FileEntry> entries[] = { SharedHandle<FileEntry> entries[] = {
SharedHandle<FileEntry>(new FileEntry("requested", 0, 0)), SharedHandle<FileEntry>(new FileEntry(storeDir+"/requested", 0, 0)),
SharedHandle<FileEntry>(new FileEntry("notFound", 0, 0)), SharedHandle<FileEntry>(new FileEntry(storeDir+"/notFound", 0, 0)),
SharedHandle<FileEntry>(new FileEntry("notRequested", 0, 0)), SharedHandle<FileEntry>(new FileEntry(storeDir+"/notRequested", 0, 0)),
SharedHandle<FileEntry>(new FileEntry("anotherRequested", 0, 0)), SharedHandle<FileEntry>(new FileEntry(storeDir+"/anotherRequested", 0, 0)),
}; };
createFile(storeDir+"/"+entries[0]->getPath(), entries[0]->getLength()); createFile(entries[0]->getPath(), entries[0]->getLength());
File(storeDir+"/"+entries[1]->getPath()).remove(); File(entries[1]->getPath()).remove();
createFile(storeDir+"/"+entries[2]->getPath(), entries[2]->getLength()); createFile(entries[2]->getPath(), entries[2]->getLength());
createFile(storeDir+"/"+entries[3]->getPath(), entries[3]->getLength()); createFile(entries[3]->getPath(), entries[3]->getLength());
entries[2]->setRequested(false); entries[2]->setRequested(false);
@ -461,15 +454,13 @@ void MultiDiskAdaptorTest::testUtime()
CPPUNIT_ASSERT_EQUAL((size_t)2, adaptor.utime(Time(atime), Time(mtime))); CPPUNIT_ASSERT_EQUAL((size_t)2, adaptor.utime(Time(atime), Time(mtime)));
CPPUNIT_ASSERT_EQUAL((time_t)mtime, CPPUNIT_ASSERT_EQUAL((time_t)mtime,
File(storeDir+"/"+entries[0]->getPath()) File(entries[0]->getPath()).getModifiedTime().getTime());
.getModifiedTime().getTime());
CPPUNIT_ASSERT_EQUAL((time_t)mtime, CPPUNIT_ASSERT_EQUAL((time_t)mtime,
File(storeDir+"/"+entries[3]->getPath()) File(entries[3]->getPath()).getModifiedTime().getTime());
.getModifiedTime().getTime());
CPPUNIT_ASSERT((time_t)mtime != File(storeDir+"/"+entries[2]->getPath()) CPPUNIT_ASSERT((time_t)mtime !=
.getModifiedTime().getTime()); File(entries[2]->getPath()).getModifiedTime().getTime());
} }
} // namespace aria2 } // namespace aria2

View File

@ -35,18 +35,21 @@ CPPUNIT_TEST_SUITE_REGISTRATION( MultiFileAllocationIteratorTest );
void MultiFileAllocationIteratorTest::testMakeDiskWriterEntries() void MultiFileAllocationIteratorTest::testMakeDiskWriterEntries()
{ {
std::string storeDir = "/tmp/aria2_MultiFileAllocationIteratorTest"
"_testMakeDiskWriterEntries";
SharedHandle<FileEntry> fs[] = { SharedHandle<FileEntry> fs[] = {
SharedHandle<FileEntry>(new FileEntry("file1", 1536, 0)), SharedHandle<FileEntry>(new FileEntry(storeDir+"/file1", 1536, 0)),
SharedHandle<FileEntry>(new FileEntry("file2", 2048, 1536)),// req no SharedHandle<FileEntry>(new FileEntry(storeDir+"/file2", 2048, 1536)),// req no
SharedHandle<FileEntry>(new FileEntry("file3", 1024, 3584)), SharedHandle<FileEntry>(new FileEntry(storeDir+"/file3", 1024, 3584)),
SharedHandle<FileEntry>(new FileEntry("file4", 1024, 4608)),// req no SharedHandle<FileEntry>(new FileEntry(storeDir+"/file4", 1024, 4608)),// req no
SharedHandle<FileEntry>(new FileEntry("file5", 1024, 5632)),// req no SharedHandle<FileEntry>(new FileEntry(storeDir+"/file5", 1024, 5632)),// req no
SharedHandle<FileEntry>(new FileEntry("file6", 1024, 6656)),// req no SharedHandle<FileEntry>(new FileEntry(storeDir+"/file6", 1024, 6656)),// req no
SharedHandle<FileEntry>(new FileEntry("file7", 256, 7680)),// req no SharedHandle<FileEntry>(new FileEntry(storeDir+"/file7", 256, 7680)),// req no
SharedHandle<FileEntry>(new FileEntry("file8", 255, 7936)), SharedHandle<FileEntry>(new FileEntry(storeDir+"/file8", 255, 7936)),
SharedHandle<FileEntry>(new FileEntry("file9", 1025, 8191)),// req no SharedHandle<FileEntry>(new FileEntry(storeDir+"/file9", 1025, 8191)),// req no
SharedHandle<FileEntry>(new FileEntry("fileA", 1024, 9216)),// req no SharedHandle<FileEntry>(new FileEntry(storeDir+"/fileA", 1024, 9216)),// req no
SharedHandle<FileEntry>(new FileEntry("fileB", 1024, 10240)), SharedHandle<FileEntry>(new FileEntry(storeDir+"/fileB", 1024, 10240)),
}; };
fs[1]->setRequested(false); // file2 fs[1]->setRequested(false); // file2
fs[3]->setRequested(false); // file4 fs[3]->setRequested(false); // file4
@ -56,8 +59,6 @@ void MultiFileAllocationIteratorTest::testMakeDiskWriterEntries()
fs[8]->setRequested(false); // file9 fs[8]->setRequested(false); // file9
fs[9]->setRequested(false); // fileA fs[9]->setRequested(false); // fileA
std::string storeDir = "/tmp/aria2_MultiFileAllocationIteratorTest"
"_testMakeDiskWriterEntries";
// create empty file4 // create empty file4
createFile(storeDir+std::string("/file4"), 0); createFile(storeDir+std::string("/file4"), 0);
@ -79,57 +80,57 @@ void MultiFileAllocationIteratorTest::testMakeDiskWriterEntries()
// file1 // file1
CPPUNIT_ASSERT_EQUAL(storeDir+std::string("/file1"), CPPUNIT_ASSERT_EQUAL(storeDir+std::string("/file1"),
entries[0]->getFilePath(storeDir)); entries[0]->getFilePath());
CPPUNIT_ASSERT(entries[0]->needsFileAllocation()); CPPUNIT_ASSERT(entries[0]->needsFileAllocation());
CPPUNIT_ASSERT(!entries[0]->getDiskWriter().isNull()); CPPUNIT_ASSERT(!entries[0]->getDiskWriter().isNull());
// file2 // file2
CPPUNIT_ASSERT_EQUAL(storeDir+std::string("/file2"), CPPUNIT_ASSERT_EQUAL(storeDir+std::string("/file2"),
entries[1]->getFilePath(storeDir)); entries[1]->getFilePath());
CPPUNIT_ASSERT(entries[1]->needsFileAllocation()); CPPUNIT_ASSERT(entries[1]->needsFileAllocation());
CPPUNIT_ASSERT(!entries[1]->getDiskWriter().isNull()); CPPUNIT_ASSERT(!entries[1]->getDiskWriter().isNull());
// file3 // file3
CPPUNIT_ASSERT_EQUAL(storeDir+std::string("/file3"), CPPUNIT_ASSERT_EQUAL(storeDir+std::string("/file3"),
entries[2]->getFilePath(storeDir)); entries[2]->getFilePath());
CPPUNIT_ASSERT(entries[2]->needsFileAllocation()); CPPUNIT_ASSERT(entries[2]->needsFileAllocation());
CPPUNIT_ASSERT(!entries[2]->getDiskWriter().isNull()); CPPUNIT_ASSERT(!entries[2]->getDiskWriter().isNull());
// file4, diskWriter is not null, because file exists. // file4, diskWriter is not null, because file exists.
CPPUNIT_ASSERT_EQUAL(storeDir+std::string("/file4"), CPPUNIT_ASSERT_EQUAL(storeDir+std::string("/file4"),
entries[3]->getFilePath(storeDir)); entries[3]->getFilePath());
CPPUNIT_ASSERT(!entries[3]->needsFileAllocation()); CPPUNIT_ASSERT(!entries[3]->needsFileAllocation());
CPPUNIT_ASSERT(!entries[3]->getDiskWriter().isNull()); CPPUNIT_ASSERT(!entries[3]->getDiskWriter().isNull());
// file5 // file5
CPPUNIT_ASSERT_EQUAL(storeDir+std::string("/file5"), CPPUNIT_ASSERT_EQUAL(storeDir+std::string("/file5"),
entries[4]->getFilePath(storeDir)); entries[4]->getFilePath());
CPPUNIT_ASSERT(!entries[4]->needsFileAllocation()); CPPUNIT_ASSERT(!entries[4]->needsFileAllocation());
CPPUNIT_ASSERT(entries[4]->getDiskWriter().isNull()); CPPUNIT_ASSERT(entries[4]->getDiskWriter().isNull());
// file6 // file6
CPPUNIT_ASSERT_EQUAL(storeDir+std::string("/file6"), CPPUNIT_ASSERT_EQUAL(storeDir+std::string("/file6"),
entries[5]->getFilePath(storeDir)); entries[5]->getFilePath());
CPPUNIT_ASSERT(entries[5]->needsFileAllocation()); CPPUNIT_ASSERT(entries[5]->needsFileAllocation());
CPPUNIT_ASSERT(!entries[5]->getDiskWriter().isNull()); CPPUNIT_ASSERT(!entries[5]->getDiskWriter().isNull());
// file7 // file7
CPPUNIT_ASSERT_EQUAL(storeDir+std::string("/file7"), CPPUNIT_ASSERT_EQUAL(storeDir+std::string("/file7"),
entries[6]->getFilePath(storeDir)); entries[6]->getFilePath());
CPPUNIT_ASSERT(entries[6]->needsFileAllocation()); CPPUNIT_ASSERT(entries[6]->needsFileAllocation());
CPPUNIT_ASSERT(!entries[6]->getDiskWriter().isNull()); CPPUNIT_ASSERT(!entries[6]->getDiskWriter().isNull());
// file8 // file8
CPPUNIT_ASSERT_EQUAL(storeDir+std::string("/file8"), CPPUNIT_ASSERT_EQUAL(storeDir+std::string("/file8"),
entries[7]->getFilePath(storeDir)); entries[7]->getFilePath());
CPPUNIT_ASSERT(entries[7]->needsFileAllocation()); CPPUNIT_ASSERT(entries[7]->needsFileAllocation());
CPPUNIT_ASSERT(!entries[7]->getDiskWriter().isNull()); CPPUNIT_ASSERT(!entries[7]->getDiskWriter().isNull());
// file9 // file9
CPPUNIT_ASSERT_EQUAL(storeDir+std::string("/file9"), CPPUNIT_ASSERT_EQUAL(storeDir+std::string("/file9"),
entries[8]->getFilePath(storeDir)); entries[8]->getFilePath());
CPPUNIT_ASSERT(!entries[8]->needsFileAllocation()); CPPUNIT_ASSERT(!entries[8]->needsFileAllocation());
CPPUNIT_ASSERT(!entries[8]->getDiskWriter().isNull()); CPPUNIT_ASSERT(!entries[8]->getDiskWriter().isNull());
// fileA // fileA
CPPUNIT_ASSERT_EQUAL(storeDir+std::string("/fileA"), CPPUNIT_ASSERT_EQUAL(storeDir+std::string("/fileA"),
entries[9]->getFilePath(storeDir)); entries[9]->getFilePath());
CPPUNIT_ASSERT(!entries[9]->needsFileAllocation()); CPPUNIT_ASSERT(!entries[9]->needsFileAllocation());
CPPUNIT_ASSERT(entries[9]->getDiskWriter().isNull()); CPPUNIT_ASSERT(entries[9]->getDiskWriter().isNull());
// fileB // fileB
CPPUNIT_ASSERT_EQUAL(storeDir+std::string("/fileB"), CPPUNIT_ASSERT_EQUAL(storeDir+std::string("/fileB"),
entries[10]->getFilePath(storeDir)); entries[10]->getFilePath());
CPPUNIT_ASSERT(entries[10]->needsFileAllocation()); CPPUNIT_ASSERT(entries[10]->needsFileAllocation());
CPPUNIT_ASSERT(!entries[10]->getDiskWriter().isNull()); CPPUNIT_ASSERT(!entries[10]->getDiskWriter().isNull());
} }
@ -158,32 +159,32 @@ void MultiFileAllocationIteratorTest::testAllocate()
diskAdaptor->setPieceLength(1); diskAdaptor->setPieceLength(1);
int64_t offset = 0; int64_t offset = 0;
SharedHandle<FileEntry> fileEntry1(new FileEntry(fname1, SharedHandle<FileEntry> fileEntry1(new FileEntry(storeDir+"/"+fname1,
length1, length1,
offset)); offset));
offset += length1; offset += length1;
SharedHandle<FileEntry> fileEntry2(new FileEntry(fname2, SharedHandle<FileEntry> fileEntry2(new FileEntry(storeDir+"/"+fname2,
length2, length2,
offset)); offset));
offset += length2; offset += length2;
SharedHandle<FileEntry> fileEntry3(new FileEntry(fname3, SharedHandle<FileEntry> fileEntry3(new FileEntry(storeDir+"/"+fname3,
length3, length3,
offset)); offset));
offset += length3; offset += length3;
SharedHandle<FileEntry> fileEntry4(new FileEntry(fname4, SharedHandle<FileEntry> fileEntry4(new FileEntry(storeDir+"/"+fname4,
length4, length4,
offset)); offset));
fileEntry4->setRequested(false); fileEntry4->setRequested(false);
offset += length4; offset += length4;
SharedHandle<FileEntry> fileEntry5(new FileEntry(fname5, SharedHandle<FileEntry> fileEntry5(new FileEntry(storeDir+"/"+fname5,
length5, length5,
offset)); offset));
offset += length5; offset += length5;
SharedHandle<FileEntry> fileEntry6(new FileEntry(fname6, SharedHandle<FileEntry> fileEntry6(new FileEntry(storeDir+"/"+fname6,
length6, length6,
offset)); offset));
fileEntry6->setRequested(false); fileEntry6->setRequested(false);
@ -197,13 +198,10 @@ void MultiFileAllocationIteratorTest::testAllocate()
fs.push_back(fileEntry6); fs.push_back(fileEntry6);
diskAdaptor->setFileEntries(fs); diskAdaptor->setFileEntries(fs);
for(std::deque<SharedHandle<FileEntry> >::const_iterator i = fs.begin();
File(storeDir+"/"+fname1).remove(); i != fs.end(); ++i) {
File(storeDir+"/"+fname2).remove(); File((*i)->getPath()).remove();
File(storeDir+"/"+fname3).remove(); }
File(storeDir+"/"+fname4).remove();
File(storeDir+"/"+fname5).remove();
File(storeDir+"/"+fname6).remove();
// we have to open file first. // we have to open file first.
diskAdaptor->initAndOpenFile(); diskAdaptor->initAndOpenFile();
@ -213,14 +211,12 @@ void MultiFileAllocationIteratorTest::testAllocate()
while(!itr->finished()) { while(!itr->finished()) {
itr->allocateChunk(); itr->allocateChunk();
} }
CPPUNIT_ASSERT_EQUAL((uint64_t)length1, File(storeDir+"/"+fname1).size()); CPPUNIT_ASSERT_EQUAL((uint64_t)length1, File(fileEntry1->getPath()).size());
CPPUNIT_ASSERT_EQUAL((uint64_t)length2, File(storeDir+"/"+fname2).size()); CPPUNIT_ASSERT_EQUAL((uint64_t)length2, File(fileEntry2->getPath()).size());
CPPUNIT_ASSERT_EQUAL((uint64_t)length3, File(storeDir+"/"+fname3).size()); CPPUNIT_ASSERT_EQUAL((uint64_t)length3, File(fileEntry3->getPath()).size());
CPPUNIT_ASSERT(!File(storeDir+"/"+fname4).isFile()); CPPUNIT_ASSERT(!File(fileEntry4->getPath()).isFile());
CPPUNIT_ASSERT_EQUAL((uint64_t)length5, File(fileEntry5->getPath()).size());
CPPUNIT_ASSERT_EQUAL((uint64_t)length5, File(storeDir+"/"+fname5).size()); CPPUNIT_ASSERT(!File(fileEntry6->getPath()).isFile());
CPPUNIT_ASSERT(!File(storeDir+"/"+fname6).isFile());
} catch(Exception& e) { } catch(Exception& e) {
CPPUNIT_FAIL(e.stackTrace()); CPPUNIT_FAIL(e.stackTrace());
} }

View File

@ -83,8 +83,7 @@ void RequestGroupTest::testRemoveURIWhoseHostnameIs()
void RequestGroupTest::testGetFilePath() void RequestGroupTest::testGetFilePath()
{ {
SharedHandle<SingleFileDownloadContext> ctx SharedHandle<SingleFileDownloadContext> ctx
(new SingleFileDownloadContext(1024, 1024, "myfile")); (new SingleFileDownloadContext(1024, 1024, "/tmp/myfile"));
ctx->setDir("/tmp");
Option op; Option op;
std::deque<std::string> uris; std::deque<std::string> uris;
@ -101,8 +100,8 @@ void RequestGroupTest::testGetFilePath()
void RequestGroupTest::testCreateDownloadResult() void RequestGroupTest::testCreateDownloadResult()
{ {
SharedHandle<SingleFileDownloadContext> ctx SharedHandle<SingleFileDownloadContext> ctx
(new SingleFileDownloadContext(1024, 1024*1024, "myfile")); (new SingleFileDownloadContext(1024, 1024*1024, "/tmp/myfile"));
ctx->setDir("/tmp"); //ctx->setDir("/tmp");
Option op; Option op;
std::deque<std::string> uris; std::deque<std::string> uris;
uris.push_back("http://first/file"); uris.push_back("http://first/file");

View File

@ -45,13 +45,14 @@ void SingleFileDownloadContextTest::testGetNumPieces()
void SingleFileDownloadContextTest::testGetActualBasePath() void SingleFileDownloadContextTest::testGetActualBasePath()
{ {
SingleFileDownloadContext ctx(0, 0, ""); SingleFileDownloadContext ctx(0, 0, "");
CPPUNIT_ASSERT_EQUAL(std::string("./index.html"), ctx.getActualBasePath()); CPPUNIT_ASSERT_EQUAL(std::string(""), ctx.getActualBasePath());
ctx.setFilename("aria2.tar.bz2"); ctx.setFilename("aria2.tar.bz2");
CPPUNIT_ASSERT_EQUAL(std::string("./aria2.tar.bz2"), ctx.getActualBasePath()); CPPUNIT_ASSERT_EQUAL(std::string("aria2.tar.bz2"), ctx.getActualBasePath());
ctx.setUFilename("aria.tar.bz2"); ctx.setUFilename("/t/aria.tar.bz2");
CPPUNIT_ASSERT_EQUAL(std::string("./aria.tar.bz2"), ctx.getActualBasePath()); CPPUNIT_ASSERT_EQUAL(std::string("/t/aria.tar.bz2"), ctx.getActualBasePath());
ctx.setDir("/tmp"); ctx.setDir("/tmp");
CPPUNIT_ASSERT_EQUAL(std::string("/tmp/aria.tar.bz2"), ctx.getActualBasePath()); // See dir doesn't effect getActualBasePath().
CPPUNIT_ASSERT_EQUAL(std::string("/t/aria.tar.bz2"), ctx.getActualBasePath());
} }
} // namespace aria2 } // namespace aria2