diff options
Diffstat (limited to 'src/base/platform')
| -rw-r--r-- | src/base/platform/unix/UnixFileStream.cpp | 15 | ||||
| -rw-r--r-- | src/base/platform/win/BridgeComStream.cpp | 36 | ||||
| -rw-r--r-- | src/base/platform/win/Stream.cpp | 32 | ||||
| -rw-r--r-- | src/base/platform/win/Win32SubProcess.cpp | 6 |
4 files changed, 50 insertions, 39 deletions
diff --git a/src/base/platform/unix/UnixFileStream.cpp b/src/base/platform/unix/UnixFileStream.cpp index df1ddffa..aaaa8d6a 100644 --- a/src/base/platform/unix/UnixFileStream.cpp +++ b/src/base/platform/unix/UnixFileStream.cpp @@ -37,7 +37,7 @@ int MapSeekOrigin(Stream::SeekOrigin origin) { } } // namespace -UnixFileStream::UnixFileStream(const char *path, int oflag, mode_t mode) { +UnixFileStream::UnixFileStream(const char* path, int oflag, mode_t mode) { file_descriptor_ = UnixFileDescriptor(::open(path, oflag, mode)); if (file_descriptor_ == -1) { throw ErrnoException(std::format( @@ -52,7 +52,7 @@ UnixFileStream::UnixFileStream(UnixFileDescriptor fd, bool can_seek, bool can_read, bool can_write) : Stream(can_seek, can_read, can_write), file_descriptor_(std::move(fd)) {} -UnixFileStream::~UnixFileStream() { DoClose(); } +UnixFileStream::~UnixFileStream() { file_descriptor_ = {}; } Index UnixFileStream::DoSeek(Index offset, SeekOrigin origin) { off_t result = ::lseek(file_descriptor_, offset, MapSeekOrigin(origin)); @@ -62,7 +62,7 @@ Index UnixFileStream::DoSeek(Index offset, SeekOrigin origin) { return result; } -Index UnixFileStream::DoRead(std::byte *buffer, Index offset, Index size) { +Index UnixFileStream::DoRead(std::byte* buffer, Index offset, Index size) { auto result = ::read(file_descriptor_, buffer + offset, size); if (result == -1) { throw ErrnoException("Failed to read file."); @@ -70,7 +70,7 @@ Index UnixFileStream::DoRead(std::byte *buffer, Index offset, Index size) { return result; } -Index UnixFileStream::DoWrite(const std::byte *buffer, Index offset, +Index UnixFileStream::DoWrite(const std::byte* buffer, Index offset, Index size) { auto result = ::write(file_descriptor_, buffer + offset, size); if (result == -1) { @@ -79,10 +79,5 @@ Index UnixFileStream::DoWrite(const std::byte *buffer, Index offset, return result; } -void UnixFileStream::DoClose() { - CRU_STREAM_BEGIN_CLOSE - if (file_descriptor_) { - file_descriptor_ = {}; - } -} +void UnixFileStream::DoClose() { file_descriptor_ = {}; } } // namespace cru::platform::unix diff --git a/src/base/platform/win/BridgeComStream.cpp b/src/base/platform/win/BridgeComStream.cpp index c6987ab2..921209b4 100644 --- a/src/base/platform/win/BridgeComStream.cpp +++ b/src/base/platform/win/BridgeComStream.cpp @@ -2,7 +2,7 @@ #include "cru/base/io/Stream.h" namespace cru::platform::win { -BridgeComStream::BridgeComStream(io::Stream *stream) +BridgeComStream::BridgeComStream(io::Stream* stream) : stream_(stream), ref_count_(1) {} BridgeComStream::~BridgeComStream() {} @@ -20,17 +20,17 @@ ULONG BridgeComStream::Release() { return ref_count_; } -HRESULT BridgeComStream::QueryInterface(const IID &riid, void **ppvObject) { +HRESULT BridgeComStream::QueryInterface(const IID& riid, void** ppvObject) { if (riid == IID_IStream) { - *ppvObject = static_cast<IStream *>(this); + *ppvObject = static_cast<IStream*>(this); AddRef(); return S_OK; } else if (riid == IID_ISequentialStream) { - *ppvObject = static_cast<ISequentialStream *>(this); + *ppvObject = static_cast<ISequentialStream*>(this); AddRef(); return S_OK; } else if (riid == IID_IUnknown) { - *ppvObject = static_cast<IUnknown *>(this); + *ppvObject = static_cast<IUnknown*>(this); AddRef(); return S_OK; } else { @@ -38,18 +38,22 @@ HRESULT BridgeComStream::QueryInterface(const IID &riid, void **ppvObject) { } } -HRESULT BridgeComStream::Read(void *pv, ULONG cb, ULONG *pcbRead) { - *pcbRead = stream_->Read(static_cast<std::byte *>(pv), cb); - return S_OK; +HRESULT BridgeComStream::Read(void* pv, ULONG cb, ULONG* pcbRead) { + auto count = stream_->Read(static_cast<std::byte*>(pv), cb); + if (count == cru::io::Stream::kEOF) { + count = 0; + } + *pcbRead = count; + return cb == count ? S_OK : S_FALSE; } -HRESULT BridgeComStream::Write(const void *pv, ULONG cb, ULONG *pcbWritten) { - *pcbWritten = stream_->Write(static_cast<const std::byte *>(pv), cb); +HRESULT BridgeComStream::Write(const void* pv, ULONG cb, ULONG* pcbWritten) { + *pcbWritten = stream_->Write(static_cast<const std::byte*>(pv), cb); return S_OK; } HRESULT BridgeComStream::Seek(LARGE_INTEGER dlibMove, DWORD dwOrigin, - ULARGE_INTEGER *plibNewPosition) { + ULARGE_INTEGER* plibNewPosition) { io::Stream::SeekOrigin so; switch (dwOrigin) { @@ -74,9 +78,9 @@ HRESULT BridgeComStream::SetSize(ULARGE_INTEGER libNewSize) { return E_NOTIMPL; } -HRESULT BridgeComStream::CopyTo(IStream *pstm, ULARGE_INTEGER cb, - ULARGE_INTEGER *pcbRead, - ULARGE_INTEGER *pcbWritten) { +HRESULT BridgeComStream::CopyTo(IStream* pstm, ULARGE_INTEGER cb, + ULARGE_INTEGER* pcbRead, + ULARGE_INTEGER* pcbWritten) { return E_NOTIMPL; } @@ -94,11 +98,11 @@ HRESULT BridgeComStream::UnlockRegion(ULARGE_INTEGER libOffset, return S_OK; } -HRESULT BridgeComStream::Stat(STATSTG *pstatstg, DWORD grfStatFlag) { +HRESULT BridgeComStream::Stat(STATSTG* pstatstg, DWORD grfStatFlag) { return E_NOTIMPL; } -HRESULT BridgeComStream::Clone(IStream **ppstm) { +HRESULT BridgeComStream::Clone(IStream** ppstm) { *ppstm = new BridgeComStream(stream_); return S_OK; } diff --git a/src/base/platform/win/Stream.cpp b/src/base/platform/win/Stream.cpp index 10b80a16..611b2ca3 100644 --- a/src/base/platform/win/Stream.cpp +++ b/src/base/platform/win/Stream.cpp @@ -77,7 +77,11 @@ Win32HandleStream::Win32HandleStream(Win32Handle&& handle, bool can_seek, : Win32HandleStream(handle.Release(), true, can_seek, can_read, can_write) { } -Win32HandleStream::~Win32HandleStream() { DoClose(); } +Win32HandleStream::~Win32HandleStream() { + if (handle_ && auto_close_) { + ::CloseHandle(handle_); + } +} Index Win32HandleStream::DoSeek(Index offset, SeekOrigin origin) { DWORD method = 0; @@ -104,10 +108,14 @@ Index Win32HandleStream::DoRead(std::byte* buffer, Index offset, Index size) { &real_read, nullptr); if (r == FALSE) { auto e = ::GetLastError(); - if (e != ERROR_BROKEN_PIPE || e != ERROR_BROKEN_PIPE) { + if (e != ERROR_BROKEN_PIPE && e != ERROR_MORE_DATA) { throw Win32Error(e, "Failed to call ReadFile."); } } + + if (real_read == 0) { + return kEOF; + } return real_read; } @@ -120,13 +128,10 @@ Index Win32HandleStream::DoWrite(const std::byte* buffer, Index offset, } void Win32HandleStream::DoClose() { - CRU_STREAM_BEGIN_CLOSE - if (auto_close_) { ::CloseHandle(handle_); } - - handle_ = {}; + handle_ = nullptr; } IStream* ToComStream(io::Stream* stream) { @@ -185,7 +190,11 @@ ComStream::ComStream(IStream* com_stream, bool auto_release, bool can_seek, stream_(com_stream), auto_release_(auto_release) {} -ComStream::~ComStream() { DoClose(); } +ComStream::~ComStream() { + if (stream_ && auto_release_) { + stream_->Release(); + } +} Index ComStream::DoSeek(Index offset, SeekOrigin origin) { DWORD dwOrigin = 0; @@ -210,6 +219,9 @@ Index ComStream::DoSeek(Index offset, SeekOrigin origin) { Index ComStream::DoRead(std::byte* buffer, Index offset, Index size) { ULONG n_read; CheckHResult(stream_->Read(buffer + offset, size, &n_read)); + if (n_read == 0) { + return kEOF; + } return n_read; } @@ -225,11 +237,9 @@ Index ComStream::DoWrite(const std::byte* buffer, Index offset, Index size) { } void ComStream::DoClose() { - CRU_STREAM_BEGIN_CLOSE - - if (stream_ && auto_release_) { + if (auto_release_) { stream_->Release(); - stream_ = nullptr; } + stream_ = nullptr; } } // namespace cru::platform::win diff --git a/src/base/platform/win/Win32SubProcess.cpp b/src/base/platform/win/Win32SubProcess.cpp index aed3937c..4f268ef3 100644 --- a/src/base/platform/win/Win32SubProcess.cpp +++ b/src/base/platform/win/Win32SubProcess.cpp @@ -1,8 +1,10 @@ #include "cru/base/platform/win/Win32SubProcess.h" -#include <processthreadsapi.h> -#include <synchapi.h> #include "cru/base/StringUtil.h" #include "cru/base/SubProcess.h" +#include "cru/base/io/AutoReadStream.h" + +#include <processthreadsapi.h> +#include <synchapi.h> #include <memory> #include <string_view> |
