summaryrefslogtreecommitdiff
path: root/Source/Android/jni/NativeConfig.cpp
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2020-09-16 09:49:16 +0200
committerGitHub <noreply@github.com>2020-09-16 09:49:16 +0200
commita7b9e6857b6c4e172a4ec333a6c83d624092cdf3 (patch)
tree9f583bee8836b7dad793b75c43309257c6b851d9 /Source/Android/jni/NativeConfig.cpp
parente4e50691fbed68d207cfdc0570fc07a56259f040 (diff)
parent744c0b13cff45ff799f5a584482fee3f77c9661c (diff)
Merge pull request #8975 from JosJuice/android-new-config
Android: Hook up the new config system
Diffstat (limited to 'Source/Android/jni/NativeConfig.cpp')
-rw-r--r--Source/Android/jni/NativeConfig.cpp193
1 files changed, 193 insertions, 0 deletions
diff --git a/Source/Android/jni/NativeConfig.cpp b/Source/Android/jni/NativeConfig.cpp
new file mode 100644
index 0000000000..3a3a5289c3
--- /dev/null
+++ b/Source/Android/jni/NativeConfig.cpp
@@ -0,0 +1,193 @@
+// Copyright 2020 Dolphin Emulator Project
+// Licensed under GPLv2+
+// Refer to the license.txt file included.
+
+#include <memory>
+#include <string>
+
+#include <jni.h>
+
+#include "Common/Assert.h"
+#include "Common/Config/Config.h"
+#include "Core/ConfigLoaders/GameConfigLoader.h"
+#include "Core/ConfigLoaders/IsSettingSaveable.h"
+#include "jni/AndroidCommon/AndroidCommon.h"
+
+constexpr jint LAYER_BASE_OR_CURRENT = 0;
+constexpr jint LAYER_LOCAL_GAME = 1;
+
+static Config::Location GetLocation(JNIEnv* env, jstring file, jstring section, jstring key)
+{
+ const std::string decoded_file = GetJString(env, file);
+
+ Config::System system;
+ if (decoded_file == "Dolphin")
+ {
+ system = Config::System::Main;
+ }
+ else if (decoded_file == "GFX")
+ {
+ system = Config::System::GFX;
+ }
+ else if (decoded_file == "Logger")
+ {
+ system = Config::System::Logger;
+ }
+ else
+ {
+ ASSERT(false);
+ return {};
+ }
+
+ return Config::Location{system, GetJString(env, section), GetJString(env, key)};
+}
+
+static std::shared_ptr<Config::Layer> GetLayer(jint layer, const Config::Location& location)
+{
+ switch (layer)
+ {
+ case LAYER_BASE_OR_CURRENT:
+ if (GetActiveLayerForConfig(location) == Config::LayerType::Base)
+ return Config::GetLayer(Config::LayerType::Base);
+ else
+ return Config::GetLayer(Config::LayerType::CurrentRun);
+
+ case LAYER_LOCAL_GAME:
+ return Config::GetLayer(Config::LayerType::LocalGame);
+
+ default:
+ ASSERT(false);
+ return nullptr;
+ }
+}
+
+template <typename T>
+static T Get(jint layer, const Config::Location& location, T default_value)
+{
+ return GetLayer(layer, location)->Get<T>(location).value_or(default_value);
+}
+
+template <typename T>
+static void Set(jint layer, const Config::Location& location, T value)
+{
+ GetLayer(layer, location)->Set(location, value);
+ Config::InvokeConfigChangedCallbacks();
+}
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+JNIEXPORT jboolean JNICALL
+Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_isSettingSaveable(
+ JNIEnv* env, jclass obj, jstring file, jstring section, jstring key)
+{
+ const Config::Location location = GetLocation(env, file, section, key);
+ return static_cast<jboolean>(ConfigLoaders::IsSettingSaveable(location));
+}
+
+JNIEXPORT void JNICALL
+Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_loadGameInis(JNIEnv* env,
+ jclass obj,
+ jstring jGameId,
+ jint jRevision)
+{
+ const std::string game_id = GetJString(env, jGameId);
+ const u16 revision = static_cast<u16>(jRevision);
+ Config::AddLayer(ConfigLoaders::GenerateGlobalGameConfigLoader(game_id, revision));
+ Config::AddLayer(ConfigLoaders::GenerateLocalGameConfigLoader(game_id, revision));
+}
+
+JNIEXPORT void JNICALL
+Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_unloadGameInis(JNIEnv* env,
+ jclass obj)
+{
+ Config::RemoveLayer(Config::LayerType::GlobalGame);
+ Config::RemoveLayer(Config::LayerType::LocalGame);
+}
+
+JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_save(
+ JNIEnv* env, jclass obj, jint layer)
+{
+ return GetLayer(layer, {})->Save();
+}
+
+JNIEXPORT jboolean JNICALL
+Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_isOverridden(
+ JNIEnv* env, jclass obj, jstring file, jstring section, jstring key)
+{
+ const Config::Location location = GetLocation(env, file, section, key);
+ const bool result = Config::GetActiveLayerForConfig(location) != Config::LayerType::Base;
+ return static_cast<jboolean>(result);
+}
+
+JNIEXPORT jboolean JNICALL
+Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_deleteKey(
+ JNIEnv* env, jclass obj, jint layer, jstring file, jstring section, jstring key)
+{
+ const Config::Location location = GetLocation(env, file, section, key);
+ return static_cast<jboolean>(GetLayer(layer, location)->DeleteKey(location));
+}
+
+JNIEXPORT jstring JNICALL
+Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_getString(
+ JNIEnv* env, jclass obj, jint layer, jstring file, jstring section, jstring key,
+ jstring default_value)
+{
+ const Config::Location location = GetLocation(env, file, section, key);
+ return ToJString(env, Get(layer, location, GetJString(env, default_value)));
+}
+
+JNIEXPORT jboolean JNICALL
+Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_getBoolean(
+ JNIEnv* env, jclass obj, jint layer, jstring file, jstring section, jstring key,
+ jboolean default_value)
+{
+ const Config::Location location = GetLocation(env, file, section, key);
+ return static_cast<jboolean>(Get(layer, location, static_cast<bool>(default_value)));
+}
+
+JNIEXPORT jint JNICALL Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_getInt(
+ JNIEnv* env, jclass obj, jint layer, jstring file, jstring section, jstring key,
+ jint default_value)
+{
+ return Get(layer, GetLocation(env, file, section, key), default_value);
+}
+
+JNIEXPORT jfloat JNICALL
+Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_getFloat(
+ JNIEnv* env, jclass obj, jint layer, jstring file, jstring section, jstring key,
+ jfloat default_value)
+{
+ return Get(layer, GetLocation(env, file, section, key), default_value);
+}
+
+JNIEXPORT void JNICALL
+Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_setString(
+ JNIEnv* env, jclass obj, jint layer, jstring file, jstring section, jstring key, jstring value)
+{
+ return Set(layer, GetLocation(env, file, section, key), GetJString(env, value));
+}
+
+JNIEXPORT void JNICALL
+Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_setBoolean(
+ JNIEnv* env, jclass obj, jint layer, jstring file, jstring section, jstring key, jboolean value)
+{
+ return Set(layer, GetLocation(env, file, section, key), static_cast<bool>(value));
+}
+
+JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_setInt(
+ JNIEnv* env, jclass obj, jint layer, jstring file, jstring section, jstring key, jint value)
+{
+ return Set(layer, GetLocation(env, file, section, key), value);
+}
+
+JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_setFloat(
+ JNIEnv* env, jclass obj, jint layer, jstring file, jstring section, jstring key, jfloat value)
+{
+ return Set(layer, GetLocation(env, file, section, key), value);
+}
+
+#ifdef __cplusplus
+}
+#endif