9#if defined(RESTINIO_ASIO_HAS_WINDOWS_OVERLAPPED_PTR)
24#if RESTINIO_ASIO_VERSION < 101300
26template<
typename Socket >
28executor_or_context_from_socket( Socket & socket )
30 return socket.get_executor().context();
35template<
typename Socket >
37executor_or_context_from_socket( Socket & socket )
39 return socket.get_executor();
51template <
typename Socket >
52class 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(
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();
209class 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();
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),
after_sendfile_cb_t m_after_sendfile_cb
const file_size_t m_chunk_size
file_size_t m_remained_size
file_offset_t m_next_write_offset
file_descriptor_t m_file_descriptor
default_asio_executor m_executor
file_size_t m_transfered_size
std::unique_ptr< char[] > m_buffer
auto make_async_write_handler() noexcept
Helper method for making a lambda for async_write completion handler.
virtual void start() override
sendfile_operation_runner_t(const sendfile_operation_runner_t &)=delete
sendfile_operation_runner_base_t< Socket > base_type_t
sendfile_operation_runner_t & operator=(const sendfile_operation_runner_t &)=delete
void init_next_write() noexcept
std::function< void(const asio_ns::error_code &, file_size_t) > after_sendfile_cb_t
Callback type for invocation when sendfile operation completes.
auto make_error_code(const Error_Type &e) noexcept
constexpr http_status_code_t ok
std::size_t uint64_to_size_t(std::uint64_t v)
Helper function for truncating uint64 to std::size_t with exception if that truncation will lead to d...
asio_ns::executor default_asio_executor
@ async_read_some_at_call_failed
A call to async_read_some_at failed. The corresponding sendfile operation wasn't done.
@ async_write_call_failed
A call to async_write failed. The corresponding write operation wasn't done.
constexpr const_buffer_t const_buffer(const void *str, std::size_t size) noexcept
asio_ns::error_code make_asio_compaible_error(asio_convertible_error_t err) noexcept
Make restinio error_code compatible with asio_ns::error_code.
Helpers for safe truncation of unsigned integers.