/* */ #ifndef _D_MULTI_DISK_ADAPTOR_H_ #define _D_MULTI_DISK_ADAPTOR_H_ #include "DiskAdaptor.h" #include "DiskWriter.h" #include "File.h" class MultiFileAllocationIterator; class DiskWriterEntry { private: FileEntryHandle fileEntry; DiskWriterHandle diskWriter; public: DiskWriterEntry(const FileEntryHandle& fileEntry): fileEntry(fileEntry), diskWriter(0) {} ~DiskWriterEntry() {} string getFilePath(const string& topDir) const { return topDir+"/"+fileEntry->getPath(); } void initAndOpenFile(const string& topDir) { diskWriter->initAndOpenFile(getFilePath(topDir), fileEntry->getLength()); } void openFile(const string& topDir) { diskWriter->openFile(getFilePath(topDir), fileEntry->getLength()); } void openExistingFile(const string& topDir) { diskWriter->openExistingFile(getFilePath(topDir), fileEntry->getLength()); } void closeFile() { diskWriter->closeFile(); } bool fileExists(const string& topDir) { return File(getFilePath(topDir)).exists(); } int64_t size() const { return diskWriter->size(); } FileEntryHandle getFileEntry() const { return fileEntry; } void setDiskWriter(const DiskWriterHandle& diskWriter) { this->diskWriter = diskWriter; } DiskWriterHandle getDiskWriter() const { return diskWriter; } bool operator<(const DiskWriterEntry& entry) const { return fileEntry < entry.fileEntry; } }; typedef SharedHandle DiskWriterEntryHandle; typedef deque DiskWriterEntries; class MultiDiskAdaptor : public DiskAdaptor { friend class MultiFileAllocationIterator; private: string topDir; int32_t pieceLength; DiskWriterEntries diskWriterEntries; void resetDiskWriterEntries(); void mkdir() const; bool isInRange(const DiskWriterEntryHandle entry, int64_t offset) const; int32_t calculateLength(const DiskWriterEntryHandle entry, int64_t fileOffset, int32_t rem) const; string getTopDirPath() const; public: MultiDiskAdaptor():pieceLength(0) {} virtual ~MultiDiskAdaptor() {} virtual void initAndOpenFile(); virtual void openFile(); virtual void openExistingFile(); virtual void closeFile(); virtual void onDownloadComplete(); virtual void writeData(const unsigned char* data, int32_t len, int64_t offset); virtual int32_t readData(unsigned char* data, int32_t len, int64_t offset); virtual bool fileExists(); virtual string getFilePath() { return getTopDirPath(); } virtual int64_t size() const; virtual FileAllocationIteratorHandle fileAllocationIterator(); virtual void enableDirectIO(); virtual void disableDirectIO(); void setTopDir(const string& topDir) { this->topDir = topDir; } const string& getTopDir() const { return topDir; } void setPieceLength(int32_t pieceLength) { this->pieceLength = pieceLength; } int32_t getPieceLength() const { return pieceLength; } }; typedef SharedHandle MultiDiskAdaptorHandle; #endif // _D_MULTI_DISK_ADAPTOR_H_