/* */ #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 "util.h" #include "DHTBucket.h" #include "bittorrent_helper.h" #include "DHTPeerLookupTaskCallback.h" #include "DHTQueryMessage.h" namespace aria2 { DHTPeerLookupTask::DHTPeerLookupTask (const SharedHandle& downloadContext): DHTAbstractNodeLookupTask (bittorrent::getInfoHash(downloadContext)) {} void DHTPeerLookupTask::getNodesFromMessage (std::vector >& nodes, const DHTGetPeersReplyMessage* message) { const std::vector >& knodes = message->getClosestKNodes(); nodes.insert(nodes.end(), knodes.begin(), knodes.end()); } void DHTPeerLookupTask::onReceivedInternal (const DHTGetPeersReplyMessage* message) { SharedHandle remoteNode = message->getRemoteNode(); tokenStorage_[util::toHex(remoteNode->getID(), DHT_ID_LENGTH)] = message->getToken(); peerStorage_->addPeer(message->getValues()); peers_.insert(peers_.end(), message->getValues().begin(), message->getValues().end()); getLogger()->info("Received %u peers.", message->getValues().size()); } SharedHandle DHTPeerLookupTask::createMessage (const SharedHandle& remoteNode) { return getMessageFactory()->createGetPeersMessage(remoteNode, getTargetID()); } SharedHandle DHTPeerLookupTask::createCallback() { return SharedHandle (new DHTPeerLookupTaskCallback(this)); } void DHTPeerLookupTask::onFinish() { if(getLogger()->debug()) { getLogger()->debug("Peer lookup for %s finished", util::toHex(getTargetID(), DHT_ID_LENGTH).c_str()); } // send announce_peer message to K closest nodes size_t num = DHTBucket::K; for(std::deque >::const_iterator i = getEntries().begin(), eoi = getEntries().end(); i != eoi && num > 0; ++i, --num) { if((*i)->used) { const SharedHandle& node = (*i)->node; SharedHandle m = getMessageFactory()->createAnnouncePeerMessage (node, getTargetID(), // this is infoHash btRuntime_->getListenPort(), tokenStorage_[util::toHex(node->getID(), DHT_ID_LENGTH)]); getMessageDispatcher()->addMessageToQueue(m); } } } void DHTPeerLookupTask::setBtRuntime(const SharedHandle& btRuntime) { btRuntime_ = btRuntime; } void DHTPeerLookupTask::setPeerStorage(const SharedHandle& ps) { peerStorage_ = ps; } } // namespace aria2