public class UsbManager : IDisposable
{
private readonly Interop.UsbContextHandle _context;
+ private readonly Interop.HostHotplugHandle _hotpluggedHandle;
private List<UsbDevice> _devices = new List<UsbDevice>();
/// <summary>
{
_context = new Interop.UsbContextHandle();
_devices = _context.GetDeviceList().Select(devHandle => new UsbDevice(this, devHandle)).ToList();
+ _context.SetHotplugCb(HostHotplugCallback, Interop.HotplugEventType.Any,
+ IntPtr.Zero, out _hotpluggedHandle).ThrowIfFailed("Failed to set hot plugged callback");
}
/// <summary>
}
}
+ /// <summary>
+ /// Event handler for events when a USB device is attached or detached.
+ /// </summary>
+ public event EventHandler<HotPluggedEventArgs> DeviceHotPlugged;
+
+ internal void HostHotplugCallback(IntPtr devHandle, IntPtr userData)
+ {
+ Interop.HostDeviceHandle handle = new Interop.HostDeviceHandle(devHandle);
+ UsbDevice device = _devices.Where(dev => dev._handle == handle).FirstOrDefault();
+ if (device == null)
+ {
+ device = new UsbDevice(this, handle);
+ _devices.Add(device);
+
+ if (DeviceHotPlugged != null)
+ {
+ DeviceHotPlugged.Invoke(this, new HotPluggedEventArgs(device, HotplugEventType.Attach));
+ }
+ }
+ else
+ {
+ if (DeviceHotPlugged != null)
+ {
+ DeviceHotPlugged.Invoke(this, new HotPluggedEventArgs(device, HotplugEventType.Detach));
+ }
+
+ _devices.Remove(device);
+ // do we need to dispose device here ?
+ }
+ }
+
internal void ThrowIfDisposed()
{
if (disposedValue) throw new ObjectDisposedException("USB Context is already disposed");
{
if (!disposedValue)
{
+ _hotpluggedHandle.UnsetHotplugCb();
_context.Dispose();
disposedValue = true;
}
}
#endregion
}
-}
\ No newline at end of file
+}