/* */ #ifndef _D_DEFAULT_PIECE_STORAGE_H_ #define _D_DEFAULT_PIECE_STORAGE_H_ #include "PieceStorage.h" #include "BtContext.h" #include "DiskAdaptor.h" #include "BitfieldMan.h" #include "Logger.h" #include "Option.h" #include "Piece.h" #define END_GAME_PIECE_NUM 20 class HaveEntry { private: int cuid; int index; Time registeredTime; public: HaveEntry(int cuid, int index): cuid(cuid), index(index) {} int getCuid() const { return cuid; } int getIndex() const { return index; } const Time& getRegisteredTime() const { return registeredTime; } }; typedef deque Haves; class DefaultPieceStorage : public PieceStorage { private: BtContextHandle btContext; BitfieldMan* bitfieldMan; DiskAdaptor* diskAdaptor; Pieces usedPieces; int endGamePieceNum; Logger* logger; const Option* option; Haves haves; int getMissingPieceIndex(const PeerHandle& peer); int getMissingFastPieceIndex(const PeerHandle& peer); PieceHandle checkOutPiece(int index); int deleteUsedPiecesByFillRate(int fillRate, int toDelete); void reduceUsedPieces(int delMax); void deleteUsedPiece(const PieceHandle& piece); PieceHandle findUsedPiece(int index) const; public: DefaultPieceStorage(BtContextHandle btContext, 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 getPiece(int index); virtual void completePiece(const PieceHandle& piece); virtual void cancelPiece(const PieceHandle& piece); virtual bool hasPiece(int index); virtual long long int getTotalLength(); virtual long long int getFilteredTotalLength(); virtual long long int getCompletedLength(); virtual long long int getFilteredCompletedLength(); virtual void initStorage(); virtual void setFileFilter(const Strings& filePaths); virtual void setFileFilter(const Integers& fileIndexes); virtual void clearFileFilter(); virtual bool downloadFinished(); virtual void setBitfield(const unsigned char* bitfield, int bitfieldLength); virtual int getBitfieldLength(); virtual const unsigned char* getBitfield(); void setEndGamePieceNum(int num) { endGamePieceNum = num; } int getEndGamePieceNum() const { return endGamePieceNum; } virtual bool isSelectiveDownloadingMode(); virtual void finishSelectiveDownloadingMode(); virtual bool isEndGame(); virtual DiskAdaptor* getDiskAdaptor(); virtual int getPieceLength(int index); virtual void advertisePiece(int cuid, int index); virtual Integers getAdvertisedPieceIndexes(int myCuid, const Time& lastCheckTime); virtual void removeAdvertisedPiece(int elapsed); /** * This method is made private for test purpose only. */ void addUsedPiece(const PieceHandle& piece); }; #endif // _D_DEFAULT_PIECE_STORAGE_H_