/* */ #include "BtExtendedMessage.h" #include #include #include "ExtensionMessage.h" #include "ExtensionMessageFactory.h" #include "bittorrent_helper.h" #include "Peer.h" #include "DlAbortEx.h" #include "message.h" #include "util.h" #include "a2functional.h" namespace aria2 { const std::string BtExtendedMessage::NAME("extended"); BtExtendedMessage::BtExtendedMessage (const ExtensionMessageHandle& extensionMessage): SimpleBtMessage(ID, NAME), extensionMessage_(extensionMessage), msgLength_(0) {} BtExtendedMessage::~BtExtendedMessage() {} unsigned char* BtExtendedMessage::createMessage() { /** * len --- 2+extpayload.length, 4bytes * id --- 20, 1byte * extmsgid --- extmsgid, 1byte * extpayload --- extpayload, nbytes * total: 6+extpayload.length bytes */ std::string payload = extensionMessage_->getPayload(); msgLength_ = 6+payload.size(); unsigned char* msg = new unsigned char[msgLength_]; bittorrent::createPeerMessageString(msg, msgLength_, 2+payload.size(), ID); *(msg+5) = extensionMessage_->getExtensionMessageID(); memcpy(msg+6, payload.data(), payload.size()); return msg; } size_t BtExtendedMessage::getMessageLength() { if(!msgLength_) { msgLength_ = 6+extensionMessage_->getPayload().size(); } return msgLength_; } bool BtExtendedMessage::sendPredicate() const { return getPeer()->isExtendedMessagingEnabled(); } std::string BtExtendedMessage::toString() const { return strconcat(NAME, " ", extensionMessage_->toString()); } BtExtendedMessageHandle BtExtendedMessage::create(const SharedHandle& factory, const SharedHandle& peer, const unsigned char* data, size_t dataLength) { bittorrent::assertPayloadLengthGreater(1, dataLength, NAME); bittorrent::assertID(ID, data, NAME); assert(factory); ExtensionMessageHandle extmsg = factory->createMessage(data+1, dataLength-1); BtExtendedMessageHandle message(new BtExtendedMessage(extmsg)); return message; } void BtExtendedMessage::doReceivedAction() { if(extensionMessage_) { extensionMessage_->doReceivedAction(); } } } // namespace aria2