//
// System.Diagnostics.Switch.cs
//
// Comments from John R. Hicks <angryjohn69@nc.rr.com> original implementation
// can be found at: /mcs/docs/apidocs/xml/en/System.Diagnostics
//
// Author:
// John R. Hicks (angryjohn69@nc.rr.com)
// Jonathan Pryor (jonpryor@vt.edu)
//
// (C) 2001-2002
//
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
using System.Collections;
using System.Collections.Specialized;
#if NET_2_0 && CONFIGURATION_DEP
using System.Configuration;
#endif
namespace System.Diagnostics{
public abstract class Switch
{
private string name;
private string description;
private int switchSetting;
#if NET_2_0
private string value;
private string defaultSwitchValue;
#endif
// MS Behavior is that (quoting from MSDN for OnSwitchSettingChanged()):
// "...It is invoked the first time a switch reads its value from the
// configuration file..."
// The docs + testing implies two things:
// 1. The value of the switch is not read in from the constructor
// 2. The value is instead read in on the first time get_SwitchSetting is
// invoked
// Assuming that OnSwitchSettingChanged() is invoked on a .config file
// read and on all changes
//
// Thus, we need to keep track of whether or not switchSetting has been
// initialized. Using `switchSetting=-1' seems logical, but if someone
// actually wants to use -1 as a switch value that would cause problems.
private bool initialized;
protected Switch(string displayName, string description)
{
this.name = displayName;
this.description = description;
}
#if NET_2_0
protected Switch(string displayName, string description, string defaultSwitchValue)
: this (displayName, description)
{
this.defaultSwitchValue = defaultSwitchValue;
}
#endif
public string Description {
get {return description;}
}
public string DisplayName {
get {return name;}
}
protected int SwitchSetting {
get {
if (!initialized) {
initialized = true;
GetConfigFileSetting ();
OnSwitchSettingChanged ();
}
return switchSetting;
}
set {
if(switchSetting != value) {
switchSetting = value;
OnSwitchSettingChanged();
}
initialized = true;
}
}
#if NET_2_0
StringDictionary attributes = new StringDictionary ();
#if XML_DEP
[System.Xml.Serialization.XmlIgnore]
#endif
public StringDictionary Attributes {
get { return attributes; }
}
protected string Value {
get { return value; }
set {
this.value = value;
#if NET_2_0 && CONFIGURATION_DEP
try {
OnValueChanged ();
} catch (Exception ex) {
string msg = string.Format ("The config "
+ "value for Switch '{0}' was "
+ "invalid.", DisplayName);
throw new ConfigurationErrorsException (
msg, ex);
}
#else
OnValueChanged ();
#endif
}
}
protected internal virtual string [] GetSupportedAttributes ()
{
return null;
}
protected virtual void OnValueChanged ()
{
}
#endif
private void GetConfigFileSetting ()
{
IDictionary d = (IDictionary) DiagnosticsConfiguration.Settings ["switches"];
// Load up the specified switch
if (d != null) {
if (d.Contains (name)) {
#if NET_2_0 && CONFIGURATION_DEP
Value = d [name] as string;
#else
switchSetting = (int) d [name];
#endif
return;
}
}
#if NET_2_0
if (defaultSwitchValue != null) {
value = defaultSwitchValue;
OnValueChanged ();
}
#endif
}
protected virtual void OnSwitchSettingChanged()
{
// Do nothing. This is merely provided for derived classes to know when
// the value of SwitchSetting has changed.
}
}
}
|