/* */ #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: SharedHandle fileEntry; SharedHandle diskWriter; bool _open; bool _directIO; bool _needsFileAllocation; public: DiskWriterEntry(const SharedHandle& fileEntry); ~DiskWriterEntry(); const std::string& getFilePath() const; void initAndOpenFile(); void openFile(); void openExistingFile(); void closeFile(); bool isOpen() const { return _open; } bool fileExists(); uint64_t size() const; const SharedHandle& getFileEntry() const { return fileEntry; } void setDiskWriter(const SharedHandle& diskWriter); const SharedHandle& getDiskWriter() const { return diskWriter; } bool operator<(const DiskWriterEntry& entry) const; // Set _directIO to true. // Additionally, if diskWriter is opened, diskWriter->enableDirectIO() is // called. void enableDirectIO(); // Set _directIO to false. // Additionally, if diskWriter is opened, diskWriter->disableDirectIO() is // called. void disableDirectIO(); bool needsFileAllocation() const { return _needsFileAllocation; } void needsFileAllocation(bool f) { _needsFileAllocation = f; } }; typedef SharedHandle DiskWriterEntryHandle; typedef std::vector DiskWriterEntries; class MultiDiskAdaptor : public DiskAdaptor { friend class MultiFileAllocationIterator; private: size_t pieceLength; DiskWriterEntries diskWriterEntries; std::vector > _openedDiskWriterEntries; size_t _maxOpenFiles; bool _directIOAllowed; bool _readOnly; void resetDiskWriterEntries(); void mkdir() const; void openIfNot(const SharedHandle& entry, void (DiskWriterEntry::*f)()); static const size_t DEFAULT_MAX_OPEN_FILES = 100; public: MultiDiskAdaptor(); virtual ~MultiDiskAdaptor(); virtual void initAndOpenFile(); virtual void openFile(); virtual void openExistingFile(); virtual void closeFile(); virtual void writeData(const unsigned char* data, size_t len, off_t offset); virtual ssize_t readData(unsigned char* data, size_t len, off_t offset); virtual bool fileExists(); virtual uint64_t size(); virtual SharedHandle fileAllocationIterator(); virtual void enableDirectIO(); virtual void disableDirectIO(); virtual void enableReadOnly(); virtual void disableReadOnly(); virtual bool isReadOnlyEnabled() const { return _readOnly; } void setPieceLength(size_t pieceLength) { this->pieceLength = pieceLength; } size_t getPieceLength() const { return pieceLength; } void allowDirectIO() { _directIOAllowed = true; } virtual void cutTrailingGarbage(); void setMaxOpenFiles(size_t maxOpenFiles); virtual size_t utime(const Time& actime, const Time& modtime); const std::vector >& getDiskWriterEntries() const { return diskWriterEntries; } }; typedef SharedHandle MultiDiskAdaptorHandle; } // namespace aria2 #endif // _D_MULTI_DISK_ADAPTOR_H_