2016-03-04 23:02:44 +00:00
|
|
|
#include "hecl/Runtime.hpp"
|
2019-09-04 21:22:05 +00:00
|
|
|
|
|
|
|
#include "hecl/hecl.hpp"
|
|
|
|
|
|
|
|
#include <logvisor/logvisor.hpp>
|
|
|
|
|
2015-11-14 08:48:31 +00:00
|
|
|
#if _WIN32
|
|
|
|
#include <ShlObj.h>
|
|
|
|
#endif
|
2015-11-13 02:12:09 +00:00
|
|
|
|
2017-12-06 03:22:31 +00:00
|
|
|
#if WINDOWS_STORE
|
|
|
|
using namespace Windows::Storage;
|
|
|
|
#endif
|
|
|
|
|
2018-12-08 05:18:42 +00:00
|
|
|
namespace hecl::Runtime {
|
2016-03-04 23:02:44 +00:00
|
|
|
static logvisor::Module Log("FileStoreManager");
|
2015-11-13 02:12:09 +00:00
|
|
|
|
2018-12-08 05:18:42 +00:00
|
|
|
FileStoreManager::FileStoreManager(SystemStringView domain) : m_domain(domain) {
|
2015-11-13 02:12:09 +00:00
|
|
|
#if _WIN32
|
2017-12-06 03:22:31 +00:00
|
|
|
#if !WINDOWS_STORE
|
2018-12-08 05:18:42 +00:00
|
|
|
WCHAR home[MAX_PATH];
|
|
|
|
if (!SUCCEEDED(SHGetFolderPathW(NULL, CSIDL_PROFILE, NULL, 0, home)))
|
2020-04-11 22:48:11 +00:00
|
|
|
Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("unable to locate profile for file store")));
|
2015-11-14 08:48:31 +00:00
|
|
|
|
2018-12-08 05:18:42 +00:00
|
|
|
SystemString path(home);
|
2017-12-06 03:22:31 +00:00
|
|
|
#else
|
2018-12-08 05:18:42 +00:00
|
|
|
StorageFolder ^ cacheFolder = ApplicationData::Current->LocalCacheFolder;
|
|
|
|
SystemString path(cacheFolder->Path->Data());
|
2017-12-06 03:22:31 +00:00
|
|
|
#endif
|
2018-12-08 05:18:42 +00:00
|
|
|
path += _SYS_STR("/.heclrun");
|
2015-11-14 08:48:31 +00:00
|
|
|
|
2018-12-08 05:18:42 +00:00
|
|
|
hecl::MakeDir(path.c_str());
|
|
|
|
path += _SYS_STR('/');
|
|
|
|
path += domain.data();
|
2015-11-14 08:48:31 +00:00
|
|
|
|
2018-12-08 05:18:42 +00:00
|
|
|
hecl::MakeDir(path.c_str());
|
|
|
|
m_storeRoot = path;
|
2015-11-13 02:12:09 +00:00
|
|
|
#else
|
2020-02-25 11:29:15 +00:00
|
|
|
const char* xdg_data_home = getenv("XDG_DATA_HOME");
|
|
|
|
std::string path;
|
|
|
|
if (xdg_data_home) {
|
|
|
|
if (xdg_data_home[0] != '/')
|
2020-04-11 22:48:11 +00:00
|
|
|
Log.report(logvisor::Fatal, FMT_STRING("invalid $XDG_DATA_HOME for file store (must be absolute)"));
|
2020-02-25 11:29:15 +00:00
|
|
|
path = xdg_data_home;
|
|
|
|
} else {
|
|
|
|
const char* home = getenv("HOME");
|
|
|
|
if (!home)
|
2020-04-11 22:48:11 +00:00
|
|
|
Log.report(logvisor::Fatal, FMT_STRING("unable to locate $HOME for file store"));
|
2020-02-25 11:29:15 +00:00
|
|
|
path = home;
|
2020-03-04 00:52:57 +00:00
|
|
|
path += "/.local/share";
|
2020-02-25 11:29:15 +00:00
|
|
|
}
|
2021-01-07 01:46:56 +00:00
|
|
|
path += "/hecl/";
|
2018-12-08 05:18:42 +00:00
|
|
|
path += domain.data();
|
2021-01-07 01:46:56 +00:00
|
|
|
if (RecursiveMakeDir(path.c_str()) != 0)
|
2020-04-11 22:48:11 +00:00
|
|
|
Log.report(logvisor::Fatal, FMT_STRING("unable to mkdir at {}"), path);
|
2018-12-08 05:18:42 +00:00
|
|
|
m_storeRoot = path;
|
2015-11-13 02:12:09 +00:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2018-12-08 05:18:42 +00:00
|
|
|
} // namespace hecl::Runtime
|