aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2022-02-03 14:55:17 +0800
committercrupest <crupest@outlook.com>2022-02-03 14:55:17 +0800
commitd15172cfe1ac8558567c1b1c10c2e671b0d1f033 (patch)
tree44eb3f6c760bc4a30786c4716a3c70d2b4b4c28e
parent2cf2f297c00ad262ddcbe56d38fdd45dffb7e342 (diff)
downloadcru-d15172cfe1ac8558567c1b1c10c2e671b0d1f033.tar.gz
cru-d15172cfe1ac8558567c1b1c10c2e671b0d1f033.tar.bz2
cru-d15172cfe1ac8558567c1b1c10c2e671b0d1f033.zip
...
-rw-r--r--include/cru/common/io/MemoryStream.hpp3
-rw-r--r--include/cru/common/io/Stream.hpp4
-rw-r--r--include/cru/common/platform/win/Win32FileStream.hpp5
-rw-r--r--src/common/io/MemoryStream.cpp5
-rw-r--r--src/common/io/Stream.cpp4
-rw-r--r--src/common/platform/win/BridgeComStream.cpp26
-rw-r--r--src/common/platform/win/Win32FileStream.cpp21
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; }