From 6dd601571e69dbecec2fba33246e77aec46c670b Mon Sep 17 00:00:00 2001 From: beirich Date: Sun, 20 Feb 2011 06:13:26 +0000 Subject: [PATCH] config system update --- .../BizHawk.MultiClient.csproj | 4 + BizHawk.MultiClient/Config.cs | 101 +++++++----------- BizHawk.MultiClient/ConfigService.cs | 75 ++----------- .../Input/ControllerBinding.cs | 2 + BizHawk.MultiClient/RecentFiles.cs | 23 +--- Newtonsoft.Json.dll | Bin 0 -> 61440 bytes 6 files changed, 57 insertions(+), 148 deletions(-) create mode 100644 Newtonsoft.Json.dll diff --git a/BizHawk.MultiClient/BizHawk.MultiClient.csproj b/BizHawk.MultiClient/BizHawk.MultiClient.csproj index 4c2933dc12..5ea18b556b 100644 --- a/BizHawk.MultiClient/BizHawk.MultiClient.csproj +++ b/BizHawk.MultiClient/BizHawk.MultiClient.csproj @@ -35,6 +35,10 @@ x86 + + False + ..\Newtonsoft.Json.dll + 3.5 diff --git a/BizHawk.MultiClient/Config.cs b/BizHawk.MultiClient/Config.cs index e4c6b1a03d..6a52324aba 100644 --- a/BizHawk.MultiClient/Config.cs +++ b/BizHawk.MultiClient/Config.cs @@ -4,13 +4,13 @@ { public Config() { - SMSController[0] = new SMSControllerTemplate(1, true); - SMSController[1] = new SMSControllerTemplate(2, false); - PCEController[0] = new PCEControllerTemplate(1,true); - PCEController[1] = new PCEControllerTemplate(2,false); - PCEController[2] = new PCEControllerTemplate(3,false); - PCEController[3] = new PCEControllerTemplate(4,false); - PCEController[4] = new PCEControllerTemplate(5,false); + SMSController[0] = new SMSControllerTemplate(true); + SMSController[1] = new SMSControllerTemplate(false); + PCEController[0] = new PCEControllerTemplate(true); + PCEController[1] = new PCEControllerTemplate(false); + PCEController[2] = new PCEControllerTemplate(false); + PCEController[3] = new PCEControllerTemplate(false); + PCEController[4] = new PCEControllerTemplate(false); } // General Client Settings @@ -95,16 +95,12 @@ public string LoadSlot9 = "F9"; - - - - // SMS / GameGear Settings public bool SmsEnableFM = true; public bool SmsAllowOverlock = false; public bool SmsForceStereoSeparation = false; - public string SmsReset = "Reset, Tab"; + public string SmsReset = "Tab"; public string SmsPause = "J1 B10, Space"; public SMSControllerTemplate[] SMSController = new SMSControllerTemplate[2]; @@ -122,7 +118,7 @@ public string GenP1Start = "J1 B10, Return"; //GameBoy Settings - public NESControllerTemplate GameBoyController = new NESControllerTemplate(1); + public NESControllerTemplate GameBoyController = new NESControllerTemplate(); } public class SMSControllerTemplate @@ -133,28 +129,21 @@ public string Right; public string B1; public string B2; - public SMSControllerTemplate(int i, bool defaults) + public SMSControllerTemplate() { } + public SMSControllerTemplate(bool defaults) { - if (!defaults) + if (defaults) { - Up = string.Format("J{0} Up", i); - Down = string.Format("J{0} Down", i); - Left = string.Format("J{0} Left", i); - Right = string.Format("J{0} Right", i); - B1 = string.Format("J{0} B1", i); - B2 = string.Format("J{0} B2", i); - } - else - { - Up = string.Format("J{0} Up, UpArrow", i); - Down = string.Format("J{0} Down, DownArrow", i); - Left = string.Format("J{0} Left, LeftArrow", i); - Right = string.Format("J{0} Right, RightArrow", i); - B1 = string.Format("J{0} B1, Z", i); - B2 = string.Format("J{0} B2, X", i); + Up = "J1 Up, UpArrow"; + Down = "J1 Down, DownArrow"; + Left = "J1 Left, LeftArrow"; + Right = "J1 Right, RightArrow"; + B1 = "J1 B1, Z"; + B2 = "J1 B2, X"; } } } + public class PCEControllerTemplate { public string Up; @@ -165,32 +154,23 @@ public string II; public string Run; public string Select; - public PCEControllerTemplate(int i, bool defaults) + public PCEControllerTemplate() { } + public PCEControllerTemplate(bool defaults) { - if (!defaults) + if (defaults) { - Up = string.Format("J{0} Up", i); - Down = string.Format("J{0} Down", i); - Left = string.Format("J{0} Left", i); - Right = string.Format("J{0} Right", i); - I = string.Format("J{0} I", i); - II = string.Format("J{0} II", i); - Run = string.Format("J{0} Run", i); - Select = string.Format("J{0} Select", i); - } - else - { - Up = string.Format("J{0} Up, UpArrow", i); - Down = string.Format("J{0} Down, DownArrow", i); - Left = string.Format("J{0} Left, LeftArrow", i); - Right = string.Format("J{0} Right, RightArrow", i); - I = string.Format("J{0} I, Z", i); - II = string.Format("J{0} II, X", i); - Run = string.Format("J{0} Run, C", i); - Select = string.Format("J{0} Select, V", i); + Up = "J1 Up, UpArrow"; + Down = "J1 Down, DownArrow"; + Left = "J1 Left, LeftArrow"; + Right = "J1 Right, RightArrow"; + I = "J1 I, Z"; + II = "J1 II, X"; + Run = "J1 Run, C"; + Select = "J1 Select, V"; } } } + public class NESControllerTemplate { public string Up; @@ -201,17 +181,16 @@ public string B; public string Start; public string Select; - public NESControllerTemplate(int i) + public NESControllerTemplate() { - Up = string.Format("J{0} Up", i); - Down = string.Format("J{0} Down", i); - Left = string.Format("J{0} Left", i); - Right = string.Format("J{0} Right", i); - A = string.Format("J{0} A", i); - B = string.Format("J{0} B", i); - Start = string.Format("J{0} Start", i); - Select = string.Format("J{0} Select", i); + Up = "J1 Up"; + Down = "J1 Down"; + Left = "J1 Left"; + Right = "J1 Right"; + A = "J1 B1, Z"; + B = "J1 B2, X"; + Start = "J1 B10, Return"; + Select = "J1 B9, Space"; } } - } \ No newline at end of file diff --git a/BizHawk.MultiClient/ConfigService.cs b/BizHawk.MultiClient/ConfigService.cs index 9743a18b91..75da242672 100644 --- a/BizHawk.MultiClient/ConfigService.cs +++ b/BizHawk.MultiClient/ConfigService.cs @@ -1,13 +1,8 @@ -using System; -using System.IO; +using System.IO; +using Newtonsoft.Json; namespace BizHawk.MultiClient { - public interface IConfigSerializable - { - void Deserialize(string str); - } - public static class ConfigService { public static T Load(string filepath) where T : new() @@ -17,58 +12,12 @@ namespace BizHawk.MultiClient try { var file = new FileInfo(filepath); - var reader = file.OpenText(); - var type = config.GetType(); - - while (reader.EndOfStream == false) + using (var reader = file.OpenText()) { - try - { - string line = reader.ReadLine(); - if (string.IsNullOrEmpty(line)) - continue; - - int seperatorIndex = line.IndexOf(' '); - string name = line.Substring(0, seperatorIndex); - string value = line.Substring(seperatorIndex).Trim(); - - var field = type.GetField(name); - if (field == null) // look at properties instead of fields? or just abort. - continue; - - Type fieldType = field.FieldType; - if (fieldType == typeof(string)) - field.SetValue(config, value); - else if (fieldType == typeof(int)) - field.SetValue(config, int.Parse(value)); - else if (fieldType == typeof(long)) - field.SetValue(config, long.Parse(value)); - else if (fieldType == typeof(byte)) - field.SetValue(config, byte.Parse(value)); - else if (fieldType == typeof(short)) - field.SetValue(config, short.Parse(value)); - else if (fieldType == typeof(float)) - field.SetValue(config, Single.Parse(value)); - else if (fieldType == typeof(double)) - field.SetValue(config, Double.Parse(value)); - else if (fieldType == typeof(bool)) - field.SetValue(config, bool.Parse(value)); - else if (fieldType == typeof(char)) - field.SetValue(config, char.Parse(value)); - else - { - var iface = fieldType.GetInterface("IConfigSerializable"); - if (iface != null) - { - IConfigSerializable i = (IConfigSerializable) Activator.CreateInstance(fieldType); - i.Deserialize(value); - field.SetValue(config, i); - } - } - } - catch { } // If anything fails to parse, just move on / use defaults, don't crash. + var s = new JsonSerializer(); + var r = new JsonReader(reader); + config = (T) s.Deserialize(r, typeof (T)); } - reader.Close(); } catch { } return config; @@ -77,16 +26,12 @@ namespace BizHawk.MultiClient public static void Save(string filepath, object config) { var file = new FileInfo(filepath); - var writer = file.CreateText(); - - var type = config.GetType(); - var fields = type.GetFields(); - - foreach (var field in fields) + using (var writer = file.CreateText()) { - writer.WriteLine("{0} {1}", field.Name, field.GetValue(config)); + var s = new JsonSerializer(); + var w = new JsonWriter(writer) { Formatting = Formatting.Indented }; + s.Serialize(w, config); } - writer.Close(); } } } \ No newline at end of file diff --git a/BizHawk.MultiClient/Input/ControllerBinding.cs b/BizHawk.MultiClient/Input/ControllerBinding.cs index 72f48ff28f..07993dbb0f 100644 --- a/BizHawk.MultiClient/Input/ControllerBinding.cs +++ b/BizHawk.MultiClient/Input/ControllerBinding.cs @@ -33,6 +33,8 @@ namespace BizHawk.MultiClient public void BindMulti(string button, string controlString) { + if (string.IsNullOrEmpty(controlString)) + return; string[] controlbindings = controlString.Split(','); foreach (string control in controlbindings) bindings[button].Add(control.Trim()); diff --git a/BizHawk.MultiClient/RecentFiles.cs b/BizHawk.MultiClient/RecentFiles.cs index d06a3fda86..76f1eee2d7 100644 --- a/BizHawk.MultiClient/RecentFiles.cs +++ b/BizHawk.MultiClient/RecentFiles.cs @@ -3,7 +3,7 @@ using System.Text; namespace BizHawk.MultiClient { - public class RecentFiles : IConfigSerializable + public class RecentFiles { private int MAX_RECENT_FILES; //Maximum number of files private List recentlist; //List of recent files @@ -82,26 +82,5 @@ namespace BizHawk.MultiClient { return recentlist[position]; } - - public override string ToString() - { - var sb = new StringBuilder(); - sb.Append(MAX_RECENT_FILES); - sb.Append("@"); - foreach (string file in recentlist) - sb.AppendFormat("\"{0}\"|", file); - return sb.ToString(); - } - - public void Deserialize(string str) - { - var sections = str.Split('@'); - MAX_RECENT_FILES = int.Parse(sections[0]); - var files = sections[1].Split('|'); - recentlist.Clear(); - foreach (string file in files) - if (string.IsNullOrEmpty(file) == false) - recentlist.Add(file.Replace("\"", "")); - } } } diff --git a/Newtonsoft.Json.dll b/Newtonsoft.Json.dll new file mode 100644 index 0000000000000000000000000000000000000000..30bd9d6c9ebfa0118849dca9d54f2a305f09ca2a GIT binary patch literal 61440 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

)O(NDV$hG*~iT2K`O+I%C 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 literal 0 HcmV?d00001