/* */ #include "BtChokeMessage.h" #include "PeerMessageUtil.h" #include "DlAbortEx.h" BtChokeMessageHandle BtChokeMessage::create(const unsigned char* data, uint32_t dataLength) { if(dataLength != 1) { throw new DlAbortEx("invalid payload size for %s, size = %d. It should be %d", "choke", dataLength, 1); } uint8_t id = PeerMessageUtil::getId(data); if(id != ID) { throw new DlAbortEx("invalid ID=%d for %s. It should be %d.", id, "choke", ID); } BtChokeMessageHandle chokeMessage = new BtChokeMessage(); return chokeMessage; } void BtChokeMessage::doReceivedAction() { peer->peerChoking = true; BT_MESSAGE_DISPATCHER(btContext, peer)->doChokedAction(); BT_REQUEST_FACTORY(btContext, peer)->doChokedAction(); } bool BtChokeMessage::sendPredicate() const { return !peer->amChoking; } uint32_t BtChokeMessage::MESSAGE_LENGTH = 5; const unsigned char* BtChokeMessage::getMessage() { if(!msg) { /** * len --- 1, 4bytes * id --- 0, 1byte * total: 5bytes */ msg = new unsigned char[MESSAGE_LENGTH]; PeerMessageUtil::createPeerMessageString(msg, MESSAGE_LENGTH, 1, ID); } return msg; } uint32_t BtChokeMessage::getMessageLength() { return MESSAGE_LENGTH; } void BtChokeMessage::onSendComplete() { peer->amChoking = true; BT_MESSAGE_DISPATCHER(btContext, peer)->doChokingAction(); } string BtChokeMessage::toString() const { return "choke"; }