/* */ #ifndef _D_DEFAULT_BT_INTERACTIVE_H_ #define _D_DEFAULT_BT_INTERACTIVE_H_ #include "BtInteractive.h" #include "BtContextAwareCommand.h" #include "TimeA2.h" namespace aria2 { class Peer; class BtMessage; class BtMessageReceiver; class BtMessageDispatcher; class BtMessageFactory; class BtRequestFactory; class PeerConnection; class DHTNode; class Logger; class FloodingStat { private: int32_t chokeUnchokeCount; int32_t keepAliveCount; public: FloodingStat():chokeUnchokeCount(0), keepAliveCount(0) {} void incChokeUnchokeCount() { if(chokeUnchokeCount < INT32_MAX) { chokeUnchokeCount++; } } void incKeepAliveCount() { if(keepAliveCount < INT32_MAX) { keepAliveCount++; } } int32_t getChokeUnchokeCount() const { return chokeUnchokeCount; } int32_t getKeepAliveCount() const { return keepAliveCount; } void reset() { chokeUnchokeCount = 0; keepAliveCount = 0; } }; class DefaultBtInteractive : public BtInteractive, public BtContextAwareCommand { private: int32_t cuid; SharedHandle peer; WeakHandle btMessageReceiver; WeakHandle dispatcher; WeakHandle btRequestFactory; WeakHandle peerConnection; WeakHandle messageFactory; WeakHandle _localNode; const Logger* logger; int32_t allowedFastSetSize; Time haveCheckPoint; Time keepAliveCheckPoint; Time floodingCheckPoint; FloodingStat floodingStat; Time inactiveCheckPoint; Time _pexCheckPoint; int32_t keepAliveInterval; int32_t maxDownloadSpeedLimit; bool _utPexEnabled; bool _dhtEnabled; size_t _numReceivedMessage; static const int32_t FLOODING_CHECK_INTERVAL = 5; void addBitfieldMessageToQueue(); void addAllowedFastMessageToQueue(); void addHandshakeExtendedMessageToQueue(); void decideChoking(); void checkHave(); void sendKeepAlive(); void decideInterest(); void fillPiece(int maxPieceNum); void addRequests(); void detectMessageFlooding(); void checkActiveInteraction(); void addPeerExchangeMessage(); void addPortMessageToQueue(); public: DefaultBtInteractive(const SharedHandle& btContext, const SharedHandle& peer); virtual ~DefaultBtInteractive(); virtual void initiateHandshake(); virtual SharedHandle receiveHandshake(bool quickReply = false); virtual SharedHandle receiveAndSendHandshake(); virtual void doPostHandshakeProcessing(); virtual void doInteractionProcessing(); virtual void cancelAllPiece(); virtual void sendPendingMessage(); size_t receiveMessages(); virtual int32_t countPendingMessage(); virtual bool isSendingMessageInProgress(); virtual size_t countReceivedMessageInIteration() const; void setCuid(int32_t cuid) { this->cuid = cuid; } void setPeer(const SharedHandle& peer); void setBtMessageReceiver(const WeakHandle& receiver); void setDispatcher(const WeakHandle& dispatcher); void setBtRequestFactory(const WeakHandle& factory); void setPeerConnection(const WeakHandle& peerConnection); void setBtMessageFactory(const WeakHandle& factory); void setKeepAliveInterval(int32_t keepAliveInterval) { this->keepAliveInterval = keepAliveInterval; } void setMaxDownloadSpeedLimit(int32_t maxDownloadSpeedLimit) { this->maxDownloadSpeedLimit = maxDownloadSpeedLimit; } void setUTPexEnabled(bool f) { _utPexEnabled = f; } void setLocalNode(const WeakHandle& node); void setDHTEnabled(bool f) { _dhtEnabled = f; } }; typedef SharedHandle DefaultBtInteractiveHandle; } // namespace aria2 #endif // _D_DEFAULT_BT_INTERACTIVE_H_