/************************************************************************* * Configuration.cs * ------------------ * begin : Jan 24, 2007 * copyright : (C) The WCell Team * email : info@wcell.org *************************************************************************/ /************************************************************************* * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * *************************************************************************/ using System; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.Configuration; using System.Reflection; using log4net; using WCell.Core.Localization; namespace WCell.Core { /// /// Defines a configuration made up of key/value values /// public abstract class Configuration : IEnumerable { protected static ILog s_log = LogManager.GetLogger(typeof (Configuration)); private string m_nullString; private System.Configuration.Configuration m_cfg; /// /// Default constructor /// /// the entry assembly to load the configuration file of public Configuration(Assembly callingAsm) { m_nullString = "None"; m_cfg = ConfigurationManager.OpenExeConfiguration(callingAsm.Location); LoadConfigDefaults(); } /// /// Loads default values in the configuration if they don't already exist /// public abstract void LoadConfigDefaults(); private int GetNoneNesting(string val) { int num1 = 0; int num2 = val.Length; if (num2 > 1) { while ((val[num1] == '(') && (val[(num2 - num1) - 1] == ')')) { num1++; } if ((num1 > 0) && (string.Compare(m_nullString, 0, val, num1, num2 - (2*num1), StringComparison.Ordinal) != 0)) { num1 = 0; } } return num1; } protected bool AddValue(string key, string value) { m_cfg.AppSettings.Settings.Add(key, value); return true; } protected string GetValue(string key) { if (key == null) { throw new ArgumentNullException("key"); } string cfgVal = m_cfg.AppSettings.Settings[key].Value; if (cfgVal == null) { s_log.Error(string.Format(Resources.KeyNotFound, key)); return ""; } switch (GetNoneNesting(cfgVal)) { case 0: return cfgVal; case 1: return null; } return cfgVal.Substring(1, cfgVal.Length - 2); } protected bool SetValue(string key, object value) { if (m_cfg.AppSettings.Settings[key] != null) { m_cfg.AppSettings.Settings.Remove(key); m_cfg.AppSettings.Settings.Add(key, value.ToString()); return true; } else { return false; } } /// /// Creates a config entry with the supplied value if one doesn't already exist /// /// the key /// the value protected void CreateValue(string key, object value) { KeyValueConfigurationElement cfgVal = m_cfg.AppSettings.Settings[key]; if (cfgVal == null) { m_cfg.AppSettings.Settings.Add(key, value.ToString()); } m_cfg.Save(ConfigurationSaveMode.Full); } #region IEnumerable members IEnumerator IEnumerable.GetEnumerator() { string configLine = ""; foreach (string cfgEle in m_cfg.AppSettings.Settings.AllKeys) { configLine = cfgEle + ": " + m_cfg.AppSettings.Settings[cfgEle].Value; yield return configLine; } } /// /// Get an enumerator that represents the key/value pairs of this configuration /// /// an IEnumerator object to enumerate through this configuration public IEnumerator GetEnumerator() { StringCollection strCol = new StringCollection(); string configLine = ""; foreach (string cfgEle in m_cfg.AppSettings.Settings.AllKeys) { configLine = cfgEle + ": " + m_cfg.AppSettings.Settings[cfgEle].Value; strCol.Add(configLine); } return (IEnumerator) strCol.GetEnumerator(); } #endregion } }