#region Copyright // // Nini Configuration Project. // Copyright (C) 2006 Brent R. Matzelle. All rights reserved. // // This software is published under the terms of the MIT X11 license, a copy of // which has been included with this distribution in the LICENSE.txt file. // #endregion using System; using System.Collections; using System.Globalization; using Nini.Util; namespace Nini.Config { #region ConfigKeyEventArgs class /// public delegate void ConfigKeyEventHandler (object sender, ConfigKeyEventArgs e); /// public class ConfigKeyEventArgs : EventArgs { string keyName = null; string keyValue = null; /// public ConfigKeyEventArgs (string keyName, string keyValue) { this.keyName = keyName; this.keyValue = keyValue; } /// public string KeyName { get { return keyName; } } /// public string KeyValue { get { return keyValue; } } } #endregion /// public class ConfigBase : IConfig { #region Private variables string configName = null; IConfigSource configSource = null; AliasText aliasText = null; IFormatProvider format = NumberFormatInfo.CurrentInfo; #endregion #region Protected variables protected OrderedList keys = new OrderedList (); #endregion #region Constructors /// public ConfigBase (string name, IConfigSource source) { configName = name; configSource = source; aliasText = new AliasText (); } #endregion #region Public properties /// public string Name { get { return configName; } set { if (configName != value) { Rename (value); } } } /// public IConfigSource ConfigSource { get { return configSource; } } /// public AliasText Alias { get { return aliasText; } } #endregion #region Public methods /// public bool Contains (string key) { return (Get (key) != null); } /// public virtual string Get (string key) { string result = null; if (keys.Contains (key)) { result = keys[key].ToString (); } return result; } /// public string Get (string key, string defaultValue) { string result = Get (key); return (result == null) ? defaultValue : result; } /// public string GetExpanded (string key) { return this.ConfigSource.GetExpanded(this, key); } /// public string GetString (string key) { return Get (key); } /// public string GetString (string key, string defaultValue) { return Get (key, defaultValue); } /// public int GetInt (string key) { string text = Get (key); if (text == null) { throw new ArgumentException ("Value not found: " + key); } return Convert.ToInt32 (text, format); } /// public int GetInt (string key, bool fromAlias) { if (!fromAlias) { return GetInt (key); } string result = Get (key); if (result == null) { throw new ArgumentException ("Value not found: " + key); } return GetIntAlias (key, result); } /// public int GetInt (string key, int defaultValue) { string result = Get (key); return (result == null) ? defaultValue : Convert.ToInt32 (result, format); } /// public int GetInt (string key, int defaultValue, bool fromAlias) { if (!fromAlias) { return GetInt (key, defaultValue); } string result = Get (key); return (result == null) ? defaultValue : GetIntAlias (key, result); } /// public long GetLong (string key) { string text = Get (key); if (text == null) { throw new ArgumentException ("Value not found: " + key); } return Convert.ToInt64 (text, format); } /// public long GetLong (string key, long defaultValue) { string result = Get (key); return (result == null) ? defaultValue : Convert.ToInt64 (result, format); } /// public bool GetBoolean (string key) { string text = Get (key); if (text == null) { throw new ArgumentException ("Value not found: " + key); } return GetBooleanAlias (text); } /// public bool GetBoolean (string key, bool defaultValue) { string text = Get (key); return (text == null) ? defaultValue : GetBooleanAlias (text); } /// public float GetFloat (string key) { string text = Get (key); if (text == null) { throw new ArgumentException ("Value not found: " + key); } return Convert.ToSingle (text, format); } /// public float GetFloat (string key, float defaultValue) { string result = Get (key); return (result == null) ? defaultValue : Convert.ToSingle (result, format); } /// public double GetDouble (string key) { string text = Get (key); if (text == null) { throw new ArgumentException ("Value not found: " + key); } return Convert.ToDouble (text, format); } /// public double GetDouble (string key, double defaultValue) { string result = Get (key); return (result == null) ? defaultValue : Convert.ToDouble (result, format); } /// public string[] GetKeys () { string[] result = new string[keys.Keys.Count]; keys.Keys.CopyTo (result, 0); return result; } /// public string[] GetValues () { string[] result = new string[keys.Values.Count]; keys.Values.CopyTo (result, 0); return result; } /// public void Add (string key, string value) { keys.Add (key, value); } /// public virtual void Set (string key, object value) { if (value == null) { throw new ArgumentNullException ("Value cannot be null"); } if (Get (key) == null) { this.Add (key, value.ToString ()); } else { keys[key] = value.ToString (); } if (ConfigSource.AutoSave) { ConfigSource.Save (); } OnKeySet (new ConfigKeyEventArgs (key, value.ToString ())); } /// public virtual void Remove (string key) { if (key == null) { throw new ArgumentNullException ("Key cannot be null"); } if (Get (key) != null) { string keyValue = null; if (KeySet != null) { keyValue = Get (key); } keys.Remove (key); OnKeyRemoved (new ConfigKeyEventArgs (key, keyValue)); } } #endregion #region Public events /// public event ConfigKeyEventHandler KeySet; /// public event ConfigKeyEventHandler KeyRemoved; #endregion #region Protected methods /// protected void OnKeySet (ConfigKeyEventArgs e) { if (KeySet != null) { KeySet (this, e); } } /// protected void OnKeyRemoved (ConfigKeyEventArgs e) { if (KeyRemoved != null) { KeyRemoved (this, e); } } #endregion #region Private methods /// /// Renames the config to the new name. /// private void Rename (string name) { this.ConfigSource.Configs.Remove (this); configName = name; this.ConfigSource.Configs.Add (this); } /// /// Returns the integer alias first from this IConfig then /// the parent if there is none. /// private int GetIntAlias (string key, string alias) { int result = -1; if (aliasText.ContainsInt (key, alias)) { result = aliasText.GetInt (key, alias); } else { result = ConfigSource.Alias.GetInt (key, alias); } return result; } /// /// Returns the boolean alias first from this IConfig then /// the parent if there is none. /// private bool GetBooleanAlias (string key) { bool result = false; if (aliasText.ContainsBoolean (key)) { result = aliasText.GetBoolean (key); } else { if (ConfigSource.Alias.ContainsBoolean (key)) { result = ConfigSource.Alias.GetBoolean (key); } else { throw new ArgumentException ("Alias value not found: " + key + ". Add it to the Alias property."); } } return result; } #endregion } }