/* */ #ifndef _D_DEFAULT_BT_INTERACTIVE_H_ #define _D_DEFAULT_BT_INTERACTIVE_H_ #include "BtInteractive.h" #include #include "TimeA2.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 Logger; class RequestGroupMan; class UTMetadataRequestFactory; class UTMetadataRequestTracker; 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 { private: cuid_t cuid; SharedHandle _downloadContext; SharedHandle _btRuntime; SharedHandle _pieceStorage; SharedHandle _peerStorage; SharedHandle peer; SharedHandle btMessageReceiver; SharedHandle dispatcher; SharedHandle btRequestFactory; SharedHandle peerConnection; SharedHandle messageFactory; SharedHandle _extensionMessageFactory; SharedHandle _extensionMessageRegistry; SharedHandle _utMetadataRequestFactory; SharedHandle _utMetadataRequestTracker; bool _metadataGetMode; WeakHandle _localNode; Logger* logger; size_t allowedFastSetSize; Time haveCheckPoint; Time keepAliveCheckPoint; Time floodingCheckPoint; FloodingStat floodingStat; Time inactiveCheckPoint; Time _pexCheckPoint; Time _perSecCheckPoint; time_t keepAliveInterval; bool _utPexEnabled; bool _dhtEnabled; size_t _numReceivedMessage; size_t _maxOutstandingRequest; WeakHandle _requestGroupMan; 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 SharedHandle& downloadContext, 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(cuid_t cuid) { this->cuid = cuid; } void setBtRuntime(const SharedHandle& btRuntime); void setPieceStorage(const SharedHandle& pieceStorage); void setPeerStorage(const SharedHandle& peerStorage); void setPeer(const SharedHandle& peer); void setBtMessageReceiver(const SharedHandle& receiver); void setDispatcher(const SharedHandle& dispatcher); void setBtRequestFactory(const SharedHandle& factory); void setPeerConnection(const SharedHandle& peerConnection); void setBtMessageFactory(const SharedHandle& factory); void setExtensionMessageFactory (const SharedHandle& factory); void setExtensionMessageRegistry (const SharedHandle& registry) { _extensionMessageRegistry = registry; } void setKeepAliveInterval(time_t keepAliveInterval) { this->keepAliveInterval = keepAliveInterval; } void setUTPexEnabled(bool f) { _utPexEnabled = f; } void setLocalNode(const WeakHandle& node); void setDHTEnabled(bool f) { _dhtEnabled = f; } void setRequestGroupMan(const WeakHandle& rgman); void setUTMetadataRequestTracker (const SharedHandle& tracker) { _utMetadataRequestTracker = tracker; } void setUTMetadataRequestFactory (const SharedHandle& factory) { _utMetadataRequestFactory = factory; } void enableMetadataGetMode() { _metadataGetMode = true; } }; typedef SharedHandle DefaultBtInteractiveHandle; } // namespace aria2 #endif // _D_DEFAULT_BT_INTERACTIVE_H_