/* */ #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) { std::vector::iterator 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(std::vector::const_iterator i = peerAddrEntries_.begin(), eoi = peerAddrEntries_.end(); i != eoi; ++i) { SharedHandle peer(new Peer((*i).getIPAddress(), (*i).getPort())); peers.push_back(peer); } } void DHTPeerAnnounceEntry::notifyUpdate() { lastUpdated_ = global::wallclock(); } } // namespace aria2