diff options
-rw-r--r-- | include/cru/common/io/MemoryStream.hpp | 3 | ||||
-rw-r--r-- | include/cru/common/io/Stream.hpp | 4 | ||||
-rw-r--r-- | include/cru/common/platform/win/Win32FileStream.hpp | 5 | ||||
-rw-r--r-- | src/common/io/MemoryStream.cpp | 5 | ||||
-rw-r--r-- | src/common/io/Stream.cpp | 4 | ||||
-rw-r--r-- | src/common/platform/win/BridgeComStream.cpp | 26 | ||||
-rw-r--r-- | src/common/platform/win/Win32FileStream.cpp | 21 |
7 files changed, 32 insertions, 36 deletions
diff --git a/include/cru/common/io/MemoryStream.hpp b/include/cru/common/io/MemoryStream.hpp index a1be1354..e917814c 100644 --- a/include/cru/common/io/MemoryStream.hpp +++ b/include/cru/common/io/MemoryStream.hpp @@ -23,8 +23,7 @@ class CRU_BASE_API MemoryStream : public Stream { public: bool CanSeek() override; - Index Tell() override; - void Seek(Index offset, SeekOrigin origin = SeekOrigin::Current) override; + Index Seek(Index offset, SeekOrigin origin = SeekOrigin::Current) override; bool CanRead() override; Index Read(std::byte* buffer, Index offset, Index size) override; diff --git a/include/cru/common/io/Stream.hpp b/include/cru/common/io/Stream.hpp index 78beba21..131e82e9 100644 --- a/include/cru/common/io/Stream.hpp +++ b/include/cru/common/io/Stream.hpp @@ -21,8 +21,8 @@ class CRU_BASE_API Stream : public Object { public: virtual bool CanSeek() = 0; - virtual Index Tell() = 0; - virtual void Seek(Index offset, SeekOrigin origin = SeekOrigin::Current) = 0; + virtual Index Seek(Index offset, SeekOrigin origin = SeekOrigin::Current) = 0; + virtual Index Tell(); virtual void Rewind(); virtual Index GetSize(); diff --git a/include/cru/common/platform/win/Win32FileStream.hpp b/include/cru/common/platform/win/Win32FileStream.hpp index 231a7ec6..ebb23357 100644 --- a/include/cru/common/platform/win/Win32FileStream.hpp +++ b/include/cru/common/platform/win/Win32FileStream.hpp @@ -24,8 +24,7 @@ class CRU_BASE_API Win32FileStream : public io::Stream { public: bool CanSeek() override; - Index Tell() override; - void Seek(Index offset, SeekOrigin origin = SeekOrigin::Current) override; + Index Seek(Index offset, SeekOrigin origin = SeekOrigin::Current) override; bool CanRead() override; Index Read(std::byte* buffer, Index offset, Index size) override; @@ -47,6 +46,6 @@ class CRU_BASE_API Win32FileStream : public io::Stream { details::Win32FileStreamPrivate* p_; }; -} // namespace cru::io +} // namespace cru::platform::win #endif diff --git a/src/common/io/MemoryStream.cpp b/src/common/io/MemoryStream.cpp index 481ed962..dcb7a032 100644 --- a/src/common/io/MemoryStream.cpp +++ b/src/common/io/MemoryStream.cpp @@ -9,9 +9,7 @@ MemoryStream::~MemoryStream() { bool MemoryStream::CanSeek() { return true; } -Index MemoryStream::Tell() { return position_; } - -void MemoryStream::Seek(Index offset, SeekOrigin origin) { +Index MemoryStream::Seek(Index offset, SeekOrigin origin) { switch (origin) { case SeekOrigin::Current: position_ += offset; @@ -23,6 +21,7 @@ void MemoryStream::Seek(Index offset, SeekOrigin origin) { position_ = size_ + offset; break; } + return position_; } bool MemoryStream::CanRead() { return true; } diff --git a/src/common/io/Stream.cpp b/src/common/io/Stream.cpp index 4f2953f9..ad1dbd0e 100644 --- a/src/common/io/Stream.cpp +++ b/src/common/io/Stream.cpp @@ -1,7 +1,9 @@ #include "cru/common/io/Stream.hpp" namespace cru::io { -void Stream::Rewind() { Seek(0); } +Index Stream::Tell() { return Seek(0, SeekOrigin::Current); } + +void Stream::Rewind() { Seek(0, SeekOrigin::Begin); } Index Stream::GetSize() { Index current_position = Tell(); diff --git a/src/common/platform/win/BridgeComStream.cpp b/src/common/platform/win/BridgeComStream.cpp index eaa53b92..d324a4c2 100644 --- a/src/common/platform/win/BridgeComStream.cpp +++ b/src/common/platform/win/BridgeComStream.cpp @@ -50,15 +50,23 @@ HRESULT BridgeComStream::Write(const void *pv, ULONG cb, ULONG *pcbWritten) { 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(); - + io::Stream::SeekOrigin so; + + switch (dwOrigin) { + case STREAM_SEEK_SET: + so = io::Stream::SeekOrigin::Begin; + break; + case STREAM_SEEK_CUR: + so = io::Stream::SeekOrigin::Current; + break; + case STREAM_SEEK_END: + so = io::Stream::SeekOrigin::End; + break; + default: + return STG_E_INVALIDFUNCTION; + }; + + plibNewPosition->QuadPart = stream_->Seek(dlibMove.QuadPart, so); return S_OK; } diff --git a/src/common/platform/win/Win32FileStream.cpp b/src/common/platform/win/Win32FileStream.cpp index 5997c570..ddf81c28 100644 --- a/src/common/platform/win/Win32FileStream.cpp +++ b/src/common/platform/win/Win32FileStream.cpp @@ -53,21 +53,7 @@ Win32FileStream::~Win32FileStream() { bool Win32FileStream::CanSeek() { return true; } -Index Win32FileStream::Tell() { - CheckClosed(); - - LARGE_INTEGER offset; - offset.QuadPart = 0; - LARGE_INTEGER file_pointer; - if (::SetFilePointerEx(p_->handle, offset, &file_pointer, FILE_CURRENT) == - 0) { - throw Win32Error(u"Failed to call SetFilePointerEx."); - } - - return file_pointer.QuadPart; -} - -void Win32FileStream::Seek(Index offset, SeekOrigin origin) { +Index Win32FileStream::Seek(Index offset, SeekOrigin origin) { CheckClosed(); DWORD dwMoveMethod = 0; @@ -82,9 +68,12 @@ void Win32FileStream::Seek(Index offset, SeekOrigin origin) { LARGE_INTEGER n_offset; n_offset.QuadPart = offset; - if (::SetFilePointerEx(p_->handle, n_offset, nullptr, dwMoveMethod) == 0) { + LARGE_INTEGER n_new_offset; + if (!::SetFilePointerEx(p_->handle, n_offset, &n_new_offset, dwMoveMethod)) { throw Win32Error(u"Failed to call SetFilePointerEx."); } + + return n_new_offset.QuadPart; } bool Win32FileStream::CanRead() { return true; } |