/* */ #ifndef _D_MULTI_DISK_WRITER_H_ #define _D_MULTI_DISK_WRITER_H_ #include "DefaultDiskWriter.h" #include "messageDigest.h" #include "FileEntry.h" #include "FileAllocator.h" class DiskWriterEntry { public: FileEntryHandle fileEntry; DefaultDiskWriter* diskWriter; public: DiskWriterEntry(const FileEntryHandle& fileEntry):fileEntry(fileEntry) { diskWriter = new DefaultDiskWriter(this->fileEntry->getLength()); } ~DiskWriterEntry() { delete diskWriter; } }; typedef deque DiskWriterEntries; class MultiDiskWriter : public DiskWriter { private: DiskWriterEntries diskWriterEntries; int pieceLength; MessageDigestContext ctx; FileAllocatorHandle fileAllocator; bool isInRange(const DiskWriterEntry* entry, long long int offset) const; int calculateLength(const DiskWriterEntry* entry, long long int fileOffset, int rem) const; void clearEntries(); void hashUpdate(DiskWriterEntry* entry, long long int offset, long long int length); void configureFileAllocator(DiskWriterEntry* entry); public: MultiDiskWriter(int pieceLength); virtual ~MultiDiskWriter(); void setFileEntries(const FileEntries& fileEntries); virtual void openFile(const string& filename); virtual void initAndOpenFile(const string& filename); virtual void closeFile(); virtual void openExistingFile(const string& filename); virtual void writeData(const char* data, int len, long long int position = 0); virtual int readData(char* data, int len, long long int position); virtual string sha1Sum(long long int offset, long long int length); void setFileAllocator(const FileAllocatorHandle& fileAllocator) { this->fileAllocator = fileAllocator; } }; #endif // _D_MULTI_DISK_WRITER_H_