/* */ #include "BtAllowedFastMessage.h" #include "PeerMessageUtil.h" #include "Util.h" #include "DlAbortEx.h" #include "message.h" #include "Peer.h" namespace aria2 { BtAllowedFastMessageHandle BtAllowedFastMessage::create(const unsigned char* data, int32_t dataLength) { if(dataLength != 5) { throw new DlAbortEx(EX_INVALID_PAYLOAD_SIZE, "allowed fast", dataLength, 5); } int8_t id = PeerMessageUtil::getId(data); if(id != ID) { throw new DlAbortEx(EX_INVALID_BT_MESSAGE_ID, id, "allowed fast", ID); } BtAllowedFastMessageHandle message = new BtAllowedFastMessage(); message->setIndex(PeerMessageUtil::getIntParam(data, 1)); return message; } void BtAllowedFastMessage::doReceivedAction() { if(!peer->isFastExtensionEnabled()) { throw new DlAbortEx("%s received while fast extension is disabled", toString().c_str()); } peer->addPeerAllowedIndex(index); } int32_t BtAllowedFastMessage::MESSAGE_LENGTH = 9; const unsigned char* BtAllowedFastMessage::getMessage() { if(!msg) { /** * len --- 5, 4bytes * id --- 17, 1byte * piece index --- index, 4bytes * total: 9bytes */ msg = new unsigned char[MESSAGE_LENGTH]; PeerMessageUtil::createPeerMessageString(msg, MESSAGE_LENGTH, 5, ID); PeerMessageUtil::setIntParam(&msg[5], index); } return msg; } int32_t BtAllowedFastMessage::getMessageLength() { return MESSAGE_LENGTH; } void BtAllowedFastMessage::onSendComplete() { peer->addAmAllowedIndex(index); } std::string BtAllowedFastMessage::toString() const { return "allowed fast index="+Util::itos(index); } } // namespace aria2