author | moel.mich |
Wed, 18 Jan 2012 21:57:57 +0000 | |
changeset 336 | 1966500884bc |
parent 229 | 940d86b60be7 |
child 344 | 3145aadca3d2 |
permissions | -rw-r--r-- |
paulwerelds@224 | 1 |
/* |
paulwerelds@224 | 2 |
|
paulwerelds@224 | 3 |
Version: MPL 1.1/GPL 2.0/LGPL 2.1 |
paulwerelds@224 | 4 |
|
paulwerelds@224 | 5 |
The contents of this file are subject to the Mozilla Public License Version |
paulwerelds@224 | 6 |
1.1 (the "License"); you may not use this file except in compliance with |
paulwerelds@224 | 7 |
the License. You may obtain a copy of the License at |
paulwerelds@224 | 8 |
|
paulwerelds@224 | 9 |
http://www.mozilla.org/MPL/ |
paulwerelds@224 | 10 |
|
paulwerelds@224 | 11 |
Software distributed under the License is distributed on an "AS IS" basis, |
paulwerelds@224 | 12 |
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License |
paulwerelds@224 | 13 |
for the specific language governing rights and limitations under the License. |
paulwerelds@224 | 14 |
|
paulwerelds@224 | 15 |
The Original Code is the Open Hardware Monitor code. |
paulwerelds@224 | 16 |
|
paulwerelds@224 | 17 |
The Initial Developer of the Original Code is |
paulwerelds@224 | 18 |
Paul Werelds <paul@werelds.net>. |
paulwerelds@224 | 19 |
Portions created by the Initial Developer are Copyright (C) 2009-2010 |
paulwerelds@224 | 20 |
the Initial Developer. All Rights Reserved. |
paulwerelds@224 | 21 |
|
paulwerelds@224 | 22 |
Contributor(s): |
paulwerelds@224 | 23 |
|
paulwerelds@224 | 24 |
Alternatively, the contents of this file may be used under the terms of |
paulwerelds@224 | 25 |
either the GNU General Public License Version 2 or later (the "GPL"), or |
paulwerelds@224 | 26 |
the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), |
paulwerelds@224 | 27 |
in which case the provisions of the GPL or the LGPL are applicable instead |
paulwerelds@224 | 28 |
of those above. If you wish to allow use of your version of this file only |
paulwerelds@224 | 29 |
under the terms of either the GPL or the LGPL, and not to allow others to |
paulwerelds@224 | 30 |
use your version of this file under the terms of the MPL, indicate your |
paulwerelds@224 | 31 |
decision by deleting the provisions above and replace them with the notice |
paulwerelds@224 | 32 |
and other provisions required by the GPL or the LGPL. If you do not delete |
paulwerelds@224 | 33 |
the provisions above, a recipient may use your version of this file under |
paulwerelds@224 | 34 |
the terms of any one of the MPL, the GPL or the LGPL. |
paulwerelds@224 | 35 |
|
paulwerelds@224 | 36 |
*/ |
paulwerelds@224 | 37 |
|
paulwerelds@223 | 38 |
using System; |
paulwerelds@223 | 39 |
using System.Collections.Generic; |
paulwerelds@223 | 40 |
using System.Management.Instrumentation; |
paulwerelds@223 | 41 |
using OpenHardwareMonitor.Hardware; |
paulwerelds@223 | 42 |
|
paulwerelds@223 | 43 |
[assembly: Instrumented("root/OpenHardwareMonitor")] |
paulwerelds@223 | 44 |
|
paulwerelds@223 | 45 |
[System.ComponentModel.RunInstaller(true)] |
paulwerelds@223 | 46 |
public class InstanceInstaller : DefaultManagementProjectInstaller { } |
paulwerelds@223 | 47 |
|
paulwerelds@227 | 48 |
namespace OpenHardwareMonitor.WMI { |
paulwerelds@224 | 49 |
/// <summary> |
paulwerelds@224 | 50 |
/// The WMI Provider. |
paulwerelds@224 | 51 |
/// This class is not exposed to WMI itself. |
paulwerelds@224 | 52 |
/// </summary> |
paulwerelds@223 | 53 |
public class WmiProvider : IDisposable { |
paulwerelds@225 | 54 |
private List<IWmiObject> activeInstances; |
paulwerelds@223 | 55 |
|
paulwerelds@223 | 56 |
public WmiProvider(IComputer computer) { |
paulwerelds@225 | 57 |
activeInstances = new List<IWmiObject>(); |
paulwerelds@223 | 58 |
|
paulwerelds@223 | 59 |
foreach (IHardware hardware in computer.Hardware) |
paulwerelds@223 | 60 |
ComputerHardwareAdded(hardware); |
paulwerelds@223 | 61 |
|
paulwerelds@223 | 62 |
computer.HardwareAdded += ComputerHardwareAdded; |
paulwerelds@223 | 63 |
computer.HardwareRemoved += ComputerHardwareRemoved; |
paulwerelds@223 | 64 |
} |
paulwerelds@223 | 65 |
|
paulwerelds@223 | 66 |
public void Update() { |
paulwerelds@225 | 67 |
foreach (IWmiObject instance in activeInstances) |
paulwerelds@223 | 68 |
instance.Update(); |
paulwerelds@223 | 69 |
} |
paulwerelds@223 | 70 |
|
paulwerelds@223 | 71 |
#region Eventhandlers |
paulwerelds@223 | 72 |
|
paulwerelds@223 | 73 |
private void ComputerHardwareAdded(IHardware hardware) { |
paulwerelds@223 | 74 |
if (!Exists(hardware.Identifier.ToString())) { |
paulwerelds@223 | 75 |
foreach (ISensor sensor in hardware.Sensors) |
paulwerelds@223 | 76 |
HardwareSensorAdded(sensor); |
paulwerelds@223 | 77 |
|
paulwerelds@223 | 78 |
hardware.SensorAdded += HardwareSensorAdded; |
paulwerelds@223 | 79 |
hardware.SensorRemoved += HardwareSensorRemoved; |
paulwerelds@223 | 80 |
|
paulwerelds@223 | 81 |
Hardware hw = new Hardware(hardware); |
paulwerelds@225 | 82 |
activeInstances.Add(hw); |
paulwerelds@223 | 83 |
|
moel@240 | 84 |
try { |
moel@240 | 85 |
Instrumentation.Publish(hw); |
moel@240 | 86 |
} catch (Exception) { } |
paulwerelds@223 | 87 |
} |
paulwerelds@223 | 88 |
|
paulwerelds@223 | 89 |
foreach (IHardware subHardware in hardware.SubHardware) |
paulwerelds@223 | 90 |
ComputerHardwareAdded(subHardware); |
paulwerelds@223 | 91 |
} |
paulwerelds@223 | 92 |
|
paulwerelds@223 | 93 |
private void HardwareSensorAdded(ISensor data) { |
paulwerelds@223 | 94 |
Sensor sensor = new Sensor(data); |
paulwerelds@225 | 95 |
activeInstances.Add(sensor); |
paulwerelds@223 | 96 |
|
moel@240 | 97 |
try { |
moel@240 | 98 |
Instrumentation.Publish(sensor); |
moel@240 | 99 |
} catch (Exception) { } |
paulwerelds@223 | 100 |
} |
paulwerelds@223 | 101 |
|
paulwerelds@223 | 102 |
private void ComputerHardwareRemoved(IHardware hardware) { |
paulwerelds@223 | 103 |
hardware.SensorAdded -= HardwareSensorAdded; |
paulwerelds@223 | 104 |
hardware.SensorRemoved -= HardwareSensorRemoved; |
paulwerelds@223 | 105 |
|
paulwerelds@223 | 106 |
foreach (ISensor sensor in hardware.Sensors) |
paulwerelds@223 | 107 |
HardwareSensorRemoved(sensor); |
paulwerelds@223 | 108 |
|
paulwerelds@223 | 109 |
foreach (IHardware subHardware in hardware.SubHardware) |
paulwerelds@223 | 110 |
ComputerHardwareRemoved(subHardware); |
paulwerelds@223 | 111 |
|
paulwerelds@223 | 112 |
RevokeInstance(hardware.Identifier.ToString()); |
paulwerelds@223 | 113 |
} |
paulwerelds@223 | 114 |
|
paulwerelds@223 | 115 |
private void HardwareSensorRemoved(ISensor sensor) { |
paulwerelds@223 | 116 |
RevokeInstance(sensor.Identifier.ToString()); |
paulwerelds@223 | 117 |
} |
paulwerelds@223 | 118 |
|
paulwerelds@223 | 119 |
#endregion |
paulwerelds@223 | 120 |
|
paulwerelds@223 | 121 |
#region Helpers |
paulwerelds@223 | 122 |
|
paulwerelds@223 | 123 |
private bool Exists(string identifier) { |
paulwerelds@225 | 124 |
return activeInstances.Exists(h => h.Identifier == identifier); |
paulwerelds@223 | 125 |
} |
paulwerelds@223 | 126 |
|
paulwerelds@223 | 127 |
private void RevokeInstance(string identifier) { |
paulwerelds@225 | 128 |
int instanceIndex = activeInstances.FindIndex( |
paulwerelds@223 | 129 |
item => item.Identifier == identifier.ToString() |
paulwerelds@223 | 130 |
); |
paulwerelds@223 | 131 |
|
moel@240 | 132 |
try { |
moel@240 | 133 |
Instrumentation.Revoke(activeInstances[instanceIndex]); |
moel@240 | 134 |
} catch (Exception) { } |
paulwerelds@223 | 135 |
|
paulwerelds@225 | 136 |
activeInstances.RemoveAt(instanceIndex); |
paulwerelds@223 | 137 |
} |
paulwerelds@223 | 138 |
|
paulwerelds@223 | 139 |
#endregion |
paulwerelds@223 | 140 |
|
paulwerelds@223 | 141 |
public void Dispose() { |
moel@240 | 142 |
foreach (IWmiObject instance in activeInstances) { |
moel@240 | 143 |
try { |
moel@240 | 144 |
Instrumentation.Revoke(instance); |
moel@240 | 145 |
} catch (Exception) { } |
moel@240 | 146 |
} |
paulwerelds@225 | 147 |
activeInstances = null; |
paulwerelds@223 | 148 |
} |
paulwerelds@223 | 149 |
} |
paulwerelds@223 | 150 |
} |