2
3
6
7
8
9
13#include <restinio/impl/include_fmtlib.hpp>
15#include <restinio/asio_include.hpp>
16#include <restinio/string_view.hpp>
17#include <restinio/exception.hpp>
19#include <restinio/detect_os.hpp>
27
28
29
30
31
33#if defined(RESTINIO_OS_WINDOWS)
34 #include "sendfile_defs_win.hpp"
35#elif defined(RESTINIO_OS_UNIX
) || defined(RESTINIO_OS_APPLE)
36 #include "sendfile_defs_posix.hpp"
38 #if defined (RESTINIO_ENABLE_SENDFILE_DEFAULT_IMPL)
39 #include "sendfile_defs_default.hpp"
41 #error "Sendfile not supported, to enable default implementation define RESTINIO_ENABLE_SENDFILE_DEFAULT_IMPL macro"
62
63
64
65
66
71
72
73
74
75 static constexpr file_size_t
78 if( 0 == chunk_size_value )
84 return chunk_size_value;
108
109
110
111
193 std::swap( r.m_last_modified_at, l.m_last_modified_at );
200 file_size_t file_total_size,
201 std::chrono::system_clock::time_point last_modified_at )
noexcept
226
227
228
229
230
236 file_size_t )
noexcept;
259 swap( left.m_meta, right.m_meta );
263 swap( left.m_timelimit, right.m_timelimit );
267
268
275
276
316
317
318
319
320
321
322
323
327 file_offset_t offset_value,
328 file_size_t size_value = std::numeric_limits< file_size_t >::max() ) &
332 if(
static_cast< file_size_t >( offset_value ) > m_meta.file_total_size() )
337 "invalid file offset: {}, while file size is {}" ),
339 m_meta.file_total_size() ) };
344 std::min< file_size_t >(
345 m_meta.file_total_size() -
static_cast< file_size_t >( offset_value ),
353 file_offset_t offset_value,
354 file_size_t size_value = std::numeric_limits< file_size_t >::max() ) &&
364
365
366
389
390
391
394 timelimit( std::chrono::steady_clock::duration timelimit_value ) &
398 m_timelimit = std::max( timelimit_value, std::chrono::steady_clock::duration::zero() );
403 timelimit( std::chrono::steady_clock::duration timelimit_value ) &&
405 return std::move(
this->timelimit( timelimit_value ) );
419
420
421
422
423
424
425
426
427
428
429
464
465
474
475
476
477
489 return sendfile_t{ std::move( fd ), meta, chunk_size };
496 const char * file_path,
504 return sendfile( std::move( fd ), meta, chunk_size );
511 const std::string & file_path,
515 return sendfile( file_path.c_str(), chunk_size );
522 string_view_t file_path,
528 std::string{ file_path.data(), file_path.size() }
,
534
535
540 const std::filesystem::path & file_path,
548 return sendfile( std::move( fd ), meta, chunk_size );
Exception class for all exceptions thrown by RESTinio.
exception_t(const char *err)
Wrapper class for working with native file handler.
file_descriptor_holder_t & operator=(const file_descriptor_holder_t &)=delete
~file_descriptor_holder_t() noexcept
file_descriptor_holder_t(file_descriptor_holder_t &&fdh) noexcept
file_descriptor_holder_t & operator=(file_descriptor_holder_t &&fdh) noexcept
friend void swap(file_descriptor_holder_t &left, file_descriptor_holder_t &right) noexcept
Swap two descriptors.
file_descriptor_t m_file_descriptor
Target file descriptor.
bool is_valid() const noexcept
Check if file descriptor is valid.
file_descriptor_holder_t(const file_descriptor_holder_t &)=delete
file_descriptor_t fd() const noexcept
file_descriptor_holder_t(file_descriptor_t fd) noexcept
Init constructor.
A guard class for setting chunk size.
static constexpr file_size_t clarify_chunk_size(file_size_t chunk_size_value) noexcept
Checks chunk_size_value and returns a value in [1, sendfile_max_chunk_size].
constexpr sendfile_chunk_size_guarded_value_t(file_size_t chunk_size_value) noexcept
constexpr auto value() const noexcept
Get the valid value of a chunk size.
const file_size_t m_chunk_size
Valid value of the chunk size.
Send file write operation description.
friend file_descriptor_holder_t takeaway_file_descriptor(sendfile_t &target)
Take away the file description form sendfile object.
sendfile_t && chunk_size(sendfile_chunk_size_guarded_value_t chunk) &&
Set prefered chunk size to use in write operation.
void check_file_is_valid() const
Check if stored file descriptor is valid, and throws if it is not.
file_meta_t m_meta
File meta data.
file_descriptor_holder_t m_file_descriptor
Native file descriptor.
sendfile_t & offset_and_size(file_offset_t offset_value, file_size_t size_value=std::numeric_limits< file_size_t >::max()) &
sendfile_t & timelimit(std::chrono::steady_clock::duration timelimit_value) &
file_descriptor_t file_descriptor() const noexcept
Get the file descriptor of a given sendfile operation.
sendfile_t && timelimit(std::chrono::steady_clock::duration timelimit_value) &&
sendfile_t & chunk_size(sendfile_chunk_size_guarded_value_t chunk) &
file_size_t m_chunk_size
A prefered chunk size for a single write call.
auto size() const noexcept
Get size of data to write.
friend void swap(sendfile_t &left, sendfile_t &right) noexcept
auto chunk_size() const noexcept
sendfile_t && offset_and_size(file_offset_t offset_value, file_size_t size_value=std::numeric_limits< file_size_t >::max()) &&
auto timelimit() const noexcept
sendfile_t(file_descriptor_holder_t fdh, file_meta_t meta, sendfile_chunk_size_guarded_value_t chunk) noexcept
bool is_valid() const noexcept
Check if file is valid.
sendfile_t(const sendfile_t &)=delete
sendfile_t & operator=(const sendfile_t &)=delete
sendfile_t(sendfile_t &&sf) noexcept
sendfile_t & operator=(sendfile_t &&sf) noexcept
file_offset_t m_offset
Data offset within the file.
friend sendfile_t sendfile(file_descriptor_holder_t, file_meta_t, file_size_t) noexcept
const file_meta_t & meta() const
Get file meta data.
auto offset() const noexcept
Get offset of data to write.
std::chrono::steady_clock::duration m_timelimit
Timelimit for writing all the given data.
file_size_t m_size
The size of data portion in file.
#define RESTINIO_FMT_FORMAT_STRING(s)
constexpr file_size_t sendfile_max_chunk_size
Maximum size of a chunk.
sendfile_t sendfile(const std::filesystem::path &file_path, file_size_t chunk_size=sendfile_default_chunk_size)
sendfile_t sendfile(const std::string &file_path, file_size_t chunk_size=sendfile_default_chunk_size)
constexpr file_descriptor_t null_file_descriptor()
Get file descriptor which stands for null.
sendfile_t sendfile(const char *file_path, file_size_t chunk_size=sendfile_default_chunk_size)
file_descriptor_t open_file(const char *file_path)
Open file.
std::FILE * file_descriptor_t
constexpr file_size_t sendfile_default_chunk_size
Default chunk size for sendfile operation.
sendfile_t sendfile(string_view_t file_path, file_size_t chunk_size=sendfile_default_chunk_size)