diff --git a/LibreHardwareMonitorLib/Hardware/Computer.cs b/LibreHardwareMonitorLib/Hardware/Computer.cs index 7c7eff5..c435a16 100644 --- a/LibreHardwareMonitorLib/Hardware/Computer.cs +++ b/LibreHardwareMonitorLib/Hardware/Computer.cs @@ -24,6 +24,9 @@ namespace LibreHardwareMonitor.Hardware { public class Computer : IComputer { + public event HardwareEventHandler HardwareAdded; + public event HardwareEventHandler HardwareRemoved; + private readonly List _groups = new List(); private readonly ISettings _settings; private bool _controllerEnabled; @@ -66,8 +69,6 @@ namespace LibreHardwareMonitor.Hardware public bool IsCpuEnabled { get { return _cpuEnabled; } - - [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)] set { if (_open && value != _cpuEnabled) @@ -85,8 +86,6 @@ namespace LibreHardwareMonitor.Hardware public bool IsControllerEnabled { get { return _controllerEnabled; } - - [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)] set { if (_open && value != _controllerEnabled) @@ -116,8 +115,6 @@ namespace LibreHardwareMonitor.Hardware public bool IsGpuEnabled { get { return _gpuEnabled; } - - [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)] set { if (_open && value != _gpuEnabled) @@ -141,8 +138,6 @@ namespace LibreHardwareMonitor.Hardware public bool IsMemoryEnabled { get { return _memoryEnabled; } - - [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)] set { if (_open && value != _memoryEnabled) @@ -160,8 +155,6 @@ namespace LibreHardwareMonitor.Hardware public bool IsMotherboardEnabled { get { return _motherboardEnabled; } - - [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)] set { if (_open && value != _motherboardEnabled) @@ -179,8 +172,6 @@ namespace LibreHardwareMonitor.Hardware public bool IsNetworkEnabled { get { return _networkEnabled; } - - [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)] set { if (_open && value != _networkEnabled) @@ -198,8 +189,6 @@ namespace LibreHardwareMonitor.Hardware public bool IsStorageEnabled { get { return _storageEnabled; } - - [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)] set { if (_open && value != _storageEnabled) @@ -214,10 +203,6 @@ namespace LibreHardwareMonitor.Hardware } } - public event HardwareEventHandler HardwareAdded; - - public event HardwareEventHandler HardwareRemoved; - public string GetReport() { lock (_lock) @@ -318,8 +303,22 @@ namespace LibreHardwareMonitor.Hardware } } + private void HardwareAddedEvent(IHardware hardware) + { + HardwareAdded?.Invoke(hardware); + } + + private void HardwareRemovedEvent(IHardware hardware) + { + HardwareRemoved?.Invoke(hardware); + } + private void Add(IGroup group) { + if (group == null) + return; + + lock (_lock) { if (_groups.Contains(group)) @@ -327,6 +326,12 @@ namespace LibreHardwareMonitor.Hardware _groups.Add(group); + + if (group is IHardwareChanged hardwareChanged) + { + hardwareChanged.HardwareAdded += HardwareAddedEvent; + hardwareChanged.HardwareRemoved += HardwareRemovedEvent; + } } if (HardwareAdded != null) @@ -345,8 +350,13 @@ namespace LibreHardwareMonitor.Hardware _groups.Remove(group); - } + if (group is IHardwareChanged hardwareChanged) + { + hardwareChanged.HardwareAdded -= HardwareAddedEvent; + hardwareChanged.HardwareRemoved -= HardwareRemovedEvent; + } + } if (HardwareRemoved != null) { @@ -374,7 +384,6 @@ namespace LibreHardwareMonitor.Hardware Remove(group); } - [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)] public void Open() { if (_open) diff --git a/LibreHardwareMonitorLib/Hardware/IHardwareChanged.cs b/LibreHardwareMonitorLib/Hardware/IHardwareChanged.cs new file mode 100644 index 0000000..db530ee --- /dev/null +++ b/LibreHardwareMonitorLib/Hardware/IHardwareChanged.cs @@ -0,0 +1,13 @@ +// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. +// If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// Copyright (C) LibreHardwareMonitor and Contributors. +// All Rights Reserved. + +namespace LibreHardwareMonitor.Hardware +{ + internal interface IHardwareChanged + { + event HardwareEventHandler HardwareAdded; + event HardwareEventHandler HardwareRemoved; + } +} diff --git a/LibreHardwareMonitorLib/Hardware/Network/NetworkGroup.cs b/LibreHardwareMonitorLib/Hardware/Network/NetworkGroup.cs index 0c2fc13..471a079 100644 --- a/LibreHardwareMonitorLib/Hardware/Network/NetworkGroup.cs +++ b/LibreHardwareMonitorLib/Hardware/Network/NetworkGroup.cs @@ -11,8 +11,11 @@ using System.Text; namespace LibreHardwareMonitor.Hardware.Network { - internal class NetworkGroup : IGroup + internal class NetworkGroup : IGroup, IHardwareChanged { + public event HardwareEventHandler HardwareAdded; + public event HardwareEventHandler HardwareRemoved; + private readonly Dictionary _networks = new Dictionary(); private readonly object _scanLock = new object(); private readonly ISettings _settings; @@ -78,23 +81,31 @@ namespace LibreHardwareMonitor.Hardware.Network { if (foundNetworkInterfaces.ContainsKey(networkInterfacePair.Key)) continue; + + removeKeys.Add(networkInterfacePair.Key); } + foreach (string key in removeKeys) { var network = _networks[key]; network.Close(); _networks.Remove(key); + + _hardware.Remove(network); + HardwareRemoved?.Invoke(network); } // Add new network interfaces. foreach (KeyValuePair networkInterfacePair in foundNetworkInterfaces) { if (!_networks.ContainsKey(networkInterfacePair.Key)) + { _networks.Add(networkInterfacePair.Key, new Network(networkInterfacePair.Value, settings)); + _hardware.Add(_networks[networkInterfacePair.Key]); + HardwareAdded?.Invoke(_networks[networkInterfacePair.Key]); + } } - - _hardware = _networks.Values.OrderBy(x => x.Name).ToList(); } }