/* */ #ifndef _D_PEER_H_ #define _D_PEER_H_ #include "common.h" #include "SharedHandle.h" #include "TimeA2.h" #include "BtConstants.h" #include "PeerStat.h" #include #include namespace aria2 { class PeerSessionResource; class Peer { public: std::string ipaddr; // TCP port which this peer is listening for incoming connections. // If it is unknown, for example, localhost accepted the incoming connection // from this peer, set port to 0. uint16_t port; private: std::string id; int32_t _cuid; unsigned char _peerId[PEER_ID_LENGTH]; Time _firstContactTime; Time _badConditionStartTime; bool _seeder; PeerSessionResource* _res; // Before calling updateSeeder(), make sure that // allocateSessionResource() is called and _res is created. // Otherwise assertion fails. void updateSeeder(); public: Peer(std::string ipaddr, uint16_t port); ~Peer(); bool operator==(const Peer& p); bool operator!=(const Peer& p); void resetStatus(); void usedBy(int32_t cuid); int32_t usedBy() const; bool unused() const; // Returns true iff _res != 0. bool isActive() const; void setPeerId(const unsigned char* peerId); const unsigned char* getPeerId() const; bool isSeeder() const; const std::string& getID() const; void startBadCondition(); bool isGood() const; void allocateSessionResource(size_t pieceLength, uint64_t totalLength); void releaseSessionResource(); const Time& getFirstContactTime() const; const Time& getBadConditionStartTime() const; // Before calling following member functions, make sure that // allocateSessionResource() is called and _res is created. // Otherwise assertion fails. // localhost is choking this peer bool amChoking() const; void amChoking(bool b) const; // localhost is interested in this peer bool amInterested() const; void amInterested(bool b) const; // this peer is choking localhost bool peerChoking() const; void peerChoking(bool b) const; // 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); // this peer is snubbing. bool snubbing() const; void snubbing(bool b); void updateUploadLength(size_t bytes); void updateDownloadLength(size_t bytes); /** * Returns the transfer rate from localhost to remote host. */ unsigned int calculateUploadSpeed(); unsigned int calculateUploadSpeed(const struct timeval& now); /** * Returns the transfer rate from remote host to localhost. */ unsigned int calculateDownloadSpeed(); unsigned int calculateDownloadSpeed(const struct timeval& now); /** * Returns the number of bytes uploaded to the remote host. */ uint64_t getSessionUploadLength() const; /** * Returns the number of bytes downloaded from the remote host. */ uint64_t getSessionDownloadLength() const; void setBitfield(const unsigned char* bitfield, size_t bitfieldLength); const unsigned char* getBitfield() const; size_t getBitfieldLength() const; void setAllBitfield(); /** * operation = 1: set index-th bit to 1 * operation = 0: set index-th bit to 0 */ void updateBitfield(size_t index, int operation); void setFastExtensionEnabled(bool enabled); bool isFastExtensionEnabled() const; void addPeerAllowedIndex(size_t index); bool isInPeerAllowedIndexSet(size_t index) const; size_t countPeerAllowedIndexSet() const; const std::deque& getPeerAllowedIndexSet() const; void addAmAllowedIndex(size_t index); bool isInAmAllowedIndexSet(size_t index) const; void setExtendedMessagingEnabled(bool enabled); bool isExtendedMessagingEnabled() const; void setDHTEnabled(bool enabled); bool isDHTEnabled() const; bool shouldBeChoking() const; bool hasPiece(size_t index) const; void updateLatency(unsigned int latency); unsigned int getLatency() const; uint8_t getExtensionMessageID(const std::string& name) const; std::string getExtensionName(uint8_t id) const; void setExtension(const std::string& name, uint8_t id); }; typedef SharedHandle PeerHandle; typedef std::deque Peers; } // namespace aria2 #endif // _D_PEER_H_