9 #if defined(RESTINIO_ASIO_HAS_WINDOWS_OVERLAPPED_PTR)
21 namespace asio_details
24 #if RESTINIO_ASIO_VERSION < 101300
26 template<
typename Socket >
28 executor_or_context_from_socket( Socket & socket )
30 return socket.get_executor().context();
35 template<
typename Socket >
37 executor_or_context_from_socket( Socket & socket )
39 return socket.get_executor();
51 template <
typename Socket >
52 class sendfile_operation_runner_t final
53 :
public sendfile_operation_runner_base_t< Socket >
56 using base_type_t = sendfile_operation_runner_base_t< Socket >;
75 takeaway_file_descriptor(sf).release();
81 init_next_read_some_from_file();
89 init_next_read_some_from_file() noexcept
91 const auto desired_size =
96 this->m_file_handle.async_read_some_at(
100 static_cast< std::size_t
>( desired_size ) ),
101 asio_ns::bind_executor(
103 make_async_read_some_at_handler() ) );
123 asio_ns::async_write(
127 static_cast< std::size_t
>( len ) },
128 asio_ns::bind_executor(
136 asio_convertible_error_t::async_write_call_failed ),
143 asio_ns::windows::random_access_handle m_file_handle{
144 asio_details::executor_or_context_from_socket(this->
m_socket),
149 make_async_read_some_at_handler() noexcept
151 return [
this, ctx = this->shared_from_this()]
153 (
const asio_ns::error_code & ec, std::size_t len ) noexcept
180 return [
this, ctx = this->shared_from_this() ]
182 (
const asio_ns::error_code & ec, std::size_t written ) noexcept
196 this->init_next_read_some_from_file();
209 class sendfile_operation_runner_t < asio_ns::ip::tcp::socket > final
210 :
public sendfile_operation_runner_base_t< asio_ns::ip::tcp::socket >
213 make_completion_handler() noexcept
215 return [
this, ctx = shared_from_this() ]
217 (
const asio_ns::error_code & ec, std::size_t written )
252 asio_ns::ip::tcp::socket & socket,
261 takeaway_file_descriptor(sf).release();
282 asio_ns::windows::overlapped_ptr overlapped{
283 asio_details::executor_or_context_from_socket(
m_socket ),
284 asio_ns::bind_executor(
286 make_completion_handler() )
290 overlapped.get()->Offset =
292 overlapped.get()->OffsetHigh =
296 const auto desired_size =
303 m_file_handle.native_handle(),
304 static_cast< DWORD
>( desired_size ),
310 DWORD last_error = ::GetLastError();
313 if( !
ok && last_error != ERROR_IO_PENDING )
324 overlapped.release();
332 asio_convertible_error_t::async_write_call_failed ),
339 std::make_unique< char[] >(
343 asio_ns::windows::random_access_handle m_file_handle{
344 asio_details::executor_or_context_from_socket(
m_socket),
353 #else // #if defined(RESTINIO_ASIO_HAS_WINDOWS_OVERLAPPED_PTR)
357 #endif // #if defined(RESTINIO_ASIO_HAS_WINDOWS_OVERLAPPED_PTR)