diff options
Diffstat (limited to 'src/base/platform/win')
| -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 |
3 files changed, 45 insertions, 29 deletions
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> |
