/* */ #include "BtBitfieldMessage.h" #include "PeerMessageUtil.h" #include "Util.h" #include "DlAbortEx.h" #include "message.h" #include "Peer.h" #include "StringFormat.h" #include "PieceStorage.h" #include namespace aria2 { void BtBitfieldMessage::setBitfield(const unsigned char* bitfield, size_t bitfieldLength) { if(this->bitfield == bitfield) { return; } delete [] this->bitfield; this->bitfieldLength = bitfieldLength; this->bitfield = new unsigned char[this->bitfieldLength]; memcpy(this->bitfield, bitfield, this->bitfieldLength); } BtBitfieldMessageHandle BtBitfieldMessage::create(const unsigned char* data, size_t dataLength) { if(dataLength <= 1) { throw DlAbortEx (StringFormat(EX_INVALID_PAYLOAD_SIZE, "bitfield", dataLength, 1).str()); } uint8_t id = PeerMessageUtil::getId(data); if(id != ID) { throw DlAbortEx (StringFormat(EX_INVALID_BT_MESSAGE_ID, id, "bitfield", ID).str()); } BtBitfieldMessageHandle message(new BtBitfieldMessage()); message->setBitfield((unsigned char*)data+1, dataLength-1); return message; } void BtBitfieldMessage::doReceivedAction() { pieceStorage->updatePieceStats(bitfield, bitfieldLength, peer->getBitfield()); peer->setBitfield(bitfield, bitfieldLength); } const unsigned char* BtBitfieldMessage::getMessage() { if(!msg) { /** * len --- 1+bitfieldLength, 4bytes * id --- 5, 1byte * bitfield --- bitfield, len bytes * total: 5+len bytes */ msgLength = 5+bitfieldLength; msg = new unsigned char[msgLength]; PeerMessageUtil::createPeerMessageString(msg, msgLength, 1+bitfieldLength, ID); memcpy(msg+5, bitfield, bitfieldLength); } return msg; } size_t BtBitfieldMessage::getMessageLength() { getMessage(); return msgLength; } std::string BtBitfieldMessage::toString() const { return "bitfield "+Util::toHex(bitfield, bitfieldLength); } } // namespace aria2