moel@165: /*
moel@165:   
moel@165:   Version: MPL 1.1/GPL 2.0/LGPL 2.1
moel@165: 
moel@165:   The contents of this file are subject to the Mozilla Public License Version
moel@165:   1.1 (the "License"); you may not use this file except in compliance with
moel@165:   the License. You may obtain a copy of the License at
moel@165:  
moel@165:   http://www.mozilla.org/MPL/
moel@165: 
moel@165:   Software distributed under the License is distributed on an "AS IS" basis,
moel@165:   WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
moel@165:   for the specific language governing rights and limitations under the License.
moel@165: 
moel@165:   The Original Code is the Open Hardware Monitor code.
moel@165: 
moel@165:   The Initial Developer of the Original Code is 
moel@165:   Michael Möller <m.moeller@gmx.ch>.
moel@165:   Portions created by the Initial Developer are Copyright (C) 2009-2010
moel@165:   the Initial Developer. All Rights Reserved.
moel@165: 
moel@165:   Contributor(s):
moel@165: 
moel@165:   Alternatively, the contents of this file may be used under the terms of
moel@165:   either the GNU General Public License Version 2 or later (the "GPL"), or
moel@165:   the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
moel@165:   in which case the provisions of the GPL or the LGPL are applicable instead
moel@165:   of those above. If you wish to allow use of your version of this file only
moel@165:   under the terms of either the GPL or the LGPL, and not to allow others to
moel@165:   use your version of this file under the terms of the MPL, indicate your
moel@165:   decision by deleting the provisions above and replace them with the notice
moel@165:   and other provisions required by the GPL or the LGPL. If you do not delete
moel@165:   the provisions above, a recipient may use your version of this file under
moel@165:   the terms of any one of the MPL, the GPL or the LGPL.
moel@165:  
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: }