/* */ #include "DHTPeerAnnounceEntry.h" #include #include #include "Peer.h" #include "wallclock.h" namespace aria2 { DHTPeerAnnounceEntry::DHTPeerAnnounceEntry(const unsigned char* infoHash) { memcpy(infoHash_, infoHash, DHT_ID_LENGTH); } DHTPeerAnnounceEntry::~DHTPeerAnnounceEntry() {} void DHTPeerAnnounceEntry::addPeerAddrEntry(const PeerAddrEntry& entry) { auto i = std::find(peerAddrEntries_.begin(), peerAddrEntries_.end(), entry); if(i == peerAddrEntries_.end()) { peerAddrEntries_.push_back(entry); } else { (*i).notifyUpdate(); } notifyUpdate(); } size_t DHTPeerAnnounceEntry::countPeerAddrEntry() const { return peerAddrEntries_.size(); } namespace { class FindStaleEntry { private: time_t timeout_; public: FindStaleEntry(time_t timeout):timeout_(timeout) {} bool operator()(const PeerAddrEntry& entry) const { if(entry.getLastUpdated().difference(global::wallclock()) >= timeout_) { return true; } else { return false; } } }; } // namespace void DHTPeerAnnounceEntry::removeStalePeerAddrEntry(time_t timeout) { peerAddrEntries_.erase(std::remove_if(peerAddrEntries_.begin(), peerAddrEntries_.end(), FindStaleEntry(timeout)), peerAddrEntries_.end()); } bool DHTPeerAnnounceEntry::empty() const { return peerAddrEntries_.empty(); } void DHTPeerAnnounceEntry::getPeers (std::vector >& peers) const { for (const auto& p: peerAddrEntries_) { std::shared_ptr peer(new Peer(p.getIPAddress(), p.getPort())); peers.push_back(peer); } } void DHTPeerAnnounceEntry::notifyUpdate() { lastUpdated_ = global::wallclock(); } } // namespace aria2