try not to crash when size of arrays in config file changes
This commit is contained in:
parent
96fc783107
commit
0bb9f65038
|
@ -1,5 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Reflection;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
@ -7,7 +8,7 @@ namespace BizHawk.MultiClient
|
||||||
{
|
{
|
||||||
public static class ConfigService
|
public static class ConfigService
|
||||||
{
|
{
|
||||||
public static T Load<T>(string filepath) where T : new()
|
public static T Load<T>(string filepath, T currentConfig) where T : new()
|
||||||
{
|
{
|
||||||
T config = new T();
|
T config = new T();
|
||||||
|
|
||||||
|
@ -22,9 +23,29 @@ namespace BizHawk.MultiClient
|
||||||
config = (T)s.Deserialize(r, typeof(T));
|
config = (T)s.Deserialize(r, typeof(T));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception e) { MessageBox.Show(e.ToString()); }
|
catch (Exception e) { MessageBox.Show(e.ToString()); }
|
||||||
if (config == null) return new T();
|
if (config == null) return new T();
|
||||||
else return config;
|
|
||||||
|
//patch up arrays in the config with the minimum number of things
|
||||||
|
foreach(var fi in typeof(T).GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public))
|
||||||
|
if (fi.FieldType.IsArray)
|
||||||
|
{
|
||||||
|
Array aold = fi.GetValue(currentConfig) as Array;
|
||||||
|
Array anew = fi.GetValue(config) as Array;
|
||||||
|
if (aold.Length == anew.Length) continue;
|
||||||
|
|
||||||
|
//create an array of the right size
|
||||||
|
Array acreate = Array.CreateInstance(fi.FieldType.GetElementType(), Math.Max(aold.Length,anew.Length));
|
||||||
|
|
||||||
|
//copy the old values in, (presumably the defaults), and then copy the new ones on top
|
||||||
|
Array.Copy(aold, acreate, Math.Min(aold.Length,acreate.Length));
|
||||||
|
Array.Copy(anew, acreate, Math.Min(anew.Length, acreate.Length));
|
||||||
|
|
||||||
|
//stash it into the config struct
|
||||||
|
fi.SetValue(config, acreate);
|
||||||
|
}
|
||||||
|
|
||||||
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Save(string filepath, object config)
|
public static void Save(string filepath, object config)
|
||||||
|
|
|
@ -1126,7 +1126,7 @@ namespace BizHawk.MultiClient
|
||||||
|
|
||||||
private void loadConfigToolStripMenuItem_Click(object sender, EventArgs e)
|
private void loadConfigToolStripMenuItem_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
Global.Config = ConfigService.Load<Config>(PathManager.DefaultIniPath);
|
Global.Config = ConfigService.Load<Config>(PathManager.DefaultIniPath, Global.Config);
|
||||||
Global.RenderPanel.AddMessage("Saved loaded");
|
Global.RenderPanel.AddMessage("Saved loaded");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@ namespace BizHawk.MultiClient
|
||||||
Application.EnableVisualStyles();
|
Application.EnableVisualStyles();
|
||||||
Application.SetCompatibleTextRenderingDefault(false);
|
Application.SetCompatibleTextRenderingDefault(false);
|
||||||
|
|
||||||
Global.Config = ConfigService.Load<Config>(PathManager.DefaultIniPath);
|
Global.Config = ConfigService.Load<Config>(PathManager.DefaultIniPath, new Config());
|
||||||
|
|
||||||
#if WINDOWS
|
#if WINDOWS
|
||||||
try { Global.DSound = new DirectSound(); }
|
try { Global.DSound = new DirectSound(); }
|
||||||
|
|
Loading…
Reference in New Issue