/* */ #include "Peer.h" #include "BitfieldManFactory.h" #include "Util.h" Peer::Peer(string ipaddr, int32_t port, int32_t pieceLength, int64_t totalLength): ipaddr(ipaddr), port(port), sessionUploadLength(0), sessionDownloadLength(0), pieceLength(pieceLength), active(false), _badConditionStartTime(0), _badConditionInterval(10) { resetStatus(); this->bitfield = BitfieldManFactory::getFactoryInstance()-> createBitfieldMan(pieceLength, totalLength); string idSeed = ipaddr+":"+Util::itos(port); id = Util::simpleMessageDigest(idSeed); } /* Peer::Peer():entryId(0), ipaddr(""), port(0), bitfield(0), sessionUploadLength(0), sessionDownloadLength(0), pieceLength(0) { resetStatus(); } */ void Peer::updateBitfield(int32_t index, int32_t operation) { if(operation == 1) { bitfield->setBit(index); } else if(operation == 0) { bitfield->unsetBit(index); } } #define THRESHOLD 1024*1024*2 bool Peer::shouldBeChoking() const { if(optUnchoking) { return false; } return chokingRequired; } bool Peer::hasPiece(int32_t index) const { return bitfield->isBitSet(index); } bool Peer::isSeeder() const { return bitfield->isAllBitSet(); } void Peer::resetStatus() { tryCount = 0; cuid = 0; amChoking = true; amInterested = false; peerChoking = true; peerInterested = false; chokingRequired = true; optUnchoking = false; snubbing = false; fastExtensionEnabled = false; latency = DEFAULT_LATENCY; fastSet.clear(); peerAllowedIndexSet.clear(); amAllowedIndexSet.clear(); peerStat.reset(); } bool Peer::isInFastSet(int32_t index) const { return find(fastSet.begin(), fastSet.end(), index) != fastSet.end(); } void Peer::addFastSetIndex(int32_t index) { if(!isInFastSet(index)) { fastSet.push_back(index); } } bool Peer::isInPeerAllowedIndexSet(int32_t index) const { return find(peerAllowedIndexSet.begin(), peerAllowedIndexSet.end(), index) != peerAllowedIndexSet.end(); } void Peer::addPeerAllowedIndex(int32_t index) { if(!isInPeerAllowedIndexSet(index)) { peerAllowedIndexSet.push_back(index); } } bool Peer::isInAmAllowedIndexSet(int32_t index) const { return find(amAllowedIndexSet.begin(), amAllowedIndexSet.end(), index) != amAllowedIndexSet.end(); } void Peer::addAmAllowedIndex(int32_t index) { if(!isInAmAllowedIndexSet(index)) { amAllowedIndexSet.push_back(index); } } void Peer::setAllBitfield() { bitfield->setAllBit(); } void Peer::updateLatency(int32_t latency) { this->latency = (this->latency*20+latency*80)/200; } void Peer::startBadCondition() { _badConditionStartTime.reset(); } bool Peer::isGood() const { return _badConditionStartTime.elapsed(_badConditionInterval); }