/////////////////////////////////////////////////////////////////////////////// // Copyright (c) Lewis Baker // Licenced under MIT license. See LICENSE.txt for details. /////////////////////////////////////////////////////////////////////////////// #include #if CPPCORO_OS_WINNT # ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN # endif # include bool cppcoro::file_write_operation_impl::try_start( cppcoro::detail::win32_overlapped_operation_base& operation) noexcept { const DWORD numberOfBytesToWrite = m_byteCount <= 0xFFFFFFFF ? static_cast(m_byteCount) : DWORD(0xFFFFFFFF); DWORD numberOfBytesWritten = 0; BOOL ok = ::WriteFile( m_fileHandle, m_buffer, numberOfBytesToWrite, &numberOfBytesWritten, operation.get_overlapped()); const DWORD errorCode = ok ? ERROR_SUCCESS : ::GetLastError(); if (errorCode != ERROR_IO_PENDING) { // Completed synchronously. // // We are assuming that the file-handle has been set to the // mode where synchronous completions do not post a completion // event to the I/O completion port and thus can return without // suspending here. operation.m_errorCode = errorCode; operation.m_numberOfBytesTransferred = numberOfBytesWritten; return false; } return true; } void cppcoro::file_write_operation_impl::cancel( cppcoro::detail::win32_overlapped_operation_base& operation) noexcept { (void)::CancelIoEx(m_fileHandle, operation.get_overlapped()); } #endif // CPPCORO_OS_WINNT