# HG changeset patch
# User paulwerelds
# Date 1287235746 0
# Node ID 39f73ac8c2f4625e9bd5727050064181451c3da1
# Parent  ba64bb91ebe4e38f29758f2e17a38b581c13d275
Added a WMI provider, documentation to follow.
diff -r ba64bb91ebe4 -r 39f73ac8c2f4 GUI/MainForm.Designer.cs
--- a/GUI/MainForm.Designer.cs	Thu Oct 14 17:30:51 2010 +0000
+++ b/GUI/MainForm.Designer.cs	Sat Oct 16 13:29:06 2010 +0000
@@ -100,6 +100,8 @@
       this.fahrenheitMenuItem = new System.Windows.Forms.MenuItem();
       this.MenuItem4 = new System.Windows.Forms.MenuItem();
       this.hddMenuItem = new System.Windows.Forms.MenuItem();
+      this.menuItem5 = new System.Windows.Forms.MenuItem();
+      this.wmiMenuItem = new System.Windows.Forms.MenuItem();
       this.helpMenuItem = new System.Windows.Forms.MenuItem();
       this.aboutMenuItem = new System.Windows.Forms.MenuItem();
       this.sensorContextMenu = new System.Windows.Forms.ContextMenu();
@@ -308,7 +310,9 @@
             this.separatorMenuItem,
             this.temperatureUnitsMenuItem,
             this.MenuItem4,
-            this.hddMenuItem});
+            this.hddMenuItem,
+            this.menuItem5,
+            this.wmiMenuItem});
       this.optionsMenuItem.Text = "Options";
       // 
       // startMinMenuItem
@@ -366,6 +370,16 @@
       this.hddMenuItem.Index = 7;
       this.hddMenuItem.Text = "Read HDD sensors";
       // 
+      // menuItem5
+      // 
+      this.menuItem5.Index = 8;
+      this.menuItem5.Text = "-";
+      // 
+      // wmiMenuItem
+      // 
+      this.wmiMenuItem.Index = 9;
+      this.wmiMenuItem.Text = "Enable WMI Provider";
+      // 
       // helpMenuItem
       // 
       this.helpMenuItem.Index = 3;
@@ -522,6 +536,8 @@
     private System.Windows.Forms.MenuItem MenuItem3;
     private System.Windows.Forms.MenuItem gadgetMenuItem;
     private System.Windows.Forms.MenuItem minCloseMenuItem;
+    private System.Windows.Forms.MenuItem menuItem5;
+    private System.Windows.Forms.MenuItem wmiMenuItem;
   }
 }
 
diff -r ba64bb91ebe4 -r 39f73ac8c2f4 GUI/MainForm.cs
--- a/GUI/MainForm.cs	Thu Oct 14 17:30:51 2010 +0000
+++ b/GUI/MainForm.cs	Sat Oct 16 13:29:06 2010 +0000
@@ -19,7 +19,7 @@
   Portions created by the Initial Developer are Copyright (C) 2009-2010
   the Initial Developer. All Rights Reserved.
 
-  Contributor(s):
+  Contributor(s): Paul Werelds
 
   Alternatively, the contents of this file may be used under the terms of
   either the GNU General Public License Version 2 or later (the "GPL"), or
@@ -38,15 +38,13 @@
 using System;
 using System.Collections.Generic;
 using System.ComponentModel;
-using System.Configuration;
 using System.Drawing;
 using System.IO;
-using System.Text;
 using System.Windows.Forms;
 using Aga.Controls.Tree;
 using Aga.Controls.Tree.NodeControls;
 using OpenHardwareMonitor.Hardware;
