diff options
author | crupest <crupest@outlook.com> | 2022-02-02 23:23:23 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2022-02-02 23:23:23 +0800 |
commit | 2cf2f297c00ad262ddcbe56d38fdd45dffb7e342 (patch) | |
tree | 340e02ea8e77ef153219837ca39e1e4e0b916fe6 /src | |
parent | 35b72a2f3215cf9644508581f0af8bde2ed753a8 (diff) | |
download | cru-2cf2f297c00ad262ddcbe56d38fdd45dffb7e342.tar.gz cru-2cf2f297c00ad262ddcbe56d38fdd45dffb7e342.tar.bz2 cru-2cf2f297c00ad262ddcbe56d38fdd45dffb7e342.zip |
...
Diffstat (limited to 'src')
-rw-r--r-- | src/common/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/common/platform/win/BridgeComStream.cpp | 98 |
2 files changed, 99 insertions, 0 deletions
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 200ea7fa..3294b2f0 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -34,6 +34,7 @@ endif() if (WIN32) target_sources(cru_base PRIVATE + platform/win/BridgeComStream.cpp platform/win/Win32FileStream.cpp platform/win/Exception.cpp ) diff --git a/src/common/platform/win/BridgeComStream.cpp b/src/common/platform/win/BridgeComStream.cpp new file mode 100644 index 00000000..eaa53b92 --- /dev/null +++ b/src/common/platform/win/BridgeComStream.cpp @@ -0,0 +1,98 @@ +#include "cru/common/io/Stream.hpp" +#include "cru/common/platform/win/BrigdeComStream.hpp" + +namespace cru::platform::win { +BridgeComStream::BridgeComStream(io::Stream *stream) + : stream_(stream), ref_count_(1) {} + +BridgeComStream::~BridgeComStream() {} + +ULONG BridgeComStream::AddRef() { return ++ref_count_; } + +ULONG BridgeComStream::Release() { + --ref_count_; + + if (ref_count_ == 0) { + delete this; + return 0; + } + + return ref_count_; +} + +HRESULT BridgeComStream::QueryInterface(const IID &riid, void **ppvObject) { + if (riid == IID_IStream) { + *ppvObject = static_cast<IStream *>(this); + AddRef(); + return S_OK; + } else if (riid == IID_ISequentialStream) { + *ppvObject = static_cast<ISequentialStream *>(this); + AddRef(); + return S_OK; + } else if (riid == IID_IUnknown) { + *ppvObject = static_cast<IUnknown *>(this); + AddRef(); + return S_OK; + } else { + return E_NOINTERFACE; + } +} + +HRESULT BridgeComStream::Read(void *pv, ULONG cb, ULONG *pcbRead) { + *pcbRead = stream_->Read(static_cast<std::byte *>(pv), cb); + return S_OK; +} + +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) { + io::Stream::SeekOrigin so = + dwOrigin == STREAM_SEEK_SET + ? io::Stream::SeekOrigin::Begin + : (STREAM_SEEK_CUR ? io::Stream::SeekOrigin::Current + : io::Stream::SeekOrigin::End); + + stream_->Seek(dlibMove.QuadPart, so); + plibNewPosition->QuadPart = stream_->Tell(); + + return S_OK; +} + +HRESULT BridgeComStream::SetSize(ULARGE_INTEGER libNewSize) { + return E_NOTIMPL; +} + +HRESULT BridgeComStream::CopyTo(IStream *pstm, ULARGE_INTEGER cb, + ULARGE_INTEGER *pcbRead, + ULARGE_INTEGER *pcbWritten) { + return E_NOTIMPL; +} + +HRESULT BridgeComStream::Commit(DWORD grfCommitFlags) { return S_OK; } + +HRESULT BridgeComStream::Revert() { return S_OK; } + +HRESULT BridgeComStream::LockRegion(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, + DWORD dwLockType) { + return S_OK; +} + +HRESULT BridgeComStream::UnlockRegion(ULARGE_INTEGER libOffset, + ULARGE_INTEGER cb, DWORD dwLockType) { + return S_OK; +} + +HRESULT BridgeComStream::Stat(STATSTG *pstatstg, DWORD grfStatFlag) { + return E_NOTIMPL; +} + +HRESULT BridgeComStream::Clone(IStream **ppstm) { + *ppstm = new BridgeComStream(stream_); + return S_OK; +} + +} // namespace cru::platform::win |