#region License // Copyright (c) 2010, Jasper Yeh. // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither the name of ClearCanvas Inc. nor the names of its contributors // may be used to endorse or promote products derived from this software without // specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, // OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN // ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY // OF SUCH DAMAGE. #endregion using System; using System.Collections.Generic; using System.Configuration; using System.IO; using System.Reflection; using System.Xml; namespace Nullstack.ClearCanvasEx.DevTools.Common { internal class XmlSettingsFile { #region Static Helpers private static readonly Dictionary __localSettingsFilenames = new Dictionary(); private static readonly Dictionary __roamingSettingsFilenames = new Dictionary(); public static XmlSettingsFile GetLocalSettingsFile(Type settingsClass) { return new XmlSettingsFile(GetLocalFilename(settingsClass)); } public static XmlSettingsFile GetRoamingSettingsFile(Type settingsClass) { return new XmlSettingsFile(GetRoamingFilename(settingsClass)); } private static string GetLocalFilename(Type settingsType) { if (!__localSettingsFilenames.ContainsKey(settingsType)) __localSettingsFilenames.Add(settingsType, __GetAppSettingsFilename(settingsType, false)); return __localSettingsFilenames[settingsType]; } private static string GetRoamingFilename(Type settingsType) { if (!__roamingSettingsFilenames.ContainsKey(settingsType)) __roamingSettingsFilenames.Add(settingsType, __GetAppSettingsFilename(settingsType, true)); return __roamingSettingsFilenames[settingsType]; } private static string __GetAppSettingsFilename(Type settingsType, bool roaming) { string appDataPath; if (roaming) appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); else appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); string assemblyComp = ""; AssemblyCompanyAttribute attribComp = GetCustomAttribute(settingsType.Assembly); if (attribComp != null && attribComp.Company != null) assemblyComp = attribComp.Company; string assemblyTitle = new FileInfo(settingsType.Assembly.Location).Name; string assemblyVer = "default"; //Version version = settingsType.Assembly.GetName().Version; //if (version != null) // assemblyVer = version.ToString(); string path = Path.Combine(Path.Combine(Path.Combine(appDataPath, assemblyComp), assemblyTitle), assemblyVer); foreach (char badchar in Path.GetInvalidPathChars()) { path = path.Replace(badchar.ToString(), ""); } return Path.Combine(path, "assembly.config"); } private static T GetCustomAttribute(Assembly assembly) where T : class { foreach (object attrib in assembly.GetCustomAttributes(typeof (T), false)) { return (T) attrib; } return null; } #endregion private const string ROOT_NODE = "configuration"; private readonly string _filename; private readonly XmlDocument SettingsXML; private XmlSettingsFile(string filename) { _filename = filename; XmlDocument m_SettingsXML = new XmlDocument(); try { m_SettingsXML.Load(filename); } catch (Exception) { XmlDeclaration dec = m_SettingsXML.CreateXmlDeclaration("1.0", "utf-8", string.Empty); m_SettingsXML.AppendChild(dec); XmlNode nodeRoot; nodeRoot = m_SettingsXML.CreateNode(XmlNodeType.Element, ROOT_NODE, ""); m_SettingsXML.AppendChild(nodeRoot); } SettingsXML = m_SettingsXML; } public void Save() { try { Directory.CreateDirectory(new FileInfo(_filename).DirectoryName); SettingsXML.Save(_filename); } catch (Exception) {} } public string GetValue(SettingsProperty setting) { string ret = ""; try { ret = SettingsXML.SelectSingleNode(ROOT_NODE + "/" + setting.Name).InnerText; } catch (Exception) { if ((setting.DefaultValue != null)) { ret = setting.DefaultValue.ToString(); } else { ret = ""; } } return ret; } public void SetValue(SettingsPropertyValue propVal) { XmlElement SettingNode; try { SettingNode = (XmlElement) SettingsXML.SelectSingleNode(ROOT_NODE + "/" + propVal.Name); } catch (Exception) { SettingNode = null; } if ((SettingNode != null)) { SettingNode.InnerText = propVal.SerializedValue.ToString(); } else { SettingNode = SettingsXML.CreateElement(propVal.Name); SettingNode.InnerText = propVal.SerializedValue.ToString(); SettingsXML.SelectSingleNode(ROOT_NODE).AppendChild(SettingNode); } } } }