We need you! We're working hard on the next version of Developer Fusion -
Let us know what you think we should be up to!
- namespace System.Diagnostics
- {
- using System;
- using System.Security;
- using System.Security.Permissions;
- using System.Threading;
- using System.Runtime.InteropServices;
- using Microsoft.Win32;
- using System.Collections;
- using System.Collections.Generic;
- using System.Collections.Specialized;
- using System.Globalization;
- using System.Configuration;
- using System.Xml.Serialization;
-
- /// <devdoc>
- /// <para>Provides an <see langword='abstract '/>base class to
- /// create new debugging and tracing switches.</para>
- /// </devdoc>
- public abstract class Switch
- {
- private SwitchElementsCollection switchSettings;
- private string description;
- private string displayName;
- private int switchSetting = 0;
- private bool initialized = false;
- private bool initializing = false;
- private string switchValueString = String.Empty;
- private StringDictionary attributes;
- private string defaultValue;
-
- private static List<WeakReference> switches = new List<WeakReference>();
-
- /// <devdoc>
- /// <para>Initializes a new instance of the <see cref='System.Diagnostics.Switch'/>
- /// class.</para>
- /// </devdoc>
- protected Switch(string displayName, string description) : this(displayName, description, "0")
- {
- }
-
- protected Switch(string displayName, string description, string defaultSwitchValue)
- {
-
-
- if (displayName == null)
- displayName = string.Empty;
-
- this.displayName = displayName;
- this.description = description;
-
- lock (switches) {
- switches.Add(new WeakReference(this));
- }
-
- defaultValue = defaultSwitchValue;
- }
-
- [XmlIgnore()]
- public StringDictionary Attributes {
- get {
- Initialize();
- if (attributes == null)
- attributes = new StringDictionary();
- return attributes;
- }
- }
-
- /// <devdoc>
- /// <para>Gets a name used to identify the switch.</para>
- /// </devdoc>
- public string DisplayName {
- get { return displayName; }
- }
-
- /// <devdoc>
- /// <para>Gets a description of the switch.</para>
- /// </devdoc>
- public string Description {
- get { return (description == null) ? string.Empty : description; }
- }
-
- /// <devdoc>
- /// <para>
- /// Indicates the current setting for this switch.
- /// </para>
- /// </devdoc>
- protected int SwitchSetting {
- get {
- if (!initialized) {
- if (!InitializeWithStatus())
- return 0;
- OnSwitchSettingChanged();
- }
- return switchSetting;
- }
- set {
- initialized = true;
- if (switchSetting != value) {
- switchSetting = value;
- OnSwitchSettingChanged();
- }
- }
- }
-
- protected string Value {
- get {
- Initialize();
- return switchValueString;
- }
- set {
- Initialize();
- switchValueString = value;
- try {
- OnValueChanged();
- }
- catch (ArgumentException e) {
- throw new ConfigurationErrorsException(SR.GetString(SR.BadConfigSwitchValue, DisplayName), e);
- }
- catch (FormatException e) {
- throw new ConfigurationErrorsException(SR.GetString(SR.BadConfigSwitchValue, DisplayName), e);
- }
- catch (OverflowException e) {
- throw new ConfigurationErrorsException(SR.GetString(SR.BadConfigSwitchValue, DisplayName), e);
- }
- }
- }
-
- private void Initialize()
- {
- InitializeWithStatus();
- }
-
- private bool InitializeWithStatus()
- {
- if (!initialized) {
-
- if (initializing)
- return false;
-
- initializing = true;
-
- if (switchSettings == null) {
- if (!InitializeConfigSettings())
- return false;
- }
-
- if (switchSettings != null) {
- SwitchElement mySettings = switchSettings[displayName];
- if (mySettings != null) {
- string value = mySettings.Value;
- if (value != null) {
- this.Value = value;
- }
- else
- this.Value = defaultValue;
-
- try {
- TraceUtils.VerifyAttributes(mySettings.Attributes, GetSupportedAttributes(), this);
- }
- catch (ConfigurationException) {
-
- initialized = false;
- initializing = false;
- throw;
- }
-
- attributes = new StringDictionary();
- attributes.contents = mySettings.Attributes;
- }
- else {
-
-
- switchValueString = defaultValue;
- OnValueChanged();
- }
- }
- else {
-
-
- switchValueString = defaultValue;
- OnValueChanged();
- }
-
- initialized = true;
- initializing = false;
- }
-
- return true;
- }
-
- private bool InitializeConfigSettings()
- {
- if (switchSettings != null)
- return true;
-
- if (!DiagnosticsConfiguration.CanInitialize())
- return false;
-
-
- switchSettings = DiagnosticsConfiguration.SwitchSettings;
- return true;
- }
-
- protected internal virtual string[] GetSupportedAttributes()
- {
- return null;
- }
-
- /// <devdoc>
- /// This method is invoked when a switch setting has been changed. It will
- /// be invoked the first time a switch reads its value from the registry
- /// or environment, and then it will be invoked each time the switch's
- /// value is changed.
- /// </devdoc>
- protected virtual void OnSwitchSettingChanged()
- {
- }
-
- protected virtual void OnValueChanged()
- {
- SwitchSetting = Int32.Parse(Value, CultureInfo.InvariantCulture);
- }
-
- static internal void RefreshAll()
- {
-
- lock (switches) {
- for (int i = 0; i < switches.Count; i++) {
- Switch swtch = ((Switch)switches[i].Target);
- if (swtch != null) {
- swtch.Refresh();
- }
- }
- }
- }
-
- internal void Refresh()
- {
- initialized = false;
- switchSettings = null;
- Initialize();
- }
-
- }
- }