moel@165: /*
moel@165:  
moel@344:   This Source Code Form is subject to the terms of the Mozilla Public
moel@344:   License, v. 2.0. If a copy of the MPL was not distributed with this
moel@344:   file, You can obtain one at http://mozilla.org/MPL/2.0/.
moel@165:  
moel@344:   Copyright (C) 2009-2010 Michael Möller <mmoeller@openhardwaremonitor.org>
moel@344: 	
moel@165: */
moel@165: 
moel@165: using System.Collections.Generic;
moel@183: using System.Globalization;
moel@165: using System.Drawing;
moel@165: using System.Xml;
moel@165: using OpenHardwareMonitor.Hardware;
moel@165: 
moel@165: namespace OpenHardwareMonitor {
moel@165:   public class PersistentSettings : ISettings {
moel@165: 
moel@165:     private IDictionary<string, string> settings = 
moel@165:       new Dictionary<string, string>();
moel@165: 
moel@165:     public void Load(string fileName) {
moel@165:       XmlDocument doc = new XmlDocument();
moel@165:       try {
moel@165:         doc.Load(fileName);
moel@165:       } catch {
moel@165:         return;
moel@165:       }
moel@165:       XmlNodeList list = doc.GetElementsByTagName("appSettings");
moel@165:       foreach (XmlNode node in list) {
moel@165:         XmlNode parent = node.ParentNode;
moel@165:         if (parent != null && parent.Name == "configuration" && 
moel@165:           parent.ParentNode is XmlDocument) {
moel@165:           foreach (XmlNode child in node.ChildNodes) {
moel@165:             if (child.Name == "add") {
moel@165:               XmlAttributeCollection attributes = child.Attributes;
moel@165:               XmlAttribute keyAttribute = attributes["key"];
moel@165:               XmlAttribute valueAttribute = attributes["value"];
moel@165:               if (keyAttribute != null && valueAttribute != null && 
moel@165:                 keyAttribute.Value != null) {
moel@165:                 settings.Add(keyAttribute.Value, valueAttribute.Value);
moel@165:               }
moel@165:             }
moel@165:           }
moel@165:         }
moel@165:       }      
moel@165:     }
moel@165: 
moel@165:     public void Save(string fileName) {
moel@165:       XmlDocument doc = new XmlDocument();
moel@165:       doc.AppendChild(doc.CreateXmlDeclaration("1.0", "utf-8", null));
moel@165:       XmlElement configuration = doc.CreateElement("configuration");
moel@165:       doc.AppendChild(configuration);
moel@165:       XmlElement appSettings = doc.CreateElement("appSettings");
moel@165:       configuration.AppendChild(appSettings);
moel@165:       foreach (KeyValuePair<string, string> keyValuePair in settings) {
moel@165:         XmlElement add = doc.CreateElement("add");
moel@165:         add.SetAttribute("key", keyValuePair.Key);
moel@165:         add.SetAttribute("value", keyValuePair.Value);
moel@165:         appSettings.AppendChild(add);
moel@165:       }
moel@165:       doc.Save(fileName);
moel@165:     }
moel@165: 
moel@165:     public bool Contains(string name) {
moel@165:       return settings.ContainsKey(name);
moel@165:     }
moel@165: 
moel@166:     public void SetValue(string name, string value) {
moel@165:       settings[name] = value;
moel@165:     }
moel@165: 
moel@166:     public string GetValue(string name, string value) {
moel@165:       string result;
moel@165:       if (settings.TryGetValue(name, out result))
moel@165:         return result;
moel@165:       else
moel@165:         return value;
moel@165:     }
moel@165: 
moel@165:     public void Remove(string name) {
moel@165:       settings.Remove(name);
moel@165:     }
moel@165: 
moel@166:     public void SetValue(string name, int value) {
moel@165:       settings[name] = value.ToString();
moel@165:     }
moel@165: 
moel@166:     public int GetValue(string name, int value) {
moel@165:       string str;
moel@165:       if (settings.TryGetValue(name, out str)) {
moel@165:         int parsedValue;
moel@165:         if (int.TryParse(str, out parsedValue))
moel@165:           return parsedValue;
moel@165:         else
moel@165:           return value;
moel@165:       } else {
moel@165:         return value;
moel@165:       }
moel@165:     }
moel@165: 
moel@183:     public void SetValue(string name, float value) {
moel@183:       settings[name] = value.ToString(CultureInfo.InvariantCulture);
moel@183:     }
moel@183: 
moel@183:     public float GetValue(string name, float value) {
moel@183:       string str;
moel@183:       if (settings.TryGetValue(name, out str)) {
moel@183:         float parsedValue;
moel@183:         if (float.TryParse(str, NumberStyles.Float, 
moel@183:           CultureInfo.InvariantCulture, out parsedValue))
moel@183:           return parsedValue;
moel@183:         else
moel@183:           return value;
moel@183:       } else {
moel@183:         return value;
moel@183:       }
moel@183:     }
moel@183: 
moel@166:     public void SetValue(string name, bool value) {
moel@165:       settings[name] = value ? "true" : "false";
moel@165:     }
moel@165: 
moel@166:     public bool GetValue(string name, bool value) {
moel@165:       string str;
moel@165:       if (settings.TryGetValue(name, out str)) {
moel@165:         return str == "true";
moel@165:       } else {
moel@165:         return value;
moel@165:       }
moel@165:     }
moel@165: 
moel@166:     public void SetValue(string name, Color color) {
moel@165:       settings[name] = color.ToArgb().ToString("X8");
moel@165:     }
moel@165: 
moel@166:     public Color GetValue(string name, Color value) {
moel@165:       string str;
moel@165:       if (settings.TryGetValue(name, out str)) {
moel@165:         int parsedValue;
moel@183:         if (int.TryParse(str, NumberStyles.HexNumber,
moel@183:           CultureInfo.InvariantCulture, out parsedValue))
moel@165:           return Color.FromArgb(parsedValue);
moel@165:         else
moel@165:           return value;
moel@165:       } else {
moel@165:         return value;
moel@165:       }
moel@165:     }
moel@165:   }
moel@165: }