From 28a82bfa4ad7a3b905f00d023f7be7096a2f75d4 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sun, 16 Apr 2006 14:42:26 +0000 Subject: [PATCH] * src/DirectDiskAdaptor.h: New class. * src/DirectDiskAdaptor.cc: New class. * src/MultiDiskAdaptor.h: New class. * src/MultiDiskAdaptor.cc: New class. * src/CopyDiskAdaptor.h: New class. * src/CopyDiskAdaptor.cc: New class. * src/DiskAdaptor.h: New class. * src/DiskAdaptor.cc: New class. --- ChangeLog | 10 ++++- src/CopyDiskAdaptor.cc | 54 +++++++++++++++++++++++ src/CopyDiskAdaptor.h | 47 ++++++++++++++++++++ src/DirectDiskAdaptor.cc | 35 +++++++++++++++ src/DirectDiskAdaptor.h | 37 ++++++++++++++++ src/DiskAdaptor.cc | 94 ++++++++++++++++++++++++++++++++++++++++ src/DiskAdaptor.h | 77 ++++++++++++++++++++++++++++++++ src/MultiDiskAdaptor.cc | 56 ++++++++++++++++++++++++ src/MultiDiskAdaptor.h | 43 ++++++++++++++++++ 9 files changed, 451 insertions(+), 2 deletions(-) create mode 100644 src/CopyDiskAdaptor.cc create mode 100644 src/CopyDiskAdaptor.h create mode 100644 src/DirectDiskAdaptor.cc create mode 100644 src/DirectDiskAdaptor.h create mode 100644 src/DiskAdaptor.cc create mode 100644 src/DiskAdaptor.h create mode 100644 src/MultiDiskAdaptor.cc create mode 100644 src/MultiDiskAdaptor.h diff --git a/ChangeLog b/ChangeLog index a46ef60f..422648c7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -60,11 +60,17 @@ * src/AbstractDiskWriter.cc (openFile): If file exists, call openExistingFile, otherwise call initAndOpenFile. (closeFile): fd > 0, not fd != 0. + * src/DirectDiskAdaptor.h: New class. + * src/DirectDiskAdaptor.cc: New class. + * src/MultiDiskAdaptor.h: New class. + * src/MultiDiskAdaptor.cc: New class. + * src/CopyDiskAdaptor.h: New class. + * src/CopyDiskAdaptor.cc: New class. + * src/DiskAdaptor.h: New class. + * src/DiskAdaptor.cc: New class. * src/prefs.h (PREF_TORRENT_SHOW_FILES): Renamed as PREF_SHOW_FILES (PREF_SHOW_FILES): New definition. - - 2006-04-12 Tatsuhiro Tsujikawa diff --git a/src/CopyDiskAdaptor.cc b/src/CopyDiskAdaptor.cc new file mode 100644 index 00000000..ca50fab6 --- /dev/null +++ b/src/CopyDiskAdaptor.cc @@ -0,0 +1,54 @@ +/* */ +#include "CopyDiskAdaptor.h" +#include "Util.h" + +CopyDiskAdaptor::CopyDiskAdaptor(DiskWriter* diskWriter):DiskAdaptor(diskWriter) {} + +CopyDiskAdaptor::~CopyDiskAdaptor() {} + +void CopyDiskAdaptor::onDownloadComplete() { + closeFile(); + fixFilename(); + openFile(); +} + +void CopyDiskAdaptor::fixFilename() { + if(topDir != NULL) { + topDir->createDir(storeDir, true); + } + long long int offset = 0; + for(FileEntries::iterator itr = fileEntries.begin(); + itr != fileEntries.end(); itr++) { + if(!itr->extracted && itr->requested) { + string dest = storeDir+"/"+itr->path; + //logger->info("writing file %s", dest.c_str()); + Util::rangedFileCopy(dest, getFilePath(), offset, itr->length); + itr->extracted = true; + } + offset += itr->length; + } +} + +string CopyDiskAdaptor::getFilePath() const { + return storeDir+"/"+tempFilename; +} diff --git a/src/CopyDiskAdaptor.h b/src/CopyDiskAdaptor.h new file mode 100644 index 00000000..ec4a16e5 --- /dev/null +++ b/src/CopyDiskAdaptor.h @@ -0,0 +1,47 @@ +/* */ +#ifndef _D_COPY_DISK_ADAPTOR_H_ +#define _D_COPY_DISK_ADAPTOR_H_ + +#include "DiskAdaptor.h" +#include "DiskWriter.h" + +class CopyDiskAdaptor : public DiskAdaptor { +private: + string tempFilename; + void fixFilename(); +protected: + string getFilePath() const; +public: + CopyDiskAdaptor(DiskWriter* diskWriter); + ~CopyDiskAdaptor(); + + virtual void onDownloadComplete(); + + // tempFilename is relative to storeDir + void setTempFilename(const string& tempFilename) { + this->tempFilename = tempFilename; + } + string getTempFile() const { return this->tempFilename; } +}; + +#endif // _D_COPY_DISK_ADAPTOR_H_ diff --git a/src/DirectDiskAdaptor.cc b/src/DirectDiskAdaptor.cc new file mode 100644 index 00000000..b6676f91 --- /dev/null +++ b/src/DirectDiskAdaptor.cc @@ -0,0 +1,35 @@ +/* */ +#include "DirectDiskAdaptor.h" + +DirectDiskAdaptor::DirectDiskAdaptor(DiskWriter* diskWriter):DiskAdaptor(diskWriter) {} + +DirectDiskAdaptor::~DirectDiskAdaptor() {} + +string DirectDiskAdaptor::getFilePath() const { + return storeDir+"/"+fileEntries.front().path; +} + +void DirectDiskAdaptor::onDownloadComplete() { + closeFile(); + openFile(); +} diff --git a/src/DirectDiskAdaptor.h b/src/DirectDiskAdaptor.h new file mode 100644 index 00000000..e7abc5dc --- /dev/null +++ b/src/DirectDiskAdaptor.h @@ -0,0 +1,37 @@ +/* */ +#ifndef _D_DIRECT_DISK_ADAPTOR_H_ +#define _D_DIRECT_DISK_ADAPTOR_H_ + +#include "DiskAdaptor.h" + +class DirectDiskAdaptor : public DiskAdaptor { +protected: + string getFilePath() const; +public: + DirectDiskAdaptor(DiskWriter* diskWriter); + virtual ~DirectDiskAdaptor(); + + virtual void onDownloadComplete(); +}; + +#endif // _D_DIRECT_DISK_ADAPTOR_H_ diff --git a/src/DiskAdaptor.cc b/src/DiskAdaptor.cc new file mode 100644 index 00000000..9f953d4a --- /dev/null +++ b/src/DiskAdaptor.cc @@ -0,0 +1,94 @@ +/* */ +#include "DiskAdaptor.h" +#include "DlAbortEx.h" + +void DiskAdaptor::openFile() { + diskWriter->openFile(getFilePath()); +} + +void DiskAdaptor::closeFile() { + diskWriter->closeFile(); +} + +void DiskAdaptor::openExistingFile() { + diskWriter->openExistingFile(getFilePath()); +} + +void DiskAdaptor::initAndOpenFile() { + diskWriter->initAndOpenFile(getFilePath()); +} + +void DiskAdaptor::writeData(const char* data, int len, long long int position) { + diskWriter->writeData(data, len, position); +} + +int DiskAdaptor::readData(char* data, int len, long long int position) { + return diskWriter->readData(data, len, position); +} + +string DiskAdaptor::sha1Sum(long long int offset, long long int length) { + return diskWriter->sha1Sum(offset, length); +} + +FileEntry DiskAdaptor::getFileEntryFromPath(const string& fileEntryPath) const { + for(FileEntries::const_iterator itr = fileEntries.begin(); + itr != fileEntries.end(); itr++) { + if(itr->path == fileEntryPath) { + return *itr; + } + } + throw new DlAbortEx("no such file entry <%s>", fileEntryPath.c_str()); +} + +bool DiskAdaptor::addDownloadEntry(const string& fileEntryPath) { + for(FileEntries::iterator itr = fileEntries.begin(); + itr != fileEntries.end(); itr++) { + if(itr->path == fileEntryPath) { + itr->requested = true; + return true; + } + } + return false; +} + +bool DiskAdaptor::addDownloadEntry(int index) { + if(fileEntries.size() <= (unsigned int)index) { + return false; + } + fileEntries.at(index).requested = true; + return true; +} + +void DiskAdaptor::addAllDownloadEntry() { + for(FileEntries::iterator itr = fileEntries.begin(); + itr != fileEntries.end(); itr++) { + itr->requested = true; + } +} + +void DiskAdaptor::removeAllDownloadEntry() { + for(FileEntries::iterator itr = fileEntries.begin(); + itr != fileEntries.end(); itr++) { + itr->requested = false; + } +} diff --git a/src/DiskAdaptor.h b/src/DiskAdaptor.h new file mode 100644 index 00000000..9e2ba46e --- /dev/null +++ b/src/DiskAdaptor.h @@ -0,0 +1,77 @@ +/* */ +#ifndef _D_DISK_ADAPTOR_H_ +#define _D_DISK_ADAPTOR_H_ + +#include "common.h" +#include "FileEntry.h" +#include "Directory.h" +#include "DiskWriter.h" + +class DiskAdaptor { +protected: + DiskWriter* diskWriter; + string storeDir; + FileEntries fileEntries; + const Directory* topDir; + virtual string getFilePath() const = 0; +public: + DiskAdaptor(DiskWriter* diskWriter):diskWriter(diskWriter), topDir(NULL) {} + virtual ~DiskAdaptor() { + delete diskWriter; + if(topDir != NULL) { + delete topDir; + } + } + + virtual void openFile(); + virtual void closeFile(); + virtual void openExistingFile(); + virtual void initAndOpenFile(); + void writeData(const char* data, int len, long long int position); + int readData(char* data, int len, long long int position); + string sha1Sum(long long int offset, long long int length); + + virtual void onDownloadComplete() = 0; + + void setFileEntries(const FileEntries& fileEntries) { + this->fileEntries = fileEntries; + } + FileEntry getFileEntryFromPath(const string& fileEntryPath) const; + bool addDownloadEntry(const string& fileEntryPath); + bool addDownloadEntry(int index); + void addAllDownloadEntry(); + void removeAllDownloadEntry(); + + void setStoreDir(const string& storeDir) { this->storeDir = storeDir; } + string getStoreDir() const { return this->storeDir; } + + void setTopDir(const Directory* dirctory) { + if(this->topDir != NULL) { + delete topDir; + } + this->topDir = dirctory; + } + const Directory* getTopDir() const { return this->topDir; } +}; + +#endif // _D_DISK_ADAPTOR_H_ diff --git a/src/MultiDiskAdaptor.cc b/src/MultiDiskAdaptor.cc new file mode 100644 index 00000000..0f9f1695 --- /dev/null +++ b/src/MultiDiskAdaptor.cc @@ -0,0 +1,56 @@ +/* */ +#include "MultiDiskAdaptor.h" + +MultiDiskAdaptor::MultiDiskAdaptor(MultiDiskWriter* diskWriter):DiskAdaptor(diskWriter) {} + +MultiDiskAdaptor::~MultiDiskAdaptor() {} + +void MultiDiskAdaptor::setDiskWriterFileEntries() { + ((MultiDiskWriter*)diskWriter)->setFileEntries(fileEntries); +} + +string MultiDiskAdaptor::getFilePath() const { + return storeDir; +} + +void MultiDiskAdaptor::openFile() { + topDir->createDir(storeDir, true); + setDiskWriterFileEntries(); + DiskAdaptor::openFile(); +} + +void MultiDiskAdaptor::initAndOpenFile() { + topDir->createDir(storeDir, true); + setDiskWriterFileEntries(); + DiskAdaptor::initAndOpenFile(); +} + +void MultiDiskAdaptor::openExistingFile() { + setDiskWriterFileEntries(); + DiskAdaptor::openExistingFile(); +} + +void MultiDiskAdaptor::onDownloadComplete() { + closeFile(); + openFile(); +} diff --git a/src/MultiDiskAdaptor.h b/src/MultiDiskAdaptor.h new file mode 100644 index 00000000..821c0ae3 --- /dev/null +++ b/src/MultiDiskAdaptor.h @@ -0,0 +1,43 @@ +/* */ +#ifndef _D_MULTI_DISK_ADAPTOR_H_ +#define _D_MULTI_DISK_ADAPTOR_H_ + +#include "DiskAdaptor.h" +#include "MultiDiskWriter.h" + +class MultiDiskAdaptor : public DiskAdaptor { +private: + void setDiskWriterFileEntries(); +protected: + virtual string getFilePath() const; +public: + MultiDiskAdaptor(MultiDiskWriter* diskWriter); + virtual ~MultiDiskAdaptor(); + + virtual void openFile(); + virtual void initAndOpenFile(); + virtual void openExistingFile(); + virtual void onDownloadComplete(); +}; + +#endif // _D_MULTI_DISK_ADAPTOR_H_