Clean up config code (#679)

* Clean up config code

* Export function

* Fix
This commit is contained in:
Christian Semmler 2025-08-15 09:56:36 -07:00 committed by GitHub
parent 94c2d16180
commit 73c6be7abf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 46 additions and 82 deletions

View File

@ -21,7 +21,6 @@ void Android_SetupDefaultConfigOverrides(dictionary* p_dictionary)
iniparser_set(p_dictionary, "isle:diskpath", data);
iniparser_set(p_dictionary, "isle:cdpath", data);
iniparser_set(p_dictionary, "isle:mediapath", data);
iniparser_set(p_dictionary, "isle:savepath", savedata.GetData());
// Default to Virtual Mouse

View File

@ -1,5 +1,7 @@
#include "config.h"
#include "mxstring.h"
#include <SDL3/SDL_filesystem.h>
#include <SDL3/SDL_log.h>
#include <iniparser.h>
@ -11,15 +13,13 @@ void IOS_SetupDefaultConfigOverrides(dictionary* p_dictionary)
// Use DevelopmentFiles path for disk and cd paths
// It's good to use that path since user can easily
// connect through SMB and copy the files
const char* documentFolder = SDL_GetUserFolder(SDL_FOLDER_DOCUMENTS);
char* diskPath = new char[strlen(documentFolder) + strlen("isle") + 1]();
strcpy(diskPath, documentFolder);
strcat(diskPath, "isle");
MxString documentFolder = SDL_GetUserFolder(SDL_FOLDER_DOCUMENTS);
documentFolder += "isle";
if (!SDL_GetPathInfo(diskPath, NULL)) {
SDL_CreateDirectory(diskPath);
if (!SDL_GetPathInfo(documentFolder.GetData(), NULL)) {
SDL_CreateDirectory(documentFolder.GetData());
}
iniparser_set(p_dictionary, "isle:diskpath", diskPath);
iniparser_set(p_dictionary, "isle:cdpath", diskPath);
iniparser_set(p_dictionary, "isle:diskpath", documentFolder.GetData());
iniparser_set(p_dictionary, "isle:cdpath", documentFolder.GetData());
}

View File

@ -40,6 +40,7 @@
#include <array>
#include <extensions/extensions.h>
#include <miniwin/miniwindevice.h>
#include <type_traits>
#include <vec.h>
#define SDL_MAIN_USE_CALLBACKS
@ -172,6 +173,7 @@ IsleApp::IsleApp()
LegoOmni::CreateInstance();
m_mediaPath = NULL;
m_iniPath = NULL;
m_maxLod = RealtimeView::GetUserMaxLOD();
m_maxAllowedExtras = m_islandQuality <= 1 ? 10 : 20;
@ -198,25 +200,11 @@ IsleApp::~IsleApp()
MxOmni::DestroyInstance();
}
if (m_hdPath) {
delete[] m_hdPath;
}
if (m_cdPath) {
delete[] m_cdPath;
}
if (m_deviceId) {
delete[] m_deviceId;
}
if (m_savePath) {
delete[] m_savePath;
}
if (m_mediaPath) {
delete[] m_mediaPath;
}
SDL_free(m_hdPath);
SDL_free(m_cdPath);
SDL_free(m_deviceId);
SDL_free(m_savePath);
SDL_free(m_mediaPath);
}
// FUNCTION: ISLE 0x401260
@ -1032,39 +1020,32 @@ bool IsleApp::LoadConfig()
#ifdef IOS
const char* prefPath = SDL_GetUserFolder(SDL_FOLDER_DOCUMENTS);
#elif defined(ANDROID)
// SDL_GetAndroidExternalStoragePath() returns without a trailing / resulting in "filesisle.ini" :(
const char* androidPath = SDL_GetAndroidExternalStoragePath();
size_t len = SDL_strlen(androidPath) + 2;
char* prefPath = new char[len];
SDL_strlcpy(prefPath, androidPath, len);
SDL_strlcat(prefPath, "/", len);
#else
char* prefPath = SDL_GetPrefPath("isledecomp", "isle");
#endif
char* iniConfig;
#ifdef __EMSCRIPTEN__
MxString androidPath = MxString(SDL_GetAndroidExternalStoragePath()) + "/";
const char* prefPath = androidPath.GetData();
#elif defined(EMSCRIPTEN)
if (m_iniPath && !Emscripten_SetupConfig(m_iniPath)) {
m_iniPath = NULL;
}
char* prefPath = SDL_GetPrefPath("isledecomp", "isle");
#else
char* prefPath = SDL_GetPrefPath("isledecomp", "isle");
#endif
MxString iniConfig;
if (m_iniPath) {
iniConfig = new char[strlen(m_iniPath) + 1];
strcpy(iniConfig, m_iniPath);
iniConfig = m_iniPath;
}
else if (prefPath) {
iniConfig = new char[strlen(prefPath) + strlen("isle.ini") + 1]();
strcat(iniConfig, prefPath);
strcat(iniConfig, "isle.ini");
iniConfig = prefPath;
iniConfig += "isle.ini";
}
else {
iniConfig = new char[strlen("isle.ini") + 1];
strcpy(iniConfig, "isle.ini");
iniConfig = "isle.ini";
}
SDL_Log("Reading configuration from \"%s\"", iniConfig);
dictionary* dict = iniparser_load(iniConfig);
SDL_Log("Reading configuration from \"%s\"", iniConfig.GetData());
dictionary* dict = iniparser_load(iniConfig.GetData());
// [library:config]
// Load sane defaults if dictionary failed to load
@ -1075,20 +1056,20 @@ bool IsleApp::LoadConfig()
}
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Loading sane defaults");
FILE* iniFP = fopen(iniConfig, "wb");
FILE* iniFP = fopen(iniConfig.GetData(), "wb");
if (!iniFP) {
SDL_LogError(
SDL_LOG_CATEGORY_APPLICATION,
"Failed to write config at '%s': %s",
iniConfig,
iniConfig.GetData(),
strerror(errno)
);
return false;
}
char buf[32];
dict = iniparser_load(iniConfig);
dict = iniparser_load(iniConfig.GetData());
iniparser_set(dict, "isle", NULL);
iniparser_set(dict, "isle:diskpath", SDL_GetBasePath());
@ -1143,8 +1124,9 @@ bool IsleApp::LoadConfig()
#ifdef ANDROID
Android_SetupDefaultConfigOverrides(dict);
#endif
iniparser_dump_ini(dict, iniFP);
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "New config written at '%s'", iniConfig);
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "New config written at '%s'", iniConfig.GetData());
fclose(iniFP);
}
@ -1152,20 +1134,10 @@ bool IsleApp::LoadConfig()
Emscripten_SetupDefaultConfigOverrides(dict);
#endif
const char* hdPath = iniparser_getstring(dict, "isle:diskpath", SDL_GetBasePath());
m_hdPath = new char[strlen(hdPath) + 1];
strcpy(m_hdPath, hdPath);
MxOmni::SetHD(m_hdPath);
const char* cdPath = iniparser_getstring(dict, "isle:cdpath", MxOmni::GetCD());
m_cdPath = new char[strlen(cdPath) + 1];
strcpy(m_cdPath, cdPath);
MxOmni::SetCD(m_cdPath);
const char* mediaPath = iniparser_getstring(dict, "isle:mediapath", hdPath);
m_mediaPath = new char[strlen(mediaPath) + 1];
strcpy(m_mediaPath, mediaPath);
MxOmni::SetHD((m_hdPath = SDL_strdup(iniparser_getstring(dict, "isle:diskpath", SDL_GetBasePath()))));
MxOmni::SetCD((m_cdPath = SDL_strdup(iniparser_getstring(dict, "isle:cdpath", MxOmni::GetCD()))));
m_savePath = SDL_strdup(iniparser_getstring(dict, "isle:savepath", prefPath));
m_mediaPath = SDL_strdup(iniparser_getstring(dict, "isle:mediapath", m_hdPath));
m_flipSurfaces = iniparser_getboolean(dict, "isle:Flip Surfaces", m_flipSurfaces);
m_fullScreen = iniparser_getboolean(dict, "isle:Full Screen", m_fullScreen);
m_exclusiveFullScreen = iniparser_getboolean(dict, "isle:Exclusive Full Screen", m_exclusiveFullScreen);
@ -1212,17 +1184,9 @@ bool IsleApp::LoadConfig()
const char* deviceId = iniparser_getstring(dict, "isle:3D Device ID", NULL);
if (deviceId != NULL) {
m_deviceId = new char[strlen(deviceId) + 1];
strcpy(m_deviceId, deviceId);
m_deviceId = SDL_strdup(deviceId);
}
// [library:config]
// The original game does not save any data if no savepath is given.
// Instead, we use SDLs prefPath as a default fallback and always save data.
const char* savePath = iniparser_getstring(dict, "isle:savepath", prefPath);
m_savePath = new char[strlen(savePath) + 1];
strcpy(m_savePath, savePath);
#ifdef EXTENSIONS
for (const char* key : Extensions::availableExtensions) {
if (iniparser_getboolean(dict, key, 0)) {
@ -1242,11 +1206,12 @@ bool IsleApp::LoadConfig()
#endif
iniparser_freedict(dict);
delete[] iniConfig;
#ifndef IOS
SDL_free(prefPath);
#endif
[](auto path) {
if constexpr (std::is_same_v<decltype(path), char*>) {
SDL_free(path);
}
}(prefPath);
return true;
}

View File

@ -101,7 +101,7 @@ class IsleApp {
MxFloat m_cursorSensitivity;
void DisplayArgumentHelp(const char* p_execName);
char* m_iniPath;
const char* m_iniPath;
MxFloat m_maxLod;
MxU32 m_maxAllowedExtras;
MxTransitionManager::TransitionType m_transitionType;

View File

@ -9,7 +9,7 @@
// SIZE 0x10
class MxString : public MxCore {
public:
MxString();
LEGO1_EXPORT MxString();
MxString(const MxString& p_str);
LEGO1_EXPORT MxString(const char* p_str);
MxString(const char* p_str, MxU16 p_maxlen);