/* */ #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(); } 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; } } }; 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