/* */ #include "DHTGetPeersMessage.h" #include #include "DHTNode.h" #include "DHTRoutingTable.h" #include "DHTMessageFactory.h" #include "DHTMessageDispatcher.h" #include "DHTMessageCallback.h" #include "DHTPeerAnnounceStorage.h" #include "Peer.h" #include "DHTTokenTracker.h" #include "util.h" namespace aria2 { const std::string DHTGetPeersMessage::GET_PEERS("get_peers"); const std::string DHTGetPeersMessage::INFO_HASH("info_hash"); 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_, getRemoteNode()->getIPAddress(), getRemoteNode()->getPort()); // Check to see localhost has the contents which has same infohash std::vector > peers; peerAnnounceStorage_->getPeers(peers, infoHash_); SharedHandle reply; if(peers.empty()) { std::vector > nodes; getRoutingTable()->getClosestKNodes(nodes, infoHash_); reply = getMessageFactory()->createGetPeersReplyMessage (getRemoteNode(), nodes, token, getTransactionID()); } else { reply = getMessageFactory()->createGetPeersReplyMessage (getRemoteNode(), peers, token, getTransactionID()); } getMessageDispatcher()->addMessageToQueue(reply); } SharedHandle DHTGetPeersMessage::getArgument() { SharedHandle aDict = Dict::g(); aDict->put(DHTMessage::ID, String::g(getLocalNode()->getID(), DHT_ID_LENGTH)); aDict->put(INFO_HASH, String::g(infoHash_, DHT_ID_LENGTH)); return aDict; } const std::string& DHTGetPeersMessage::getMessageType() const { return GET_PEERS; } 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