1 // 2 // ip/basic_resolver.hpp 3 // ~~~~~~~~~~~~~~~~~~~~~ 4 // 5 // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com) 6 // 7 // Distributed under the Boost Software License, Version 1.0. (See accompanying 8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 9 // 10 11 #ifndef ASIO_IP_BASIC_RESOLVER_HPP 12 #define ASIO_IP_BASIC_RESOLVER_HPP 13 14 15 #include "asio/detail/config.hpp" 16 #include "asio/basic_io_object.hpp" 17 #include "asio/detail/handler_type_requirements.hpp" 18 #include "asio/detail/throw_error.hpp" 19 #include "asio/error.hpp" 20 #include "asio/ip/basic_resolver_iterator.hpp" 21 #include "asio/ip/basic_resolver_query.hpp" 22 #include "asio/ip/resolver_service.hpp" 23 24 #include "asio/detail/push_options.hpp" 25 26 namespace asio { 27 namespace ip { 28 29 /// Provides endpoint resolution functionality. 30 /** 31 * The basic_resolver class template provides the ability to resolve a query 32 * to a list of endpoints. 33 * 34 * @par Thread Safety 35 * @e Distinct @e objects: Safe.@n 36 * @e Shared @e objects: Unsafe. 37 */ 38 template <typename InternetProtocol, 39 typename ResolverService = resolver_service<InternetProtocol> > 40 class basic_resolver 41 : public basic_io_object<ResolverService> 42 { 43 public: 44 /// The protocol type. 45 typedef InternetProtocol protocol_type; 46 47 /// The endpoint type. 48 typedef typename InternetProtocol::endpoint endpoint_type; 49 50 /// The query type. 51 typedef basic_resolver_query<InternetProtocol> query; 52 53 /// The iterator type. 54 typedef basic_resolver_iterator<InternetProtocol> iterator; 55 56 /// Constructor. 57 /** 58 * This constructor creates a basic_resolver. 59 * 60 * @param io_service The io_service object that the resolver will use to 61 * dispatch handlers for any asynchronous operations performed on the timer. 62 */ 63 explicit basic_resolver(asio::io_service& io_service) 64 : basic_io_object<ResolverService>(io_service) 65 { 66 } 67 68 /// Cancel any asynchronous operations that are waiting on the resolver. 69 /** 70 * This function forces the completion of any pending asynchronous 71 * operations on the host resolver. The handler for each cancelled operation 72 * will be invoked with the asio::error::operation_aborted error code. 73 */ 74 void cancel() 75 { 76 return this->service.cancel(this->implementation); 77 } 78 79 /// Perform forward resolution of a query to a list of entries. 80 /** 81 * This function is used to resolve a query into a list of endpoint entries. 82 * 83 * @param q A query object that determines what endpoints will be returned. 84 * 85 * @returns A forward-only iterator that can be used to traverse the list 86 * of endpoint entries. 87 * 88 * @throws asio::system_error Thrown on failure. 89 * 90 * @note A default constructed iterator represents the end of the list. 91 * 92 * A successful call to this function is guaranteed to return at least one 93 * entry. 94 */ 95 iterator resolve(const query& q) 96 { 97 asio::error_code ec; 98 iterator i = this->service.resolve(this->implementation, q, ec); 99 asio::detail::throw_error(ec, "resolve"); 100 return i; 101 } 102 103 /// Perform forward resolution of a query to a list of entries. 104 /** 105 * This function is used to resolve a query into a list of endpoint entries. 106 * 107 * @param q A query object that determines what endpoints will be returned. 108 * 109 * @param ec Set to indicate what error occurred, if any. 110 * 111 * @returns A forward-only iterator that can be used to traverse the list 112 * of endpoint entries. Returns a default constructed iterator if an error 113 * occurs. 114 * 115 * @note A default constructed iterator represents the end of the list. 116 * 117 * A successful call to this function is guaranteed to return at least one 118 * entry. 119 */ 120 iterator resolve(const query& q, asio::error_code& ec) 121 { 122 return this->service.resolve(this->implementation, q, ec); 123 } 124 125 /// Asynchronously perform forward resolution of a query to a list of entries. 126 /** 127 * This function is used to asynchronously resolve a query into a list of 128 * endpoint entries. 129 * 130 * @param q A query object that determines what endpoints will be returned. 131 * 132 * @param handler The handler to be called when the resolve operation 133 * completes. Copies will be made of the handler as required. The function 134 * signature of the handler must be: 135 * @code void handler( 136 * const asio::error_code& error, // Result of operation. 137 * resolver::iterator iterator // Forward-only iterator that can 138 * // be used to traverse the list 139 * // of endpoint entries. 140 * ); @endcode 141 * Regardless of whether the asynchronous operation completes immediately or 142 * not, the handler will not be invoked from within this function. Invocation 143 * of the handler will be performed in a manner equivalent to using 144 * asio::io_service::post(). 145 * 146 * @note A default constructed iterator represents the end of the list. 147 * 148 * A successful resolve operation is guaranteed to pass at least one entry to 149 * the handler. 150 */ 151 template <typename ResolveHandler> 152 ASIO_INITFN_RESULT_TYPE(ResolveHandler, 153 void (asio::error_code, iterator)) 154 async_resolve(const query& q, 155 ASIO_MOVE_ARG(ResolveHandler) handler) 156 { 157 // If you get an error on the following line it means that your handler does 158 // not meet the documented type requirements for a ResolveHandler. 159 ASIO_RESOLVE_HANDLER_CHECK( 160 ResolveHandler, handler, iterator) type_check; 161 162 return this->service.async_resolve(this->implementation, q, 163 ASIO_MOVE_CAST(ResolveHandler)(handler)); 164 } 165 166 /// Perform reverse resolution of an endpoint to a list of entries. 167 /** 168 * This function is used to resolve an endpoint into a list of endpoint 169 * entries. 170 * 171 * @param e An endpoint object that determines what endpoints will be 172 * returned. 173 * 174 * @returns A forward-only iterator that can be used to traverse the list 175 * of endpoint entries. 176 * 177 * @throws asio::system_error Thrown on failure. 178 * 179 * @note A default constructed iterator represents the end of the list. 180 * 181 * A successful call to this function is guaranteed to return at least one 182 * entry. 183 */ 184 iterator resolve(const endpoint_type& e) 185 { 186 asio::error_code ec; 187 iterator i = this->service.resolve(this->implementation, e, ec); 188 asio::detail::throw_error(ec, "resolve"); 189 return i; 190 } 191 192 /// Perform reverse resolution of an endpoint to a list of entries. 193 /** 194 * This function is used to resolve an endpoint into a list of endpoint 195 * entries. 196 * 197 * @param e An endpoint object that determines what endpoints will be 198 * returned. 199 * 200 * @param ec Set to indicate what error occurred, if any. 201 * 202 * @returns A forward-only iterator that can be used to traverse the list 203 * of endpoint entries. Returns a default constructed iterator if an error 204 * occurs. 205 * 206 * @note A default constructed iterator represents the end of the list. 207 * 208 * A successful call to this function is guaranteed to return at least one 209 * entry. 210 */ 211 iterator resolve(const endpoint_type& e, asio::error_code& ec) 212 { 213 return this->service.resolve(this->implementation, e, ec); 214 } 215 216 /// Asynchronously perform reverse resolution of an endpoint to a list of 217 /// entries. 218 /** 219 * This function is used to asynchronously resolve an endpoint into a list of 220 * endpoint entries. 221 * 222 * @param e An endpoint object that determines what endpoints will be 223 * returned. 224 * 225 * @param handler The handler to be called when the resolve operation 226 * completes. Copies will be made of the handler as required. The function 227 * signature of the handler must be: 228 * @code void handler( 229 * const asio::error_code& error, // Result of operation. 230 * resolver::iterator iterator // Forward-only iterator that can 231 * // be used to traverse the list 232 * // of endpoint entries. 233 * ); @endcode 234 * Regardless of whether the asynchronous operation completes immediately or 235 * not, the handler will not be invoked from within this function. Invocation 236 * of the handler will be performed in a manner equivalent to using 237 * asio::io_service::post(). 238 * 239 * @note A default constructed iterator represents the end of the list. 240 * 241 * A successful resolve operation is guaranteed to pass at least one entry to 242 * the handler. 243 */ 244 template <typename ResolveHandler> 245 ASIO_INITFN_RESULT_TYPE(ResolveHandler, 246 void (asio::error_code, iterator)) 247 async_resolve(const endpoint_type& e, 248 ASIO_MOVE_ARG(ResolveHandler) handler) 249 { 250 // If you get an error on the following line it means that your handler does 251 // not meet the documented type requirements for a ResolveHandler. 252 ASIO_RESOLVE_HANDLER_CHECK( 253 ResolveHandler, handler, iterator) type_check; 254 255 return this->service.async_resolve(this->implementation, e, 256 ASIO_MOVE_CAST(ResolveHandler)(handler)); 257 } 258 }; 259 260 } // namespace ip 261 } // namespace asio 262 263 #include "asio/detail/pop_options.hpp" 264 265 #endif // ASIO_IP_BASIC_RESOLVER_HPP 266