Author: atsushi
Date: 2006-08-14 02:10:01 -0400 (Mon, 14 Aug 2006)
New Revision: 63705
Added:
trunk/mcs/class/System/System.Diagnostics/LocalFileEventLog.cs
trunk/mcs/class/System/System.Diagnostics/NullEventLog.cs
Modified:
trunk/mcs/class/System/ChangeLog
trunk/mcs/class/System/System.Diagnostics/ChangeLog
trunk/mcs/class/System/System.Diagnostics/EventLog.cs
trunk/mcs/class/System/System.Diagnostics/EventLogEntryCollection.cs
trunk/mcs/class/System/System.Diagnostics/EventLogImpl.cs
trunk/mcs/class/System/System.dll.sources
Log:
2006-08-14 Atsushi Enomoto <[EMAIL PROTECTED]>
* System.dll.sources : added LocalFileEventLog.cs and NullEventLog.cs.
* EventLogImpl.cs, EventLogEntryCollection.cs, EventLog.cs :
some rework to support actual event log implementations.
* NullEventLog.cs, LocalFileEventLog.cs :
new files. The former (default) implementation does nothing for
any event log features. The latter implements local file based
event logs.
Modified: trunk/mcs/class/System/ChangeLog
===================================================================
--- trunk/mcs/class/System/ChangeLog 2006-08-14 06:00:46 UTC (rev 63704)
+++ trunk/mcs/class/System/ChangeLog 2006-08-14 06:10:01 UTC (rev 63705)
@@ -1,5 +1,9 @@
-2006-08-11 Atsushi Enomoto <[EMAIL PROTECTED]>
+2006-08-14 Atsushi Enomoto <[EMAIL PROTECTED]>
+ * System.dll.sources : added LocalFileEventLog.cs and NullEventLog.cs.
+
+2006-08-14 Atsushi Enomoto <[EMAIL PROTECTED]>
+
* System.dll.sources : reverted all recent changes on EventLogs.
It does not work at all.
Modified: trunk/mcs/class/System/System.Diagnostics/ChangeLog
===================================================================
--- trunk/mcs/class/System/System.Diagnostics/ChangeLog 2006-08-14 06:00:46 UTC
(rev 63704)
+++ trunk/mcs/class/System/System.Diagnostics/ChangeLog 2006-08-14 06:10:01 UTC
(rev 63705)
@@ -1,5 +1,14 @@
2006-08-14 Atsushi Enomoto <[EMAIL PROTECTED]>
+ * EventLogImpl.cs, EventLogEntryCollection.cs, EventLog.cs :
+ some rework to support actual event log implementations.
+ * NullEventLog.cs, LocalFileEventLog.cs :
+ new files. The former (default) implementation does nothing for
+ any event log features. The latter implements local file based
+ event logs.
+
+2006-08-14 Atsushi Enomoto <[EMAIL PROTECTED]>
+
* UnixEventLog.cs, EventLogEntry.cs, EventSourceCreationData.cs,
EventLogImpl.cs, Win32EventLog.cs, EventLogEntryCollection.cs,
EventLog.cs:
Modified: trunk/mcs/class/System/System.Diagnostics/EventLog.cs
===================================================================
--- trunk/mcs/class/System/System.Diagnostics/EventLog.cs 2006-08-14
06:00:46 UTC (rev 63704)
+++ trunk/mcs/class/System/System.Diagnostics/EventLog.cs 2006-08-14
06:10:01 UTC (rev 63705)
@@ -72,7 +72,7 @@
this.machineName = machineName;
this.logName = logName;
- this.Impl = new EventLogImpl (this);
+ this.Impl = EventLogImpl.Create (this);
EventLogImpl.EntryWritten += new
EntryWrittenEventHandler (EntryWrittenHandler);
}
Modified: trunk/mcs/class/System/System.Diagnostics/EventLogEntryCollection.cs
===================================================================
--- trunk/mcs/class/System/System.Diagnostics/EventLogEntryCollection.cs
2006-08-14 06:00:46 UTC (rev 63704)
+++ trunk/mcs/class/System/System.Diagnostics/EventLogEntryCollection.cs
2006-08-14 06:10:01 UTC (rev 63705)
@@ -39,8 +39,10 @@
private ArrayList eventLogs = new ArrayList ();
- internal EventLogEntryCollection()
+ internal EventLogEntryCollection(IEnumerable entries)
{
+ foreach (object entry in entries)
+ eventLogs.Add (entry);
}
public int Count {
Modified: trunk/mcs/class/System/System.Diagnostics/EventLogImpl.cs
===================================================================
--- trunk/mcs/class/System/System.Diagnostics/EventLogImpl.cs 2006-08-14
06:00:46 UTC (rev 63704)
+++ trunk/mcs/class/System/System.Diagnostics/EventLogImpl.cs 2006-08-14
06:10:01 UTC (rev 63705)
@@ -3,8 +3,10 @@
//
// Authors:
// Andreas Nahr ([EMAIL PROTECTED])
+// Atsushi Enomoto <[EMAIL PROTECTED]>
//
// (C) 2003 Andreas Nahr
+// (C) 2006 Novell, Inc.
//
//
@@ -32,89 +34,131 @@
using System.Diagnostics;
using System.ComponentModel;
using System.ComponentModel.Design;
+using System.Collections;
+using System.Globalization;
+using System.IO;
+using System.Net;
namespace System.Diagnostics
{
+ internal abstract class EventLogImpl
+ {
+ static EventLogFactory factory;
-// FIXME set a symbol for every implementation and include the implementation
-#if (EVENTLOG_WIN32)
+ static EventLogImpl ()
+ {
+ factory = GetFactory ();
+ }
- // TODO implement the EventLog for Win32 platforms
+ static EventLogFactory GetFactory ()
+ {
+ if (LocalFileEventLogUtil.IsEnabled)
+ return new LocalFileEventLogFactory ();
-#elif (EVENTLOG_GENERIC)
+ //throw new NotSupportedException (String.Format ("No
EventLog implementation is supported. Consider setting MONO_LOCAL_EVENTLOG_PATH
environment variable."));
+ return new NullEventLogFactory ();
+ }
- // TODO implement a generic (XML - based?) Eventlog for non - Win32
platforms
+ EventLog log;
-#else
- // Empty implementation that does not need any specific platform
- // but should be enough to get applications to run that WRITE to
eventlog
- internal class EventLogImpl
- {
- public EventLogImpl (EventLog coreEventLog)
+ protected EventLogImpl (EventLog coreEventLog)
{
+ this.log = coreEventLog;
}
+ public static EventLogImpl Create (EventLog source)
+ {
+ return factory.Create (source);
+ }
+
public static event EntryWrittenEventHandler EntryWritten;
- public EventLogEntryCollection Entries {
- get {return new EventLogEntryCollection ();}
- }
+ public abstract EventLogEntryCollection Entries { get; }
- public string LogDisplayName {
- get {return "";}
- }
+ public abstract string LogDisplayName { get; }
- public void BeginInit () {}
+ public abstract void BeginInit ();
- public void Clear () {}
+ public abstract void Clear ();
- public void Close () {}
+ public abstract void Close ();
- public static void CreateEventSource (string source, string
logName, string machineName) {}
+ public static void CreateEventSource (string source, string
logName, string machineName)
+ {
+ factory.CreateEventSource (source, logName,
machineName);
+ }
- public static void Delete (string logName, string machineName)
{}
+ public static void Delete (string logName, string machineName)
+ {
+ factory.Delete (logName, machineName);
+ }
- public static void DeleteEventSource (string source, string
machineName) {}
+ public static void DeleteEventSource (string source, string
machineName)
+ {
+ factory.DeleteEventSource (source, machineName);
+ }
- public void Dispose (bool disposing) {}
+ public abstract void Dispose (bool disposing);
- public void EndInit () {}
+ public abstract void EndInit ();
public static bool Exists (string logName, string machineName)
{
- return false;
+ return factory.Exists (logName, machineName);
}
public static EventLog[] GetEventLogs (string machineName)
{
- return new EventLog[0];
+ return factory.GetEventLogs (machineName);
}
public static string LogNameFromSourceName (string source,
string machineName)
{
- return String.Empty;
+ return factory.LogNameFromSourceName (source,
machineName);
}
public static bool SourceExists (string source, string
machineName)
{
- return false;
+ return factory.SourceExists (source, machineName);
}
public void WriteEntry (string message, EventLogEntryType type,
int eventID, short category, byte[] rawData)
{
- WriteEntry ("", message, type, eventID, category,
rawData);
+ WriteEntry (log.Source, message, type, eventID,
category, rawData);
}
public static void WriteEntry (string source, string message,
EventLogEntryType type, int eventID, short category, byte[] rawData)
{
- EventLogEntry Entry;
- Entry = new EventLogEntry ("", category, 0, eventID,
message, source,
- "", "", type, DateTime.Now, DateTime.Now,
rawData, null);
- if (EntryWritten != null)
- EntryWritten (null, new EntryWrittenEventArgs
(Entry));
+ factory.WriteEntry (source, message, type, eventID,
category, rawData);
+ if (EntryWritten != null) {
+ // FIXME: some arguments are improper.
+ EventLogEntry e = new EventLogEntry ("",
+ category, 0, eventID, message, source,
+ "", ".", type, DateTime.Now,
DateTime.Now,
+ rawData, null);
+ EntryWritten (null, new EntryWrittenEventArgs
(e));
+ }
}
}
-#endif
+ internal abstract class EventLogFactory
+ {
+ public abstract EventLogImpl Create (EventLog source);
+ public abstract void CreateEventSource (string source, string
logName, string machineName);
+
+ public abstract void Delete (string logName, string
machineName);
+
+ public abstract void DeleteEventSource (string source, string
machineName);
+
+ public abstract bool Exists (string logName, string
machineName);
+
+ public abstract EventLog[] GetEventLogs (string machineName);
+
+ public abstract string LogNameFromSourceName (string source,
string machineName);
+
+ public abstract bool SourceExists (string source, string
machineName);
+
+ public abstract void WriteEntry (string source, string message,
EventLogEntryType type, int eventID, short category, byte[] rawData);
+ }
}
Added: trunk/mcs/class/System/System.Diagnostics/LocalFileEventLog.cs
===================================================================
--- trunk/mcs/class/System/System.Diagnostics/LocalFileEventLog.cs
2006-08-14 06:00:46 UTC (rev 63704)
+++ trunk/mcs/class/System/System.Diagnostics/LocalFileEventLog.cs
2006-08-14 06:10:01 UTC (rev 63705)
@@ -0,0 +1,274 @@
+//
+// LocalFileEventLog.cs
+//
+// Author:
+// Atsushi Enomoto <[EMAIL PROTECTED]>
+//
+// (C) 2006 Novell, Inc.
+//
+
+//
+// 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;
+using System.Diagnostics;
+using System.ComponentModel;
+using System.ComponentModel.Design;
+using System.Collections;
+using System.Globalization;
+using System.IO;
+using System.Net;
+
+namespace System.Diagnostics
+{
+ class LocalFileEventLogUtil
+ {
+ public const string DateFormat = "yyyyMMddHHmmssfff";
+
+ static readonly string path;
+
+ static LocalFileEventLogUtil ()
+ {
+ string env = Environment.GetEnvironmentVariable
("MONO_LOCAL_EVENTLOG_PATH");
+ if (env != null)
+ path = Path.GetFullPath (env);
+ }
+
+ public static bool IsEnabled {
+ get { return path != null && Directory.Exists (path); }
+ }
+
+ public static string GetSourceDir (string source)
+ {
+ foreach (string log in GetLogDirectories ()) {
+ string sd = Path.Combine (log, source);
+ if (Directory.Exists (sd))
+ return sd;
+ }
+ return null;
+ }
+
+ public static string GetLogDir (string logName)
+ {
+ return Path.Combine (Path.Combine (path, "logs"),
logName);
+ }
+
+ public static string [] GetLogDirectories ()
+ {
+ return Directory.GetDirectories (Path.Combine (path,
"logs"));
+ }
+ }
+
+ class LocalFileEventLog : EventLogImpl
+ {
+ static readonly string [] empty_strings = new string [0];
+
+ EventLog log;
+ string source_path;
+
+ public LocalFileEventLog (EventLog log)
+ : base (log)
+ {
+ this.log = log;
+ source_path = LocalFileEventLogUtil.GetSourceDir
(log.Source);
+ if (!Directory.Exists (source_path))
+ throw new SystemException (String.Format
("INTERNAL ERROR: directory for {0} does not exist.", log.Source));
+ }
+
+ public override EventLogEntryCollection Entries {
+ get {
+ ArrayList list = new ArrayList ();
+ int index = 0;
+ foreach (string file in Directory.GetFiles
(source_path, "*.log"))
+ list.Add (LoadLogEntry (file, index++));
+ return new EventLogEntryCollection
((EventLogEntry []) list.ToArray (typeof (EventLogEntry)));
+ }
+ }
+
+ public override string LogDisplayName {
+ get { return log.Log; }
+ }
+
+ EventLogEntry LoadLogEntry (string file, int index)
+ {
+ using (TextReader tr = File.OpenText (file)) {
+ int id = int.Parse (tr.ReadLine ().Substring
(9));
+ EventLogEntryType type = (EventLogEntryType)
+ Enum.Parse (typeof (EventLogEntryType),
tr.ReadLine ().Substring (11));
+ string category = tr.ReadLine ().Substring (10);
+ int size = int.Parse (tr.ReadLine ().Substring
(15));
+ char [] buf = new char [size];
+ tr.Read (buf, 0, size);
+ string filename = Path.GetFileName
(file).Substring (0, LocalFileEventLogUtil.DateFormat.Length);
+ DateTime date = DateTime.ParseExact (filename,
LocalFileEventLogUtil.DateFormat, CultureInfo.InvariantCulture);
+ byte [] bin = Convert.FromBase64String
(tr.ReadToEnd ());
+ // FIXME: categoryNumber, index, userName, two
dates
+ return new EventLogEntry (category, 0, index,
+ id, new string (buf), log.Source, "",
log.MachineName,
+ type, date, date, bin, empty_strings);
+ }
+ }
+
+ public override void BeginInit ()
+ {
+ }
+
+ public override void Clear ()
+ {
+ foreach (string file in Directory.GetFiles
(source_path, "*.log"))
+ File.Delete (file);
+ }
+
+ public override void Close ()
+ {
+ }
+
+ public override void Dispose (bool disposing)
+ {
+ Close ();
+ }
+
+ public override void EndInit ()
+ {
+ }
+ }
+
+ // Creates a log repository at MONO_LOCAL_EVENTLOG_DIR, which consists
of
+ // -
+ internal class LocalFileEventLogFactory : EventLogFactory
+ {
+ static readonly IPAddress local_ip = IPAddress.Parse
("127.0.0.1");
+
+ public LocalFileEventLogFactory ()
+ {
+ }
+
+ public override EventLogImpl Create (EventLog log)
+ {
+ if (!SourceExists (log.Source, log.MachineName))
+ CreateEventSource (log.Source, log.Log,
log.MachineName);
+ return new LocalFileEventLog (log);
+ }
+
+ void VerifyMachine (string machineName)
+ {
+ if (machineName != ".") {
+ IPHostEntry entry =
+#if NET_2_0
+ Dns.GetHostEntry (machineName);
+#else
+ Dns.Resolve (machineName);
+#endif
+ if (Array.IndexOf (entry.AddressList, local_ip)
< 0)
+ throw new NotSupportedException
(String.Format ("LocalFileEventLog does not support remote machine: {0}",
machineName));
+ }
+ }
+
+ public override void CreateEventSource (string source, string
logName, string machineName)
+ {
+ VerifyMachine (machineName);
+
+ string sourceDir = LocalFileEventLogUtil.GetSourceDir
(source);
+ if (sourceDir != null)
+ throw new ArgumentException (String.Format
("Source '{0}' already exists on the local machine.", source));
+
+ string logDir = LocalFileEventLogUtil.GetLogDir
(logName);
+ if (!Directory.Exists (logDir))
+ Directory.CreateDirectory (logDir);
+ Directory.CreateDirectory (Path.Combine (logDir,
source));
+ }
+
+ public override void Delete (string logName, string machineName)
+ {
+ VerifyMachine (machineName);
+
+ string logDir = LocalFileEventLogUtil.GetLogDir
(logName);
+ if (Directory.Exists (logDir))
+ Directory.Delete (logDir);
+ }
+
+ public override void DeleteEventSource (string source, string
machineName)
+ {
+ VerifyMachine (machineName);
+
+ string sourceDir = LocalFileEventLogUtil.GetSourceDir
(source);
+ if (Directory.Exists (sourceDir))
+ Directory.Delete (sourceDir);
+ else
+ throw new ArgumentException (String.Format
("Event source '{0}' does not exist on the local machine."), source);
+ }
+
+ public override bool Exists (string logName, string machineName)
+ {
+ VerifyMachine (machineName);
+
+ return Directory.Exists
(LocalFileEventLogUtil.GetLogDir (logName));
+ }
+
+ public override EventLog[] GetEventLogs (string machineName)
+ {
+ VerifyMachine (machineName);
+
+ ArrayList al = new ArrayList ();
+ foreach (string log in
LocalFileEventLogUtil.GetLogDirectories ())
+ al.Add (new EventLog (log));
+ return (EventLog []) al.ToArray (typeof (EventLog));
+ }
+
+ public override string LogNameFromSourceName (string source,
string machineName)
+ {
+ VerifyMachine (machineName);
+
+ string sourceDir = LocalFileEventLogUtil.GetSourceDir
(source);
+ if (sourceDir == null)
+ throw new ArgumentException (String.Format
("Event source '{0}' does not exist on the local machine."), source);
+ return Directory.GetParent (sourceDir).Name;
+ }
+
+ public override bool SourceExists (string source, string
machineName)
+ {
+ VerifyMachine (machineName);
+
+ return LocalFileEventLogUtil.GetSourceDir (source) !=
null;
+ }
+
+ public override void WriteEntry (string source, string message,
EventLogEntryType type, int eventID, short category, byte[] rawData)
+ {
+ if (!SourceExists (source, "."))
+ throw new ArgumentException (String.Format
("Event source '{0}' does not exist on the local machine."), source);
+ string sourceDir = LocalFileEventLogUtil.GetSourceDir
(source);
+ string path = Path.Combine (sourceDir,
DateTime.Now.ToString (LocalFileEventLogUtil.DateFormat) + ".log");
+ try {
+ using (TextWriter w = File.CreateText (path)) {
+ w.WriteLine ("EventID: {0}", eventID);
+ w.WriteLine ("EntryType: {0}", type);
+ w.WriteLine ("Category: {0}", category);
+ w.WriteLine ("MessageLength: {0}",
message.Length);
+ w.Write (message);
+ if (rawData != null)
+ w.Write (Convert.ToBase64String
(rawData));
+ }
+ } catch (IOException) {
+ File.Delete (path);
+ }
+ }
+ }
+}
Property changes on:
trunk/mcs/class/System/System.Diagnostics/LocalFileEventLog.cs
___________________________________________________________________
Name: svn:eol-style
+ native
Added: trunk/mcs/class/System/System.Diagnostics/NullEventLog.cs
===================================================================
--- trunk/mcs/class/System/System.Diagnostics/NullEventLog.cs 2006-08-14
06:00:46 UTC (rev 63704)
+++ trunk/mcs/class/System/System.Diagnostics/NullEventLog.cs 2006-08-14
06:10:01 UTC (rev 63705)
@@ -0,0 +1,126 @@
+//
+// NullEventLog.cs
+//
+// Author:
+// Atsushi Enomoto <[EMAIL PROTECTED]>
+//
+// (C) 2006 Novell, Inc.
+//
+
+//
+// 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;
+using System.Diagnostics;
+using System.ComponentModel;
+using System.ComponentModel.Design;
+using System.Collections;
+using System.Globalization;
+using System.IO;
+using System.Net;
+
+namespace System.Diagnostics
+{
+ internal class NullEventLog : EventLogImpl
+ {
+ EventLogEntryCollection empty_entries =
+ new EventLogEntryCollection (new EventLogEntry [0]);
+
+ public NullEventLog (EventLog coreEventLog)
+ : base (coreEventLog)
+ {
+ }
+
+ public override EventLogEntryCollection Entries {
+ get { return empty_entries; }
+ }
+
+ public override string LogDisplayName {
+ get { return String.Empty; }
+ }
+
+ public override void BeginInit ()
+ {
+ }
+
+ public override void Clear ()
+ {
+ }
+
+ public override void Close ()
+ {
+ }
+
+ public override void Dispose (bool disposing)
+ {
+ }
+
+ public override void EndInit ()
+ {
+ }
+ }
+
+ internal class NullEventLogFactory : EventLogFactory
+ {
+ EventLog [] empty_logs = new EventLog [0];
+
+ public override EventLogImpl Create (EventLog source)
+ {
+ return new NullEventLog (source);
+ }
+
+ public override void CreateEventSource (string source, string
logName, string machineName)
+ {
+ }
+
+ public override void Delete (string logName, string machineName)
+ {
+ }
+
+ public override void DeleteEventSource (string source, string
machineName)
+ {
+ }
+
+ public override bool Exists (string logName, string machineName)
+ {
+ return false;
+ }
+
+ public override EventLog [] GetEventLogs (string machineName)
+ {
+ return empty_logs;
+ }
+
+ public override string LogNameFromSourceName (string source,
string machineName)
+ {
+ return String.Empty;
+ }
+
+ public override bool SourceExists (string source, string
machineName)
+ {
+ return false;
+ }
+
+ public override void WriteEntry (string source, string message,
EventLogEntryType type, int eventID, short category, byte[] rawData)
+ {
+ }
+ }
+}
Property changes on: trunk/mcs/class/System/System.Diagnostics/NullEventLog.cs
___________________________________________________________________
Name: svn:eol-style
+ native
Modified: trunk/mcs/class/System/System.dll.sources
===================================================================
--- trunk/mcs/class/System/System.dll.sources 2006-08-14 06:00:46 UTC (rev
63704)
+++ trunk/mcs/class/System/System.dll.sources 2006-08-14 06:10:01 UTC (rev
63705)
@@ -450,7 +450,9 @@
System.Diagnostics/InstanceDataCollectionCollection.cs
System.Diagnostics/InstanceDataCollection.cs
System.Diagnostics/InstanceData.cs
+System.Diagnostics/LocalFileEventLog.cs
System.Diagnostics/MonitoringDescriptionAttribute.cs
+System.Diagnostics/NullEventLog.cs
System.Diagnostics/OverflowAction.cs
System.Diagnostics/PerformanceCounterCategory.cs
System.Diagnostics/PerformanceCounter.cs
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches