#include "SDL_internal.h"
extern "C" {
#include "../SDL_sysfilesystem.h"
}
#include "../../core/windows/SDL_windows.h"
#include <SDL3/SDL_hints.h>
#include <SDL3/SDL_system.h>
#include <SDL3/SDL_filesystem.h>
#include <XGameSaveFiles.h>
char *SDL_SYS_GetBasePath(void)
{
char *path = WIN_GetModulePath(NULL); if (!path) {
return NULL; }
char *ptr = SDL_strrchr(path, '\\');
SDL_assert(ptr != NULL);
ptr[1] = '\0';
ptr = (char *) SDL_realloc(path, ((size_t) (ptr - path)) + 2); return ptr ? ptr : path; }
char *SDL_SYS_GetExeName(void)
{
char *path = WIN_GetModulePath(NULL); if (!path) {
return NULL; }
char *ptr = SDL_strrchr(path, '\\');
const size_t slen = SDL_strlen(ptr); SDL_memmove(path, ptr + 1, slen); ptr = (char *) SDL_realloc(path, slen); return ptr ? ptr : path; }
char *SDL_SYS_GetPrefPath(const char *org, const char *app)
{
XUserHandle user = NULL;
XAsyncBlock block = { 0 };
char *folderPath;
HRESULT result;
const char *csid = SDL_GetHint("SDL_GDK_SERVICE_CONFIGURATION_ID");
if (!csid) {
SDL_LogWarn(SDL_LOG_CATEGORY_SYSTEM, "Set SDL_GDK_SERVICE_CONFIGURATION_ID before calling SDL_GetPrefPath!");
return SDL_strdup("T:\\");
}
if (!SDL_GetGDKDefaultUser(&user)) {
return NULL;
}
if (FAILED(result = XGameSaveFilesGetFolderWithUiAsync(user, csid, &block))) {
WIN_SetErrorFromHRESULT("XGameSaveFilesGetFolderWithUiAsync", result);
return NULL;
}
folderPath = (char *)SDL_malloc(MAX_PATH);
do {
result = XGameSaveFilesGetFolderWithUiResult(&block, MAX_PATH, folderPath);
} while (result == E_PENDING);
if (FAILED(result)) {
WIN_SetErrorFromHRESULT("XGameSaveFilesGetFolderWithUiResult", result);
SDL_free(folderPath);
return NULL;
}
SDL_strlcat(folderPath, "\\SDLPrefPath\\", MAX_PATH);
if (CreateDirectoryA(folderPath, NULL) == FALSE) {
if (GetLastError() != ERROR_ALREADY_EXISTS) {
WIN_SetError("CreateDirectoryA");
SDL_free(folderPath);
return NULL;
}
}
return folderPath;
}
char *SDL_SYS_GetUserFolder(SDL_Folder folder)
{
SDL_Unsupported();
return NULL;
}
char *SDL_SYS_GetCurrentDirectory(void)
{
const char *base = SDL_GetBasePath();
if (!base) {
return NULL;
}
return SDL_strdup(base);
}