From e49f9b10a856da67c0f9efada2cdee102e600c01 Mon Sep 17 00:00:00 2001 From: sigmabeta Date: Sun, 17 Jan 2016 13:42:22 -0500 Subject: [PATCH] Implement Java-based Config file read/save --- .../model/settings/BooleanSetting.java | 28 +++ .../model/settings/FloatSetting.java | 28 +++ .../dolphinemu/model/settings/IntSetting.java | 28 +++ .../dolphinemu/model/settings/Setting.java | 26 +++ .../model/settings/SettingSection.java | 35 ++++ .../model/settings/StringSetting.java | 28 +++ .../dolphinemu/utils/SettingsFile.java | 193 ++++++++++++++++++ 7 files changed, 366 insertions(+) create mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/BooleanSetting.java create mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/FloatSetting.java create mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/IntSetting.java create mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/Setting.java create mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/SettingSection.java create mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/StringSetting.java create mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/SettingsFile.java diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/BooleanSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/BooleanSetting.java new file mode 100644 index 0000000000..e282e6f038 --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/BooleanSetting.java @@ -0,0 +1,28 @@ +package org.dolphinemu.dolphinemu.model.settings; + +public final class BooleanSetting extends Setting +{ + private boolean mValue; + + public BooleanSetting(String key, SettingSection section, boolean value) + { + super(key, section); + mValue = value; + } + + public boolean getValue() + { + return mValue; + } + + public void setValue(boolean value) + { + mValue = value; + } + + @Override + public String getValueAsString() + { + return mValue ? "True" : "False"; + } +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/FloatSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/FloatSetting.java new file mode 100644 index 0000000000..82c273a991 --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/FloatSetting.java @@ -0,0 +1,28 @@ +package org.dolphinemu.dolphinemu.model.settings; + +public final class FloatSetting extends Setting +{ + private float mValue; + + public FloatSetting(String key, SettingSection section, float value) + { + super(key, section); + mValue = value; + } + + public float getValue() + { + return mValue; + } + + public void setValue(float value) + { + mValue = value; + } + + @Override + public String getValueAsString() + { + return Float.toString(mValue); + } +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/IntSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/IntSetting.java new file mode 100644 index 0000000000..b47ce6ecf3 --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/IntSetting.java @@ -0,0 +1,28 @@ +package org.dolphinemu.dolphinemu.model.settings; + +public final class IntSetting extends Setting +{ + private int mValue; + + public IntSetting(String key, SettingSection section, int value) + { + super(key, section); + mValue = value; + } + + public int getValue() + { + return mValue; + } + + public void setValue(int value) + { + mValue = value; + } + + @Override + public String getValueAsString() + { + return Integer.toString(mValue); + } +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/Setting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/Setting.java new file mode 100644 index 0000000000..7ebc5633d8 --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/Setting.java @@ -0,0 +1,26 @@ +package org.dolphinemu.dolphinemu.model.settings; + +public abstract class Setting +{ + private String mKey; + + private SettingSection mSection; + + public Setting(String key, SettingSection section) + { + mKey = key; + mSection = section; + } + + public String getKey() + { + return mKey; + } + + public SettingSection getSection() + { + return mSection; + } + + public abstract String getValueAsString(); +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/SettingSection.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/SettingSection.java new file mode 100644 index 0000000000..7ab9626e65 --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/SettingSection.java @@ -0,0 +1,35 @@ +package org.dolphinemu.dolphinemu.model.settings; + +import java.util.HashMap; + +public class SettingSection +{ + private String mName; + + private HashMap mSettings = new HashMap<>(); + + public SettingSection(String name) + { + mName = name; + } + + public String getName() + { + return mName; + } + + public void putSetting(String key, Setting setting) + { + mSettings.put(key, setting); + } + + public Setting getSetting(String key) + { + return mSettings.get(key); + } + + public HashMap getSettings() + { + return mSettings; + } +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/StringSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/StringSetting.java new file mode 100644 index 0000000000..5c381dda3a --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/StringSetting.java @@ -0,0 +1,28 @@ +package org.dolphinemu.dolphinemu.model.settings; + +public final class StringSetting extends Setting +{ + private String mValue; + + public StringSetting(String key, SettingSection section, String value) + { + super(key, section); + mValue = value; + } + + public String getValue() + { + return mValue; + } + + public void setValue(String value) + { + mValue = value; + } + + @Override + public String getValueAsString() + { + return mValue; + } +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/SettingsFile.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/SettingsFile.java new file mode 100644 index 0000000000..c200c3dea3 --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/SettingsFile.java @@ -0,0 +1,193 @@ +package org.dolphinemu.dolphinemu.utils; + +import android.os.Environment; +import android.support.annotation.NonNull; + +import org.dolphinemu.dolphinemu.model.settings.BooleanSetting; +import org.dolphinemu.dolphinemu.model.settings.FloatSetting; +import org.dolphinemu.dolphinemu.model.settings.IntSetting; +import org.dolphinemu.dolphinemu.model.settings.Setting; +import org.dolphinemu.dolphinemu.model.settings.SettingSection; +import org.dolphinemu.dolphinemu.model.settings.StringSetting; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.UnsupportedEncodingException; +import java.util.HashMap; +import java.util.Set; + +public final class SettingsFile +{ + private SettingsFile() + { + } + + public static HashMap readFile(String fileName) + { + HashMap sections = new HashMap<>(); + + File ini = getSettingsFile(fileName); + + BufferedReader reader = null; + + try + { + reader = new BufferedReader(new FileReader(ini)); + + SettingSection current = null; + for (String line; (line = reader.readLine()) != null; ) + { + if (line.startsWith("[") && line.endsWith("]")) + { + current = sectionFromLine(line); + sections.put(current.getName(), current); + } + else if ((current != null) && line.contains("=")) + { + Setting setting = settingFromLine(current, line); + current.putSetting(setting.getKey(), setting); + } + } + } + catch (FileNotFoundException e) + { + Log.error("[SettingsFile] File not found: " + fileName + ".ini: " + e.getMessage()); + } + catch (IOException e) + { + Log.error("[SettingsFile] Error reading from: " + fileName + ".ini: " + e.getMessage()); + } finally + { + if (reader != null) + { + try + { + reader.close(); + } + catch (IOException e) + { + Log.error("[SettingsFile] Error closing: " + fileName + ".ini: " + e.getMessage()); + } + } + } + + return sections; + } + + @NonNull + private static File getSettingsFile(String fileName) + { + String storagePath = Environment.getExternalStorageDirectory().getAbsolutePath(); + return new File(storagePath + "/dolphin-emu/Config/" + fileName + ".ini"); + } + + public static void saveFile(String fileName, HashMap sections) + { + File ini = getSettingsFile(fileName); + + PrintWriter writer = null; + try + { + writer = new PrintWriter(ini, "UTF-8"); + + Set keySet = sections.keySet(); + + for (String key : keySet) + { + SettingSection section = sections.get(key); + writeSection(writer, section); + } + } + catch (FileNotFoundException e) + { + Log.error("[SettingsFile] File not found: " + fileName + ".ini: " + e.getMessage()); + } + catch (UnsupportedEncodingException e) + { + Log.error("[SettingsFile] Bad encoding; please file a bug report: " + fileName + ".ini: " + e.getMessage()); + } finally + { + if (writer != null) + { + writer.close(); + } + } + } + + private static SettingSection sectionFromLine(String line) + { + String sectionName = line.substring(1, line.length() - 1); + return new SettingSection(sectionName); + } + + private static Setting settingFromLine(SettingSection current, String line) + { + String[] splitLine = line.split("="); + + String key = splitLine[0].trim(); + String value = splitLine[1].trim(); + + try + { + int valueAsInt = Integer.valueOf(value); + + return new IntSetting(key, current, valueAsInt); + } + catch (NumberFormatException ex) + { + } + + try + { + float valueAsFloat = Float.valueOf(value); + + return new FloatSetting(key, current, valueAsFloat); + } + catch (NumberFormatException ex) + { + } + + switch (value) + { + case "True": + return new BooleanSetting(key, current, true); + case "False": + return new BooleanSetting(key, current, false); + default: + return new StringSetting(key, current, value); + } + } + + private static void writeSection(PrintWriter writer, SettingSection section) + { + // Write the section header. + String header = sectionAsString(section); + writer.println(header); + + // Write this section's values. + HashMap settings = section.getSettings(); + Set keySet = settings.keySet(); + + for (String key : keySet) + { + Setting setting = settings.get(key); + String settingString = settingAsString(setting); + + writer.println(settingString); + } + } + + private static String sectionAsString(SettingSection section) + { + return "[" + section.getName() + "]"; + } + + private static String settingAsString(Setting setting) + { + return setting.getKey() + " = " + setting.getValueAsString(); + } +}