2005-01-31 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mcs / class / System / System.Diagnostics / Switch.cs
index 90efcc258e8943ec1ed7e0d50565ae6f7ddace7a..71f9cfc29745d75781dd25c7e571eca4765592c9 100755 (executable)
 //
 // 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
+// (C) 2001-2002
 //
 
-namespace System.Diagnostics
-{
-        /// <summary>
-        /// Abstract base class to create new debugging and tracing switches
-        /// </summary>
-        public abstract class Switch
-        {
-                   private string desc = "";
-                private string display_name = "";
-                private int iSwitch;
+//
+// 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.
+//
 
-                // ================= Constructors ===================
-                /// <summary>
-                /// Initialize a new instance
-                /// </summary>
-                protected Switch(string displayName, string description)
-                {
-                        display_name = displayName;
-                        desc = description;
-                }
+using System.Collections;
 
-                /// <summary>
-                /// Allows an Object to attempt to free resources and
-                /// perform cleanup before the Object is reclaimed
-                /// by the Garbage Collector
-                /// </summary>
-                ~Switch()
-                {
-                }
+namespace System.Diagnostics
+{
+       public abstract class Switch
+       {
+               private string name = "";
+               private string description = "";
+               private int switchSetting = 0;
 
-                // ================ Instance Methods ================
+               // 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 = false;
 
-                // ==================== Properties ==================
+               protected Switch(string displayName, string description)
+               {
+                       this.name = displayName;
+                       this.description = description;
+               }
 
-                /// <summary>
-                /// Returns a description of the switch
-                /// </summary>
-                public string Description
-                {
-                        get
-                        {
-                                return desc;
-                        }
-                }
+               public string Description {
+                       get {return description;}
+               }
 
-                /// <summary>
-                /// Returns a name used to identify the switch
-                /// </summary>
-                public string DisplayName
-                {
-                        get
-                        {
-                                return display_name;
-                        }
-                }
+               public string DisplayName {
+                       get {return name;}
+               }
 
-                /// <summary>
-                /// Gets or sets the current setting for this switch
-                /// </summary>
-                protected int SwitchSetting
-                {
-                        get
-                        {
-                                return iSwitch;
-                        }
-                        set
-                        {
-                                                       if(iSwitch != value) 
-                                                       {
-                                                               iSwitch = value;
-                                                               OnSwitchSettingChanged();
-                                                       }
-                                               }
+               protected int SwitchSetting {
+                       get {
+                               if (!initialized) {
+                                       initialized = true;
+                                       GetConfigFileSetting ();
+                                       OnSwitchSettingChanged ();
                                }
+                               return switchSetting;
+                       }
+                       set {
+                               if(switchSetting != value) {
+                                       switchSetting = value;
+                                       OnSwitchSettingChanged();
+                               }
+                               initialized = true;
+                       }
+               }
+
+               private void GetConfigFileSetting ()
+               {
+                       try {
+                               IDictionary d = (IDictionary) DiagnosticsConfiguration.Settings ["switches"];
+                               
+                               // Load up the specified switch
+                               if (d != null)
+                                       switchSetting = int.Parse (d [name].ToString());
+                       } catch {
+                               switchSetting = 0;
+                       }
+               }
 
-                /// <summary>
-                /// Raises the SwitchSettingChanged event
-                /// </summary>
-               [MonoTODO]
                protected virtual void OnSwitchSettingChanged()
                {
-                       // TODO: implement me
+                       // Do nothing.  This is merely provided for derived classes to know when
+                       // the value of SwitchSetting has changed.
                }
-        }
+       }
 }
+