/* */ #include "DefaultBtMessageFactory.h" #include "DlAbortEx.h" #include "bittorrent_helper.h" #include "BtKeepAliveMessage.h" #include "BtChokeMessage.h" #include "BtUnchokeMessage.h" #include "BtInterestedMessage.h" #include "BtNotInterestedMessage.h" #include "BtHaveMessage.h" #include "BtBitfieldMessage.h" #include "BtBitfieldMessageValidator.h" #include "RangeBtMessageValidator.h" #include "IndexBtMessageValidator.h" #include "BtRequestMessage.h" #include "BtCancelMessage.h" #include "BtPieceMessage.h" #include "BtPieceMessageValidator.h" #include "BtPortMessage.h" #include "BtHaveAllMessage.h" #include "BtHaveNoneMessage.h" #include "BtRejectMessage.h" #include "BtSuggestPieceMessage.h" #include "BtAllowedFastMessage.h" #include "BtHandshakeMessage.h" #include "BtHandshakeMessageValidator.h" #include "BtExtendedMessage.h" #include "ExtensionMessage.h" #include "Peer.h" #include "Piece.h" #include "DownloadContext.h" #include "PieceStorage.h" #include "PeerStorage.h" #include "fmt.h" #include "ExtensionMessageFactory.h" #include "bittorrent_helper.h" namespace aria2 { DefaultBtMessageFactory::DefaultBtMessageFactory(): cuid_(0), downloadContext_(0), pieceStorage_(0), peerStorage_(0), dhtEnabled_(false), dispatcher_(0), requestFactory_(0), peerConnection_(0), localNode_(0), routingTable_(0), taskQueue_(0), taskFactory_(0), metadataGetMode_(false) {} DefaultBtMessageFactory::~DefaultBtMessageFactory() {} std::shared_ptr DefaultBtMessageFactory::createBtMessage (const unsigned char* data, size_t dataLength) { std::shared_ptr msg; if(dataLength == 0) { // keep-alive msg.reset(new BtKeepAliveMessage()); } else { uint8_t id = bittorrent::getId(data); switch(id) { case BtChokeMessage::ID: msg.reset(BtChokeMessage::create(data, dataLength)); break; case BtUnchokeMessage::ID: msg.reset(BtUnchokeMessage::create(data, dataLength)); break; case BtInterestedMessage::ID: { BtInterestedMessage* m = BtInterestedMessage::create(data, dataLength); m->setPeerStorage(peerStorage_); msg.reset(m); } break; case BtNotInterestedMessage::ID: { BtNotInterestedMessage* m = BtNotInterestedMessage::create(data, dataLength); m->setPeerStorage(peerStorage_); msg.reset(m); } break; case BtHaveMessage::ID: msg.reset(BtHaveMessage::create(data, dataLength)); if(!metadataGetMode_) { msg->setBtMessageValidator(make_unique (static_cast(msg.get()), downloadContext_->getNumPieces())); } break; case BtBitfieldMessage::ID: msg.reset(BtBitfieldMessage::create(data, dataLength)); if(!metadataGetMode_) { msg->setBtMessageValidator(make_unique (static_cast(msg.get()), downloadContext_->getNumPieces())); } break; case BtRequestMessage::ID: { BtRequestMessage* m = BtRequestMessage::create(data, dataLength); if(!metadataGetMode_) { m->setBtMessageValidator (make_unique (m, downloadContext_->getNumPieces(), pieceStorage_->getPieceLength(m->getIndex()))); } msg.reset(m); break; } case BtCancelMessage::ID: { BtCancelMessage* m = BtCancelMessage::create(data, dataLength); if(!metadataGetMode_) { m->setBtMessageValidator (make_unique (m, downloadContext_->getNumPieces(), pieceStorage_->getPieceLength(m->getIndex()))); } msg.reset(m); break; } case BtPieceMessage::ID: { BtPieceMessage* m = BtPieceMessage::create(data, dataLength); if(!metadataGetMode_) { m->setBtMessageValidator (make_unique (m, downloadContext_->getNumPieces(), pieceStorage_->getPieceLength(m->getIndex()))); } m->setDownloadContext(downloadContext_); m->setPeerStorage(peerStorage_); msg.reset(m); break; } case BtHaveAllMessage::ID: msg.reset(BtHaveAllMessage::create(data, dataLength)); break; case BtHaveNoneMessage::ID: msg.reset(BtHaveNoneMessage::create(data, dataLength)); break; case BtRejectMessage::ID: { BtRejectMessage* m = BtRejectMessage::create(data, dataLength); if(!metadataGetMode_) { m->setBtMessageValidator (make_unique (m, downloadContext_->getNumPieces(), pieceStorage_->getPieceLength(m->getIndex()))); } msg.reset(m); break; } case BtSuggestPieceMessage::ID: { BtSuggestPieceMessage* m = BtSuggestPieceMessage::create(data, dataLength); if(!metadataGetMode_) { m->setBtMessageValidator(make_unique (m, downloadContext_->getNumPieces())); } msg.reset(m); break; } case BtAllowedFastMessage::ID: { BtAllowedFastMessage* m = BtAllowedFastMessage::create(data, dataLength); if(!metadataGetMode_) { std::shared_ptr validator (new IndexBtMessageValidator(m, downloadContext_->getNumPieces())); m->setBtMessageValidator(make_unique (m, downloadContext_->getNumPieces())); } msg.reset(m); break; } case BtPortMessage::ID: { BtPortMessage* m = BtPortMessage::create(data, dataLength); m->setLocalNode(localNode_); m->setRoutingTable(routingTable_); m->setTaskQueue(taskQueue_); m->setTaskFactory(taskFactory_); msg.reset(m); break; } case BtExtendedMessage::ID: { if(peer_->isExtendedMessagingEnabled()) { msg.reset(BtExtendedMessage::create(extensionMessageFactory_, peer_, data, dataLength)); } else { throw DL_ABORT_EX("Received extended message from peer during" " a session with extended messaging disabled."); } break; } default: throw DL_ABORT_EX(fmt("Invalid message ID. id=%u", id)); } } setCommonProperty(msg.get()); return msg; } void DefaultBtMessageFactory::setCommonProperty(AbstractBtMessage* msg) { msg->setCuid(cuid_); msg->setPeer(peer_); msg->setPieceStorage(pieceStorage_); msg->setBtMessageDispatcher(dispatcher_); msg->setBtRequestFactory(requestFactory_); msg->setBtMessageFactory(this); msg->setPeerConnection(peerConnection_); if(metadataGetMode_) { msg->enableMetadataGetMode(); } } std::shared_ptr DefaultBtMessageFactory::createHandshakeMessage (const unsigned char* data, size_t dataLength) { std::shared_ptr msg = BtHandshakeMessage::create(data, dataLength); msg->setBtMessageValidator(make_unique (msg.get(), bittorrent::getInfoHash(downloadContext_))); setCommonProperty(msg.get()); return msg; } std::shared_ptr DefaultBtMessageFactory::createHandshakeMessage(const unsigned char* infoHash, const unsigned char* peerId) { std::shared_ptr msg (new BtHandshakeMessage(infoHash, peerId)); msg->setDHTEnabled(dhtEnabled_); setCommonProperty(msg.get()); return msg; } std::shared_ptr DefaultBtMessageFactory::createRequestMessage (const std::shared_ptr& piece, size_t blockIndex) { BtRequestMessage* msg (new BtRequestMessage(piece->getIndex(), blockIndex*piece->getBlockLength(), piece->getBlockLength(blockIndex), blockIndex)); setCommonProperty(msg); return std::shared_ptr(msg); } std::shared_ptr DefaultBtMessageFactory::createCancelMessage (size_t index, int32_t begin, int32_t length) { BtCancelMessage* msg(new BtCancelMessage(index, begin, length)); setCommonProperty(msg); return std::shared_ptr(msg); } std::shared_ptr DefaultBtMessageFactory::createPieceMessage (size_t index, int32_t begin, int32_t length) { BtPieceMessage* msg(new BtPieceMessage(index, begin, length)); msg->setDownloadContext(downloadContext_); setCommonProperty(msg); return std::shared_ptr(msg); } std::shared_ptr DefaultBtMessageFactory::createHaveMessage(size_t index) { BtHaveMessage* msg(new BtHaveMessage(index)); setCommonProperty(msg); return std::shared_ptr(msg); } std::shared_ptr DefaultBtMessageFactory::createChokeMessage() { BtChokeMessage* msg(new BtChokeMessage()); setCommonProperty(msg); return std::shared_ptr(msg); } std::shared_ptr DefaultBtMessageFactory::createUnchokeMessage() { BtUnchokeMessage* msg(new BtUnchokeMessage()); setCommonProperty(msg); return std::shared_ptr(msg); } std::shared_ptr DefaultBtMessageFactory::createInterestedMessage() { BtInterestedMessage* msg(new BtInterestedMessage()); setCommonProperty(msg); return std::shared_ptr(msg); } std::shared_ptr DefaultBtMessageFactory::createNotInterestedMessage() { BtNotInterestedMessage* msg(new BtNotInterestedMessage()); setCommonProperty(msg); return std::shared_ptr(msg); } std::shared_ptr DefaultBtMessageFactory::createBitfieldMessage() { BtBitfieldMessage* msg (new BtBitfieldMessage(pieceStorage_->getBitfield(), pieceStorage_->getBitfieldLength())); setCommonProperty(msg); return std::shared_ptr(msg); } std::shared_ptr DefaultBtMessageFactory::createKeepAliveMessage() { BtKeepAliveMessage* msg(new BtKeepAliveMessage()); setCommonProperty(msg); return std::shared_ptr(msg); } std::shared_ptr DefaultBtMessageFactory::createHaveAllMessage() { BtHaveAllMessage* msg(new BtHaveAllMessage()); setCommonProperty(msg); return std::shared_ptr(msg); } std::shared_ptr DefaultBtMessageFactory::createHaveNoneMessage() { BtHaveNoneMessage* msg(new BtHaveNoneMessage()); setCommonProperty(msg); return std::shared_ptr(msg); } std::shared_ptr DefaultBtMessageFactory::createRejectMessage (size_t index, int32_t begin, int32_t length) { BtRejectMessage* msg(new BtRejectMessage(index, begin, length)); setCommonProperty(msg); return std::shared_ptr(msg); } std::shared_ptr DefaultBtMessageFactory::createAllowedFastMessage(size_t index) { BtAllowedFastMessage* msg(new BtAllowedFastMessage(index)); setCommonProperty(msg); return std::shared_ptr(msg); } std::shared_ptr DefaultBtMessageFactory::createPortMessage(uint16_t port) { BtPortMessage* msg(new BtPortMessage(port)); setCommonProperty(msg); return std::shared_ptr(msg); } std::shared_ptr DefaultBtMessageFactory::createBtExtendedMessage (const std::shared_ptr& msg) { BtExtendedMessage* m(new BtExtendedMessage(msg)); setCommonProperty(m); return std::shared_ptr(m); } void DefaultBtMessageFactory::setTaskQueue(DHTTaskQueue* taskQueue) { taskQueue_ = taskQueue; } void DefaultBtMessageFactory::setTaskFactory(DHTTaskFactory* taskFactory) { taskFactory_ = taskFactory; } void DefaultBtMessageFactory::setPeer(const std::shared_ptr& peer) { peer_ = peer; } void DefaultBtMessageFactory::setDownloadContext (DownloadContext* downloadContext) { downloadContext_ = downloadContext; } void DefaultBtMessageFactory::setPieceStorage(PieceStorage* pieceStorage) { pieceStorage_ = pieceStorage; } void DefaultBtMessageFactory::setPeerStorage(PeerStorage* peerStorage) { peerStorage_ = peerStorage; } void DefaultBtMessageFactory::setBtMessageDispatcher (BtMessageDispatcher* dispatcher) { dispatcher_ = dispatcher; } void DefaultBtMessageFactory::setExtensionMessageFactory (const std::shared_ptr& factory) { extensionMessageFactory_ = factory; } void DefaultBtMessageFactory::setLocalNode(DHTNode* localNode) { localNode_ = localNode; } void DefaultBtMessageFactory::setRoutingTable(DHTRoutingTable* routingTable) { routingTable_ = routingTable; } void DefaultBtMessageFactory::setBtRequestFactory(BtRequestFactory* factory) { requestFactory_ = factory; } void DefaultBtMessageFactory::setPeerConnection(PeerConnection* connection) { peerConnection_ = connection; } } // namespace aria2