aboutsummaryrefslogtreecommitdiff
path: root/src/base/platform/win
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/platform/win')
-rw-r--r--src/base/platform/win/BridgeComStream.cpp36
-rw-r--r--src/base/platform/win/Stream.cpp32
-rw-r--r--src/base/platform/win/Win32SubProcess.cpp6
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>