30#if defined( _MSC_VER ) || defined(__MINGW32__)
32#elif (defined( __clang__ ) || defined( __GNUC__ )) && !defined(__WIN32__)
35 #if defined (RESTINIO_ENABLE_SENDFILE_DEFAULT_IMPL)
38 #error "Sendfile not supported, to enable default implementation define RESTINIO_ENABLE_SENDFILE_DEFAULT_IMPL macro"
75 if( 0 == chunk_size_value )
81 return chunk_size_value;
116 swap( left.m_file_descriptor, right.m_file_descriptor );
188 std::swap( r.m_file_total_size, l.m_file_total_size );
189 std::swap( r.m_last_modified_at, l.m_last_modified_at );
252 swap( left.m_file_descriptor, right.m_file_descriptor );
253 swap( left.m_meta, right.m_meta );
254 swap( left.m_offset, right.m_offset );
255 swap( left.m_size, right.m_size );
256 swap( left.m_chunk_size, right.m_chunk_size );
257 swap( left.m_timelimit, right.m_timelimit );
321 file_size_t size_value = std::numeric_limits< file_size_t >::max() ) &
329 "invalid file offset: {}, while file size is {}",
336 std::min< file_size_t >(
346 file_size_t size_value = std::numeric_limits< file_size_t >::max() ) &&
384 timelimit( std::chrono::steady_clock::duration timelimit_value ) &
393 timelimit( std::chrono::steady_clock::duration timelimit_value ) &&
482 const char * file_path,
488 auto meta = get_file_meta< file_meta_t >( fd.fd() );
496 const std::string & file_path,
500 return sendfile( file_path.c_str(), chunk_size );
512 std::string{ file_path.data(), file_path.size() },
Exception class for all exceptions thrown by RESTinio.
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
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
file_offset_t m_offset
Data offset within the file.
const file_meta_t & meta() const
Get file meta data.
auto offset() const noexcept
Get offset of data to write.
friend sendfile_t sendfile(file_descriptor_holder_t, file_meta_t, file_size_t) noexcept
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.
A special wrapper around fmtlib include files.
void swap(optional< T > &x, optional< T > &y)
constexpr underlying_uint_t zero
The minimal allowed value for a qvalue.
constexpr file_size_t sendfile_max_chunk_size
Maximum size of a chunk.
sendfile_t sendfile(file_descriptor_holder_t fd, file_meta_t meta, file_size_t chunk_size=sendfile_default_chunk_size) noexcept
constexpr file_descriptor_t null_file_descriptor()
Get file descriptor which stands for null.
std::uint64_t file_size_t
nonstd::string_view string_view_t
void close_file(file_descriptor_t fd)
Close file by its descriptor.
std::int64_t file_offset_t
std::FILE * file_descriptor_t
file_descriptor_t open_file(const char *file_path)
Open file.
constexpr file_size_t sendfile_default_chunk_size
Default chunk size for sendfile operation.