/* */ #ifndef _D_PIECE_MESSAGE_H_ #define _D_PIECE_MESSAGE_H_ #include "PeerMessage.h" #include "TorrentMan.h" class PieceMessage : public PeerMessage { private: int index; int begin; char* block; int blockLength; int leftDataLength; bool headerSent; int pendingCount; // for check int pieces; int pieceLength; char msgHeader[13]; bool checkPieceHash(const Piece& piece); void onGotNewPiece(Piece& piece); void onGotWrongPiece(Piece& piece); void erasePieceOnDisk(const Piece& piece); int sendPieceData(long long int offset, int length) const; PeerMessageHandle createRejectMessage(int index, int begin, int blockLength) const; public: PieceMessage(int index = 0, int begin = 0, int blockLength = 0) :PeerMessage(), index(index), begin(begin), block(0), blockLength(blockLength), leftDataLength(0), headerSent(false), pendingCount(0), pieces(0), pieceLength(0) { uploading = true; } virtual ~PieceMessage() { if(block != NULL) { delete [] block; } } enum ID_t { ID = 7 }; int getIndex() const { return index; } void setIndex(int index) { this->index = index; } int getBegin() const { return begin; } void setBegin(int begin) { this->begin = begin; } const char* getBlock() const { return block; } void setBlock(const char* block, int blockLength); int getBlockLength() const { return blockLength; } void setBlockLength(int blockLength) { this->blockLength = blockLength; } void setPieces(int pieces) { this->pieces = pieces; } int getPieces() const { return pieces;} void setPieceLength(int pieceLength) { this->pieceLength = pieceLength; } int getPieceLength() const { return pieceLength;} void incrementPendingCount() { pendingCount++; } bool isPendingCountMax() const { return pendingCount > 2; } static PieceMessage* create(const char* data, int dataLength); virtual int getId() const { return ID; } virtual void receivedAction(); virtual const char* getMessageHeader(); virtual int getMessageHeaderLength(); virtual void send(); virtual void check() const; virtual string toString() const; virtual void onChoked(); virtual void onCanceled(int index, int begin, int blockLength); }; #endif // _D_PIECE_MESSAGE_H_