mirror of
https://github.com/AxioDL/metaforce.git
synced 2025-07-04 19:15:52 +00:00
FileStoreManager: Use SDL_GetPrefPath, add org argument
Use SDL_GetPrefPath by default, if we fail to get a valid path *then* we use the platform specific logic as a fallback
This commit is contained in:
parent
399b44baf0
commit
b305454199
@ -580,7 +580,7 @@ int main(int argc, char** argv) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SetupBasics(IsClientLoggingEnabled(argc, argv));
|
SetupBasics(IsClientLoggingEnabled(argc, argv));
|
||||||
metaforce::FileStoreManager fileMgr{"metaforce"};
|
metaforce::FileStoreManager fileMgr{"AxioDL", "metaforce"};
|
||||||
metaforce::CVarManager cvarMgr{fileMgr};
|
metaforce::CVarManager cvarMgr{fileMgr};
|
||||||
metaforce::CVarCommons cvarCmns{cvarMgr};
|
metaforce::CVarCommons cvarCmns{cvarMgr};
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include "Runtime/CBasics.hpp"
|
#include "Runtime/CBasics.hpp"
|
||||||
|
|
||||||
|
#include <SDL.h>
|
||||||
#include <logvisor/logvisor.hpp>
|
#include <logvisor/logvisor.hpp>
|
||||||
#if _WIN32
|
#if _WIN32
|
||||||
#include <nowide/convert.hpp>
|
#include <nowide/convert.hpp>
|
||||||
@ -18,46 +19,51 @@ using namespace Windows::Storage;
|
|||||||
namespace metaforce {
|
namespace metaforce {
|
||||||
static logvisor::Module Log("FileStoreManager");
|
static logvisor::Module Log("FileStoreManager");
|
||||||
|
|
||||||
FileStoreManager::FileStoreManager(std::string_view domain) : m_domain(domain) {
|
FileStoreManager::FileStoreManager(std::string_view org, std::string_view domain) : m_org(org), m_domain(domain) {
|
||||||
|
auto prefPath = SDL_GetPrefPath(org.data(), domain.data());
|
||||||
|
if (prefPath == nullptr) {
|
||||||
#if _WIN32
|
#if _WIN32
|
||||||
#if !WINDOWS_STORE
|
#if !WINDOWS_STORE
|
||||||
WCHAR home[MAX_PATH];
|
WCHAR home[MAX_PATH];
|
||||||
if (!SUCCEEDED(SHGetFolderPathW(NULL, CSIDL_PROFILE, NULL, 0, home)))
|
if (!SUCCEEDED(SHGetFolderPathW(NULL, CSIDL_PROFILE, NULL, 0, home)))
|
||||||
Log.report(logvisor::Fatal, FMT_STRING("unable to locate profile for file store"));
|
Log.report(logvisor::Fatal, FMT_STRING("unable to locate profile for file store"));
|
||||||
|
|
||||||
std::string path = nowide::narrow(home);
|
std::string path = nowide::narrow(home);
|
||||||
#else
|
#else
|
||||||
StorageFolder ^ cacheFolder = ApplicationData::Current->LocalCacheFolder;
|
StorageFolder ^ cacheFolder = ApplicationData::Current->LocalCacheFolder;
|
||||||
std::string path(cacheFolder->Path->Data());
|
std::string path(cacheFolder->Path->Data());
|
||||||
#endif
|
#endif
|
||||||
path += "/.heclrun";
|
path += "/." + m_org;
|
||||||
|
|
||||||
CBasics::MakeDir(path.c_str());
|
CBasics::MakeDir(path.c_str());
|
||||||
path += '/';
|
path += '/';
|
||||||
path += domain.data();
|
path += domain.data();
|
||||||
|
|
||||||
CBasics::MakeDir(path.c_str());
|
CBasics::MakeDir(path.c_str());
|
||||||
m_storeRoot = path;
|
m_storeRoot = path;
|
||||||
#else
|
#else
|
||||||
const char* xdg_data_home = getenv("XDG_DATA_HOME");
|
const char* xdg_data_home = getenv("XDG_DATA_HOME");
|
||||||
std::string path;
|
std::string path;
|
||||||
if (xdg_data_home) {
|
if (xdg_data_home) {
|
||||||
if (xdg_data_home[0] != '/')
|
if (xdg_data_home[0] != '/')
|
||||||
Log.report(logvisor::Fatal, FMT_STRING("invalid $XDG_DATA_HOME for file store (must be absolute)"));
|
Log.report(logvisor::Fatal, FMT_STRING("invalid $XDG_DATA_HOME for file store (must be absolute)"));
|
||||||
path = xdg_data_home;
|
path = xdg_data_home;
|
||||||
|
} else {
|
||||||
|
const char* home = getenv("HOME");
|
||||||
|
if (!home)
|
||||||
|
Log.report(logvisor::Fatal, FMT_STRING("unable to locate $HOME for file store"));
|
||||||
|
path = home;
|
||||||
|
path += "/.local/share";
|
||||||
|
}
|
||||||
|
path += "/" + m_org + "/" + domain.data();
|
||||||
|
if (CBasics::RecursiveMakeDir(path.c_str()) != 0) {
|
||||||
|
Log.report(logvisor::Fatal, FMT_STRING("unable to mkdir at {}"), path);
|
||||||
|
}
|
||||||
|
m_storeRoot = path;
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
const char* home = getenv("HOME");
|
m_storeRoot = std::string(prefPath);
|
||||||
if (!home)
|
|
||||||
Log.report(logvisor::Fatal, FMT_STRING("unable to locate $HOME for file store"));
|
|
||||||
path = home;
|
|
||||||
path += "/.local/share";
|
|
||||||
}
|
}
|
||||||
path += "/hecl/";
|
|
||||||
path += domain.data();
|
|
||||||
if (CBasics::RecursiveMakeDir(path.c_str()) != 0)
|
|
||||||
Log.report(logvisor::Fatal, FMT_STRING("unable to mkdir at {}"), path);
|
|
||||||
m_storeRoot = path;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace hecl::Runtime
|
} // namespace hecl::Runtime
|
||||||
|
@ -7,11 +7,13 @@ namespace metaforce {
|
|||||||
* @brief Per-platform file store resolution
|
* @brief Per-platform file store resolution
|
||||||
*/
|
*/
|
||||||
class FileStoreManager {
|
class FileStoreManager {
|
||||||
|
std::string m_org;
|
||||||
std::string m_domain;
|
std::string m_domain;
|
||||||
std::string m_storeRoot;
|
std::string m_storeRoot;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
FileStoreManager(std::string_view domain);
|
FileStoreManager(std::string_view org, std::string_view domain);
|
||||||
|
std::string_view getOrg() const { return m_org; }
|
||||||
std::string_view getDomain() const { return m_domain; }
|
std::string_view getDomain() const { return m_domain; }
|
||||||
/**
|
/**
|
||||||
* @brief Returns the full path to the file store, including domain
|
* @brief Returns the full path to the file store, including domain
|
||||||
|
@ -13,6 +13,7 @@ void CTextOutStream::WriteString(const char* str, u32 len) {
|
|||||||
} else if (str[i] == '\n' && !wroteCarriageReturn) {
|
} else if (str[i] == '\n' && !wroteCarriageReturn) {
|
||||||
m_out->WriteChar('\r');
|
m_out->WriteChar('\r');
|
||||||
wroteLineFeed = true;
|
wroteLineFeed = true;
|
||||||
|
wroteCarriageReturn = true;
|
||||||
}
|
}
|
||||||
m_out->WriteChar(str[i]);
|
m_out->WriteChar(str[i]);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user