2 // Copyright (c) 2013-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
8 #ifndef BEAST_WEBSOCKET_IMPL_TEARDOWN_IPP
9 #define BEAST_WEBSOCKET_IMPL_TEARDOWN_IPP
11 #include <beast/core/async_completion.hpp>
12 #include <beast/core/handler_concepts.hpp>
13 #include <beast/core/handler_helpers.hpp>
14 #include <beast/core/handler_ptr.hpp>
22 template<class Handler>
26 boost::asio::ip::tcp::socket;
35 data(Handler& handler, socket_type& socket_)
36 : cont(beast_asio_helpers::
37 is_continuation(handler))
43 handler_ptr<data, Handler> d_;
46 template<class DeducedHandler>
50 : d_(std::forward<DeducedHandler>(h), socket)
52 (*this)(error_code{}, 0, false);
56 operator()(error_code ec, std::size_t, bool again = true);
59 void* asio_handler_allocate(std::size_t size,
62 return beast_asio_helpers::
63 allocate(size, op->d_.handler());
67 void asio_handler_deallocate(void* p,
68 std::size_t size, teardown_tcp_op* op)
70 return beast_asio_helpers::
71 deallocate(p, size, op->d_.handler());
75 bool asio_handler_is_continuation(teardown_tcp_op* op)
80 template<class Function>
82 void asio_handler_invoke(Function&& f,
85 return beast_asio_helpers::
86 invoke(f, op->d_.handler());
90 template<class Handler>
92 teardown_tcp_op<Handler>::
93 operator()(error_code ec, std::size_t, bool again)
95 using boost::asio::buffer;
97 d.cont = d.cont || again;
105 boost::asio::ip::tcp::socket::shutdown_send, ec);
109 d.socket.async_read_some(
110 buffer(d.buf), std::move(*this));
114 if(ec == boost::asio::error::eof)
124 //------------------------------------------------------------------------------
128 teardown(teardown_tag,
129 boost::asio::ip::tcp::socket& socket,
132 using boost::asio::buffer;
134 boost::asio::ip::tcp::socket::shutdown_send, ec);
138 auto const n = socket.read_some(
143 if(ec == boost::asio::error::eof)
148 template<class TeardownHandler>
151 async_teardown(teardown_tag,
152 boost::asio::ip::tcp::socket& socket,
153 TeardownHandler&& handler)
155 static_assert(beast::is_CompletionHandler<
156 TeardownHandler, void(error_code)>::value,
157 "TeardownHandler requirements not met");
158 detail::teardown_tcp_op<typename std::decay<
159 TeardownHandler>::type>{std::forward<
160 TeardownHandler>(handler), socket};