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