/* */ #ifndef D_ASYNC_NAME_RESOLVER_H #define D_ASYNC_NAME_RESOLVER_H #include "common.h" #include #include #include #include "SharedHandle.h" #include "a2netcompat.h" namespace aria2 { class AsyncNameResolver { friend void callback (void* arg, int status, int timeouts, struct hostent* host); public: enum STATUS { STATUS_READY, STATUS_QUERYING, STATUS_SUCCESS, STATUS_ERROR, }; private: STATUS status_; int family_; ares_channel channel_; std::vector resolvedAddresses_; std::string error_; std::string hostname_; public: AsyncNameResolver (int family #ifdef HAVE_ARES_ADDR_NODE , ares_addr_node* servers #endif // HAVE_ARES_ADDR_NODE ); ~AsyncNameResolver(); void resolve(const std::string& name); const std::vector& getResolvedAddresses() const { return resolvedAddresses_; } const std::string& getError() const { return error_; } STATUS getStatus() const { return status_; } int getFds(fd_set* rfdsPtr, fd_set* wfdsPtr) const; void process(fd_set* rfdsPtr, fd_set* wfdsPtr); int getFamily() const { return family_; } #ifdef HAVE_LIBCARES int getsock(sock_t* sockets) const; void process(ares_socket_t readfd, ares_socket_t writefd); #endif // HAVE_LIBCARES bool operator==(const AsyncNameResolver& resolver) const; void setAddr(const std::string& addrString); void reset(); const std::string& getHostname() const { return hostname_; } }; #ifdef HAVE_ARES_ADDR_NODE ares_addr_node* parseAsyncDNSServers(const std::string& serversOpt); #endif // HAVE_ARES_ADDR_NODE } // namespace aria2 #endif // D_ASYNC_NAME_RESOLVER_H