blob: 1fa33515c6f0b859669618e6c8671042fcd27556 [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));
55 this->m_connectTimer.async_wait(bind(&Impl::connectTimeoutHandler, this, _1));
56
57 // typename boost::asio::ip::basic_resolver< Protocol > resolver;
58 auto resolver = make_shared<typename Protocol::resolver>(ref(this->m_socket.get_io_service()));
59 resolver->async_resolve(query, bind(&Impl::resolveHandler, this, _1, _2, resolver));
60 }
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
81 this->m_socket.async_connect(*endpoint, bind(&Impl::connectHandler, this, _1));
82 }
83};
84
85
86} // namespace ndn
87
88#endif // NDN_TRANSPORT_STREAM_TRANSPORT_WITH_RESOLVER_IMPL_HPP