-using OpenHardwareMonitor.Utilities;
+using OpenHardwareMonitor.WMIProvider;
 
 namespace OpenHardwareMonitor.GUI {
   public partial class MainForm : Form {
@@ -75,6 +73,9 @@
     private UserOption autoStart;
     private UserOption readHddSensors;
     private UserOption showGadget;
+    private UserOption enableWmiProvider;
+
+    private WmiProvider wmiProvider;
 
     public MainForm() {      
       InitializeComponent();
@@ -133,6 +134,10 @@
 
       computer.HardwareAdded += new HardwareEventHandler(HardwareAdded);
       computer.HardwareRemoved += new HardwareEventHandler(HardwareRemoved);
+
+      if (settings.GetValue("enableWmiProvider", false))
+        wmiProvider = new WmiProvider(computer);
+
       computer.Open();
 
       timer.Enabled = true;
@@ -152,7 +157,8 @@
       plotColorPalette[11] = Color.Olive;
       plotColorPalette[12] = Color.Firebrick;
 
-      showHiddenSensors = new UserOption("hiddenMenuItem", false, hiddenMenuItem, settings);
+      showHiddenSensors = new UserOption("hiddenMenuItem", false,
+        hiddenMenuItem, settings);
       showHiddenSensors.Changed += delegate(object sender, EventArgs e) {
         treeModel.ForceVisible = showHiddenSensors.Value;
       };
@@ -163,7 +169,8 @@
         treeView.Invalidate();
       };
 
-      showValue = new UserOption("valueMenuItem", true, valueMenuItem, settings);
+      showValue = new UserOption("valueMenuItem", true, valueMenuItem,
+        settings);
       showValue.Changed += delegate(object sender, EventArgs e) {
         treeView.Columns[1].IsVisible = showValue.Value;
       };
@@ -178,16 +185,20 @@
         treeView.Columns[3].IsVisible = showMax.Value;
       };
 
-      startMinimized = new UserOption("startMinMenuItem", false, startMinMenuItem, settings);
+      startMinimized = new UserOption("startMinMenuItem", false,
+        startMinMenuItem, settings);
 
-      minimizeToTray = new UserOption("minTrayMenuItem", true, minTrayMenuItem, settings);
+      minimizeToTray = new UserOption("minTrayMenuItem", true,
+        minTrayMenuItem, settings);
       minimizeToTray.Changed += delegate(object sender, EventArgs e) {
         systemTray.IsMainIconEnabled = minimizeToTray.Value;
       };
 
-      minimizeOnClose = new UserOption("minCloseMenuItem", false, minCloseMenuItem, settings);
+      minimizeOnClose = new UserOption("minCloseMenuItem", false,
+        minCloseMenuItem, settings);
 
-      autoStart = new UserOption(null, startupManager.Startup, startupMenuItem, settings);
+      autoStart = new UserOption(null, startupManager.Startup,
+        startupMenuItem, settings);
       autoStart.Changed += delegate(object sender, EventArgs e) {
         try {
           startupManager.Startup = autoStart.Value;
@@ -198,18 +209,31 @@
         }
       };
 
-      readHddSensors = new UserOption("hddMenuItem", true, hddMenuItem, settings);
+      readHddSensors = new UserOption("hddMenuItem", true, hddMenuItem,
+        settings);
       readHddSensors.Changed += delegate(object sender, EventArgs e) {
         computer.HDDEnabled = readHddSensors.Value;
         UpdatePlotSelection(null, null);
       };
 
-      showGadget = new UserOption("gadgetMenuItem", false, gadgetMenuItem, settings);
+      showGadget = new UserOption("gadgetMenuItem", false, gadgetMenuItem,
+        settings);
       showGadget.Changed += delegate(object sender, EventArgs e) {
         if (gadget != null) 
           gadget.Visible = showGadget.Value;
       };
 
+      enableWmiProvider = new UserOption("enableWmiProvider", false,
+        wmiMenuItem, settings);
+      enableWmiProvider.Changed += delegate {
+        if (enableWmiProvider.Value && wmiProvider == null)
+          wmiProvider = new WmiProvider(computer);
+        else if (!enableWmiProvider.Value && wmiProvider != null) {
+          wmiProvider.Dispose();
+          wmiProvider = null;
+        }
+      };
+
       celciusMenuItem.Checked = 
         unitManager.TemperatureUnit == TemperatureUnit.Celcius;
       fahrenheitMenuItem.Checked = !celciusMenuItem.Checked;
@@ -229,10 +253,9 @@
       IntPtr handle = Handle;
 
       // Make sure the settings are saved when the user logs off
-      Microsoft.Win32.SystemEvents.SessionEnded +=
-        delegate(object sender, Microsoft.Win32.SessionEndedEventArgs e) {
-          SaveConfiguration();
-        };  
+      Microsoft.Win32.SystemEvents.SessionEnded += delegate {
+        SaveConfiguration();
+      };  
     }
     
     private void SubHardwareAdded(IHardware hardware, Node node) {
@@ -297,7 +320,8 @@
       plotPanel.SetSensors(selected, colors);
     }
 
