diff options
Diffstat (limited to 'app/source/Cplt/Utils/StandardDirectories.cpp')
-rw-r--r-- | app/source/Cplt/Utils/StandardDirectories.cpp | 78 |
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; +} |