[USB] Add code to support HotPluggedEvents
[platform/core/csapi/usb.git] / Tizen.System.Usb / Usb / UsbManager.cs
index f01996d..aba4987 100644 (file)
@@ -26,6 +26,7 @@ namespace Tizen.System.Usb
     public class UsbManager : IDisposable
     {
         private readonly Interop.UsbContextHandle _context;
+        private readonly Interop.HostHotplugHandle _hotpluggedHandle;
         private List<UsbDevice> _devices = new List<UsbDevice>();
 
         /// <summary>
@@ -35,6 +36,8 @@ namespace Tizen.System.Usb
         {
             _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>
@@ -52,6 +55,37 @@ namespace Tizen.System.Usb
             }
         }
 
+        /// <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");
@@ -64,6 +98,7 @@ namespace Tizen.System.Usb
         {
             if (!disposedValue)
             {
+                _hotpluggedHandle.UnsetHotplugCb();
                 _context.Dispose();
                 disposedValue = true;
             }
@@ -81,4 +116,4 @@ namespace Tizen.System.Usb
         }
         #endregion
     }
-}
\ No newline at end of file
+}