/* */ #ifndef _D_PEER_H_ #define _D_PEER_H_ #include "common.h" #include "BitfieldMan.h" #include #include using namespace std; #define PEER_ID_LENGTH 20 #define DEFAULT_LATENCY 1000 class Peer { public: int entryId; string ipaddr; int port; bool amChoking; bool amInterested; bool peerChoking; bool peerInterested; int tryCount; int error; int cuid; bool chokingRequired; bool optUnchoking; private: char peerId[PEER_ID_LENGTH]; BitfieldMan* bitfield; bool fastExtensionEnabled; // allowed fast indexes that peer has sent by Allowed Fast message Integers fastSet; long long int peerUpload; long long int peerDownload; int pieceLength; long long int totalLength; int deltaUpload; int deltaDownload; int latency; public: Peer(string ipaddr, int port, int pieceLength, long long int totalLength): entryId(0), ipaddr(ipaddr), port(port), amChoking(true), amInterested(false), peerChoking(true), peerInterested(false), tryCount(0), error(0), cuid(0), chokingRequired(true), optUnchoking(false), bitfield(NULL), fastExtensionEnabled(false), peerUpload(0), peerDownload(0), pieceLength(pieceLength), totalLength(totalLength), deltaUpload(0), deltaDownload(0), latency(DEFAULT_LATENCY) { this->bitfield = new BitfieldMan(pieceLength, totalLength); } ~Peer() { if(bitfield != NULL) { delete bitfield; } } void resetStatus(); void addDeltaUpload(int length) { this->deltaUpload += length; } void resetDeltaUpload() { this->deltaUpload = 0; } int getDeltaUpload() const { return this->deltaUpload; } void addDeltaDownload(int length) { this->deltaDownload += length; } void resetDeltaDownload() { this->deltaDownload = 0; } int getDeltaDownload() const { return this->deltaDownload; } void setPeerId(const char* peerId) { memcpy(this->peerId, peerId, PEER_ID_LENGTH); } const char* getPeerId() const { return this->peerId; } void setBitfield(const unsigned char* bitfield, int bitfieldLength) { this->bitfield->setBitfield(bitfield, bitfieldLength); } const unsigned char* getBitfield() const { return bitfield->getBitfield(); } int getBitfieldLength() const { return bitfield->getBitfieldLength(); } void setAllBitfield(); /** * operation = 1: set index-th bit 1 * operation = 0: set index-th bit 0 */ void updateBitfield(int index, int operation); void addPeerUpload(int size) { peerUpload += size; addDeltaUpload(size); } void setPeerUpload(long long int size) { peerUpload = size; } long long int getPeerUpload() const { return peerUpload; } void addPeerDownload(int size) { peerDownload += size; addDeltaDownload(size); } void setPeerDownload(long long int size) { peerDownload = size; } long long int getPeerDownload() const { return peerDownload; } void setFastExtensionEnabled(bool enabled) { fastExtensionEnabled = enabled; } bool isFastExtensionEnabled() const { return fastExtensionEnabled; } void addFastSetIndex(int index); const Integers& getFastSet() const { return fastSet; } bool isInFastSet(int index) const; int countFastSet() const { return fastSet.size(); } bool shouldBeChoking() const; bool hasPiece(int index) const; bool isSeeder() const; void updateLatency(int latency); int getLatency() const { return latency; } static Peer* nullPeer; }; #endif // _D_PEER_H_