/* */ #include "DHTGetPeersMessage.h" #include "DHTNode.h" #include "Data.h" #include "Dictionary.h" #include "DHTRoutingTable.h" #include "DHTMessageFactory.h" #include "DHTMessageDispatcher.h" #include "DHTMessageCallback.h" #include "DHTPeerAnnounceStorage.h" #include "DHTUtil.h" #include "Peer.h" #include "DHTTokenTracker.h" #include "Util.h" #include namespace aria2 { DHTGetPeersMessage::DHTGetPeersMessage(const SharedHandle& localNode, const SharedHandle& remoteNode, const unsigned char* infoHash, const std::string& transactionID): DHTQueryMessage(localNode, remoteNode, transactionID) { memcpy(_infoHash, infoHash, DHT_ID_LENGTH); } DHTGetPeersMessage::~DHTGetPeersMessage() {} void DHTGetPeersMessage::doReceivedAction() { std::string token = _tokenTracker->generateToken(_infoHash, _remoteNode->getIPAddress(), _remoteNode->getPort()); // Check to see localhost has the contents which has same infohash Peers peers = _peerAnnounceStorage->getPeers(_infoHash); SharedHandle reply = 0; if(peers.empty()) { std::deque > nodes = _routingTable->getClosestKNodes(_infoHash); reply = _factory->createGetPeersReplyMessage(_remoteNode, nodes, token, _transactionID); } else { reply = _factory->createGetPeersReplyMessage(_remoteNode, peers, token, _transactionID); } _dispatcher->addMessageToQueue(reply); } Dictionary* DHTGetPeersMessage::getArgument() { Dictionary* a = new Dictionary(); a->put("id", new Data(_localNode->getID(), DHT_ID_LENGTH)); a->put("info_hash", new Data(_infoHash, DHT_ID_LENGTH)); return a; } std::string DHTGetPeersMessage::getMessageType() const { return "get_peers"; } void DHTGetPeersMessage::validate() const {} void DHTGetPeersMessage::setPeerAnnounceStorage(const WeakHandle& storage) { _peerAnnounceStorage = storage; } void DHTGetPeersMessage::setTokenTracker(const WeakHandle& tokenTracker) { _tokenTracker = tokenTracker; } std::string DHTGetPeersMessage::toStringOptional() const { return "info_hash="+Util::toHex(_infoHash, INFO_HASH_LENGTH); } } // namespace aria2