From 839292efaaf8d997b2cbca7abae8c6e575f6c01a Mon Sep 17 00:00:00 2001 From: crupest Date: Tue, 25 Jan 2022 17:42:19 +0800 Subject: ... --- include/cru/common/io/FileStream.hpp | 4 +- include/cru/common/io/Win32FileStream.hpp | 53 --------- include/cru/common/platform/win/Exception.hpp | 6 +- .../cru/common/platform/win/Win32FileStream.hpp | 52 +++++++++ include/cru/osx/Exception.hpp | 1 + include/cru/win/Exception.hpp | 1 + src/common/CMakeLists.txt | 2 +- src/common/io/Win32FileStream.cpp | 127 -------------------- src/common/platform/win/Exception.cpp | 7 ++ src/common/platform/win/Win32FileStream.cpp | 129 +++++++++++++++++++++ test/common/io/Win32FileStreamTest.cpp | 3 +- 11 files changed, 199 insertions(+), 186 deletions(-) delete mode 100644 include/cru/common/io/Win32FileStream.hpp create mode 100644 include/cru/common/platform/win/Win32FileStream.hpp delete mode 100644 src/common/io/Win32FileStream.cpp create mode 100644 src/common/platform/win/Win32FileStream.cpp diff --git a/include/cru/common/io/FileStream.hpp b/include/cru/common/io/FileStream.hpp index fdde13fa..73c7b61e 100644 --- a/include/cru/common/io/FileStream.hpp +++ b/include/cru/common/io/FileStream.hpp @@ -6,8 +6,8 @@ namespace cru::io { using FileStream = UnixFileStream; } #elif CRU_PLATFORM_WINDOWS -#include "Win32FileStream.hpp" +#include "../platform/win/Win32FileStream.hpp" namespace cru::io { -using FileStream = Win32FileStream; +using FileStream = platform::win::Win32FileStream; } #endif diff --git a/include/cru/common/io/Win32FileStream.hpp b/include/cru/common/io/Win32FileStream.hpp deleted file mode 100644 index 08600a8e..00000000 --- a/include/cru/common/io/Win32FileStream.hpp +++ /dev/null @@ -1,53 +0,0 @@ -#pragma once - -#include "../PreConfig.hpp" - -#ifdef CRU_PLATFORM_WINDOWS - -#include "../String.hpp" -#include "OpenFileFlag.hpp" -#include "Stream.hpp" -#include "cru/common/Base.hpp" - -namespace cru::io { -namespace details { -class Win32FileStreamPrivate; -} - -class CRU_BASE_API Win32FileStream : public Stream { - public: - Win32FileStream(String path, OpenFileFlag flags); - - CRU_DELETE_COPY(Win32FileStream) - CRU_DELETE_MOVE(Win32FileStream) - - ~Win32FileStream() override; - - public: - bool CanSeek() override; - Index Tell() override; - void Seek(Index offset, SeekOrigin origin = SeekOrigin::Current) override; - - bool CanRead() override; - Index Read(std::byte* buffer, Index offset, Index size) override; - using Stream::Read; - - bool CanWrite() override; - Index Write(const std::byte* buffer, Index offset, Index size) override; - using Stream::Write; - - void Close() override; - - private: - void CheckClosed(); - - private: - String path_; - OpenFileFlag flags_; - bool closed_ = false; - - details::Win32FileStreamPrivate* p_; -}; -} // namespace cru::io - -#endif diff --git a/include/cru/common/platform/win/Exception.hpp b/include/cru/common/platform/win/Exception.hpp index f90efe0a..0774327f 100644 --- a/include/cru/common/platform/win/Exception.hpp +++ b/include/cru/common/platform/win/Exception.hpp @@ -38,8 +38,10 @@ class CRU_BASE_API Win32Error : public platform::PlatformException { public: // ::GetLastError is automatically called to get the error code. // The same as Win32Error(::GetLastError(), message) - explicit Win32Error(std::string_view message); - Win32Error(DWORD error_code, std::string_view message); + [[deprecated]] explicit Win32Error(std::string_view message); + explicit Win32Error(String message); + [[deprecated]] Win32Error(DWORD error_code, std::string_view message); + Win32Error(DWORD error_code, String message); CRU_DEFAULT_COPY(Win32Error) CRU_DEFAULT_MOVE(Win32Error) diff --git a/include/cru/common/platform/win/Win32FileStream.hpp b/include/cru/common/platform/win/Win32FileStream.hpp new file mode 100644 index 00000000..231a7ec6 --- /dev/null +++ b/include/cru/common/platform/win/Win32FileStream.hpp @@ -0,0 +1,52 @@ +#pragma once + +#include "../../PreConfig.hpp" + +#ifdef CRU_PLATFORM_WINDOWS + +#include "../../String.hpp" +#include "../../io/OpenFileFlag.hpp" +#include "../../io/Stream.hpp" + +namespace cru::platform::win { +namespace details { +class Win32FileStreamPrivate; +} + +class CRU_BASE_API Win32FileStream : public io::Stream { + public: + Win32FileStream(String path, io::OpenFileFlag flags); + + CRU_DELETE_COPY(Win32FileStream) + CRU_DELETE_MOVE(Win32FileStream) + + ~Win32FileStream() override; + + public: + bool CanSeek() override; + Index Tell() override; + void Seek(Index offset, SeekOrigin origin = SeekOrigin::Current) override; + + bool CanRead() override; + Index Read(std::byte* buffer, Index offset, Index size) override; + using Stream::Read; + + bool CanWrite() override; + Index Write(const std::byte* buffer, Index offset, Index size) override; + using Stream::Write; + + void Close() override; + + private: + void CheckClosed(); + + private: + String path_; + io::OpenFileFlag flags_; + bool closed_ = false; + + details::Win32FileStreamPrivate* p_; +}; +} // namespace cru::io + +#endif diff --git a/include/cru/osx/Exception.hpp b/include/cru/osx/Exception.hpp index 4123778b..5776ab72 100644 --- a/include/cru/osx/Exception.hpp +++ b/include/cru/osx/Exception.hpp @@ -1,2 +1,3 @@ #pragma once #include "cru/common/platform/osx/Exception.hpp" +#include "cru/platform/Exception.hpp" diff --git a/include/cru/win/Exception.hpp b/include/cru/win/Exception.hpp index d3ac69a7..3c42ff65 100644 --- a/include/cru/win/Exception.hpp +++ b/include/cru/win/Exception.hpp @@ -1,2 +1,3 @@ #pragma once #include "cru/common/platform/win/Exception.hpp" +#include "cru/platform/Exception.hpp" diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 0316d9e6..481205a0 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -34,7 +34,7 @@ endif() if (WIN32) target_sources(cru_base PRIVATE - io/Win32FileStream.cpp + platform/win/Win32FileStream.cpp platform/win/Exception.cpp ) endif() diff --git a/src/common/io/Win32FileStream.cpp b/src/common/io/Win32FileStream.cpp deleted file mode 100644 index e7ee0e6a..00000000 --- a/src/common/io/Win32FileStream.cpp +++ /dev/null @@ -1,127 +0,0 @@ -#include "cru/common/io/Win32FileStream.hpp" - -#include "cru/common/Exception.hpp" -#include "cru/common/io/OpenFileFlag.hpp" - -#include - -namespace cru::io { -namespace details { -struct Win32FileStreamPrivate { - HANDLE handle; -}; -} // namespace details - -Win32FileStream::Win32FileStream(String path, OpenFileFlag flags) - : path_(std::move(path)), flags_(flags) { - p_ = new details::Win32FileStreamPrivate(); - - DWORD dwDesiredAccess = 0; - if (flags & OpenFileFlags::Read) { - dwDesiredAccess |= GENERIC_READ; - } - if (flags & OpenFileFlags::Write) { - dwDesiredAccess |= GENERIC_WRITE; - } - - DWORD dwCreationDisposition = 0; - if (flags & OpenFileFlags::Create) { - if (flags & OpenFileFlags::ThrowOnExist) { - dwCreationDisposition = CREATE_NEW; - } else { - dwCreationDisposition = OPEN_ALWAYS; - } - } else { - dwCreationDisposition = OPEN_EXISTING; - } - - p_->handle = - ::CreateFileW(path_.WinCStr(), dwDesiredAccess, 0, nullptr, - dwCreationDisposition, FILE_ATTRIBUTE_NORMAL, nullptr); - - if (p_->handle == INVALID_HANDLE_VALUE) { - throw Exception(u"Failed to call CreateFileW."); - } -} - -Win32FileStream::~Win32FileStream() { - Close(); - delete p_; -} - -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 Exception(u"Failed to call SetFilePointerEx."); - } - - return file_pointer.QuadPart; -} - -void Win32FileStream::Seek(Index offset, SeekOrigin origin) { - CheckClosed(); - - DWORD dwMoveMethod = 0; - - if (origin == SeekOrigin::Current) { - dwMoveMethod = FILE_CURRENT; - } else if (origin == SeekOrigin::End) { - dwMoveMethod = FILE_END; - } else { - dwMoveMethod = FILE_BEGIN; - } - - LARGE_INTEGER n_offset; - n_offset.QuadPart = offset; - if (::SetFilePointerEx(p_->handle, n_offset, nullptr, dwMoveMethod) == 0) { - throw Exception(u"Failed to call SetFilePointerEx."); - } -} - -bool Win32FileStream::CanRead() { return true; } - -Index Win32FileStream::Read(std::byte* buffer, Index offset, Index size) { - CheckClosed(); - - DWORD dwRead; - if (::ReadFile(p_->handle, buffer + offset, size, &dwRead, nullptr) == 0) { - throw Exception(u"Failed to call ReadFile."); - } - return dwRead; -} - -bool Win32FileStream::CanWrite() { return true; } - -Index Win32FileStream::Write(const std::byte* buffer, Index offset, - Index size) { - CheckClosed(); - - DWORD dwWritten; - if (::WriteFile(p_->handle, buffer + offset, size, &dwWritten, nullptr) == - 0) { - throw Exception(u"Failed to call WriteFile."); - } - - return dwWritten; -} - -void Win32FileStream::Close() { - if (closed_) return; - - ::CloseHandle(p_->handle); - - closed_ = true; -} - -void Win32FileStream::CheckClosed() { - if (closed_) throw Exception(u"Stream is closed."); -} - -} // namespace cru::io diff --git a/src/common/platform/win/Exception.cpp b/src/common/platform/win/Exception.cpp index 34ae8955..def12123 100644 --- a/src/common/platform/win/Exception.cpp +++ b/src/common/platform/win/Exception.cpp @@ -32,8 +32,15 @@ inline String Win32MakeMessage(DWORD error_code, String message) { Win32Error::Win32Error(std::string_view message) : Win32Error(::GetLastError(), message) {} +Win32Error::Win32Error(String message) + : Win32Error(::GetLastError(), message) {} + Win32Error::Win32Error(DWORD error_code, std::string_view message) : PlatformException(Win32MakeMessage( error_code, String::FromUtf8(message.data(), message.size()))), error_code_(error_code) {} + +Win32Error::Win32Error(DWORD error_code, String message) + : PlatformException(Win32MakeMessage(error_code, message)), + error_code_(error_code) {} } // namespace cru::platform::win diff --git a/src/common/platform/win/Win32FileStream.cpp b/src/common/platform/win/Win32FileStream.cpp new file mode 100644 index 00000000..5997c570 --- /dev/null +++ b/src/common/platform/win/Win32FileStream.cpp @@ -0,0 +1,129 @@ +#include "cru/common/platform/win/Win32FileStream.hpp" + +#include "cru/common/io/OpenFileFlag.hpp" +#include "cru/common/platform/win/Exception.hpp" + +#include + +namespace cru::platform::win { +using namespace cru::io; + +namespace details { +struct Win32FileStreamPrivate { + HANDLE handle; +}; +} // namespace details + +Win32FileStream::Win32FileStream(String path, OpenFileFlag flags) + : path_(std::move(path)), flags_(flags) { + p_ = new details::Win32FileStreamPrivate(); + + DWORD dwDesiredAccess = 0; + if (flags & OpenFileFlags::Read) { + dwDesiredAccess |= GENERIC_READ; + } + if (flags & OpenFileFlags::Write) { + dwDesiredAccess |= GENERIC_WRITE; + } + + DWORD dwCreationDisposition = 0; + if (flags & OpenFileFlags::Create) { + if (flags & OpenFileFlags::ThrowOnExist) { + dwCreationDisposition = CREATE_NEW; + } else { + dwCreationDisposition = OPEN_ALWAYS; + } + } else { + dwCreationDisposition = OPEN_EXISTING; + } + + p_->handle = + ::CreateFileW(path_.WinCStr(), dwDesiredAccess, 0, nullptr, + dwCreationDisposition, FILE_ATTRIBUTE_NORMAL, nullptr); + + if (p_->handle == INVALID_HANDLE_VALUE) { + throw Win32Error(u"Failed to call CreateFileW."); + } +} + +Win32FileStream::~Win32FileStream() { + Close(); + delete p_; +} + +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) { + CheckClosed(); + + DWORD dwMoveMethod = 0; + + if (origin == SeekOrigin::Current) { + dwMoveMethod = FILE_CURRENT; + } else if (origin == SeekOrigin::End) { + dwMoveMethod = FILE_END; + } else { + dwMoveMethod = FILE_BEGIN; + } + + LARGE_INTEGER n_offset; + n_offset.QuadPart = offset; + if (::SetFilePointerEx(p_->handle, n_offset, nullptr, dwMoveMethod) == 0) { + throw Win32Error(u"Failed to call SetFilePointerEx."); + } +} + +bool Win32FileStream::CanRead() { return true; } + +Index Win32FileStream::Read(std::byte* buffer, Index offset, Index size) { + CheckClosed(); + + DWORD dwRead; + if (::ReadFile(p_->handle, buffer + offset, size, &dwRead, nullptr) == 0) { + throw Win32Error(u"Failed to call ReadFile."); + } + return dwRead; +} + +bool Win32FileStream::CanWrite() { return true; } + +Index Win32FileStream::Write(const std::byte* buffer, Index offset, + Index size) { + CheckClosed(); + + DWORD dwWritten; + if (::WriteFile(p_->handle, buffer + offset, size, &dwWritten, nullptr) == + 0) { + throw Win32Error(u"Failed to call WriteFile."); + } + + return dwWritten; +} + +void Win32FileStream::Close() { + if (closed_) return; + + ::CloseHandle(p_->handle); + + closed_ = true; +} + +void Win32FileStream::CheckClosed() { + if (closed_) throw Exception(u"Stream is closed."); +} + +} // namespace cru::platform::win diff --git a/test/common/io/Win32FileStreamTest.cpp b/test/common/io/Win32FileStreamTest.cpp index 6c3edb6f..0e35bb8d 100644 --- a/test/common/io/Win32FileStreamTest.cpp +++ b/test/common/io/Win32FileStreamTest.cpp @@ -1,5 +1,5 @@ #include "cru/common/io/OpenFileFlag.hpp" -#include "cru/common/io/Win32FileStream.hpp" +#include "cru/common/platform/win/Win32FileStream.hpp" #include @@ -9,6 +9,7 @@ TEST(UnixFileStream, Work) { using namespace cru; using namespace cru::io; + using namespace cru::platform::win; auto temp_file_path = (std::filesystem::temp_directory_path() / "cru_test_temp.XXXXXX") -- cgit v1.2.3