/* */ #ifndef _D_PIECE_H_ #define _D_PIECE_H_ #include "BitfieldMan.h" #include "common.h" #define BLOCK_LENGTH (16*1024) class Piece { private: int32_t index; int32_t length; BitfieldMan* bitfield; public: Piece(); Piece(int32_t index, int32_t length); Piece(const Piece& piece); ~Piece() { delete bitfield; } Piece& operator=(const Piece& piece) { if(this != &piece) { index = piece.index; length = piece.length; if(bitfield != NULL) { delete bitfield; } if(piece.bitfield == NULL) { bitfield = NULL; } else { bitfield = new BitfieldMan(*piece.bitfield); } } return *this; } bool operator==(const Piece& piece) const { return index == piece.index; } int32_t getMissingUnusedBlockIndex() const; int32_t getMissingBlockIndex() const; BlockIndexes getAllMissingBlockIndexes() const; void completeBlock(int32_t blockIndex); void cancelBlock(int32_t blockIndex); int32_t countCompleteBlock() const { return bitfield->countBlock()-bitfield->countMissingBlock(); } bool hasBlock(int32_t blockIndex) const { return bitfield->isBitSet(blockIndex); } /** * Returns true if all blocks of this piece have been downloaded, otherwise * returns false. */ bool pieceComplete() const; int32_t countBlock() const { return bitfield->countBlock(); } int32_t getBlockLength(int32_t index) const { return bitfield->getBlockLength(index); } int32_t getBlockLength() const { return bitfield->getBlockLength(); } int32_t getIndex() const { return index; } void setIndex(int32_t index) { this->index = index; } int32_t getLength() const { return length; } void setLength(int32_t index) { this->length = length; } const unsigned char* getBitfield() const { return bitfield->getBitfield(); } void setBitfield(const unsigned char* bitfield, int32_t len); int32_t getBitfieldLength() const { return bitfield->getBitfieldLength(); } void clearAllBlock(); void setAllBlock(); string toString() const; bool isBlockUsed(int32_t index) const { return bitfield->isUseBitSet(index); } }; typedef SharedHandle PieceHandle; typedef deque Pieces; #endif // _D_PIECE_H_