-    private void nodeTextBoxText_EditorShowing(object sender, CancelEventArgs e) 
+    private void nodeTextBoxText_EditorShowing(object sender,
+      CancelEventArgs e) 
     {
       e.Cancel = !(treeView.CurrentNode != null &&
         treeView.CurrentNode.Tag is SensorNode);
@@ -319,9 +343,12 @@
       computer.Accept(updateVisitor);
       treeView.Invalidate();
       plotPanel.Invalidate();
-      systemTray.Redraw(); 
+      systemTray.Redraw();
       if (gadget != null)
         gadget.Redraw();
+
+      if (wmiProvider != null)
+        wmiProvider.Update();
     }
 
     private void SaveConfiguration() {
@@ -355,13 +382,13 @@
         Height = settings.GetValue("mainForm.Height", 640)
       };
 
-      Rectangle totalWorkingArea = new Rectangle(int.MaxValue, int.MaxValue,
+      Rectangle fullWorkingArea = new Rectangle(int.MaxValue, int.MaxValue,
         int.MinValue, int.MinValue);
 
       foreach (Screen screen in Screen.AllScreens)
-        totalWorkingArea = Rectangle.Union(totalWorkingArea, screen.Bounds);
+        fullWorkingArea = Rectangle.Union(fullWorkingArea, screen.Bounds);
 
-      Rectangle intersection = Rectangle.Intersect(totalWorkingArea, newBounds);
+      Rectangle intersection = Rectangle.Intersect(fullWorkingArea, newBounds);
       if (intersection.Width < 20 || intersection.Height < 20 ||
         !settings.Contains("mainForm.Location.X")
       ) {
@@ -394,7 +421,9 @@
       if (m == null || m.Button != MouseButtons.Right)
         return;
 
-      NodeControlInfo info = treeView.GetNodeControlInfoAt(new Point(m.X, m.Y));
+      NodeControlInfo info = treeView.GetNodeControlInfoAt(
+        new Point(m.X, m.Y)
+      );
       treeView.SelectedNode = info.Node;
       if (info.Node != null) {
         SensorNode node = info.Node.Tag as SensorNode;
diff -r ba64bb91ebe4 -r 39f73ac8c2f4 OpenHardwareMonitor.csproj
--- a/OpenHardwareMonitor.csproj	Thu Oct 14 17:30:51 2010 +0000
+++ b/OpenHardwareMonitor.csproj	Sat Oct 16 13:29:06 2010 +0000
@@ -58,7 +58,9 @@
   
   
     
+    
     
+    
     
     
     
@@ -126,6 +128,12 @@
     
     
     
+    
+    
+    
+    
+      Component
+    
   
   
     
diff -r ba64bb91ebe4 -r 39f73ac8c2f4 WMIProvider/Hardware.cs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WMIProvider/Hardware.cs	Sat Oct 16 13:29:06 2010 +0000
@@ -0,0 +1,19 @@
+using System.Management.Instrumentation;
+using OpenHardwareMonitor.Hardware;
+
+namespace OpenHardwareMonitor.WMIProvider {
+  [InstrumentationClass(InstrumentationType.Instance)]
+  public class Hardware : IWmiClass {
+    public string HardwareType { get; private set; }
+    public string Identifier { get; private set; }
+    public string Name { get; private set; }
+
+    public Hardware(IHardware hardware) {
+      Name = hardware.Name;
+      Identifier = hardware.Identifier.ToString();
+      HardwareType = hardware.HardwareType.ToString();
+    }
+
+    public void Update() { }
+  }
+}
diff -r ba64bb91ebe4 -r 39f73ac8c2f4 WMIProvider/IWmiClass.cs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WMIProvider/IWmiClass.cs	Sat Oct 16 13:29:06 2010 +0000
@@ -0,0 +1,8 @@
+namespace OpenHardwareMonitor.WMIProvider {
+  interface IWmiClass {
+    string Name { get; }
+    string Identifier { get; }
+
+    void Update();
+  }
+}
diff -r ba64bb91ebe4 -r 39f73ac8c2f4 WMIProvider/Sensor.cs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WMIProvider/Sensor.cs	Sat Oct 16 13:29:06 2010 +0000
@@ -0,0 +1,40 @@
+using System.Management.Instrumentation;
+using OpenHardwareMonitor.Hardware;
+
+namespace OpenHardwareMonitor.WMIProvider {
+  [InstrumentationClass(InstrumentationType.Instance)]
+  public class Sensor : IWmiClass {
+
+    private ISensor _sensor;
+
+    public string SensorType { get; private set; }
+    public string Identifier { get; private set; }
+    public string Parent { get; private set; }
+    public string Name { get; private set; }
+    public float Value { get; private set; }
+    public float Min { get; private set; }
+    public float Max { get; private set; }
+    public int Index { get; private set; }
+
+    public Sensor(ISensor sensor) {
+      Name = sensor.Name;
+      Index = sensor.Index;
+
+      SensorType = sensor.SensorType.ToString();
+      Identifier = sensor.Identifier.ToString();
+      Parent = sensor.Hardware.Identifier.ToString();
+
+      _sensor = sensor;
+    }
+    
+    public void Update() {
+      Value = (_sensor.Value != null) ? (float)_sensor.Value : 0;
+
+      if (_sensor.Min != null)
+        Min = (float)_sensor.Min;
+
+      if (_sensor.Max != null)
+        Max = (float)_sensor.Max;
+    }
+  }
+}
diff -r ba64bb91ebe4 -r 39f73ac8c2f4 WMIProvider/WMIProvider.cs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WMIProvider/WMIProvider.cs	Sat Oct 16 13:29:06 2010 +0000
@@ -0,0 +1,100 @@
+using System;
+using System.Collections.Generic;
+using System.Management.Instrumentation;
+using OpenHardwareMonitor.Hardware;
+
+[assembly: Instrumented("root/OpenHardwareMonitor")]
+
+[System.ComponentModel.RunInstaller(true)]
+public class InstanceInstaller : DefaultManagementProjectInstaller { }
+
+namespace OpenHardwareMonitor.WMIProvider {
+  public class WmiProvider : IDisposable {
+    private List _activeInstances;
+
+    public WmiProvider(IComputer computer) {
+      _activeInstances = new List();
+
+      foreach (IHardware hardware in computer.Hardware)
+        ComputerHardwareAdded(hardware);
+
+      computer.HardwareAdded += ComputerHardwareAdded;
+      computer.HardwareRemoved += ComputerHardwareRemoved;
+    }
+
+    public void Update() {
+      foreach (IWmiClass instance in _activeInstances)
+        instance.Update();
+    }
+
+    #region Eventhandlers
+    
+    private void ComputerHardwareAdded(IHardware hardware) {
+      if (!Exists(hardware.Identifier.ToString())) {
+        foreach (ISensor sensor in hardware.Sensors)
+          HardwareSensorAdded(sensor);
+
+        hardware.SensorAdded += HardwareSensorAdded;
+        hardware.SensorRemoved += HardwareSensorRemoved;
+
+        Hardware hw = new Hardware(hardware);
+        _activeInstances.Add(hw);
+
+        Instrumentation.Publish(hw);
+      }
+
+      foreach (IHardware subHardware in hardware.SubHardware)
+        ComputerHardwareAdded(subHardware);
+    }
+
+    private void HardwareSensorAdded(ISensor data) {
+      Sensor sensor = new Sensor(data);
+      _activeInstances.Add(sensor);
+
+      Instrumentation.Publish(sensor);
+    }
+
+    private void ComputerHardwareRemoved(IHardware hardware) {
+      hardware.SensorAdded -= HardwareSensorAdded;
+      hardware.SensorRemoved -= HardwareSensorRemoved;
+      
+      foreach (ISensor sensor in hardware.Sensors) 
+        HardwareSensorRemoved(sensor);
+      
+      foreach (IHardware subHardware in hardware.SubHardware)
+        ComputerHardwareRemoved(subHardware);
+
+      RevokeInstance(hardware.Identifier.ToString());
+    }
+
+    private void HardwareSensorRemoved(ISensor sensor) {
+      RevokeInstance(sensor.Identifier.ToString());
+    }
+
+    #endregion
+
+    #region Helpers
+    
+    private bool Exists(string identifier) {
+      return _activeInstances.Exists(h => h.Identifier == identifier);
+    }
+
+    private void RevokeInstance(string identifier) {
+      int instanceIndex = _activeInstances.FindIndex(
+        item => item.Identifier == identifier.ToString()
+      );
+
+      Instrumentation.Revoke(_activeInstances[instanceIndex]);
+
+      _activeInstances.RemoveAt(instanceIndex);
+    }
+
+    #endregion
+
+    public void Dispose() {
+      foreach (IWmiClass instance in _activeInstances)
+        Instrumentation.Revoke(instance);
+      _activeInstances = null;
+    }
+  }
+}