/* */ #include "Peer.h" #include "BitfieldManFactory.h" #include "Util.h" #ifdef ENABLE_MESSAGE_DIGEST # include "MessageDigestHelper.h" #endif // ENABLE_MESSAGE_DIGEST Peer::Peer(string ipaddr, uint16_t port, int32_t pieceLength, int64_t totalLength): ipaddr(ipaddr), port(port), sessionUploadLength(0), sessionDownloadLength(0), active(false), _badConditionStartTime(0), _badConditionInterval(10) { resetStatus(); this->bitfield = BitfieldManFactory::getFactoryInstance()-> createBitfieldMan(pieceLength, totalLength); string idSeed = ipaddr+":"+Util::itos(port); #ifdef ENABLE_MESSAGE_DIGEST id = MessageDigestHelper::digestString("sha1", idSeed); #else id = idSeed; #endif // ENABLE_MESSAGE_DIGEST } void Peer::reconfigure(int32_t pieceLength, int64_t totalLength) { delete bitfield; this->bitfield = BitfieldManFactory::getFactoryInstance()-> createBitfieldMan(pieceLength, totalLength); } 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; _extendedMessagingEnabled = false; _extensions.clear(); latency = DEFAULT_LATENCY; peerAllowedIndexSet.clear(); amAllowedIndexSet.clear(); peerStat.reset(); } 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); } uint8_t Peer::getExtensionMessageID(const string& name) { Extensions::const_iterator itr = _extensions.find(name); if(itr == _extensions.end()) { return 0; } else { return (*itr).second; } } string Peer::getExtensionName(uint8_t id) { for(Extensions::const_iterator itr = _extensions.begin(); itr != _extensions.end(); ++itr) { const Extensions::value_type& p = *itr; if(p.second == id) { return p.first; } } return ""; } void Peer::setExtension(const string& name, uint8_t id) { _extensions[name] = id; }