Chris@16: // Chris@16: // basic_socket_streambuf.hpp Chris@16: // ~~~~~~~~~~~~~~~~~~~~~~~~~~ Chris@16: // Chris@101: // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com) Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: // Chris@16: Chris@16: #ifndef BOOST_ASIO_BASIC_SOCKET_STREAMBUF_HPP Chris@16: #define BOOST_ASIO_BASIC_SOCKET_STREAMBUF_HPP Chris@16: Chris@16: #if defined(_MSC_VER) && (_MSC_VER >= 1200) Chris@16: # pragma once Chris@16: #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) Chris@16: Chris@16: #include Chris@16: Chris@16: #if !defined(BOOST_ASIO_NO_IOSTREAM) Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #if defined(BOOST_ASIO_HAS_BOOST_DATE_TIME) Chris@16: # include Chris@16: #else Chris@16: # include Chris@16: #endif Chris@16: Chris@16: #if !defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES) Chris@16: Chris@16: # include Chris@16: Chris@16: // A macro that should expand to: Chris@16: // template Chris@16: // basic_socket_streambuf* connect( Chris@16: // T1 x1, ..., Tn xn) Chris@16: // { Chris@16: // init_buffers(); Chris@16: // this->basic_socket::close(ec_); Chris@16: // typedef typename Protocol::resolver resolver_type; Chris@16: // typedef typename resolver_type::query resolver_query; Chris@16: // resolver_query query(x1, ..., xn); Chris@16: // resolve_and_connect(query); Chris@16: // return !ec_ ? this : 0; Chris@16: // } Chris@16: // This macro should only persist within this file. Chris@16: Chris@16: # define BOOST_ASIO_PRIVATE_CONNECT_DEF(n) \ Chris@16: template \ Chris@16: basic_socket_streambuf* connect(BOOST_ASIO_VARIADIC_PARAMS(n)) \ Chris@16: { \ Chris@16: init_buffers(); \ Chris@16: this->basic_socket::close(ec_); \ Chris@16: typedef typename Protocol::resolver resolver_type; \ Chris@16: typedef typename resolver_type::query resolver_query; \ Chris@16: resolver_query query(BOOST_ASIO_VARIADIC_ARGS(n)); \ Chris@16: resolve_and_connect(query); \ Chris@16: return !ec_ ? this : 0; \ Chris@16: } \ Chris@16: /**/ Chris@16: Chris@16: #endif // !defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES) Chris@16: Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: namespace asio { Chris@16: namespace detail { Chris@16: Chris@16: // A separate base class is used to ensure that the io_service is initialised Chris@16: // prior to the basic_socket_streambuf's basic_socket base class. Chris@16: class socket_streambuf_base Chris@16: { Chris@16: protected: Chris@16: io_service io_service_; Chris@16: }; Chris@16: Chris@16: } // namespace detail Chris@16: Chris@16: /// Iostream streambuf for a socket. Chris@16: template , Chris@16: #if defined(BOOST_ASIO_HAS_BOOST_DATE_TIME) \ Chris@16: || defined(GENERATING_DOCUMENTATION) Chris@16: typename Time = boost::posix_time::ptime, Chris@16: typename TimeTraits = boost::asio::time_traits