/* */ #ifndef D_DEFAULT_BT_INTERACTIVE_H #define D_DEFAULT_BT_INTERACTIVE_H #include "BtInteractive.h" #include #include #include "TimerA2.h" #include "Command.h" namespace aria2 { class DownloadContext; class BtRuntime; class PieceStorage; class PeerStorage; class Peer; class BtMessage; class BtMessageReceiver; class BtMessageDispatcher; class BtMessageFactory; class BtRequestFactory; class PeerConnection; class ExtensionMessageFactory; class ExtensionMessageRegistry; class DHTNode; class RequestGroupMan; class UTMetadataRequestFactory; class UTMetadataRequestTracker; class FloodingStat { private: int chokeUnchokeCount; int keepAliveCount; public: FloodingStat():chokeUnchokeCount(0), keepAliveCount(0) {} void incChokeUnchokeCount() { if(chokeUnchokeCount < INT_MAX) { ++chokeUnchokeCount; } } void incKeepAliveCount() { if(keepAliveCount < INT_MAX) { ++keepAliveCount; } } int getChokeUnchokeCount() const { return chokeUnchokeCount; } int getKeepAliveCount() const { return keepAliveCount; } void reset() { chokeUnchokeCount = 0; keepAliveCount = 0; } }; class DefaultBtInteractive : public BtInteractive { private: cuid_t cuid_; std::shared_ptr downloadContext_; std::shared_ptr btRuntime_; std::shared_ptr pieceStorage_; std::shared_ptr peerStorage_; std::shared_ptr peer_; std::unique_ptr btMessageReceiver_; std::unique_ptr dispatcher_; std::unique_ptr btRequestFactory_; std::unique_ptr peerConnection_; std::unique_ptr messageFactory_; std::unique_ptr extensionMessageFactory_; std::unique_ptr extensionMessageRegistry_; std::unique_ptr utMetadataRequestFactory_; std::unique_ptr utMetadataRequestTracker_; bool metadataGetMode_; DHTNode* localNode_; size_t allowedFastSetSize_; Timer haveTimer_; Timer keepAliveTimer_; Timer floodingTimer_; FloodingStat floodingStat_; Timer inactiveTimer_; Timer pexTimer_; Timer perSecTimer_; time_t keepAliveInterval_; bool utPexEnabled_; bool dhtEnabled_; size_t numReceivedMessage_; size_t maxOutstandingRequest_; RequestGroupMan* requestGroupMan_; uint16_t tcpPort_; std::vector haveIndexes_; Timer haveLastSent_; 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 maxMissingBlock); void addRequests(); void detectMessageFlooding(); void checkActiveInteraction(); void addPeerExchangeMessage(); void addPortMessageToQueue(); public: DefaultBtInteractive(const std::shared_ptr& downloadContext, const std::shared_ptr& peer); virtual ~DefaultBtInteractive(); virtual void initiateHandshake() CXX11_OVERRIDE; virtual std::unique_ptr receiveHandshake (bool quickReply = false) CXX11_OVERRIDE; virtual std::unique_ptr receiveAndSendHandshake() CXX11_OVERRIDE; virtual void doPostHandshakeProcessing() CXX11_OVERRIDE; virtual void doInteractionProcessing() CXX11_OVERRIDE; virtual void cancelAllPiece() CXX11_OVERRIDE; virtual void sendPendingMessage() CXX11_OVERRIDE; size_t receiveMessages(); virtual size_t countPendingMessage() CXX11_OVERRIDE; virtual bool isSendingMessageInProgress() CXX11_OVERRIDE; virtual size_t countReceivedMessageInIteration() const CXX11_OVERRIDE; virtual size_t countOutstandingRequest() CXX11_OVERRIDE; void setCuid(cuid_t cuid) { cuid_ = cuid; } void setBtRuntime(const std::shared_ptr& btRuntime); void setPieceStorage(const std::shared_ptr& pieceStorage); void setPeerStorage(const std::shared_ptr& peerStorage); void setPeer(const std::shared_ptr& peer); void setBtMessageReceiver(std::unique_ptr receiver); void setDispatcher(std::unique_ptr dispatcher); void setBtRequestFactory(std::unique_ptr factory); void setPeerConnection(std::unique_ptr peerConnection); void setBtMessageFactory(std::unique_ptr factory); void setExtensionMessageFactory (std::unique_ptr factory); void setExtensionMessageRegistry (std::unique_ptr registry); void setKeepAliveInterval(time_t keepAliveInterval) { keepAliveInterval_ = keepAliveInterval; } void setUTPexEnabled(bool f) { utPexEnabled_ = f; } void setLocalNode(DHTNode* node); void setDHTEnabled(bool f) { dhtEnabled_ = f; } void setRequestGroupMan(RequestGroupMan* rgman); void setUTMetadataRequestTracker (std::unique_ptr tracker); void setUTMetadataRequestFactory (std::unique_ptr factory); void enableMetadataGetMode() { metadataGetMode_ = true; } void setTcpPort(uint16_t port) { tcpPort_ = port; } }; } // namespace aria2 #endif // D_DEFAULT_BT_INTERACTIVE_H