Merge pull request #439 from mono-soc-2012/garyb/iconfix
[mono.git] / mcs / class / System / System.Diagnostics / PerformanceCounterCategory.cs
index 6a5e13c11c02018b0add09865f34255d745b9ea4..3f8a88f11474cf58111033dfd650cc41e9c9ffd2 100644 (file)
@@ -29,6 +29,7 @@
 //
 
 using System.Security.Permissions;
+using System.Runtime.CompilerServices;
 
 namespace System.Diagnostics 
 {
@@ -37,6 +38,40 @@ namespace System.Diagnostics
        {
                private string categoryName;
                private string machineName;
+               private PerformanceCounterCategoryType type = PerformanceCounterCategoryType.Unknown;
+
+               [MethodImplAttribute (MethodImplOptions.InternalCall)]
+               static extern bool CategoryDelete (string name);
+
+               [MethodImplAttribute (MethodImplOptions.InternalCall)]
+               static extern string CategoryHelpInternal (string category, string machine);
+
+               /* this icall allows a null counter and it will just search for the category */
+               [MethodImplAttribute (MethodImplOptions.InternalCall)]
+               static extern bool CounterCategoryExists (string counter, string category, string machine);
+
+               [MethodImplAttribute (MethodImplOptions.InternalCall)]
+               static extern bool Create (string categoryName, string categoryHelp,
+                       PerformanceCounterCategoryType categoryType, CounterCreationData[] items);
+
+               [MethodImplAttribute (MethodImplOptions.InternalCall)]
+               static extern int InstanceExistsInternal (string instance, string category, string machine);
+
+               [MethodImplAttribute (MethodImplOptions.InternalCall)]
+               static extern string[] GetCategoryNames (string machine);
+
+               [MethodImplAttribute (MethodImplOptions.InternalCall)]
+               static extern string[] GetCounterNames (string category, string machine);
+
+               [MethodImplAttribute (MethodImplOptions.InternalCall)]
+               static extern string[] GetInstanceNames (string category, string machine);
+
+               static void CheckCategory (string categoryName) {
+                       if (categoryName == null)
+                               throw new ArgumentNullException ("categoryName");
+                       if (categoryName == "")
+                               throw new ArgumentException ("categoryName");
+               }
 
                public PerformanceCounterCategory ()
                        : this ("", ".")
@@ -50,157 +85,210 @@ namespace System.Diagnostics
                }
 
                // may throw ArgumentException (""), ArgumentNullException
-               [MonoTODO]
-               public PerformanceCounterCategory (string categoryName,
-                       string machineName)
+               public PerformanceCounterCategory (string categoryName, string machineName)
                {
+                       CheckCategory (categoryName);
+                       if (machineName == null)
+                               throw new ArgumentNullException ("machineName");
                        // TODO checks and whatever else is needed
                        this.categoryName = categoryName;
                        this.machineName = machineName;
-                       throw new NotImplementedException ();
                }
 
                // may throw InvalidOperationException, Win32Exception
-               [MonoTODO]
                public string CategoryHelp {
-                       get {throw new NotImplementedException ();}
+                       get {
+                               string res = CategoryHelpInternal (categoryName, machineName);
+                               if (res != null)
+                                       return res;
+                               throw new InvalidOperationException ();
+                       }
                }
 
                // may throw ArgumentException (""), ArgumentNullException
-               [MonoTODO]
                public string CategoryName {
                        get {return categoryName;}
                        set {
-                               // TODO needs validity checks
+                               if (value == null)
+                                       throw new ArgumentNullException ("value");
+                               if (value == "")
+                                       throw new ArgumentException ("value");
                                categoryName = value;
                        }
                }
 
                // may throw ArgumentException
-               [MonoTODO]
                public string MachineName {
                        get {return machineName;}
                        set {
-                               // TODO needs validity checks
+                               if (value == null)
+                                       throw new ArgumentNullException ("value");
+                               if (value == "")
+                                       throw new ArgumentException ("value");
                                machineName = value;
                        }
                }
 
-               // may throw ArgumentNullException, InvalidOperationException
-               // (categoryName isn't set), Win32Exception
-               [MonoTODO]
+               public PerformanceCounterCategoryType CategoryType {
+                       get {
+                               return type;
+                       }
+               }
+
                public bool CounterExists (string counterName)
                {
-                       throw new NotImplementedException ();
+                       return CounterExists (counterName, categoryName, machineName);
                }
 
-               // may throw ArgumentNullException, InvalidOperationException
-               // (categoryName is ""), Win32Exception
-               [MonoTODO]
-               public static bool CounterExists (string counterName, 
-                       string categoryName)
+               public static bool CounterExists (string counterName, string categoryName)
                {
-                       throw new NotImplementedException ();
+                       return CounterExists (counterName, categoryName, ".");
                }
 
                // may throw ArgumentNullException, InvalidOperationException
                // (categoryName is "", machine name is bad), Win32Exception
-               [MonoTODO]
-               public static bool CounterExists (string counterName, 
+               public static bool CounterExists (string counterName, string categoryName, string machineName)
+               {
+                       if (counterName == null)
+                               throw new ArgumentNullException ("counterName");
+                       CheckCategory (categoryName);
+                       if (machineName == null)
+                               throw new ArgumentNullException ("machineName");
+                       return CounterCategoryExists (counterName, categoryName, machineName);
+               }
+
+               [Obsolete ("Use another overload that uses PerformanceCounterCategoryType instead")]
+               public static PerformanceCounterCategory Create (
                        string categoryName,
-                       string machineName)
+                       string categoryHelp,
+                       CounterCreationDataCollection counterData)
                {
-                       throw new NotImplementedException ();
+                       return Create (categoryName, categoryHelp,
+                               PerformanceCounterCategoryType.Unknown, counterData);
                }
 
-               [MonoTODO]
+               [Obsolete ("Use another overload that uses PerformanceCounterCategoryType instead")]
                public static PerformanceCounterCategory Create (
                        string categoryName,
                        string categoryHelp,
+                       string counterName,
+                       string counterHelp)
+               {
+                       return Create (categoryName, categoryHelp,
+                               PerformanceCounterCategoryType.Unknown, counterName, counterHelp);
+               }
+
+               public static PerformanceCounterCategory Create (
+                       string categoryName,
+                       string categoryHelp,
+                       PerformanceCounterCategoryType categoryType,
                        CounterCreationDataCollection counterData)
                {
-                       throw new NotImplementedException ();
+                       CheckCategory (categoryName);
+                       if (counterData == null)
+                               throw new ArgumentNullException ("counterData");
+                       if (counterData.Count == 0)
+                               throw new ArgumentException ("counterData");
+                       CounterCreationData[] items = new CounterCreationData [counterData.Count];
+                       counterData.CopyTo (items, 0);
+                       if (!Create (categoryName, categoryHelp, categoryType, items))
+                               throw new InvalidOperationException ();
+                       return new PerformanceCounterCategory (categoryName, categoryHelp);
                }
 
-               [MonoTODO]
                public static PerformanceCounterCategory Create (
                        string categoryName,
                        string categoryHelp,
+                       PerformanceCounterCategoryType categoryType,
                        string counterName,
                        string counterHelp)
                {
-                       throw new NotImplementedException ();
+                       CheckCategory (categoryName);
+                       CounterCreationData[] items = new CounterCreationData [1];
+                       // we use PerformanceCounterType.NumberOfItems32 as the default type
+                       items [0] = new CounterCreationData (counterName, counterHelp, PerformanceCounterType.NumberOfItems32);
+                       if (!Create (categoryName, categoryHelp, categoryType, items))
+                               throw new InvalidOperationException ();
+                       return new PerformanceCounterCategory (categoryName, categoryHelp);
                }
 
-               [MonoTODO]
                public static void Delete (string categoryName)
                {
-                       throw new NotImplementedException ();
+                       CheckCategory (categoryName);
+                       if (!CategoryDelete (categoryName))
+                               throw new InvalidOperationException ();
                }
 
-               [MonoTODO]
                public static bool Exists (string categoryName)
                {
-                       throw new NotImplementedException ();
+                       return Exists (categoryName, ".");
                }
 
-               [MonoTODO]
-               public static bool Exists (string categoryName, 
-                       string machineName)
+               public static bool Exists (string categoryName, string machineName)
                {
-                       throw new NotImplementedException ();
+                       CheckCategory (categoryName);
+                       return CounterCategoryExists (null, categoryName, machineName);
                }
 
-               [MonoTODO]
                public static PerformanceCounterCategory[] GetCategories ()
                {
-                       throw new NotImplementedException ();
+                       return GetCategories (".");
                }
 
-               [MonoTODO]
-               public static PerformanceCounterCategory[] GetCategories (
-                       string machineName)
+               public static PerformanceCounterCategory[] GetCategories (string machineName)
                {
-                       throw new NotImplementedException ();
+                       if (machineName == null)
+                               throw new ArgumentNullException ("machineName");
+                       string[] catnames = GetCategoryNames (machineName);
+                       PerformanceCounterCategory[] cats = new PerformanceCounterCategory [catnames.Length];
+                       for (int i = 0; i < catnames.Length; ++i)
+                               cats [i] = new PerformanceCounterCategory (catnames [i], machineName);
+                       return cats;
                }
 
-               [MonoTODO]
                public PerformanceCounter[] GetCounters ()
                {
-                       throw new NotImplementedException ();
+                       return GetCounters ("");
                }
 
-               [MonoTODO]
                public PerformanceCounter[] GetCounters (string instanceName)
                {
-                       throw new NotImplementedException ();
+                       string[] countnames = GetCounterNames (categoryName, machineName);
+                       PerformanceCounter[] counters = new PerformanceCounter [countnames.Length];
+                       for (int i = 0; i < countnames.Length; ++i) {
+                               counters [i] = new PerformanceCounter (categoryName, countnames [i], instanceName, machineName);
+                       }
+                       return counters;
                }
 
-               [MonoTODO]
                public string[] GetInstanceNames ()
                {
-                       throw new NotImplementedException ();
+                       return GetInstanceNames (categoryName, machineName);
                }
 
-               [MonoTODO]
                public bool InstanceExists (string instanceName)
                {
-                       throw new NotImplementedException ();
+                       return InstanceExists (instanceName, categoryName, machineName);
                }
 
-               [MonoTODO]
-               public static bool InstanceExists (string instanceName, 
-                       string categoryName)
+               public static bool InstanceExists (string instanceName, string categoryName)
                {
-                       throw new NotImplementedException ();
+                       return InstanceExists (instanceName, categoryName, ".");
                }
 
-               [MonoTODO]
-               public static bool InstanceExists (string instanceName, 
-                       string categoryName,
-                       string machineName)
+               public static bool InstanceExists (string instanceName, string categoryName, string machineName)
                {
-                       throw new NotImplementedException ();
+                       if (instanceName == null)
+                               throw new ArgumentNullException ("instanceName");
+                       CheckCategory (categoryName);
+                       if (machineName == null)
+                               throw new ArgumentNullException ("machineName");
+                       int val = InstanceExistsInternal (instanceName, categoryName, machineName);
+                       if (val == 0)
+                               return false;
+                       if (val == 1)
+                               return true;
+                       throw new InvalidOperationException ();
                }
 
                [MonoTODO]