aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2022-05-07 18:08:43 +0800
committercrupest <crupest@outlook.com>2022-05-07 18:08:43 +0800
commit23e68dc785d274327efeecb22cfc712c71cfbfc0 (patch)
treefd5c9498febd4cbe9245ee2d4bd37ec614b38d02
parentb3e5d228311fac99d5a6f5699276ff87229b8c7b (diff)
downloadcru-23e68dc785d274327efeecb22cfc712c71cfbfc0.tar.gz
cru-23e68dc785d274327efeecb22cfc712c71cfbfc0.tar.bz2
cru-23e68dc785d274327efeecb22cfc712c71cfbfc0.zip
...
-rw-r--r--src/common/io/Resource.cpp21
1 files changed, 20 insertions, 1 deletions
diff --git a/src/common/io/Resource.cpp b/src/common/io/Resource.cpp
index 0ee7f753..b847e1cf 100644
--- a/src/common/io/Resource.cpp
+++ b/src/common/io/Resource.cpp
@@ -1,13 +1,19 @@
#include "cru/common/io/Resource.h"
#include "cru/common/Exception.h"
+#include "cru/common/log/Logger.h"
#if defined(CRU_PLATFORM_OSX)
#include <CoreFoundation/CoreFoundation.h>
#elif defined(CRU_PLATFORM_WINDOWS)
+#include <Windows.h>
#endif
+#include <filesystem>
+
namespace cru::io {
std::filesystem::path GetResourceDir() {
+ constexpr auto kLogTag = u"GetResourceDir";
+
#if defined(CRU_PLATFORM_OSX)
CFBundleRef main_bundle = CFBundleGetMainBundle();
CFURLRef bundle_url = CFBundleCopyBundleURL(main_bundle);
@@ -21,7 +27,20 @@ std::filesystem::path GetResourceDir() {
return bundle_path / "Contents/Resources";
#elif defined(CRU_PLATFORM_WINDOWS)
- throw Exception(u"Not implemented.");
+ wchar_t buffer[MAX_PATH];
+ DWORD size = ::GetModuleFileNameW(nullptr, buffer, MAX_PATH);
+ std::filesystem::path module_path(buffer, buffer + size);
+ auto p = module_path;
+ while (p.has_parent_path()) {
+ p = p.parent_path();
+ auto resource_dir_path = p / "assets";
+ if (std::filesystem::exists(resource_dir_path) &&
+ std::filesystem::is_directory(resource_dir_path)) {
+ return resource_dir_path;
+ }
+ }
+
+ throw Exception(u"Failed to find resource directory.");
#else
throw Exception(u"Not implemented.");
#endif