/* */ #ifndef _D_PIECE_H_ #define _D_PIECE_H_ #include "common.h" #include "SharedHandle.h" #include #include #include namespace aria2 { class BitfieldMan; #ifdef ENABLE_MESSAGE_DIGEST class MessageDigestContext; #endif // ENABLE_MESSAGE_DIGEST class Piece { private: size_t index; size_t length; size_t _blockLength; BitfieldMan* bitfield; #ifdef ENABLE_MESSAGE_DIGEST size_t _nextBegin; std::string _hashAlgo; SharedHandle _mdctx; #endif // ENABLE_MESSAGE_DIGEST public: static const size_t BLOCK_LENGTH = 16*1024; Piece(); Piece(size_t index, size_t length, size_t blockLength = BLOCK_LENGTH); Piece(const Piece& piece); ~Piece(); Piece& operator=(const Piece& piece); bool operator==(const Piece& piece) const { return index == piece.index; } bool operator<(const Piece& piece) const { return index < piece.index; } bool getMissingUnusedBlockIndex(size_t& index) const; bool getMissingBlockIndex(size_t& index) const; bool getFirstMissingBlockIndexWithoutLock(size_t& index) const; bool getAllMissingBlockIndexes(unsigned char* misbitfield, size_t mislen) const; void completeBlock(size_t blockIndex); void cancelBlock(size_t blockIndex); size_t countCompleteBlock() const; size_t countMissingBlock() const; bool hasBlock(size_t blockIndex) const; /** * Returns true if all blocks of this piece have been downloaded, otherwise * returns false. */ bool pieceComplete() const; size_t countBlock() const; size_t getBlockLength(size_t index) const; size_t getBlockLength() const; size_t getIndex() const { return index; } void setIndex(size_t index) { this->index = index; } size_t getLength() const { return length; } void setLength(size_t index) { this->length = length; } const unsigned char* getBitfield() const; void setBitfield(const unsigned char* bitfield, size_t len); size_t getBitfieldLength() const; void clearAllBlock(); void setAllBlock(); std::string toString() const; bool isBlockUsed(size_t index) const; // Calculates completed length size_t getCompletedLength(); #ifdef ENABLE_MESSAGE_DIGEST void setHashAlgo(const std::string& algo); // Updates hash value. This function compares begin and private variable // _nextBegin and only when they are equal, hash is updated eating data and // returns true. Otherwise returns false. bool updateHash(uint32_t begin, const unsigned char* data, size_t dataLength); bool isHashCalculated() const; // Returns hash value in ASCII hexadecimal form. // WARN: This function must be called only once. std::string getHashString(); void destroyHashContext(); #endif // ENABLE_MESSAGE_DIGEST /** * Loses current bitfield state. */ void reconfigure(size_t length); }; typedef SharedHandle PieceHandle; typedef std::deque Pieces; } // namespace aria2 #endif // _D_PIECE_H_