/* */ #ifndef D_DEFAULT_PIECE_STORAGE_H #define D_DEFAULT_PIECE_STORAGE_H #include "PieceStorage.h" #include #include #include "a2functional.h" namespace aria2 { class DownloadContext; class BitfieldMan; class Option; class DiskWriterFactory; class FileEntry; class PieceStatMan; class PieceSelector; class StreamPieceSelector; #define END_GAME_PIECE_NUM 20 struct HaveEntry { HaveEntry(uint64_t haveIndex, cuid_t cuid, size_t index, Timer registeredTime) : haveIndex(haveIndex), cuid(cuid), index(index), registeredTime(std::move(registeredTime)) { } uint64_t haveIndex; cuid_t cuid; size_t index; Timer registeredTime; }; class DefaultPieceStorage : public PieceStorage { private: std::shared_ptr downloadContext_; std::unique_ptr bitfieldMan_; std::shared_ptr diskAdaptor_; std::shared_ptr diskWriterFactory_; typedef std::set, DerefLess>> UsedPieceSet; UsedPieceSet usedPieces_; bool endGame_; size_t endGamePieceNum_; const Option* option_; // The next unique index on HaveEntry, which is ever strictly // increasing sequence of integer. uint64_t nextHaveIndex_; std::deque haves_; std::shared_ptr pieceStatMan_; std::unique_ptr pieceSelector_; std::unique_ptr streamPieceSelector_; WrDiskCache* wrDiskCache_; #ifdef ENABLE_BITTORRENT void getMissingPiece(std::vector>& pieces, size_t minMissingBlocks, const unsigned char* bitfield, size_t length, cuid_t cuid); void createFastIndexBitfield(BitfieldMan& bitfield, const std::shared_ptr& peer); #endif // ENABLE_BITTORRENT std::shared_ptr checkOutPiece(size_t index, cuid_t cuid); // size_t deleteUsedPiecesByFillRate(int fillRate, size_t toDelete); // void reduceUsedPieces(size_t upperBound); void deleteUsedPiece(const std::shared_ptr& piece); std::shared_ptr findUsedPiece(size_t index) const; // Returns the sum of completed length of in-flight pieces int64_t getInFlightPieceCompletedLength() const; // Returns the sum of completed length of in-flight pieces // intersecting filter ranges. int64_t getInFlightPieceFilteredCompletedLength() 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 std::shared_ptr& downloadContext, const Option* option); virtual ~DefaultPieceStorage(); #ifdef ENABLE_BITTORRENT virtual bool hasMissingPiece(const std::shared_ptr& peer) CXX11_OVERRIDE; virtual void getMissingPiece(std::vector>& pieces, size_t minMissingBlocks, const std::shared_ptr& peer, cuid_t cuid) CXX11_OVERRIDE; virtual void getMissingPiece(std::vector>& pieces, size_t minMissingBlocks, const std::shared_ptr& peer, const std::vector& excludedIndexes, cuid_t cuid) CXX11_OVERRIDE; virtual void getMissingFastPiece(std::vector>& pieces, size_t minMissingBlocks, const std::shared_ptr& peer, cuid_t cuid) CXX11_OVERRIDE; virtual void getMissingFastPiece(std::vector>& pieces, size_t minMissingBlocks, const std::shared_ptr& peer, const std::vector& excludedIndexes, cuid_t cuid) CXX11_OVERRIDE; virtual std::shared_ptr getMissingPiece(const std::shared_ptr& peer, cuid_t cuid) CXX11_OVERRIDE; virtual std::shared_ptr getMissingPiece(const std::shared_ptr& peer, const std::vector& excludedIndexes, cuid_t cuid) CXX11_OVERRIDE; std::shared_ptr getMissingFastPiece(const std::shared_ptr& peer, cuid_t cuid); std::shared_ptr getMissingFastPiece(const std::shared_ptr& peer, const std::vector& excludedIndexes, cuid_t cuid); #endif // ENABLE_BITTORRENT virtual bool hasMissingUnusedPiece() CXX11_OVERRIDE; virtual std::shared_ptr getMissingPiece(size_t minSplitSize, const unsigned char* ignoreBitfield, size_t length, cuid_t cuid) CXX11_OVERRIDE; virtual std::shared_ptr getMissingPiece(size_t index, cuid_t cuid) CXX11_OVERRIDE; virtual std::shared_ptr getPiece(size_t index) CXX11_OVERRIDE; virtual void completePiece(const std::shared_ptr& piece) CXX11_OVERRIDE; virtual void cancelPiece(const std::shared_ptr& piece, cuid_t cuid) CXX11_OVERRIDE; virtual bool hasPiece(size_t index) CXX11_OVERRIDE; virtual bool isPieceUsed(size_t index) CXX11_OVERRIDE; virtual int64_t getTotalLength() CXX11_OVERRIDE; virtual int64_t getFilteredTotalLength() CXX11_OVERRIDE; virtual int64_t getCompletedLength() CXX11_OVERRIDE; virtual int64_t getFilteredCompletedLength() CXX11_OVERRIDE; virtual void initStorage() CXX11_OVERRIDE; virtual void setupFileFilter() CXX11_OVERRIDE; virtual void clearFileFilter() CXX11_OVERRIDE; virtual bool downloadFinished() CXX11_OVERRIDE; virtual bool allDownloadFinished() CXX11_OVERRIDE; virtual void setBitfield(const unsigned char* bitfield, size_t bitfieldLength) CXX11_OVERRIDE; virtual size_t getBitfieldLength() CXX11_OVERRIDE; virtual const unsigned char* getBitfield() CXX11_OVERRIDE; virtual void setEndGamePieceNum(size_t num) CXX11_OVERRIDE { endGamePieceNum_ = num; } size_t getEndGamePieceNum() const { return endGamePieceNum_; } virtual bool isSelectiveDownloadingMode() CXX11_OVERRIDE; virtual bool isEndGame() CXX11_OVERRIDE { return endGame_; } virtual void enterEndGame() CXX11_OVERRIDE { endGame_ = true; } virtual std::shared_ptr getDiskAdaptor() CXX11_OVERRIDE; virtual WrDiskCache* getWrDiskCache() CXX11_OVERRIDE; virtual void flushWrDiskCacheEntry() CXX11_OVERRIDE; virtual int32_t getPieceLength(size_t index) CXX11_OVERRIDE; virtual void advertisePiece(cuid_t cuid, size_t index, Timer registeredTime) CXX11_OVERRIDE; virtual uint64_t getAdvertisedPieceIndexes(std::vector& indexes, cuid_t myCuid, uint64_t lastHaveIndex) CXX11_OVERRIDE; virtual void removeAdvertisedPiece(const Timer& expiry) CXX11_OVERRIDE; virtual void markAllPiecesDone() CXX11_OVERRIDE; virtual void markPiecesDone(int64_t length) CXX11_OVERRIDE; virtual void markPieceMissing(size_t index) CXX11_OVERRIDE; virtual void addInFlightPiece( const std::vector>& pieces) CXX11_OVERRIDE; virtual size_t countInFlightPiece() CXX11_OVERRIDE; virtual void getInFlightPieces(std::vector>& pieces) CXX11_OVERRIDE; virtual void addPieceStats(size_t index) CXX11_OVERRIDE; virtual void addPieceStats(const unsigned char* bitfield, size_t bitfieldLength) CXX11_OVERRIDE; virtual void subtractPieceStats(const unsigned char* bitfield, size_t bitfieldLength) CXX11_OVERRIDE; virtual void updatePieceStats(const unsigned char* newBitfield, size_t newBitfieldLength, const unsigned char* oldBitfield) CXX11_OVERRIDE; virtual size_t getNextUsedIndex(size_t index) CXX11_OVERRIDE; virtual void onDownloadIncomplete() CXX11_OVERRIDE; /** * This method is made private for test purpose only. */ void addUsedPiece(const std::shared_ptr& piece); void setDiskWriterFactory( const std::shared_ptr& diskWriterFactory); const std::shared_ptr& getPieceStatMan() const { return pieceStatMan_; } void setPieceSelector(std::unique_ptr pieceSelector); const std::unique_ptr& getPieceSelector() const { return pieceSelector_; } std::unique_ptr popPieceSelector(); void setWrDiskCache(WrDiskCache* wrDiskCache) { wrDiskCache_ = wrDiskCache; } }; } // namespace aria2 #endif // D_DEFAULT_PIECE_STORAGE_H