/* */ #include "PeerSessionResource.h" #include #include #include "BitfieldMan.h" #include "A2STR.h" #include "BtMessageDispatcher.h" #include "wallclock.h" namespace aria2 { PeerSessionResource::PeerSessionResource(int32_t pieceLength, int64_t totalLength) : bitfieldMan_(new BitfieldMan(pieceLength, totalLength)), lastDownloadUpdate_(0), lastAmUnchoking_(0), dispatcher_(nullptr), amChoking_(true), amInterested_(false), peerChoking_(true), peerInterested_(false), chokingRequired_(true), optUnchoking_(false), snubbing_(false), fastExtensionEnabled_(false), extendedMessagingEnabled_(false), dhtEnabled_(false) {} PeerSessionResource::~PeerSessionResource() { delete bitfieldMan_; } void PeerSessionResource::amChoking(bool b) { amChoking_ = b; if(!b) { lastAmUnchoking_ = global::wallclock(); } } void PeerSessionResource::amInterested(bool b) { amInterested_ = b; } void PeerSessionResource::peerChoking(bool b) { peerChoking_ = b; } void PeerSessionResource::peerInterested(bool b) { peerInterested_ = b; } void PeerSessionResource::chokingRequired(bool b) { chokingRequired_ = b; } void PeerSessionResource::optUnchoking(bool b) { optUnchoking_ = b; } bool PeerSessionResource::shouldBeChoking() const { if(optUnchoking_) { return false; } return chokingRequired_; } void PeerSessionResource::snubbing(bool b) { snubbing_ = b; if(snubbing_) { chokingRequired(true); optUnchoking(false); } } bool PeerSessionResource::hasAllPieces() const { return bitfieldMan_->isAllBitSet(); } void PeerSessionResource::updateBitfield(size_t index, int operation) { if(operation == 1) { bitfieldMan_->setBit(index); } else if(operation == 0) { bitfieldMan_->unsetBit(index); } } void PeerSessionResource::setBitfield (const unsigned char* bitfield, size_t bitfieldLength) { bitfieldMan_->setBitfield(bitfield, bitfieldLength); } const unsigned char* PeerSessionResource::getBitfield() const { return bitfieldMan_->getBitfield(); } size_t PeerSessionResource::getBitfieldLength() const { return bitfieldMan_->getBitfieldLength(); } bool PeerSessionResource::hasPiece(size_t index) const { return bitfieldMan_->isBitSet(index); } void PeerSessionResource::markSeeder() { bitfieldMan_->setAllBit(); } void PeerSessionResource::fastExtensionEnabled(bool b) { fastExtensionEnabled_ = b; } const std::set& PeerSessionResource::peerAllowedIndexSet() const { return peerAllowedIndexSet_; } void PeerSessionResource::addPeerAllowedIndex(size_t index) { peerAllowedIndexSet_.insert(index); } bool PeerSessionResource::peerAllowedIndexSetContains(size_t index) const { return peerAllowedIndexSet_.count(index) == 1; } void PeerSessionResource::addAmAllowedIndex(size_t index) { amAllowedIndexSet_.insert(index); } bool PeerSessionResource::amAllowedIndexSetContains(size_t index) const { return amAllowedIndexSet_.count(index) == 1; } void PeerSessionResource::extendedMessagingEnabled(bool b) { extendedMessagingEnabled_ = b; } uint8_t PeerSessionResource::getExtensionMessageID(int key) const { return extreg_.getExtensionMessageID(key); } const char* PeerSessionResource::getExtensionName(uint8_t id) const { return extreg_.getExtensionName(id); } void PeerSessionResource::addExtension(int key, uint8_t id) { extreg_.setExtensionMessageID(key, id); } void PeerSessionResource::dhtEnabled(bool b) { dhtEnabled_ = b; } int64_t PeerSessionResource::uploadLength() const { return netStat_.getSessionUploadLength(); } void PeerSessionResource::updateUploadLength(int32_t bytes) { netStat_.updateUploadLength(bytes); } int64_t PeerSessionResource::downloadLength() const { return netStat_.getSessionDownloadLength(); } void PeerSessionResource::updateDownloadLength(int32_t bytes) { netStat_.updateDownloadLength(bytes); lastDownloadUpdate_ = global::wallclock(); } int64_t PeerSessionResource::getCompletedLength() const { return bitfieldMan_->getCompletedLength(); } void PeerSessionResource::setBtMessageDispatcher(BtMessageDispatcher* dpt) { dispatcher_ = dpt; } size_t PeerSessionResource::countOutstandingUpload() const { assert(dispatcher_); return dispatcher_->countOutstandingUpload(); } void PeerSessionResource::reconfigure(int32_t pieceLength, int64_t totalLenth) { delete bitfieldMan_; bitfieldMan_ = new BitfieldMan(pieceLength, totalLenth); } } // namespace aria2