/* */ #ifndef _D_DEFAULT_BT_INTERACTIVE_H_ #define _D_DEFAULT_BT_INTERACTIVE_H_ #include "BtInteractive.h" #include "BtContextAwareCommand.h" #include "TimeA2.h" #include namespace aria2 { class Peer; class BtMessage; class BtMessageReceiver; class BtMessageDispatcher; class BtMessageFactory; class BtRequestFactory; class PeerConnection; class DHTNode; class Logger; class FloodingStat { private: unsigned int chokeUnchokeCount; unsigned int keepAliveCount; public: FloodingStat():chokeUnchokeCount(0), keepAliveCount(0) {} void incChokeUnchokeCount() { if(chokeUnchokeCount < UINT_MAX) { chokeUnchokeCount++; } } void incKeepAliveCount() { if(keepAliveCount < UINT_MAX) { keepAliveCount++; } } unsigned int getChokeUnchokeCount() const { return chokeUnchokeCount; } unsigned int 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; size_t allowedFastSetSize; Time haveCheckPoint; Time keepAliveCheckPoint; Time floodingCheckPoint; FloodingStat floodingStat; Time inactiveCheckPoint; Time _pexCheckPoint; time_t keepAliveInterval; unsigned int maxDownloadSpeedLimit; bool _utPexEnabled; bool _dhtEnabled; size_t _numReceivedMessage; static const time_t FLOODING_CHECK_INTERVAL = 5; void addBitfieldMessageToQueue(); void addAllowedFastMessageToQueue(); void addHandshakeExtendedMessageToQueue(); void decideChoking(); void checkHave(); void sendKeepAlive(); void decideInterest(); void fillPiece(size_t 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 size_t countPendingMessage(); virtual bool isSendingMessageInProgress(); virtual size_t countReceivedMessageInIteration() const; virtual size_t countOutstandingRequest(); 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(time_t keepAliveInterval) { this->keepAliveInterval = keepAliveInterval; } void setMaxDownloadSpeedLimit(unsigned int 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_