The Labs \ Source Viewer \ SSCLI \ System.Diagnostics \ SwitchesDictionarySectionHandler

  1. //------------------------------------------------------------------------------
  2. // <copyright file="DiagnosticsConfigurationHandler.cs" company="Microsoft">
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. // </copyright>
  14. //------------------------------------------------------------------------------
  15. #if !LIB
  16. #define TRACE
  17. #define DEBUG
  18. namespace System.Diagnostics
  19. {
  20.    
  21.     using System;
  22.     using System.Collections;
  23.     using System.Diagnostics;
  24.     using System.Xml;
  25.     using System.Configuration;
  26.     using System.Reflection;
  27.     using System.Globalization;
  28.    
  29.     /// <devdoc>
  30.     /// The configuration section handler for the diagnostics section of the configuration
  31.     /// file. The section handler participates in the resolution of configuration settings
  32.     /// between the &lt;diagnostics&gt; and &lt;/diagnostics&gt;portion of the .config file.
  33.     /// </devdoc>
  34.     /// <internalonly/>
  35.     [Obsolete("This class has been deprecated. http://go.microsoft.com/fwlink/?linkid=14202")]
  36.     public class DiagnosticsConfigurationHandler : IConfigurationSectionHandler
  37.     {
  38.        
  39.         /// <devdoc>
  40.         /// <para>Parses the configuration settings between the
  41.         /// &lt;diagnostics&gt; and &lt;/diagnostics&gt; portion of the .config file to populate
  42.         /// the values of 'WebServicesConfiguration' object and returning it.
  43.         /// </para>
  44.         /// </devdoc>
  45.         /// <internalonly/>
  46.         public virtual object Create(object parent, object configContext, XmlNode section)
  47.         {
  48.             bool foundSwitches = false;
  49.             bool foundAssert = false;
  50.             bool foundTrace = false;
  51.             bool foundCounters = false;
  52.            
  53.             HandlerBase.CheckForUnrecognizedAttributes(section);
  54.            
  55.             // Since the tracing and switch code lives in System.Dll and config is in System.Configuration.dll
  56.             // the settings just go into a hashtable to communicate to the values to the diagnostics code in System.dll
  57.             Hashtable parentConfig = (Hashtable)parent;
  58.             Hashtable config;
  59.             if (parentConfig == null)
  60.                 config = new Hashtable();
  61.             else
  62.                 config = (Hashtable)parentConfig.Clone();
  63.            
  64.             foreach (XmlNode child in section.ChildNodes) {
  65.                 if (HandlerBase.IsIgnorableAlsoCheckForNonElement(child))
  66.                     continue;
  67.                
  68.                 switch (child.Name) {
  69.                     case "switches":
  70.                         if (foundSwitches)
  71.                             throw new ConfigurationErrorsException(SR.GetString(SR.ConfigSectionsUnique, "switches"));
  72.                         foundSwitches = true;
  73.                        
  74.                         HandleSwitches(config, child, configContext);
  75.                         break;
  76.                     case "assert":
  77.                         if (foundAssert)
  78.                             throw new ConfigurationErrorsException(SR.GetString(SR.ConfigSectionsUnique, "assert"));
  79.                         foundAssert = true;
  80.                        
  81.                         HandleAssert(config, child, configContext);
  82.                         break;
  83.                     case "trace":
  84.                         if (foundTrace)
  85.                             throw new ConfigurationErrorsException(SR.GetString(SR.ConfigSectionsUnique, "trace"));
  86.                         foundTrace = true;
  87.                        
  88.                         HandleTrace(config, child, configContext);
  89.                         break;
  90.                     case "performanceCounters":
  91.                         if (foundCounters)
  92.                             throw new ConfigurationErrorsException(SR.GetString(SR.ConfigSectionsUnique, "performanceCounters"));
  93.                         foundCounters = true;
  94.                        
  95.                         HandleCounters((Hashtable)parent, config, child, configContext);
  96.                         break;
  97.                     default:
  98.                         HandlerBase.ThrowUnrecognizedElement(child);
  99.                         break;
  100.                 }
  101.                 // switch(child.Name)
  102.                 HandlerBase.CheckForUnrecognizedAttributes(child);
  103.             }
  104.             return config;
  105.         }
  106.        
  107.         private static void HandleSwitches(Hashtable config, XmlNode switchesNode, object context)
  108.         {
  109.             Hashtable switches = (Hashtable)new SwitchesDictionarySectionHandler().Create(config["switches"], context, switchesNode);
  110.             IDictionaryEnumerator en = switches.GetEnumerator();
  111.             while (en.MoveNext()) {
  112.                 try {
  113.                     Int32.Parse((string)en.Value, CultureInfo.InvariantCulture);
  114.                 }
  115.                 catch {
  116.                     throw new ConfigurationErrorsException(SR.GetString(SR.Value_must_be_numeric, en.Key));
  117.                 }
  118.             }
  119.            
  120.             config["switches"] = switches;
  121.         }
  122.        
  123.         private static void HandleAssert(Hashtable config, XmlNode assertNode, object context)
  124.         {
  125.             bool assertuienabled = false;
  126.             if (HandlerBase.GetAndRemoveBooleanAttribute(assertNode, "assertuienabled", ref assertuienabled) != null)
  127.                 config["assertuienabled"] = assertuienabled;
  128.            
  129.             string logfilename = null;
  130.             if (HandlerBase.GetAndRemoveStringAttribute(assertNode, "logfilename", ref logfilename) != null)
  131.                 config["logfilename"] = logfilename;
  132.            
  133.             HandlerBase.CheckForChildNodes(assertNode);
  134.         }
  135.        
  136.         private static void HandleCounters(Hashtable parent, Hashtable config, XmlNode countersNode, object context)
  137.         {
  138.             int filemappingsize = 0;
  139.             if (HandlerBase.GetAndRemoveIntegerAttribute(countersNode, "filemappingsize", ref filemappingsize) != null) {
  140.                 //Should only be handled at machine config level
  141.                 if (parent == null)
  142.                     config["filemappingsize"] = filemappingsize;
  143.             }
  144.            
  145.             HandlerBase.CheckForChildNodes(countersNode);
  146.         }
  147.        
  148.         private static void HandleTrace(Hashtable config, XmlNode traceNode, object context)
  149.         {
  150.             bool foundListeners = false;
  151.             bool autoflush = false;
  152.             if (HandlerBase.GetAndRemoveBooleanAttribute(traceNode, "autoflush", ref autoflush) != null)
  153.                 config["autoflush"] = autoflush;
  154.            
  155.             int indentsize = 0;
  156.             if (HandlerBase.GetAndRemoveIntegerAttribute(traceNode, "indentsize", ref indentsize) != null)
  157.                 config["indentsize"] = indentsize;
  158.            
  159.             foreach (XmlNode traceChild in traceNode.ChildNodes) {
  160.                 if (HandlerBase.IsIgnorableAlsoCheckForNonElement(traceChild))
  161.                     continue;
  162.                
  163.                 if (traceChild.Name == "listeners") {
  164.                     if (foundListeners)
  165.                         throw new ConfigurationErrorsException(SR.GetString(SR.ConfigSectionsUnique, "listeners"));
  166.                     foundListeners = true;
  167.                    
  168.                     HandleListeners(config, traceChild, context);
  169.                 }
  170.                 else {
  171.                     HandlerBase.ThrowUnrecognizedElement(traceChild);
  172.                 }
  173.             }
  174.         }
  175.        
  176.         private static void HandleListeners(Hashtable config, XmlNode listenersNode, object context)
  177.         {
  178.             HandlerBase.CheckForUnrecognizedAttributes(listenersNode);
  179.             foreach (XmlNode listenersChild in listenersNode.ChildNodes) {
  180.                 if (HandlerBase.IsIgnorableAlsoCheckForNonElement(listenersChild))
  181.                     continue;
  182.                
  183.                 string name = null;
  184.                 string className = null;
  185.                 string initializeData = null;
  186.                 string op = listenersChild.Name;
  187.                
  188.                 switch (op) {
  189.                     case "add":
  190.                     case "remove":
  191.                     case "clear":
  192.                         break;
  193.                     default:
  194.                         HandlerBase.ThrowUnrecognizedElement(listenersChild);
  195.                         break;
  196.                 }
  197.                
  198.                 HandlerBase.GetAndRemoveStringAttribute(listenersChild, "name", ref name);
  199.                 HandlerBase.GetAndRemoveStringAttribute(listenersChild, "type", ref className);
  200.                 HandlerBase.GetAndRemoveStringAttribute(listenersChild, "initializeData", ref initializeData);
  201.                 HandlerBase.CheckForUnrecognizedAttributes(listenersChild);
  202.                 HandlerBase.CheckForChildNodes(listenersChild);
  203.                
  204.                 TraceListener newListener = null;
  205.                 if (className != null) {
  206.                     Type t = Type.GetType(className);
  207.                    
  208.                     if (t == null)
  209.                         throw new ConfigurationErrorsException(SR.GetString(SR.Could_not_find_type, className));
  210.                    
  211.                     if (!typeof(TraceListener).IsAssignableFrom(t))
  212.                         throw new ConfigurationErrorsException(SR.GetString(SR.Type_isnt_tracelistener, className));
  213.                    
  214.                     // create a listener with parameterless constructor
  215.                     if (initializeData == null) {
  216.                         ConstructorInfo ctorInfo = t.GetConstructor(new Type[] {});
  217.                         if (ctorInfo == null)
  218.                             throw new ConfigurationErrorsException(SR.GetString(SR.Could_not_get_constructor, className));
  219.                         newListener = (TraceListener)(ctorInfo.Invoke(new object[] {}));
  220.                     }
  221.                     // create a listener with a one-string constructor
  222.                     else {
  223.                         ConstructorInfo ctorInfo = t.GetConstructor(new Type[] {typeof(string)});
  224.                         if (ctorInfo == null)
  225.                             throw new ConfigurationErrorsException(SR.GetString(SR.Could_not_get_constructor, className));
  226.                         newListener = (TraceListener)(ctorInfo.Invoke(new object[] {initializeData}));
  227.                     }
  228.                     if (name != null) {
  229.                         newListener.Name = name;
  230.                     }
  231.                 }
  232.                
  233.                 // we already verified above that we only have "add", "remove", or "clear", so we can
  234.                 // switch on the first char here for perf.
  235.                 switch (op[0]) {
  236.                     case 'a':
  237.                         if (newListener == null)
  238.                             throw new ConfigurationErrorsException(SR.GetString(SR.Could_not_create_listener, name));
  239.                        
  240.                         Trace.Listeners.Add(newListener);
  241.                        
  242.                         break;
  243.                     case 'r':
  244.                         if (newListener == null) {
  245.                             // no type specified, we'll have to delete by name
  246.                            
  247.                             // if no name is specified we can't do anything
  248.                             if (name == null)
  249.                                 throw new ConfigurationErrorsException(SR.GetString(SR.Cannot_remove_with_null));
  250.                            
  251.                             Trace.Listeners.Remove(name);
  252.                         }
  253.                         else {
  254.                             // remove by listener
  255.                             Trace.Listeners.Remove(newListener);
  256.                         }
  257.                         break;
  258.                     case 'c':
  259.                         Trace.Listeners.Clear();
  260.                         break;
  261.                     default:
  262.                         HandlerBase.ThrowUnrecognizedElement(listenersChild);
  263.                         break;
  264.                 }
  265.             }
  266.         }
  267.     }
  268.    
  269.     internal class SwitchesDictionarySectionHandler : DictionarySectionHandler
  270.     {
  271.         protected override string KeyAttributeName {
  272.             get { return "name"; }
  273.         }
  274.        
  275.         internal override bool ValueRequired {
  276.             get { return true; }
  277.         }
  278.        
  279.     }
  280. }
  281. #endif

Developer Fusion