Config: When saving Config.json, preserve ThunksDB entries

This commit is contained in:
Tony Wasserka committed 2025-02-16 13:15:40 +01:00
1 parent b968ea7e7e
commit cc6ff5e9e6
3 files changed
+54 -8

No files matched your search

+51 -6
View File
@@ -66,11 +66,8 @@ static constexpr std::pair<std::string_view, FEXCore::Config::ConfigOption> Conf
#include <FEXCore/Config/ConfigValues.inl>
};
void SaveLayerToJSON(const fextl::string& Filename, FEXCore::Config::Layer* const Layer) {
char Buffer[4096];
char* Dest {};
Dest = json_objOpen(Buffer, nullptr);
Dest = json_objOpen(Dest, "Config");
static char* SaveLayerToJSON(char* JsonBuffer, const FEXCore::Config::Layer* Layer) {
JsonBuffer = json_objOpen(JsonBuffer, "Config");
for (auto& it : Layer->GetOptionMap()) {
std::string_view Name {};
for (auto& name_it : ConfigLookup) {
@@ -80,13 +77,30 @@ void SaveLayerToJSON(const fextl::string& Filename, FEXCore::Config::Layer* cons
}
}
for (auto& var : it.second) {
Dest = json_str(Dest, Name.data(), var.c_str());
JsonBuffer = json_str(JsonBuffer, Name.data(), var.c_str());
}
}
return json_objClose(JsonBuffer);
}
void SaveLayerToJSON(const fextl::string& Filename, const FEXCore::Config::Layer* Layer, const fextl::unordered_map<fextl::string, bool>& HostLibs) {
char Buffer[4096];
char* Dest {};
Dest = json_objOpen(Buffer, nullptr);
Dest = SaveLayerToJSON(Dest, Layer);
Dest = json_objOpen(Dest, "ThunksDB");
for (auto& [Name, Enabled] : HostLibs) {
Dest = json_int(Dest, Name.c_str(), Enabled);
}
Dest = json_objClose(Dest);
Dest = json_objClose(Dest);
json_end(Dest);
LogMan::Throw::AFmt(Dest <= std::end(Buffer), "Exceeded JSON buffer size");
auto File = FEXCore::File::File(Filename.c_str(),
FEXCore::File::FileModes::WRITE | FEXCore::File::FileModes::CREATE | FEXCore::File::FileModes::TRUNCATE);
@@ -95,6 +109,37 @@ void SaveLayerToJSON(const fextl::string& Filename, FEXCore::Config::Layer* cons
}
}
void SaveLayerToJSON(const fextl::string& Filename, const FEXCore::Config::Layer* Layer) {
fextl::unordered_map<fextl::string, bool> HostLibsDB;
// Load existing ThunksDB entry to persist it
{
fextl::vector<char> FileData;
if (!FEXCore::FileLoading::LoadFile(FileData, Filename)) {
goto WriteConfig;
}
// Find bounds of previously existing Config entry (if any)
FEX::JSON::JsonAllocator Pool {};
const json_t* json = FEX::JSON::CreateJSON(FileData, Pool);
if (!json) {
goto WriteConfig;
}
const json_t* ThunksDB = json_getProperty(json, "ThunksDB");
if (!ThunksDB) {
goto WriteConfig;
}
for (const json_t* Item = json_getChild(ThunksDB); Item != nullptr; Item = json_getSibling(Item)) {
HostLibsDB.emplace(json_getName(Item), (json_getInteger(Item) != 0));
}
}
WriteConfig:
SaveLayerToJSON(Filename, Layer, HostLibsDB);
}
// Application loaders
class OptionMapper : public FEXCore::Config::Layer {
public:
+2 -1
View File
@@ -19,7 +19,8 @@ public:
protected:
};
void SaveLayerToJSON(const fextl::string& Filename, FEXCore::Config::Layer* const Layer);
void SaveLayerToJSON(const fextl::string& Filename, const FEXCore::Config::Layer* Layer);
void SaveLayerToJSON(const fextl::string& Filename, const FEXCore::Config::Layer* Layer, const fextl::unordered_map<fextl::string, bool>& HostLibs);
struct ApplicationNames {
// This is the full path to the program (if it exists).
+1 -1
View File
@@ -335,7 +335,7 @@ ConfigRuntime::ConfigRuntime(const QString& ConfigFilename) {
void ConfigRuntime::onSave(const QUrl& Filename) {
qInfo() << "Saving to" << Filename.toLocalFile().toStdString().c_str();
FEX::Config::SaveLayerToJSON(Filename.toLocalFile().toStdString().c_str(), LoadedConfig.get());
FEX::Config::SaveLayerToJSON(Filename.toLocalFile().toStdString().c_str(), LoadedConfig.get(), HostLibs.HostLibsDB);
}
void ConfigRuntime::onLoad(const QUrl& Filename) {