/* */ #ifndef _D_DOWNLOAD_ENGINE_H_ #define _D_DOWNLOAD_ENGINE_H_ #include "common.h" #include #include #include #include #include "SharedHandle.h" #include "a2netcompat.h" #include "TimeA2.h" #include "a2io.h" #ifdef ENABLE_ASYNC_DNS # include "AsyncNameResolver.h" #endif // ENABLE_ASYNC_DNS #include "CUIDCounter.h" #include "FileAllocationMan.h" #include "CheckIntegrityMan.h" #include "DNSCache.h" namespace aria2 { class Logger; class Option; class RequestGroupMan; class StatCalc; class SocketCore; class CookieStorage; class AuthConfigFactory; class Request; class EventPoll; class Command; #ifdef ENABLE_BITTORRENT class BtRegistry; #endif // ENABLE_BITTORRENT class DownloadEngine { private: void waitData(); std::string _sessionId; SharedHandle _eventPoll; Logger* logger; SharedHandle _statCalc; bool _haltRequested; class SocketPoolEntry { private: SharedHandle _socket; std::map _options; time_t _timeout; Time _registeredTime; public: SocketPoolEntry(const SharedHandle& socket, const std::map& option, time_t timeout); ~SocketPoolEntry(); bool isTimeout() const; const SharedHandle& getSocket() const { return _socket; } const std::map& getOptions() const { return _options; } }; // key = IP address:port, value = SocketPoolEntry std::multimap _socketPool; Time _lastSocketPoolScan; bool _noWait; static const time_t DEFAULT_REFRESH_INTERVAL = 1; time_t _refreshInterval; std::deque _routineCommands; SharedHandle _cookieStorage; #ifdef ENABLE_BITTORRENT SharedHandle _btRegistry; #endif // ENABLE_BITTORRENT CUIDCounter _cuidCounter; SharedHandle _dnsCache; SharedHandle _authConfigFactory; /** * Delegates to StatCalc */ void calculateStatistics(); void onEndOfRun(); void afterEachIteration(); void poolSocket(const std::string& ipaddr, uint16_t port, const SocketPoolEntry& entry); std::multimap::iterator findSocketPoolEntry(const std::string& ipaddr, uint16_t port); public: std::deque commands; SharedHandle _requestGroupMan; SharedHandle _fileAllocationMan; SharedHandle _checkIntegrityMan; Option* option; DownloadEngine(const SharedHandle& eventPoll); virtual ~DownloadEngine(); void run(); void cleanQueue(); bool addSocketForReadCheck(const SharedHandle& socket, Command* command); bool deleteSocketForReadCheck(const SharedHandle& socket, Command* command); bool addSocketForWriteCheck(const SharedHandle& socket, Command* command); bool deleteSocketForWriteCheck(const SharedHandle& socket, Command* command); #ifdef ENABLE_ASYNC_DNS bool addNameResolverCheck(const SharedHandle& resolver, Command* command); bool deleteNameResolverCheck(const SharedHandle& resolver, Command* command); #endif // ENABLE_ASYNC_DNS void addCommand(const std::vector& commands); void setStatCalc(const SharedHandle& statCalc); bool isHaltRequested() const { return _haltRequested; } void requestHalt(); void requestForceHalt(); void setNoWait(bool b); void addRoutineCommand(Command* command); void poolSocket(const std::string& ipaddr, uint16_t port, const SharedHandle& sock, const std::map& options, time_t timeout = 15); void poolSocket(const std::string& ipaddr, uint16_t port, const SharedHandle& sock, time_t timeout = 15); void poolSocket(const SharedHandle& request, bool proxyDefined, const SharedHandle& socket, const std::map& options, time_t timeout = 15); void poolSocket(const SharedHandle& request, bool proxyDefined, const SharedHandle& socket, time_t timeout = 15); SharedHandle popPooledSocket(const std::string& ipaddr, uint16_t port); SharedHandle popPooledSocket (std::map& options, const std::string& ipaddr, uint16_t port); SharedHandle popPooledSocket(const std::vector& ipaddrs, uint16_t port); SharedHandle popPooledSocket (std::map& options, const std::vector& ipaddrs, uint16_t port); const SharedHandle& getCookieStorage() const { return _cookieStorage; } #ifdef ENABLE_BITTORRENT const SharedHandle& getBtRegistry() const { return _btRegistry; } #endif // ENABLE_BITTORRENT cuid_t newCUID(); const std::string& findCachedIPAddress (const std::string& hostname, uint16_t port) const; template void findAllCachedIPAddresses (OutputIterator out, const std::string& hostname, uint16_t port) const { _dnsCache->findAll(out, hostname, port); } void cacheIPAddress (const std::string& hostname, const std::string& ipaddr, uint16_t port); void markBadIPAddress (const std::string& hostname, const std::string& ipaddr, uint16_t port); void removeCachedIPAddress(const std::string& hostname, uint16_t port); void setAuthConfigFactory(const SharedHandle& factory); const SharedHandle& getAuthConfigFactory() const { return _authConfigFactory; } void setRefreshInterval(time_t interval); const std::string getSessionId() const { return _sessionId; } }; typedef SharedHandle DownloadEngineHandle; } // namespace aria2 #endif // _D_DOWNLOAD_ENGINE_H_