/* */ #include "DefaultExtensionMessageFactory.h" #include "BtContext.h" #include "Peer.h" #include "DlAbortEx.h" #include "HandshakeExtensionMessage.h" #include "UTPexExtensionMessage.h" #include "LogFactory.h" #include "Logger.h" #include "BtRegistry.h" #include "StringFormat.h" namespace aria2 { DefaultExtensionMessageFactory::DefaultExtensionMessageFactory(): _logger(LogFactory::getInstance()) {} DefaultExtensionMessageFactory::DefaultExtensionMessageFactory(const BtContextHandle& btContext, const PeerHandle& peer): _btContext(btContext), _peer(peer), _logger(LogFactory::getInstance()) {} DefaultExtensionMessageFactory::~DefaultExtensionMessageFactory() {} ExtensionMessageHandle DefaultExtensionMessageFactory::createMessage(const unsigned char* data, size_t length) { uint8_t extensionMessageID = *data; if(extensionMessageID == 0) { // handshake HandshakeExtensionMessageHandle m = HandshakeExtensionMessage::create(data, length); m->setBtContext(_btContext); m->setPeer(_peer); return m; } else { std::string extensionName = getExtensionName(extensionMessageID); if(extensionName.empty()) { throw DlAbortEx (StringFormat("No extension registered for extended message ID %u", extensionMessageID).str()); } if(extensionName == "ut_pex") { // uTorrent compatible Peer-Exchange UTPexExtensionMessageHandle m = UTPexExtensionMessage::create(_btContext, data, length); m->setBtContext(_btContext); return m; } else { throw DlAbortEx (StringFormat("Unsupported extension message received. extensionMessageID=%u, extensionName=%s", extensionMessageID, extensionName.c_str()).str()); } } } void DefaultExtensionMessageFactory::setBtContext(const BtContextHandle& btContext) { _btContext = btContext; } void DefaultExtensionMessageFactory::setPeer(const PeerHandle& peer) { _peer = peer; } } // namespace aria2