aboutsummaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2022-01-25 17:30:46 +0800
committercrupest <crupest@outlook.com>2022-01-25 17:30:46 +0800
commit2ed65999ef6f3e1156427dd3efe04353ae657882 (patch)
tree1c6618099e42887e96351c87cc8ce6b7c61b01f7 /src/common
parenta77fb1aaa4aa765ae51b3cb5a1f8d9c8c233b01a (diff)
downloadcru-2ed65999ef6f3e1156427dd3efe04353ae657882.tar.gz
cru-2ed65999ef6f3e1156427dd3efe04353ae657882.tar.bz2
cru-2ed65999ef6f3e1156427dd3efe04353ae657882.zip
...
Diffstat (limited to 'src/common')
-rw-r--r--src/common/CMakeLists.txt13
-rw-r--r--src/common/io/Resource.cpp20
-rw-r--r--src/common/platform/Exception.cpp1
-rw-r--r--src/common/platform/osx/Convert.cpp29
-rw-r--r--src/common/platform/osx/Exception.cpp1
-rw-r--r--src/common/platform/win/Exception.cpp39
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