/* */ #include "DHTPeerAnnounceEntry.h" #include #include #include "Peer.h" #include "PeerStorage.h" namespace aria2 { DHTPeerAnnounceEntry::DHTPeerAnnounceEntry(const unsigned char* infoHash) { memcpy(_infoHash, infoHash, DHT_ID_LENGTH); } DHTPeerAnnounceEntry::~DHTPeerAnnounceEntry() {} void DHTPeerAnnounceEntry::addPeerAddrEntry(const PeerAddrEntry& entry) { std::deque::iterator i = std::find(_peerAddrEntries.begin(), _peerAddrEntries.end(), entry); if(i == _peerAddrEntries.end()) { _peerAddrEntries.push_back(entry); } else { (*i).notifyUpdate(); } notifyUpdate(); } void DHTPeerAnnounceEntry::clearLocal() { _peerStorage.reset(); } void DHTPeerAnnounceEntry::setPeerStorage (const SharedHandle& peerStorage) { _peerStorage = peerStorage; } size_t DHTPeerAnnounceEntry::countPeerAddrEntry() const { return _peerAddrEntries.size(); } const std::deque& DHTPeerAnnounceEntry::getPeerAddrEntries() const { return _peerAddrEntries; } class FindStaleEntry { private: time_t _timeout; public: FindStaleEntry(time_t timeout):_timeout(timeout) {} bool operator()(const PeerAddrEntry& entry) const { if(entry.getLastUpdated().elapsed(_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() && _peerStorage.isNull(); } void DHTPeerAnnounceEntry::getPeers(std::deque >& peers) const { for(std::deque::const_iterator i = _peerAddrEntries.begin(); i != _peerAddrEntries.end(); ++i) { SharedHandle peer(new Peer((*i).getIPAddress(), (*i).getPort())); peers.push_back(peer); } if(!_peerStorage.isNull()) { _peerStorage->getActivePeers(peers); } } void DHTPeerAnnounceEntry::notifyUpdate() { _lastUpdated.reset(); } } // namespace aria2