/* */ #ifndef D_MULTI_DISK_ADAPTOR_H #define D_MULTI_DISK_ADAPTOR_H #include "DiskAdaptor.h" namespace aria2 { class MultiFileAllocationIterator; class FileEntry; class DiskWriter; class DiskWriterEntry { private: std::shared_ptr fileEntry_; std::unique_ptr diskWriter_; bool open_; bool needsFileAllocation_; bool needsDiskWriter_; public: DiskWriterEntry(const std::shared_ptr& fileEntry); const std::string& getFilePath() const; void initAndOpenFile(); void openFile(); void openExistingFile(); void closeFile(); bool isOpen() const { return open_; } bool fileExists(); int64_t size() const; const std::shared_ptr& getFileEntry() const { return fileEntry_; } void setDiskWriter(std::unique_ptr diskWriter); const std::unique_ptr& getDiskWriter() const { return diskWriter_; } bool operator<(const DiskWriterEntry& entry) const; bool needsFileAllocation() const { return needsFileAllocation_; } void needsFileAllocation(bool f) { needsFileAllocation_ = f; } bool needsDiskWriter() const { return needsDiskWriter_; } void needsDiskWriter(bool f) { needsDiskWriter_ = f; } }; typedef std::vector> DiskWriterEntries; class MultiDiskAdaptor : public DiskAdaptor { friend class MultiFileAllocationIterator; private: int32_t pieceLength_; DiskWriterEntries diskWriterEntries_; std::vector openedDiskWriterEntries_; int maxOpenFiles_; bool readOnly_; void resetDiskWriterEntries(); void openIfNot(DiskWriterEntry* entry, void (DiskWriterEntry::*f)()); static const int DEFAULT_MAX_OPEN_FILES = 100; public: MultiDiskAdaptor(); ~MultiDiskAdaptor(); virtual void initAndOpenFile(); virtual void openFile(); virtual void openExistingFile(); virtual void closeFile(); virtual void writeData(const unsigned char* data, size_t len, int64_t offset); virtual ssize_t readData(unsigned char* data, size_t len, int64_t offset); virtual void writeCache(const WrDiskCacheEntry* entry); virtual bool fileExists(); virtual int64_t size(); virtual std::shared_ptr fileAllocationIterator(); virtual void enableReadOnly(); virtual void disableReadOnly(); virtual bool isReadOnlyEnabled() const { return readOnly_; } // Enables mmap feature. This method must be called after files are // opened. virtual void enableMmap(); void setPieceLength(int32_t pieceLength) { pieceLength_ = pieceLength; } int32_t getPieceLength() const { return pieceLength_; } virtual void cutTrailingGarbage(); void setMaxOpenFiles(int maxOpenFiles); virtual size_t utime(const Time& actime, const Time& modtime); const DiskWriterEntries& getDiskWriterEntries() const { return diskWriterEntries_; } }; } // namespace aria2 #endif // D_MULTI_DISK_ADAPTOR_H