aboutsummaryrefslogtreecommitdiff
path: root/app/source/Cplt/Utils/StandardDirectories.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'app/source/Cplt/Utils/StandardDirectories.cpp')
-rw-r--r--app/source/Cplt/Utils/StandardDirectories.cpp78
1 files changed, 78 insertions, 0 deletions
diff --git a/app/source/Cplt/Utils/StandardDirectories.cpp b/app/source/Cplt/Utils/StandardDirectories.cpp
new file mode 100644
index 0000000..2202f51
--- /dev/null
+++ b/app/source/Cplt/Utils/StandardDirectories.cpp
@@ -0,0 +1,78 @@
+#include "StandardDirectories.hpp"
+
+#include <filesystem>
+#include <stdexcept>
+
+namespace fs = std::filesystem;
+
+#if defined(_WIN32)
+// https://stackoverflow.com/questions/54499256/how-to-find-the-saved-games-folder-programmatically-in-c-c
+# include <ShlObj_core.h>
+# include <objbase.h>
+# pragma comment(lib, "shell32.lib")
+# pragma comment(lib, "ole32.lib")
+
+static fs::path GetAppDataRoaming()
+{
+ PWSTR path = nullptr;
+ HRESULT hr = SHGetKnownFolderPath(FOLDERID_RoamingAppData, KF_FLAG_CREATE, nullptr, &path);
+ if (SUCCEEDED(hr)) {
+ auto dataDir = fs::path(path);
+ CoTaskMemFree(path);
+
+ fs::create_directories(dataDir);
+ return dataDir;
+ } else {
+ fs::path dataDir("~/AppData/Roaming");
+ fs::create_directories(dataDir);
+ return dataDir;
+ }
+}
+
+#elif defined(__APPLE__)
+// TODO
+#elif defined(__linux__)
+# include <cstdlib>
+
+static fs::path GetEnvVar(const char* name, const char* backup)
+{
+ if (const char* path = std::getenv(name)) {
+ fs::path dataDir(path);
+ fs::create_directories(dataDir);
+ return dataDir;
+ } else {
+ fs::path dataDir(backup);
+ fs::create_directories(dataDir);
+ return dataDir;
+ }
+}
+
+#endif
+
+const std::filesystem::path& StandardDirectories::UserData()
+{
+ static auto userDataDir = []() -> fs::path {
+#if defined(_WIN32)
+ return GetAppDataRoaming();
+#elif defined(__APPLE__)
+ // TODO where?
+#elif defined(__linux__)
+ return GetEnvVar("XDG_DATA_HOME", "~/.local/share");
+#endif
+ }();
+ return userDataDir;
+}
+
+const std::filesystem::path& StandardDirectories::UserConfig()
+{
+ static auto userConfigDir = []() -> fs::path {
+#if defined(_WIN32)
+ return GetAppDataRoaming();
+#elif defined(__APPLE__)
+ // TODO where?
+#elif defined(__linux__)
+ return GetEnvVar("XDG_CONFIG_HOME", "~/.config");
+#endif
+ }();
+ return userConfigDir;
+}