/* */ #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 { #ifdef HAVE_LIBCARES1_5 friend void callback(void* arg, int status, int timeouts, struct hostent* host); #else friend void callback(void* arg, int status, struct hostent* host); #endif // HAVE_LIBCARES1_5 public: enum STATUS { STATUS_READY, STATUS_QUERYING, STATUS_SUCCESS, STATUS_ERROR, }; private: STATUS _status; ares_channel _channel; std::vector _resolvedAddresses; std::string _error; std::string _hostname; public: AsyncNameResolver(); ~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); #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; } }; } // namespace aria2 #endif // _D_ASYNC_NAME_RESOLVER_H_