/* */ #include "BtCancelMessage.h" #include "PeerMessageUtil.h" #include "Util.h" #include "DlAbortEx.h" #include "message.h" BtCancelMessageHandle BtCancelMessage::create(const unsigned char* data, int32_t dataLength) { if(dataLength != 13) { throw new DlAbortEx(EX_INVALID_PAYLOAD_SIZE, "cancel", dataLength, 13); } int8_t id = PeerMessageUtil::getId(data); if(id != ID) { throw new DlAbortEx(EX_INVALID_BT_MESSAGE_ID, id, "cancel", ID); } BtCancelMessageHandle message = new BtCancelMessage(); message->setIndex(PeerMessageUtil::getIntParam(data, 1)); message->setBegin(PeerMessageUtil::getIntParam(data, 5)); message->setLength(PeerMessageUtil::getIntParam(data, 9)); return message; } void BtCancelMessage::doReceivedAction() { dispatcher->doCancelSendingPieceAction(index, begin, length); } int32_t BtCancelMessage::MESSAGE_LENGTH = 17; const unsigned char* BtCancelMessage::getMessage() { if(!msg) { /** * len --- 13, 4bytes * id --- 8, 1byte * index --- index, 4bytes * begin --- begin, 4bytes * length -- length, 4bytes * total: 17bytes */ msg = new unsigned char[MESSAGE_LENGTH]; PeerMessageUtil::createPeerMessageString(msg, MESSAGE_LENGTH, 13, ID); PeerMessageUtil::setIntParam(&msg[5], index); PeerMessageUtil::setIntParam(&msg[9], begin); PeerMessageUtil::setIntParam(&msg[13], length); } return msg; } int32_t BtCancelMessage::getMessageLength() { return MESSAGE_LENGTH; } string BtCancelMessage::toString() const { return "cancel index="+Util::itos(index)+", begin="+Util::itos(begin)+ ", length="+Util::itos(length); }