/* */ #ifndef _D_DEFAULT_PIECE_STORAGE_H_ #define _D_DEFAULT_PIECE_STORAGE_H_ #include "PieceStorage.h" class DownloadContext; typedef SharedHandle DownloadContextHandle; class BitfieldMan; class Logger; class Option; typedef deque Pieces; class DiskWriterFactory; typedef SharedHandle DiskWriterFactoryHandle; class FileEntry; typedef SharedHandle FileEntryHandle; #define END_GAME_PIECE_NUM 20 class HaveEntry { private: int32_t cuid; int32_t index; Time registeredTime; public: HaveEntry(int32_t cuid, int32_t index): cuid(cuid), index(index) {} int32_t getCuid() const { return cuid; } int32_t getIndex() const { return index; } const Time& getRegisteredTime() const { return registeredTime; } }; typedef deque Haves; class DefaultPieceStorage : public PieceStorage { private: DownloadContextHandle downloadContext; BitfieldMan* bitfieldMan; DiskAdaptorHandle diskAdaptor; DiskWriterFactoryHandle _diskWriterFactory; Pieces usedPieces; int32_t endGamePieceNum; Logger* logger; const Option* option; Haves haves; int32_t getMissingPieceIndex(const PeerHandle& peer); int32_t getMissingFastPieceIndex(const PeerHandle& peer); PieceHandle checkOutPiece(int32_t index); int32_t deleteUsedPiecesByFillRate(int32_t fillRate, int32_t toDelete); void reduceUsedPieces(int32_t delMax); void deleteUsedPiece(const PieceHandle& piece); PieceHandle findUsedPiece(int32_t index) const; int32_t getInFlightPieceCompletedLength() const; public: DefaultPieceStorage(const DownloadContextHandle& downloadContext, const Option* option); virtual ~DefaultPieceStorage(); virtual bool hasMissingPiece(const PeerHandle& peer); virtual PieceHandle getMissingPiece(const PeerHandle& peer); virtual PieceHandle getMissingFastPiece(const PeerHandle& peer); virtual PieceHandle getMissingPiece(); virtual PieceHandle getMissingPiece(const FileEntryHandle& fileEntry); virtual PieceHandle getMissingPiece(int32_t index); virtual PieceHandle getPiece(int32_t index); virtual void completePiece(const PieceHandle& piece); virtual void cancelPiece(const PieceHandle& piece); virtual bool hasPiece(int32_t index); virtual bool isPieceUsed(int32_t index); virtual int64_t getTotalLength(); virtual int64_t getFilteredTotalLength(); virtual int64_t getCompletedLength(); virtual int64_t getFilteredCompletedLength(); virtual void initStorage(); virtual void setFileFilter(const Strings& filePaths); virtual void setFileFilter(IntSequence seq); virtual void clearFileFilter(); virtual bool downloadFinished(); virtual bool allDownloadFinished(); virtual void setBitfield(const unsigned char* bitfield, int32_t bitfieldLength); virtual int32_t getBitfieldLength(); virtual const unsigned char* getBitfield(); void setEndGamePieceNum(int32_t num) { endGamePieceNum = num; } int32_t getEndGamePieceNum() const { return endGamePieceNum; } virtual bool isSelectiveDownloadingMode(); virtual void finishSelectiveDownloadingMode(); virtual bool isEndGame(); virtual DiskAdaptorHandle getDiskAdaptor(); virtual int32_t getPieceLength(int32_t index); virtual void advertisePiece(int32_t cuid, int32_t index); virtual Integers getAdvertisedPieceIndexes(int32_t myCuid, const Time& lastCheckTime); virtual void removeAdvertisedPiece(int32_t elapsed); virtual void markAllPiecesDone(); virtual void markPiecesDone(int64_t length); virtual void markPieceMissing(int32_t index); virtual void addInFlightPiece(const Pieces& pieces); virtual int32_t countInFlightPiece(); virtual Pieces getInFlightPieces(); /** * This method is made private for test purpose only. */ void addUsedPiece(const PieceHandle& piece); void setDiskWriterFactory(const DiskWriterFactoryHandle& diskWriterFactory); }; typedef SharedHandle DefaultPieceStorageHandle; #endif // _D_DEFAULT_PIECE_STORAGE_H_