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