/* */ #include "BtExtendedMessage.h" #include "ExtensionMessage.h" #include "ExtensionMessageFactory.h" #include "PeerMessageUtil.h" #include "Peer.h" #include "BtContext.h" #include "DlAbortEx.h" #include "message.h" #include "Util.h" #include "StringFormat.h" #include #include namespace aria2 { BtExtendedMessage::BtExtendedMessage(const ExtensionMessageHandle& extensionMessage):_extensionMessage(extensionMessage), _msg(0), _msgLength(0) {} BtExtendedMessage::~BtExtendedMessage() { delete [] _msg; } const unsigned char* BtExtendedMessage::getMessage() { if(!_msg) { /** * len --- 2+extpayload.length, 4bytes * id --- 20, 1byte * extmsgid --- extmsgid, 1byte * extpayload --- extpayload, nbytes * total: 6+extpayload.length bytes */ std::string payload = _extensionMessage->getBencodedData(); _msgLength = 6+payload.size(); _msg = new unsigned char[_msgLength]; PeerMessageUtil::createPeerMessageString(_msg, _msgLength, 2+payload.size(), ID); *(_msg+5) = _extensionMessage->getExtensionMessageID(); memcpy(_msg+6, payload.c_str(), payload.size()); } return _msg; } size_t BtExtendedMessage::getMessageLength() { getMessage(); return _msgLength; } bool BtExtendedMessage::sendPredicate() const { return peer->isExtendedMessagingEnabled(); } std::string BtExtendedMessage::toString() const { return "extended "+_extensionMessage->toString(); } BtExtendedMessageHandle BtExtendedMessage::create(const SharedHandle& factory, const PeerHandle& peer, const unsigned char* data, size_t dataLength) { if(dataLength < 2) { throw DlAbortEx (StringFormat(MSG_TOO_SMALL_PAYLOAD_SIZE, "extended", dataLength).str()); } uint8_t id = PeerMessageUtil::getId(data); if(id != ID) { throw DlAbortEx (StringFormat(EX_INVALID_BT_MESSAGE_ID, id, "extended", ID).str()); } assert(!factory.isNull()); ExtensionMessageHandle extmsg = factory->createMessage(data+1, dataLength-1); BtExtendedMessageHandle message(new BtExtendedMessage(extmsg)); return message; } void BtExtendedMessage::doReceivedAction() { if(!_extensionMessage.isNull()) { _extensionMessage->doReceivedAction(); } } ExtensionMessageHandle BtExtendedMessage::getExtensionMessage() const { return _extensionMessage; } } // namespace aria2