diff options
author | crupest <crupest@outlook.com> | 2022-01-25 17:30:46 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2022-01-25 17:30:46 +0800 |
commit | 2ed65999ef6f3e1156427dd3efe04353ae657882 (patch) | |
tree | 1c6618099e42887e96351c87cc8ce6b7c61b01f7 /src/common | |
parent | a77fb1aaa4aa765ae51b3cb5a1f8d9c8c233b01a (diff) | |
download | cru-2ed65999ef6f3e1156427dd3efe04353ae657882.tar.gz cru-2ed65999ef6f3e1156427dd3efe04353ae657882.tar.bz2 cru-2ed65999ef6f3e1156427dd3efe04353ae657882.zip |
...
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/CMakeLists.txt | 13 | ||||
-rw-r--r-- | src/common/io/Resource.cpp | 20 | ||||
-rw-r--r-- | src/common/platform/Exception.cpp | 1 | ||||
-rw-r--r-- | src/common/platform/osx/Convert.cpp | 29 | ||||
-rw-r--r-- | src/common/platform/osx/Exception.cpp | 1 | ||||
-rw-r--r-- | src/common/platform/win/Exception.cpp | 39 |
6 files changed, 103 insertions, 0 deletions
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index d8462abf..0316d9e6 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -7,7 +7,9 @@ add_library(cru_base SHARED String.cpp StringUtil.cpp io/Stream.cpp + io/Resource.cpp io/MemoryStream.cpp + platform/Exception.cpp ) target_compile_definitions(cru_base PRIVATE CRU_BASE_EXPORT_API) target_include_directories(cru_base PUBLIC ${CRU_INCLUDE_DIR}) @@ -20,9 +22,20 @@ if (UNIX) ) endif() +if (APPLE) + find_library(CORE_FOUNDATION CoreFoundation REQUIRED) + target_link_libraries(cru_base PUBLIC ${CORE_FOUNDATION}) + + target_sources(cru_base PRIVATE + platform/osx/Convert.cpp + platform/osx/Exception.cpp + ) +endif() + if (WIN32) target_sources(cru_base PRIVATE io/Win32FileStream.cpp + platform/win/Exception.cpp ) endif() diff --git a/src/common/io/Resource.cpp b/src/common/io/Resource.cpp new file mode 100644 index 00000000..e2ff8004 --- /dev/null +++ b/src/common/io/Resource.cpp @@ -0,0 +1,20 @@ +#include "cru/common/io/Resource.hpp" +#include "cru/common/Exception.hpp" + +#if defined(CRU_PLATFORM_OSX) +#include <CoreFoundation/CoreFoundation.h> +#elif defined(CRU_PLATFORM_WINDOWS) +#endif + +namespace cru::io { +std::unique_ptr<Stream> CreateStreamFromResourcePath(const String& path) { +#if defined(CRU_PLATFORM_OSX) + // CFBundleRef main_bundle = CFBundleGetMainBundle(); + throw Exception(u"Not implemented."); +#elif defined(CRU_PLATFORM_WINDOWS) + throw Exception(u"Not implemented."); +#else + throw Exception(u"Not implemented."); +#endif +} +} // namespace cru::io diff --git a/src/common/platform/Exception.cpp b/src/common/platform/Exception.cpp new file mode 100644 index 00000000..c13c8b1e --- /dev/null +++ b/src/common/platform/Exception.cpp @@ -0,0 +1 @@ +#include "cru/common/platform/Exception.hpp" diff --git a/src/common/platform/osx/Convert.cpp b/src/common/platform/osx/Convert.cpp new file mode 100644 index 00000000..e5105698 --- /dev/null +++ b/src/common/platform/osx/Convert.cpp @@ -0,0 +1,29 @@ +#include "cru/common/platform/osx/Convert.hpp" + +namespace cru::platform::osx { +CFStringRef Convert(const String& string) { + return CFStringCreateWithBytes( + nullptr, reinterpret_cast<const UInt8*>(string.data()), + string.size() * sizeof(std::uint16_t), kCFStringEncodingUTF16, false); +} + +String Convert(CFStringRef string) { + auto length = CFStringGetLength(string); + + String result; + + for (int i = 0; i < length; i++) { + result.AppendCodePoint(CFStringGetCharacterAtIndex(string, i)); + } + + return result; +} + +CFRange Convert(const Range& range) { + return CFRangeMake(range.position, range.count); +} + +Range Convert(const CFRange& range) { + return Range(range.location, range.length); +} +} // namespace cru::platform::osx diff --git a/src/common/platform/osx/Exception.cpp b/src/common/platform/osx/Exception.cpp new file mode 100644 index 00000000..b02fd458 --- /dev/null +++ b/src/common/platform/osx/Exception.cpp @@ -0,0 +1 @@ +#include "cru/common/platform//osx/Exception.hpp" diff --git a/src/common/platform/win/Exception.cpp b/src/common/platform/win/Exception.cpp new file mode 100644 index 00000000..34ae8955 --- /dev/null +++ b/src/common/platform/win/Exception.cpp @@ -0,0 +1,39 @@ +#include "cru/common/platform/win/Exception.hpp" +#include "cru/common/Format.hpp" + +#include <optional> + +namespace cru::platform::win { + +inline String HResultMakeMessage(HRESULT h_result, + std::optional<String> message) { + if (message.has_value()) + return Format(u"HRESULT: {}. Message: {}", h_result, message->WinCStr()); + else + return Format(u"HRESULT: {}.", h_result); +} + +HResultError::HResultError(HRESULT h_result) + : PlatformException(HResultMakeMessage(h_result, std::nullopt)), + h_result_(h_result) {} + +HResultError::HResultError(HRESULT h_result, + std::string_view additional_message) + : PlatformException(HResultMakeMessage( + h_result, String::FromUtf8(additional_message.data(), + additional_message.size()))), + h_result_(h_result) {} + +inline String Win32MakeMessage(DWORD error_code, String message) { + return Format(u"Last error code: {}.\nMessage: {}\n", error_code, + message.WinCStr()); +} + +Win32Error::Win32Error(std::string_view 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) {} +} // namespace cru::platform::win |