/* */ #ifndef D_DOWNLOAD_ENGINE_H #define D_DOWNLOAD_ENGINE_H #include "common.h" #include #include #include #include #include #include "a2netcompat.h" #include "TimerA2.h" #include "a2io.h" #include "CUIDCounter.h" #include "FileAllocationMan.h" #include "CheckIntegrityMan.h" #include "DNSCache.h" #ifdef ENABLE_ASYNC_DNS # include "AsyncNameResolver.h" #endif // ENABLE_ASYNC_DNS namespace aria2 { 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 #ifdef ENABLE_WEBSOCKET namespace rpc { class WebSocketSessionMan; } // namespace rpc #endif // ENABLE_WEBSOCKET namespace util { namespace security { class HMAC; class HMACResult; } // namespace security } // namespace util class DownloadEngine { private: void waitData(); std::string sessionId_; std::unique_ptr eventPoll_; std::unique_ptr statCalc_; int haltRequested_; class SocketPoolEntry { private: std::shared_ptr socket_; // protocol specific option string std::string options_; time_t timeout_; Timer registeredTime_; public: SocketPoolEntry(const std::shared_ptr& socket, const std::string& option, time_t timeout); SocketPoolEntry(const std::shared_ptr& socket, time_t timeout); ~SocketPoolEntry(); bool isTimeout() const; const std::shared_ptr& getSocket() const { return socket_; } const std::string& getOptions() const { return options_; } }; // key = IP address:port, value = SocketPoolEntry std::multimap socketPool_; Timer lastSocketPoolScan_; bool noWait_; static const int64_t DEFAULT_REFRESH_INTERVAL = 1000; // Milliseconds int64_t refreshInterval_; Timer lastRefresh_; std::unique_ptr cookieStorage_; #ifdef ENABLE_BITTORRENT std::unique_ptr btRegistry_; #endif // ENABLE_BITTORRENT CUIDCounter cuidCounter_; #ifdef HAVE_ARES_ADDR_NODE ares_addr_node* asyncDNSServers_; #endif // HAVE_ARES_ADDR_NODE std::unique_ptr dnsCache_; std::unique_ptr authConfigFactory_; #ifdef ENABLE_WEBSOCKET std::unique_ptr webSocketSessionMan_; #endif // ENABLE_WEBSOCKET /** * Delegates to StatCalc */ void calculateStatistics(); void onEndOfRun(); void afterEachIteration(); void poolSocket(const std::string& key, const SocketPoolEntry& entry); std::multimap::iterator findSocketPoolEntry(const std::string& key); std::unique_ptr requestGroupMan_; std::unique_ptr fileAllocationMan_; std::unique_ptr checkIntegrityMan_; Option* option_; // Ensure that Commands are cleaned up before requestGroupMan_ is // deleted. std::deque> routineCommands_; std::deque> commands_; std::unique_ptr tokenHMAC_; std::unique_ptr tokenExpected_; public: DownloadEngine(std::unique_ptr eventPoll); ~DownloadEngine(); // If oneshot is true, this function returns after one event polling // and performing action for them. This function returns 1 when // oneshot is true and there are still downloads to be // processed. Otherwise, returns 0. int run(bool oneshot=false); bool addSocketForReadCheck(const std::shared_ptr& socket, Command* command); bool deleteSocketForReadCheck(const std::shared_ptr& socket, Command* command); bool addSocketForWriteCheck(const std::shared_ptr& socket, Command* command); bool deleteSocketForWriteCheck(const std::shared_ptr& socket, Command* command); #ifdef ENABLE_ASYNC_DNS bool addNameResolverCheck(const std::shared_ptr& resolver, Command* command); bool deleteNameResolverCheck(const std::shared_ptr& resolver, Command* command); #endif // ENABLE_ASYNC_DNS void addCommand(std::vector> commands); void addCommand(std::unique_ptr command); const std::unique_ptr& getRequestGroupMan() const { return requestGroupMan_; } void setRequestGroupMan(std::unique_ptr rgman); const std::unique_ptr& getFileAllocationMan() const { return fileAllocationMan_; } void setFileAllocationMan(std::unique_ptr faman); const std::unique_ptr& getCheckIntegrityMan() const { return checkIntegrityMan_; } void setCheckIntegrityMan(std::unique_ptr ciman); Option* getOption() const { return option_; } void setOption(Option* op) { option_ = op; } void setStatCalc(std::unique_ptr statCalc); bool isHaltRequested() const { return haltRequested_; } bool isForceHaltRequested() const { return haltRequested_ >= 2; } void requestHalt(); void requestForceHalt(); void setNoWait(bool b); void addRoutineCommand(std::unique_ptr command); void poolSocket(const std::string& ipaddr, uint16_t port, const std::string& username, const std::string& proxyhost, uint16_t proxyport, const std::shared_ptr& sock, const std::string& options, time_t timeout = 15); void poolSocket(const std::shared_ptr& request, const std::string& username, const std::shared_ptr& proxyRequest, const std::shared_ptr& socket, const std::string& options, time_t timeout = 15); void poolSocket(const std::string& ipaddr, uint16_t port, const std::string& proxyhost, uint16_t proxyport, const std::shared_ptr& sock, time_t timeout = 15); void poolSocket(const std::shared_ptr& request, const std::shared_ptr& proxyRequest, const std::shared_ptr& socket, time_t timeout = 15); std::shared_ptr popPooledSocket (const std::string& ipaddr, uint16_t port, const std::string& proxyhost, uint16_t proxyport); std::shared_ptr popPooledSocket (std::string& options, const std::string& ipaddr, uint16_t port, const std::string& username, const std::string& proxyhost, uint16_t proxyport); std::shared_ptr popPooledSocket (const std::vector& ipaddrs, uint16_t port); std::shared_ptr popPooledSocket (std::string& options, const std::vector& ipaddrs, uint16_t port, const std::string& username); const std::unique_ptr& getCookieStorage() const; #ifdef ENABLE_BITTORRENT const std::unique_ptr& 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(std::unique_ptr factory); const std::unique_ptr& getAuthConfigFactory() const; void setRefreshInterval(int64_t interval); const std::string getSessionId() const { return sessionId_; } #ifdef HAVE_ARES_ADDR_NODE void setAsyncDNSServers(ares_addr_node* asyncDNSServers); ares_addr_node* getAsyncDNSServers() const { return asyncDNSServers_; } #endif // HAVE_ARES_ADDR_NODE #ifdef ENABLE_WEBSOCKET void setWebSocketSessionMan(std::unique_ptr wsman); const std::unique_ptr& getWebSocketSessionMan() const { return webSocketSessionMan_; } #endif // ENABLE_WEBSOCKET bool validateToken(const std::string& token); }; } // namespace aria2 #endif // D_DOWNLOAD_ENGINE_H