/* */ #ifndef _D_PEER_SESSION_RESOURCE_H_ #define _D_PEER_SESSION_RESOURCE_H_ #include "common.h" #include "BtConstants.h" #include "PeerStat.h" #include "TimeA2.h" #include #include namespace aria2 { class BitfieldMan; class BtMessageDispatcher; class PeerSessionResource { private: // localhost is choking this peer bool _amChoking; // localhost is interested in this peer bool _amInterested; // this peer is choking localhost bool _peerChoking; // this peer is interested in localhost bool _peerInterested; // choking this peer is requested bool _chokingRequired; // this peer is eligible for *optional* unchoking. bool _optUnchoking; // this peer is snubbing. bool _snubbing; BitfieldMan* _bitfieldMan; bool _fastExtensionEnabled; // fast index set which a peer has sent to localhost. std::deque _peerAllowedIndexSet; // fast index set which localhost has sent to a peer. std::deque _amAllowedIndexSet; bool _extendedMessagingEnabled; Extensions _extensions; bool _dhtEnabled; PeerStat _peerStat; unsigned int _latency; Time _lastDownloadUpdate; Time _lastAmUnchoking; WeakHandle _dispatcher; public: PeerSessionResource(size_t pieceLength, uint64_t totalLength); ~PeerSessionResource(); // localhost is choking this peer bool amChoking() const { return _amChoking; } void amChoking(bool b); // localhost is interested in this peer bool amInterested() const { return _amInterested; } void amInterested(bool b); // this peer is choking localhost bool peerChoking() const { return _peerChoking; } void peerChoking(bool b); // this peer is interested in localhost bool peerInterested() const { return _peerInterested; } void peerInterested(bool b); // this peer should be choked bool chokingRequired() const { return _chokingRequired; } void chokingRequired(bool b); // this peer is eligible for unchoking optionally. bool optUnchoking() const { return _optUnchoking; } void optUnchoking(bool b); bool shouldBeChoking() const; // this peer is snubbing. bool snubbing() const { return _snubbing; } void snubbing(bool b); bool hasAllPieces() const; void updateBitfield(size_t index, int operation); void setBitfield(const unsigned char* bitfield, size_t bitfieldLength); const unsigned char* getBitfield() const; size_t getBitfieldLength() const; bool hasPiece(size_t index) const; void markSeeder(); bool fastExtensionEnabled() const { return _fastExtensionEnabled; } void fastExtensionEnabled(bool b); // fast index set which a peer has sent to localhost. const std::deque& peerAllowedIndexSet() const; void addPeerAllowedIndex(size_t index); bool peerAllowedIndexSetContains(size_t index) const; // fast index set which localhost has sent to a peer. const std::deque& amAllowedIndexSet() const { return _amAllowedIndexSet; } void addAmAllowedIndex(size_t index); bool amAllowedIndexSetContains(size_t index) const; bool extendedMessagingEnabled() const { return _extendedMessagingEnabled; } void extendedMessagingEnabled(bool b); uint8_t getExtensionMessageID(const std::string& name) const; std::string getExtensionName(uint8_t id) const; void addExtension(const std::string& name, uint8_t id); bool dhtEnabled() const { return _dhtEnabled; } void dhtEnabled(bool b); PeerStat& getPeerStat() { return _peerStat; } unsigned int latency() const { return _latency; } void updateLatency(unsigned int latency); uint64_t uploadLength() const; void updateUploadLength(size_t bytes); uint64_t downloadLength() const; void updateDownloadLength(size_t bytes); const Time& getLastDownloadUpdate() const { return _lastDownloadUpdate; } const Time& getLastAmUnchoking() const { return _lastAmUnchoking; } uint64_t getCompletedLength() const; void setBtMessageDispatcher(const WeakHandle& dpt); size_t countOutstandingUpload() const; }; } // namespace aria2 #endif // _D_PEER_SESSION_RESOURCE_H_