]> O.S.I.I.S - jp/crow.git/commitdiff
optimize configuration class
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Fri, 6 Jan 2017 19:55:59 +0000 (20:55 +0100)
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Fri, 6 Jan 2017 20:04:43 +0000 (21:04 +0100)
src/Configuration.cs

index 48c57c879d1d293d5581859a479377edb9e4fa57..70923e6027abdd80354eaf26c79775a033c06ea3 100644 (file)
@@ -22,18 +22,48 @@ using System;
 using System.Reflection;
 using System.IO;
 using System.Collections.Generic;
+using System.Threading;
 
 namespace Crow
 {
-       //TODO:maybe create iterator
+       public class ConfigItem {
+               Type type;
+               internal object curVal;
+               bool parsingNeeded = false;
+               public ConfigItem(object newVal){
+                       curVal = newVal;
+               }
+               public ConfigItem(string newVal){
+                       curVal = newVal;
+                       parsingNeeded = true;
+               }
+               public T GetValue<T>(){
+                       if (type == null)
+                               type = typeof(T);
+                       if (parsingNeeded) {
+                               MethodInfo miParse = type.GetMethod ("Parse", new Type[] {typeof(string)});
+                               if (miParse != null)
+                                       curVal = miParse.Invoke (null, new object[]{ curVal });
+                               parsingNeeded = false;
+                       }
+                       return (T)Convert.ChangeType (curVal, type);
+               }
+               public void Set(object value){
+                       curVal = value;
+               }
+       }
+       /// <summary>
+       /// Application wide Configuration utility
+       /// </summary>
        public static class Configuration
        {
+               volatile static bool isDirty = false;
                static string configPath, configFileName = "app.config";
-               static Dictionary<string, string> items;
+               static Dictionary<string, ConfigItem> items;
 
                static Configuration ()
                {
-                       items = new Dictionary<string, string> ();
+                       items = new Dictionary<string, ConfigItem> ();
                        string configRoot =
                                Path.Combine(
                                        Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
@@ -50,42 +80,58 @@ namespace Crow
                        string path = Path.Combine(configPath, configFileName);
 
                        if (File.Exists (path)) {
-                               using (Stream s = new FileStream(path, FileMode.Open))
+                               using (Stream s = new FileStream (path, FileMode.Open))
                                        load (s);
-                               return;
+                       } else {
+                               string defaultConfigResID = appName + ".default.config";
+                               bool found = false;
+                               foreach (string resIds in a.GetManifestResourceNames()) {
+                                       if (string.Equals (defaultConfigResID, resIds, StringComparison.OrdinalIgnoreCase)) {
+                                               using (Stream s = a.GetManifestResourceStream (defaultConfigResID))
+                                                       load (s);
+                                               found = true;
+                                               break;
+                                       }
+                               }
+                               if (!found)
+                                       Console.WriteLine ("No Default Config found. ({0})", defaultConfigResID);
                        }
-
-                       string defaultConfigResID = appName + ".default.config";
-                       foreach (string resIds in a.GetManifestResourceNames()) {
-                               if (string.Equals (defaultConfigResID, resIds, StringComparison.OrdinalIgnoreCase)) {
-                                       using (Stream s = a.GetManifestResourceStream (defaultConfigResID))
-                                               load (s);
-                                       return;
+                       startSavingThread ();
+               }
+               static void startSavingThread(){
+                       Thread t = new Thread (savingThread);
+                       t.IsBackground = true;
+                       t.Start ();
+               }
+               static void savingThread(){
+                       while(true){
+                               if (isDirty) {
+                                       save ();
+                                       isDirty = false;
                                }
+                               Thread.Sleep (1000);
                        }
-                       Console.WriteLine ("No Default Config found. ({0})", defaultConfigResID);
                }
                public static T Get<T>(string key)
                {
-                       if (!items.ContainsKey (key))
-                               return default(T);
-                       Type type = typeof(T);
-                       MethodInfo miParse = type.GetMethod ("Parse", new Type[] {typeof(string)});
-                       if (miParse == null)
-                               return (T)Convert.ChangeType (items [key], typeof(T));
-
-                       return (T)Convert.ChangeType (miParse.Invoke (null, new object[]{ items [key] }), type);
+                       return !items.ContainsKey (key) ? default(T) : items [key].GetValue<T> ();
                }
                public static void Set<T>(string key, T value)
                {
-                       items [key] = value.ToString();
-                       save ();
+                       if (!items.ContainsKey (key)) {
+                               lock(items)
+                                       items[key] = new ConfigItem (value);
+                       }else
+                               items[key].Set (value);
+                       isDirty = true;
                }
                static void save(){
                        using (Stream s = new FileStream(Path.Combine(configPath, configFileName),FileMode.Create)){
                                using (StreamWriter sw = new StreamWriter (s)) {
-                                       foreach (string key in items.Keys) {
-                                               sw.WriteLine(key + "=" + items[key]);
+                                       lock (items) {
+                                               foreach (string key in items.Keys) {
+                                                       sw.WriteLine (key + "=" + (string)items [key].curVal.ToString ());
+                                               }
                                        }
                                }
                        }
@@ -99,7 +145,7 @@ namespace Crow
                                        string[] tmp = l.Trim ().Split ('=');
                                        if (tmp.Length != 2)
                                                continue;
-                                       items[tmp [0].Trim ()] = tmp [1].Trim ();
+                                       items[tmp [0].Trim ()] = new ConfigItem(tmp [1].Trim ());
                                }
                        }
                }