/* */ #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 char BtExtendedMessage::NAME[] = "extended"; BtExtendedMessage::BtExtendedMessage( std::unique_ptr extensionMessage) : SimpleBtMessage(ID, NAME), extensionMessage_(std::move(extensionMessage)), msgLength_(0) { } std::vector 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(); auto msg = std::vector(msgLength_); auto p = msg.data(); bittorrent::createPeerMessageString(p, msgLength_, 2 + payload.size(), ID); p += 5; *p++ = extensionMessage_->getExtensionMessageID(); std::copy(std::begin(payload), std::end(payload), p); return msg; } bool BtExtendedMessage::sendPredicate() const { return getPeer()->isExtendedMessagingEnabled(); } std::string BtExtendedMessage::toString() const { std::string s = NAME; s += " "; s += extensionMessage_->toString(); return s; } std::unique_ptr BtExtendedMessage::create(ExtensionMessageFactory* factory, const std::shared_ptr& peer, const unsigned char* data, size_t dataLength) { bittorrent::assertPayloadLengthGreater(1, dataLength, NAME); bittorrent::assertID(ID, data, NAME); assert(factory); return make_unique( factory->createMessage(data + 1, dataLength - 1)); } void BtExtendedMessage::doReceivedAction() { if (extensionMessage_) { extensionMessage_->doReceivedAction(); } } const std::unique_ptr& BtExtendedMessage::getExtensionMessage() const { return extensionMessage_; } } // namespace aria2