/* */ #include "DHTPeerLookupTask.h" #include "Peer.h" #include "DHTGetPeersReplyMessage.h" #include "Logger.h" #include "DHTMessageFactory.h" #include "DHTNode.h" #include "DHTNodeLookupEntry.h" #include "DHTMessageDispatcher.h" #include "DHTMessageCallback.h" #include "PeerStorage.h" #include "BtRuntime.h" #include "BtContext.h" #include "Util.h" #include "DHTBucket.h" namespace aria2 { DHTPeerLookupTask::DHTPeerLookupTask(const SharedHandle& btContext): DHTAbstractNodeLookupTask(btContext->getInfoHash()), _ctx(btContext) {} void DHTPeerLookupTask::getNodesFromMessage(std::deque >& nodes, const SharedHandle& message) { SharedHandle m(dynamic_pointer_cast(message)); if(!m.isNull()) { const std::deque >& knodes = m->getClosestKNodes(); nodes.insert(nodes.end(), knodes.begin(), knodes.end()); } } void DHTPeerLookupTask::onReceivedInternal(const SharedHandle& message) { SharedHandle m(dynamic_pointer_cast(message)); if(m.isNull()) { return; } SharedHandle remoteNode = m->getRemoteNode(); _tokenStorage[Util::toHex(remoteNode->getID(), DHT_ID_LENGTH)] = m->getToken(); _peerStorage->addPeer(m->getValues()); _peers.insert(_peers.end(), m->getValues().begin(), m->getValues().end()); _logger->info("Received %u peers.", m->getValues().size()); } SharedHandle DHTPeerLookupTask::createMessage(const SharedHandle& remoteNode) { return _factory->createGetPeersMessage(remoteNode, _targetID); } void DHTPeerLookupTask::onFinish() { // send announce_peer message to K closest nodes size_t num = DHTBucket::K; for(std::deque >::const_iterator i = _entries.begin(); i != _entries.end() && num > 0; ++i, --num) { if((*i)->_used) { const SharedHandle& node = (*i)->_node; SharedHandle m = _factory->createAnnouncePeerMessage(node, _ctx->getInfoHash(), _btRuntime->getListenPort(), _tokenStorage[Util::toHex(node->getID(), DHT_ID_LENGTH)]); _dispatcher->addMessageToQueue(m); } } } const std::deque >& DHTPeerLookupTask::getPeers() const { return _peers; } void DHTPeerLookupTask::setBtRuntime(const SharedHandle& btRuntime) { _btRuntime = btRuntime; } void DHTPeerLookupTask::setPeerStorage(const SharedHandle& ps) { _peerStorage = ps; } } // namespace aria2