113682d959ddacde1ce65843aa8c5b43dc9017b32Brian// 213682d959ddacde1ce65843aa8c5b43dc9017b32Brian// detail/resolver_service.hpp 313682d959ddacde1ce65843aa8c5b43dc9017b32Brian// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413682d959ddacde1ce65843aa8c5b43dc9017b32Brian// 513682d959ddacde1ce65843aa8c5b43dc9017b32Brian// Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com) 613682d959ddacde1ce65843aa8c5b43dc9017b32Brian// 713682d959ddacde1ce65843aa8c5b43dc9017b32Brian// Distributed under the Boost Software License, Version 1.0. (See accompanying 813682d959ddacde1ce65843aa8c5b43dc9017b32Brian// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 913682d959ddacde1ce65843aa8c5b43dc9017b32Brian// 1013682d959ddacde1ce65843aa8c5b43dc9017b32Brian 1113682d959ddacde1ce65843aa8c5b43dc9017b32Brian#ifndef ASIO_DETAIL_RESOLVER_SERVICE_HPP 1213682d959ddacde1ce65843aa8c5b43dc9017b32Brian#define ASIO_DETAIL_RESOLVER_SERVICE_HPP 1313682d959ddacde1ce65843aa8c5b43dc9017b32Brian 1413682d959ddacde1ce65843aa8c5b43dc9017b32Brian 1513682d959ddacde1ce65843aa8c5b43dc9017b32Brian#include "asio/detail/config.hpp" 1613682d959ddacde1ce65843aa8c5b43dc9017b32Brian 1713682d959ddacde1ce65843aa8c5b43dc9017b32Brian 1813682d959ddacde1ce65843aa8c5b43dc9017b32Brian#include "asio/ip/basic_resolver_iterator.hpp" 1913682d959ddacde1ce65843aa8c5b43dc9017b32Brian#include "asio/ip/basic_resolver_query.hpp" 2013682d959ddacde1ce65843aa8c5b43dc9017b32Brian#include "asio/detail/addressof.hpp" 2113682d959ddacde1ce65843aa8c5b43dc9017b32Brian#include "asio/detail/resolve_endpoint_op.hpp" 2213682d959ddacde1ce65843aa8c5b43dc9017b32Brian#include "asio/detail/resolve_op.hpp" 2313682d959ddacde1ce65843aa8c5b43dc9017b32Brian#include "asio/detail/resolver_service_base.hpp" 2413682d959ddacde1ce65843aa8c5b43dc9017b32Brian 2513682d959ddacde1ce65843aa8c5b43dc9017b32Brian#include "asio/detail/push_options.hpp" 2613682d959ddacde1ce65843aa8c5b43dc9017b32Brian 2713682d959ddacde1ce65843aa8c5b43dc9017b32Briannamespace asio { 2813682d959ddacde1ce65843aa8c5b43dc9017b32Briannamespace detail { 2913682d959ddacde1ce65843aa8c5b43dc9017b32Brian 3013682d959ddacde1ce65843aa8c5b43dc9017b32Briantemplate <typename Protocol> 31279ffe3f163fd6a5e7bfa108db14c81acbb06eceBrianclass resolver_service : public resolver_service_base 324f25420bdd834e81a3e22733304efc5261c2998aBrian Paul{ 33287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellpublic: 34d8ae972fd067a2478d1b0b4a35fec47ac2c814f7José Fonseca // The implementation type of the resolver. A cancellation token is used to 356acd63a4980951727939c0dd545a0324965b3834José Fonseca // indicate to the background thread that the operation has been cancelled. 36d8ae972fd067a2478d1b0b4a35fec47ac2c814f7José Fonseca typedef socket_ops::shared_cancel_token_type implementation_type; 37d8ae972fd067a2478d1b0b4a35fec47ac2c814f7José Fonseca 3813682d959ddacde1ce65843aa8c5b43dc9017b32Brian // The endpoint type. 394c90dc7027a42e046662d52c7300f0eb68a6cf3fBrian typedef typename Protocol::endpoint endpoint_type; 404fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell 4180c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell // The query type. 424da1cdf78fa3b954840650fa46cf72da5daf149fBrian typedef asio::ip::basic_resolver_query<Protocol> query_type; 4370eb7996f265f3634dabda078f13d1be3533cc65Brian 444fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell // The iterator type. 454fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell typedef asio::ip::basic_resolver_iterator<Protocol> iterator_type; 46f3955f6fcdd1a3106a6538642131ccea5ef1cef0Brian Paul 47f3955f6fcdd1a3106a6538642131ccea5ef1cef0Brian Paul // Constructor. 484fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell resolver_service(asio::io_service& io_service) 494fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell : resolver_service_base(io_service) 504fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell { 514fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell } 524fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell 534fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell // Resolve a query to a list of entries. 544fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell iterator_type resolve(implementation_type&, const query_type& query, 5513682d959ddacde1ce65843aa8c5b43dc9017b32Brian asio::error_code& ec) 56c5dd2e40e268e40335a47b86b7c4ce201e337a77Brian Paul { 57f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin asio::detail::addrinfo_type* address_info = 0; 58f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin 59f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin socket_ops::getaddrinfo(query.host_name().c_str(), 604fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell query.service_name().c_str(), query.hints(), &address_info, ec); 614fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell auto_addrinfo auto_address_info(address_info); 624fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell 63f3955f6fcdd1a3106a6538642131ccea5ef1cef0Brian Paul return ec ? iterator_type() : iterator_type::create( 644fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell address_info, query.host_name(), query.service_name()); 654fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell } 66f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin 67f117327a3f246713abfd4dc4320d4a1a7f1b811aZack Rusin // Asynchronously resolve a query to a list of entries. 684528287e040415c2071012d02f20979ff995c754Keith Whitwell template <typename Handler> 6925a42f39e362322dbac836c29b76b3104bbfe6f4Brian Paul void async_resolve(implementation_type& impl, 7025a42f39e362322dbac836c29b76b3104bbfe6f4Brian Paul const query_type& query, Handler& handler) 7125a42f39e362322dbac836c29b76b3104bbfe6f4Brian Paul { 72c5dd2e40e268e40335a47b86b7c4ce201e337a77Brian Paul // Allocate and construct an operation to wrap the handler. 731f34e1a6cbac4b96d07a3d6d01bc443d5282add4Brian Paul typedef resolve_op<Protocol, Handler> op; 7425a42f39e362322dbac836c29b76b3104bbfe6f4Brian Paul typename op::ptr p = { asio::detail::addressof(handler), 7525a42f39e362322dbac836c29b76b3104bbfe6f4Brian Paul asio_handler_alloc_helpers::allocate( 7625a42f39e362322dbac836c29b76b3104bbfe6f4Brian Paul sizeof(op), handler), 0 }; 7725a42f39e362322dbac836c29b76b3104bbfe6f4Brian Paul p.p = new (p.v) op(impl, query, io_service_impl_, handler); 7813682d959ddacde1ce65843aa8c5b43dc9017b32Brian 7913682d959ddacde1ce65843aa8c5b43dc9017b32Brian ASIO_HANDLER_CREATION((p.p, "resolver", &impl, "async_resolve")); 8021ff00306131cd5598f95285badaaabc98021e11José Fonseca 8113682d959ddacde1ce65843aa8c5b43dc9017b32Brian start_resolve_op(p.p); 821f34e1a6cbac4b96d07a3d6d01bc443d5282add4Brian Paul p.v = p.p = 0; 8325a42f39e362322dbac836c29b76b3104bbfe6f4Brian Paul } 844528287e040415c2071012d02f20979ff995c754Keith Whitwell 854528287e040415c2071012d02f20979ff995c754Keith Whitwell // Resolve an endpoint to a list of entries. 8625a42f39e362322dbac836c29b76b3104bbfe6f4Brian Paul iterator_type resolve(implementation_type&, 8725a42f39e362322dbac836c29b76b3104bbfe6f4Brian Paul const endpoint_type& endpoint, asio::error_code& ec) 8825a42f39e362322dbac836c29b76b3104bbfe6f4Brian Paul { 894528287e040415c2071012d02f20979ff995c754Keith Whitwell char host_name[NI_MAXHOST]; 9025a42f39e362322dbac836c29b76b3104bbfe6f4Brian Paul char service_name[NI_MAXSERV]; 914528287e040415c2071012d02f20979ff995c754Keith Whitwell socket_ops::sync_getnameinfo(endpoint.data(), endpoint.size(), 92864abce57d3b81d0f92673472959b71e09c4f245Brian host_name, NI_MAXHOST, service_name, NI_MAXSERV, 93864abce57d3b81d0f92673472959b71e09c4f245Brian endpoint.protocol().type(), ec); 9425a42f39e362322dbac836c29b76b3104bbfe6f4Brian Paul 9525a42f39e362322dbac836c29b76b3104bbfe6f4Brian Paul return ec ? iterator_type() : iterator_type::create( 9625a42f39e362322dbac836c29b76b3104bbfe6f4Brian Paul endpoint, host_name, service_name); 9725a42f39e362322dbac836c29b76b3104bbfe6f4Brian Paul } 981f34e1a6cbac4b96d07a3d6d01bc443d5282add4Brian Paul 9925a42f39e362322dbac836c29b76b3104bbfe6f4Brian Paul // Asynchronously resolve an endpoint to a list of entries. 10025a42f39e362322dbac836c29b76b3104bbfe6f4Brian Paul template <typename Handler> 10125a42f39e362322dbac836c29b76b3104bbfe6f4Brian Paul void async_resolve(implementation_type& impl, 10225a42f39e362322dbac836c29b76b3104bbfe6f4Brian Paul const endpoint_type& endpoint, Handler& handler) 10325a42f39e362322dbac836c29b76b3104bbfe6f4Brian Paul { 10425a42f39e362322dbac836c29b76b3104bbfe6f4Brian Paul // Allocate and construct an operation to wrap the handler. 10525a42f39e362322dbac836c29b76b3104bbfe6f4Brian Paul typedef resolve_endpoint_op<Protocol, Handler> op; 1064528287e040415c2071012d02f20979ff995c754Keith Whitwell typename op::ptr p = { asio::detail::addressof(handler), 107df87fb59136eb302d72eac4b58fd8ffb25989ed5Brian Paul asio_handler_alloc_helpers::allocate( 1081f34e1a6cbac4b96d07a3d6d01bc443d5282add4Brian Paul sizeof(op), handler), 0 }; 109df87fb59136eb302d72eac4b58fd8ffb25989ed5Brian Paul p.p = new (p.v) op(impl, endpoint, io_service_impl_, handler); 110df87fb59136eb302d72eac4b58fd8ffb25989ed5Brian Paul 111df87fb59136eb302d72eac4b58fd8ffb25989ed5Brian Paul ASIO_HANDLER_CREATION((p.p, "resolver", &impl, "async_resolve")); 1121f34e1a6cbac4b96d07a3d6d01bc443d5282add4Brian Paul 11313682d959ddacde1ce65843aa8c5b43dc9017b32Brian start_resolve_op(p.p); 114a380f98b6cc1da78d0845746ab86c3490a800126Brian p.v = p.p = 0; 11513682d959ddacde1ce65843aa8c5b43dc9017b32Brian } 1165d69aeb0028f44d06093faede5c545908b0df89aBrian}; 1175d69aeb0028f44d06093faede5c545908b0df89aBrian 1181f34e1a6cbac4b96d07a3d6d01bc443d5282add4Brian Paul} // namespace detail 119c5dd2e40e268e40335a47b86b7c4ce201e337a77Brian Paul} // namespace asio 1201f34e1a6cbac4b96d07a3d6d01bc443d5282add4Brian Paul 1211f34e1a6cbac4b96d07a3d6d01bc443d5282add4Brian Paul#include "asio/detail/pop_options.hpp" 1228a619e62bffa6f21330df747940e322909937806Michal Krol 12325a42f39e362322dbac836c29b76b3104bbfe6f4Brian Paul 1241f34e1a6cbac4b96d07a3d6d01bc443d5282add4Brian Paul#endif // ASIO_DETAIL_RESOLVER_SERVICE_HPP 1258a619e62bffa6f21330df747940e322909937806Michal Krol