/* */ #include "DefaultPeerStorage.h" #include "LogFactory.h" #include "BtRegistry.h" extern PeerHandle nullPeer; DefaultPeerStorage::DefaultPeerStorage(BtContextHandle btContext, const Option* option): btContext(btContext), option(option), maxPeerListSize(MAX_PEER_LIST_SIZE), peerEntryIdCounter(0), btRuntime(BT_RUNTIME(btContext)), removedPeerSessionDownloadLength(0), removedPeerSessionUploadLength(0) { logger = LogFactory::getInstance(); } DefaultPeerStorage::~DefaultPeerStorage() {} bool DefaultPeerStorage::addPeer(const PeerHandle& peer) { Peers::iterator itr = find(peers.begin(), peers.end(), peer); if(itr == peers.end()) { if(peers.size() >= (size_t)maxPeerListSize) { deleteUnusedPeer(peers.size()-maxPeerListSize+1); } ++peerEntryIdCounter; peer->entryId = peerEntryIdCounter; peers.push_back(peer); return true; } else { const PeerHandle& peer = *itr; if(peer->error >= MAX_PEER_ERROR || peer->cuid != 0) { return false; } else { *itr = peer; return true; } } } void DefaultPeerStorage::addPeer(const Peers& peers) { for(Peers::const_iterator itr = peers.begin(); itr != peers.end(); itr++) { const PeerHandle& peer = *itr; if(addPeer(peer)) { logger->debug("Adding peer %s:%d", peer->ipaddr.c_str(), peer->port); } } } const Peers& DefaultPeerStorage::getPeers() { return peers; } class FindFinePeer { public: bool operator()(const PeerHandle& peer) const { return peer->cuid == 0 && peer->error < MAX_PEER_ERROR; } }; PeerHandle DefaultPeerStorage::getUnusedPeer() { Peers::const_iterator itr = find_if(peers.begin(), peers.end(), FindFinePeer()); if(itr == peers.end()) { return nullPeer; } else { return *itr; } } class FindPeer { private: string ipaddr; int port; public: FindPeer(const string& ipaddr, int port):ipaddr(ipaddr), port(port) {} bool operator()(const PeerHandle& peer) const { return ipaddr == peer->ipaddr && port == peer->port; } }; PeerHandle DefaultPeerStorage::getPeer(const string& ipaddr, int port) const { Peers::const_iterator itr = find_if(peers.begin(), peers.end(), FindPeer(ipaddr, port)); if(itr == peers.end()) { return nullPeer; } else { return *itr; } } int DefaultPeerStorage::countPeer() const { return peers.size(); } bool DefaultPeerStorage::isPeerAvailable() { return getUnusedPeer() != nullPeer; } Peers DefaultPeerStorage::getActivePeers() { Peers activePeers; for(Peers::iterator itr = peers.begin(); itr != peers.end(); itr++) { PeerHandle& peer = *itr; if(peer->isActive()) { activePeers.push_back(peer); } } return activePeers; } TransferStat DefaultPeerStorage::calculateStat() { TransferStat stat; for(Peers::iterator itr = peers.begin(); itr != peers.end(); itr++) { PeerHandle& peer = *itr; if(peer->isActive()) { stat.downloadSpeed += peer->calculateDownloadSpeed(); stat.uploadSpeed += peer->calculateUploadSpeed(); } stat.sessionDownloadLength += peer->getSessionDownloadLength(); stat.sessionUploadLength += peer->getSessionUploadLength(); } stat.sessionDownloadLength += removedPeerSessionDownloadLength; stat.sessionUploadLength += removedPeerSessionUploadLength; return stat; } void DefaultPeerStorage::deleteUnusedPeer(int delSize) { for(Peers::iterator itr = peers.begin(); itr != peers.end() && delSize > 0;) { const PeerHandle& p = *itr; if(p->cuid == 0) { // Update removedPeerSession******Length removedPeerSessionDownloadLength += p->getSessionDownloadLength(); removedPeerSessionUploadLength += p->getSessionUploadLength(); itr = peers.erase(itr); delSize--; } else { itr++; } } }