Auto-detect default INI files by OS prefix
All checks were successful
Build / Build (push) Successful in 30s
All checks were successful
Build / Build (push) Successful in 30s
Scan the browse directory for case-insensitive android*/linux*/lakka* .ini files at startup and use the first match, with legacy default filenames as fallback.
This commit is contained in:
@@ -6,8 +6,12 @@
|
|||||||
#include "app_config.h"
|
#include "app_config.h"
|
||||||
#include "ini_handler.h"
|
#include "ini_handler.h"
|
||||||
|
|
||||||
|
#include <dirent.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cctype>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
// Create parent directories for a file path
|
// Create parent directories for a file path
|
||||||
static void ensureParentDir(const std::string& filePath)
|
static void ensureParentDir(const std::string& filePath)
|
||||||
@@ -30,6 +34,70 @@ static void ensureParentDir(const std::string& filePath)
|
|||||||
mkdir(dir.c_str(), 0755);
|
mkdir(dir.c_str(), 0755);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static std::string toLowerCopy(const std::string& s)
|
||||||
|
{
|
||||||
|
std::string out = s;
|
||||||
|
std::transform(out.begin(), out.end(), out.begin(),
|
||||||
|
[](unsigned char c) { return (char)std::tolower(c); });
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool hasIniExtension(const std::string& name)
|
||||||
|
{
|
||||||
|
if (name.size() < 4)
|
||||||
|
return false;
|
||||||
|
std::string ext = toLowerCopy(name.substr(name.size() - 4));
|
||||||
|
return ext == ".ini";
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool startsWithCaseInsensitive(const std::string& value, const std::string& prefix)
|
||||||
|
{
|
||||||
|
if (value.size() < prefix.size())
|
||||||
|
return false;
|
||||||
|
std::string valuePrefix = toLowerCopy(value.substr(0, prefix.size()));
|
||||||
|
return valuePrefix == toLowerCopy(prefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string findIniByPrefix(const std::string& directory, const std::string& prefix, const std::string& fallbackPath)
|
||||||
|
{
|
||||||
|
DIR* dp = opendir(directory.c_str());
|
||||||
|
if (!dp)
|
||||||
|
return fallbackPath;
|
||||||
|
|
||||||
|
std::vector<std::string> matches;
|
||||||
|
struct dirent* ep;
|
||||||
|
|
||||||
|
while ((ep = readdir(dp)) != nullptr)
|
||||||
|
{
|
||||||
|
std::string name = ep->d_name;
|
||||||
|
if (name == "." || name == "..")
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!hasIniExtension(name))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!startsWithCaseInsensitive(name, prefix))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
matches.push_back(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
closedir(dp);
|
||||||
|
|
||||||
|
if (matches.empty())
|
||||||
|
return fallbackPath;
|
||||||
|
|
||||||
|
std::sort(matches.begin(), matches.end(), [](const std::string& a, const std::string& b) {
|
||||||
|
return toLowerCopy(a) < toLowerCopy(b);
|
||||||
|
});
|
||||||
|
|
||||||
|
std::string fullPath = directory;
|
||||||
|
if (!fullPath.empty() && fullPath.back() != '/')
|
||||||
|
fullPath += '/';
|
||||||
|
fullPath += matches.front();
|
||||||
|
return fullPath;
|
||||||
|
}
|
||||||
|
|
||||||
AppConfig& AppConfig::get()
|
AppConfig& AppConfig::get()
|
||||||
{
|
{
|
||||||
static AppConfig instance;
|
static AppConfig instance;
|
||||||
@@ -38,10 +106,10 @@ AppConfig& AppConfig::get()
|
|||||||
|
|
||||||
AppConfig::AppConfig()
|
AppConfig::AppConfig()
|
||||||
{
|
{
|
||||||
// Defaults
|
// Defaults: scan for case-insensitive prefixes first, fallback to legacy names.
|
||||||
paths[(int)OsTarget::ANDROID] = DEFAULT_ANDROID_INI;
|
paths[(int)OsTarget::ANDROID] = findIniByPrefix(DEFAULT_BROWSE_DIR, "android", DEFAULT_ANDROID_INI);
|
||||||
paths[(int)OsTarget::LINUX] = DEFAULT_LINUX_INI;
|
paths[(int)OsTarget::LINUX] = findIniByPrefix(DEFAULT_BROWSE_DIR, "linux", DEFAULT_LINUX_INI);
|
||||||
paths[(int)OsTarget::LAKKA] = DEFAULT_LAKKA_INI;
|
paths[(int)OsTarget::LAKKA] = findIniByPrefix(DEFAULT_BROWSE_DIR, "lakka", DEFAULT_LAKKA_INI);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AppConfig::load()
|
void AppConfig::load()
|
||||||
|
|||||||
Reference in New Issue
Block a user