/* */ #ifndef _D_SINGLE_FILE_DOWNLOAD_CONTEXT_H_ #define _D_SINGLE_FILE_DOWNLOAD_CONTEXT_H_ #include "DownloadContext.h" class SingleFileDownloadContext:public DownloadContext { private: int32_t _pieceLength; /** * Actual file path is _dir + _filename. * If _ufilename is not zero-length string, then _dir + _ufilename. */ FileEntryHandle _fileEntry; string _filename; string _ufilename; Strings _pieceHashes; string _pieceHashAlgo; void updateFileEntry() { if(_ufilename != "") { _fileEntry->setPath(_ufilename); } else if(_filename != "") { _fileEntry->setPath(_filename); } else { _fileEntry->setPath("index.html"); } } public: SingleFileDownloadContext(int32_t pieceLength, int64_t totalLength, const string& filename, const string& ufilename = ""): _pieceLength(pieceLength), _fileEntry(new FileEntry(filename, totalLength, 0)), _filename(filename), _ufilename(ufilename) { updateFileEntry(); } virtual ~SingleFileDownloadContext() {} virtual string getPieceHash(int32_t index) const { if(index < 0 || _pieceHashes.size() <= (size_t)index) { return ""; } return _pieceHashes[index]; } virtual const Strings& getPieceHashes() const { return _pieceHashes; } virtual int64_t getTotalLength() const { return _fileEntry->getLength(); } virtual FILE_MODE getFileMode() const { return SINGLE; } virtual FileEntries getFileEntries() const { FileEntries fs; fs.push_back(_fileEntry); return fs; } virtual string getName() const { return _filename; } virtual int32_t getPieceLength() const { return _pieceLength; } virtual int32_t getNumPieces() const { return (_fileEntry->getLength()+_pieceLength-1)/_pieceLength; } virtual string getActualBasePath() const { return _dir+"/"+_fileEntry->getPath(); } virtual string getPieceHashAlgo() const { return _pieceHashAlgo; } void setPieceHashes(const Strings& pieceHashes) { _pieceHashes = pieceHashes; } void setFilename(const string& filename) { _filename = filename; updateFileEntry(); } void setUFilename(const string& ufilename) { _ufilename = ufilename; updateFileEntry(); } void setTotalLength(int64_t totalLength) { _fileEntry->setLength(totalLength); } void setPieceHashAlgo(const string& algo) { _pieceHashAlgo = algo; } }; typedef SharedHandle SingleFileDownloadContextHandle; #endif // _D_SINGLE_FILE_DOWNLOAD_CONTEXT_H_