/* */ #include "DHTAnnouncePeerMessage.h" #include "DHTNode.h" #include "Data.h" #include "Dictionary.h" #include "DHTRoutingTable.h" #include "DHTMessageFactory.h" #include "DHTMessageDispatcher.h" #include "DHTMessageCallback.h" #include "Util.h" #include "DHTPeerAnnounceStorage.h" #include "DHTTokenTracker.h" #include "DlAbortEx.h" #include "BtConstants.h" #include namespace aria2 { DHTAnnouncePeerMessage::DHTAnnouncePeerMessage(const SharedHandle& localNode, const SharedHandle& remoteNode, const unsigned char* infoHash, uint16_t tcpPort, const std::string& token, const std::string& transactionID): DHTQueryMessage(localNode, remoteNode, transactionID), _token(token), _tcpPort(tcpPort), _peerAnnounceStorage(0), _tokenTracker(0) { memcpy(_infoHash, infoHash, DHT_ID_LENGTH); } DHTAnnouncePeerMessage::~DHTAnnouncePeerMessage() {} void DHTAnnouncePeerMessage::doReceivedAction() { _peerAnnounceStorage->addPeerAnnounce(_infoHash, _remoteNode->getIPAddress(), _tcpPort); SharedHandle reply = _factory->createAnnouncePeerReplyMessage(_remoteNode, _transactionID); _dispatcher->addMessageToQueue(reply); } Dictionary* DHTAnnouncePeerMessage::getArgument() { Dictionary* a = new Dictionary(); a->put("id", new Data(reinterpret_cast(_localNode->getID()), DHT_ID_LENGTH)); a->put("info_hash", new Data(reinterpret_cast(_infoHash), DHT_ID_LENGTH)); a->put("port", new Data(Util::uitos(_tcpPort), true)); a->put("token", new Data(_token)); return a; } std::string DHTAnnouncePeerMessage::getMessageType() const { return "announce_peer"; } void DHTAnnouncePeerMessage::validate() const { if(!_tokenTracker->validateToken(_token, _infoHash, _remoteNode->getIPAddress(), _remoteNode->getPort())) { throw new DlAbortEx("Invalid token=%s from %s:%u", Util::toHex(_token).c_str(), _remoteNode->getIPAddress().c_str(), _remoteNode->getPort()); } } void DHTAnnouncePeerMessage::setPeerAnnounceStorage(const WeakHandle& storage) { _peerAnnounceStorage = storage; } void DHTAnnouncePeerMessage::setTokenTracker(const WeakHandle& tokenTracker) { _tokenTracker = tokenTracker; } std::string DHTAnnouncePeerMessage::toStringOptional() const { return "token="+Util::toHex(_token)+ ", info_hash="+Util::toHex(_infoHash, INFO_HASH_LENGTH)+ ", tcpPort="+Util::uitos(_tcpPort); } } // namespace aria2