/* */ #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 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; uint64_t _uploadLength; uint64_t _downloadLength; Time _lastDownloadUpdate; Time _lastAmUnchoking; public: PeerSessionResource(size_t pieceLength, uint64_t totalLength); ~PeerSessionResource(); // localhost is choking this peer bool amChoking() const; void amChoking(bool b); // localhost is interested in this peer bool amInterested() const; void amInterested(bool b); // this peer is choking localhost bool peerChoking() const; void peerChoking(bool b); // this peer is interested in localhost bool peerInterested() const; void peerInterested(bool b); // this peer should be choked bool chokingRequired() const; void chokingRequired(bool b); // this peer is eligible for unchoking optionally. bool optUnchoking() const; void optUnchoking(bool b); bool shouldBeChoking() const; // this peer is snubbing. bool snubbing() const; 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; 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; void addAmAllowedIndex(size_t index); bool amAllowedIndexSetContains(size_t index) const; bool extendedMessagingEnabled() const; 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; void dhtEnabled(bool b); PeerStat& getPeerStat(); unsigned int latency() const; 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; const Time& getLastAmUnchoking() const; uint64_t getCompletedLength() const; }; } // namespace aria2 #endif // _D_PEER_SESSION_RESOURCE_H_