blob: ede844415bf21be1dad8f2a7bc84b7d248917188 [file] [log] [blame]
Junxiao Shi446de3c2016-07-25 22:38:16 +00001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
3 * Copyright (c) 2013-2016 Regents of the University of California.
4 *
5 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
6 *
7 * ndn-cxx library is free software: you can redistribute it and/or modify it under the
8 * terms of the GNU Lesser General Public License as published by the Free Software
9 * Foundation, either version 3 of the License, or (at your option) any later version.
10 *
11 * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
14 *
15 * You should have received copies of the GNU General Public License and GNU Lesser
16 * General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
17 * <http://www.gnu.org/licenses/>.
18 *
19 * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
20 */
21
22#ifndef NDN_TRANSPORT_STREAM_TRANSPORT_WITH_RESOLVER_IMPL_HPP
23#define NDN_TRANSPORT_STREAM_TRANSPORT_WITH_RESOLVER_IMPL_HPP
24
25#include "stream-transport-impl.hpp"
26
27namespace ndn {
28
29/** \brief implementation detail of a Boost.Asio-based stream-oriented transport
30 * with resolver support
31 */
32template<typename BaseTransport, typename Protocol>
33class StreamTransportWithResolverImpl : public StreamTransportImpl<BaseTransport, Protocol>
34{
35public:
36 typedef StreamTransportWithResolverImpl<BaseTransport,Protocol> Impl;
37
38 StreamTransportWithResolverImpl(BaseTransport& transport, boost::asio::io_service& ioService)
39 : StreamTransportImpl<BaseTransport, Protocol>(transport, ioService)
40 {
41 }
42
43 void
44 connect(const typename Protocol::resolver::query& query)
45 {
46 if (this->m_isConnecting) {
47 return;
48 }
49
50 this->m_isConnecting = true;
51
52 // Wait at most 4 seconds to connect
53 /// @todo Decide whether this number should be configurable
54 this->m_connectTimer.expires_from_now(boost::posix_time::seconds(4));
Junxiao Shi8c565382016-07-25 23:04:49 +000055 this->m_connectTimer.async_wait(bind(&Impl::connectTimeoutHandler, this->shared_from_this(), _1));
Junxiao Shi446de3c2016-07-25 22:38:16 +000056
57 // typename boost::asio::ip::basic_resolver< Protocol > resolver;
58 auto resolver = make_shared<typename Protocol::resolver>(ref(this->m_socket.get_io_service()));
Junxiao Shi8c565382016-07-25 23:04:49 +000059 resolver->async_resolve(query, bind(&Impl::resolveHandler, this->shared_from_base(), _1, _2, resolver));
Junxiao Shi446de3c2016-07-25 22:38:16 +000060 }
61
62protected:
63 void
64 resolveHandler(const boost::system::error_code& error,
65 typename Protocol::resolver::iterator endpoint,
66 const shared_ptr<typename Protocol::resolver>&)
67 {
68 if (error) {
69 if (error == boost::system::errc::operation_canceled)
70 return;
71
72 BOOST_THROW_EXCEPTION(Transport::Error(error, "Error during resolution of host or port"));
73 }
74
75 typename Protocol::resolver::iterator end;
76 if (endpoint == end) {
77 this->m_transport.close();
78 BOOST_THROW_EXCEPTION(Transport::Error(error, "Unable to resolve because host or port"));
79 }
80
Junxiao Shi8c565382016-07-25 23:04:49 +000081 this->m_socket.async_connect(*endpoint, bind(&Impl::connectHandler, this->shared_from_this(), _1));
82 }
83
84private:
85 shared_ptr<Impl>
86 shared_from_base()
87 {
88 return static_pointer_cast<Impl>(this->shared_from_this());
Junxiao Shi446de3c2016-07-25 22:38:16 +000089 }
90};
91
92
93} // namespace ndn
94
95#endif // NDN_TRANSPORT_STREAM_TRANSPORT_WITH_RESOLVER_IMPL_HPP