146 lines
4.5 KiB
C#
146 lines
4.5 KiB
C#
|
// ==++==
|
||
|
//
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
//
|
||
|
// ==--==
|
||
|
namespace System.Diagnostics {
|
||
|
using System;
|
||
|
using System.IO;
|
||
|
using System.Collections;
|
||
|
using System.Runtime.Versioning;
|
||
|
using System.Diagnostics.Contracts;
|
||
|
using System.Diagnostics.CodeAnalysis;
|
||
|
|
||
|
[Serializable]
|
||
|
internal class LogSwitch
|
||
|
{
|
||
|
// ! WARNING !
|
||
|
// If any fields are added/deleted/modified, perform the
|
||
|
// same in the EE code (debugdebugger.cpp/debugdebugger.h)
|
||
|
internal String strName;
|
||
|
internal String strDescription;
|
||
|
private LogSwitch ParentSwitch;
|
||
|
internal volatile LoggingLevels iLevel;
|
||
|
internal volatile LoggingLevels iOldLevel;
|
||
|
|
||
|
// ! END WARNING !
|
||
|
|
||
|
|
||
|
private LogSwitch ()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
// Constructs a LogSwitch. A LogSwitch is used to categorize log messages.
|
||
|
//
|
||
|
// All switches (except for the global LogSwitch) have a parent LogSwitch.
|
||
|
//
|
||
|
[System.Security.SecuritySafeCritical] // auto-generated
|
||
|
public LogSwitch(String name, String description, LogSwitch parent)
|
||
|
{
|
||
|
if (name != null && name.Length == 0)
|
||
|
throw new ArgumentOutOfRangeException("Name", Environment.GetResourceString("Argument_StringZeroLength"));
|
||
|
Contract.EndContractBlock();
|
||
|
|
||
|
if ((name != null) && (parent != null))
|
||
|
{
|
||
|
strName = name;
|
||
|
strDescription = description;
|
||
|
iLevel = LoggingLevels.ErrorLevel;
|
||
|
iOldLevel = iLevel;
|
||
|
ParentSwitch = parent;
|
||
|
|
||
|
Log.m_Hashtable.Add (strName, this);
|
||
|
|
||
|
// Call into the EE to let it know about the creation of
|
||
|
// this switch
|
||
|
Log.AddLogSwitch (this);
|
||
|
}
|
||
|
else
|
||
|
throw new ArgumentNullException ((name==null ? "name" : "parent"));
|
||
|
}
|
||
|
|
||
|
[System.Security.SecuritySafeCritical] // auto-generated
|
||
|
internal LogSwitch(String name, String description)
|
||
|
{
|
||
|
strName = name;
|
||
|
strDescription = description;
|
||
|
iLevel = LoggingLevels.ErrorLevel;
|
||
|
iOldLevel = iLevel;
|
||
|
ParentSwitch = null;
|
||
|
|
||
|
Log.m_Hashtable.Add (strName, this);
|
||
|
|
||
|
// Call into the EE to let it know about the creation of
|
||
|
// this switch
|
||
|
Log.AddLogSwitch (this);
|
||
|
}
|
||
|
|
||
|
|
||
|
// Get property returns the name of the switch
|
||
|
public virtual String Name
|
||
|
{
|
||
|
get { return strName;}
|
||
|
}
|
||
|
|
||
|
// Get property returns the description of the switch
|
||
|
public virtual String Description
|
||
|
{
|
||
|
get {return strDescription;}
|
||
|
}
|
||
|
|
||
|
|
||
|
// Get property returns the parent of the switch
|
||
|
public virtual LogSwitch Parent
|
||
|
{
|
||
|
get { return ParentSwitch; }
|
||
|
}
|
||
|
|
||
|
|
||
|
// Property to Get/Set the level of log messages which are "on" for the switch.
|
||
|
//
|
||
|
public virtual LoggingLevels MinimumLevel
|
||
|
{
|
||
|
get { return iLevel; }
|
||
|
[System.Security.SecuritySafeCritical] // auto-generated
|
||
|
[ResourceExposure(ResourceScope.None)]
|
||
|
[ResourceConsumption(ResourceScope.Process, ResourceScope.Process)]
|
||
|
set
|
||
|
{
|
||
|
iLevel = value;
|
||
|
iOldLevel = value;
|
||
|
String strParentName = ParentSwitch!=null ? ParentSwitch.Name : "";
|
||
|
if (Debugger.IsAttached)
|
||
|
Log.ModifyLogSwitch ((int)iLevel, strName, strParentName);
|
||
|
|
||
|
Log.InvokeLogSwitchLevelHandlers (this, iLevel);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
// Checks if the given level is "on" for this switch or one of its parents.
|
||
|
//
|
||
|
public virtual bool CheckLevel(LoggingLevels level)
|
||
|
{
|
||
|
if (iLevel > level)
|
||
|
{
|
||
|
// recurse through the list till parent is hit.
|
||
|
if (this.ParentSwitch == null)
|
||
|
return false;
|
||
|
else
|
||
|
return this.ParentSwitch.CheckLevel (level);
|
||
|
}
|
||
|
else
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
|
||
|
// Returns a switch with the particular name, if any. Returns null if no
|
||
|
// such switch exists.
|
||
|
public static LogSwitch GetSwitch(String name)
|
||
|
{
|
||
|
return (LogSwitch)Log.m_Hashtable[name];
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|