/* */ #ifndef _D_DEFAULT_PIECE_STORAGE_H_ #define _D_DEFAULT_PIECE_STORAGE_H_ #include "PieceStorage.h" #include namespace aria2 { class DownloadContext; class BitfieldMan; class Logger; class Option; class DiskWriterFactory; class FileEntry; class PieceStatMan; class PieceSelector; #define END_GAME_PIECE_NUM 20 class HaveEntry { private: cuid_t cuid_; size_t index_; Timer registeredTime_; public: HaveEntry(cuid_t cuid, size_t index, const Timer& registeredTime): cuid_(cuid), index_(index), registeredTime_(registeredTime) {} cuid_t getCuid() const { return cuid_; } size_t getIndex() const { return index_; } const Timer& getRegisteredTime() const { return registeredTime_; } }; class DefaultPieceStorage : public PieceStorage { private: SharedHandle downloadContext_; BitfieldMan* bitfieldMan_; SharedHandle diskAdaptor_; SharedHandle diskWriterFactory_; std::deque > usedPieces_; bool endGame_; size_t endGamePieceNum_; Logger* logger_; const Option* option_; std::deque haves_; SharedHandle pieceStatMan_; SharedHandle pieceSelector_; #ifdef ENABLE_BITTORRENT void getMissingPiece (std::vector >& pieces, size_t minMissingBlocks, const unsigned char* bitfield, size_t length); void createFastIndexBitfield(BitfieldMan& bitfield, const SharedHandle& peer); #endif // ENABLE_BITTORRENT SharedHandle checkOutPiece(size_t index); // size_t deleteUsedPiecesByFillRate(int fillRate, size_t toDelete); // void reduceUsedPieces(size_t upperBound); void deleteUsedPiece(const SharedHandle& piece); SharedHandle findUsedPiece(size_t index) const; size_t getInFlightPieceCompletedLength() const; public: // Setting randomPieceStatsOrdering to true means a piece is chosen in // random when more than 2 pieces has the same rarity. // If it is set to false, a piece whose index is smallest has the highest // priority. DefaultPieceStorage(const SharedHandle& downloadContext, const Option* option); virtual ~DefaultPieceStorage(); #ifdef ENABLE_BITTORRENT virtual bool hasMissingPiece(const SharedHandle& peer); virtual void getMissingPiece (std::vector >& pieces, size_t minMissingBlocks, const SharedHandle& peer); virtual void getMissingPiece (std::vector >& pieces, size_t minMissingBlocks, const SharedHandle& peer, const std::vector& excludedIndexes); virtual void getMissingFastPiece (std::vector >& pieces, size_t minMissingBlocks, const SharedHandle& peer); virtual void getMissingFastPiece (std::vector >& pieces, size_t minMissingBlocks, const SharedHandle& peer, const std::vector& excludedIndexes); virtual SharedHandle getMissingPiece(const SharedHandle& peer); virtual SharedHandle getMissingPiece (const SharedHandle& peer, const std::vector& excludedIndexes); SharedHandle getMissingFastPiece (const SharedHandle& peer); SharedHandle getMissingFastPiece (const SharedHandle& peer, const std::vector& excludedIndexes); #endif // ENABLE_BITTORRENT virtual bool hasMissingUnusedPiece(); virtual SharedHandle getSparseMissingUnusedPiece (size_t minSplitSize, const unsigned char* ignoreBitfield, size_t length); 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 setupFileFilter(); 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(); virtual void setEndGamePieceNum(size_t num) { endGamePieceNum_ = num; } size_t getEndGamePieceNum() const { return endGamePieceNum_; } virtual bool isSelectiveDownloadingMode(); virtual bool isEndGame() { return endGame_; } virtual void enterEndGame() { endGame_ = true; } virtual SharedHandle getDiskAdaptor(); virtual size_t getPieceLength(size_t index); virtual void advertisePiece(cuid_t cuid, size_t index); virtual void getAdvertisedPieceIndexes(std::vector& indexes, cuid_t myCuid, const Timer& 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::vector >& pieces); virtual size_t countInFlightPiece(); virtual void getInFlightPieces (std::vector >& pieces); virtual void addPieceStats(size_t index); virtual void addPieceStats(const unsigned char* bitfield, size_t bitfieldLength); virtual void subtractPieceStats(const unsigned char* bitfield, size_t bitfieldLength); virtual void updatePieceStats(const unsigned char* newBitfield, size_t newBitfieldLength, const unsigned char* oldBitfield); virtual size_t getNextUsedIndex(size_t index); /** * This method is made private for test purpose only. */ void addUsedPiece(const SharedHandle& piece); void setDiskWriterFactory (const SharedHandle& diskWriterFactory); const SharedHandle& getPieceStatMan() const { return pieceStatMan_; } void setPieceSelector(const SharedHandle& pieceSelector) { pieceSelector_ = pieceSelector; } const SharedHandle& getPieceSelector() const { return pieceSelector_; } }; typedef SharedHandle DefaultPieceStorageHandle; } // namespace aria2 #endif // _D_DEFAULT_PIECE_STORAGE_H_