WMIProvider/WMIProvider.cs
author paulwerelds
Sat, 16 Oct 2010 13:29:06 +0000
changeset 223 39f73ac8c2f4
child 224 be9534663a55
permissions -rw-r--r--
Added a WMI provider, documentation to follow.
paulwerelds@223
     1
using System;
paulwerelds@223
     2
using System.Collections.Generic;
paulwerelds@223
     3
using System.Management.Instrumentation;
paulwerelds@223
     4
using OpenHardwareMonitor.Hardware;
paulwerelds@223
     5
paulwerelds@223
     6
[assembly: Instrumented("root/OpenHardwareMonitor")]
paulwerelds@223
     7
paulwerelds@223
     8
[System.ComponentModel.RunInstaller(true)]
paulwerelds@223
     9
public class InstanceInstaller : DefaultManagementProjectInstaller { }
paulwerelds@223
    10
paulwerelds@223
    11
namespace OpenHardwareMonitor.WMIProvider {
paulwerelds@223
    12
  public class WmiProvider : IDisposable {
paulwerelds@223
    13
    private List<IWmiClass> _activeInstances;
paulwerelds@223
    14
paulwerelds@223
    15
    public WmiProvider(IComputer computer) {
paulwerelds@223
    16
      _activeInstances = new List<IWmiClass>();
paulwerelds@223
    17
paulwerelds@223
    18
      foreach (IHardware hardware in computer.Hardware)
paulwerelds@223
    19
        ComputerHardwareAdded(hardware);
paulwerelds@223
    20
paulwerelds@223
    21
      computer.HardwareAdded += ComputerHardwareAdded;
paulwerelds@223
    22
      computer.HardwareRemoved += ComputerHardwareRemoved;
paulwerelds@223
    23
    }
paulwerelds@223
    24
paulwerelds@223
    25
    public void Update() {
paulwerelds@223
    26
      foreach (IWmiClass instance in _activeInstances)
paulwerelds@223
    27
        instance.Update();
paulwerelds@223
    28
    }
paulwerelds@223
    29
paulwerelds@223
    30
    #region Eventhandlers
paulwerelds@223
    31
    
paulwerelds@223
    32
    private void ComputerHardwareAdded(IHardware hardware) {
paulwerelds@223
    33
      if (!Exists(hardware.Identifier.ToString())) {
paulwerelds@223
    34
        foreach (ISensor sensor in hardware.Sensors)
paulwerelds@223
    35
          HardwareSensorAdded(sensor);
paulwerelds@223
    36
paulwerelds@223
    37
        hardware.SensorAdded += HardwareSensorAdded;
paulwerelds@223
    38
        hardware.SensorRemoved += HardwareSensorRemoved;
paulwerelds@223
    39
paulwerelds@223
    40
        Hardware hw = new Hardware(hardware);
paulwerelds@223
    41
        _activeInstances.Add(hw);
paulwerelds@223
    42
paulwerelds@223
    43
        Instrumentation.Publish(hw);
paulwerelds@223
    44
      }
paulwerelds@223
    45
paulwerelds@223
    46
      foreach (IHardware subHardware in hardware.SubHardware)
paulwerelds@223
    47
        ComputerHardwareAdded(subHardware);
paulwerelds@223
    48
    }
paulwerelds@223
    49
paulwerelds@223
    50
    private void HardwareSensorAdded(ISensor data) {
paulwerelds@223
    51
      Sensor sensor = new Sensor(data);
paulwerelds@223
    52
      _activeInstances.Add(sensor);
paulwerelds@223
    53
paulwerelds@223
    54
      Instrumentation.Publish(sensor);
paulwerelds@223
    55
    }
paulwerelds@223
    56
paulwerelds@223
    57
    private void ComputerHardwareRemoved(IHardware hardware) {
paulwerelds@223
    58
      hardware.SensorAdded -= HardwareSensorAdded;
paulwerelds@223
    59
      hardware.SensorRemoved -= HardwareSensorRemoved;
paulwerelds@223
    60
      
paulwerelds@223
    61
      foreach (ISensor sensor in hardware.Sensors) 
paulwerelds@223
    62
        HardwareSensorRemoved(sensor);
paulwerelds@223
    63
      
paulwerelds@223
    64
      foreach (IHardware subHardware in hardware.SubHardware)
paulwerelds@223
    65
        ComputerHardwareRemoved(subHardware);
paulwerelds@223
    66
paulwerelds@223
    67
      RevokeInstance(hardware.Identifier.ToString());
paulwerelds@223
    68
    }
paulwerelds@223
    69
paulwerelds@223
    70
    private void HardwareSensorRemoved(ISensor sensor) {
paulwerelds@223
    71
      RevokeInstance(sensor.Identifier.ToString());
paulwerelds@223
    72
    }
paulwerelds@223
    73
paulwerelds@223
    74
    #endregion
paulwerelds@223
    75
paulwerelds@223
    76
    #region Helpers
paulwerelds@223
    77
    
paulwerelds@223
    78
    private bool Exists(string identifier) {
paulwerelds@223
    79
      return _activeInstances.Exists(h => h.Identifier == identifier);
paulwerelds@223
    80
    }
paulwerelds@223
    81
paulwerelds@223
    82
    private void RevokeInstance(string identifier) {
paulwerelds@223
    83
      int instanceIndex = _activeInstances.FindIndex(
paulwerelds@223
    84
        item => item.Identifier == identifier.ToString()
paulwerelds@223
    85
      );
paulwerelds@223
    86
paulwerelds@223
    87
      Instrumentation.Revoke(_activeInstances[instanceIndex]);
paulwerelds@223
    88
paulwerelds@223
    89
      _activeInstances.RemoveAt(instanceIndex);
paulwerelds@223
    90
    }
paulwerelds@223
    91
paulwerelds@223
    92
    #endregion
paulwerelds@223
    93
paulwerelds@223
    94
    public void Dispose() {
paulwerelds@223
    95
      foreach (IWmiClass instance in _activeInstances)
paulwerelds@223
    96
        Instrumentation.Revoke(instance);
paulwerelds@223
    97
      _activeInstances = null;
paulwerelds@223
    98
    }
paulwerelds@223
    99
  }
paulwerelds@223
   100
}