Implemented del_device by vid/pid
authorArmin Novak <armin.novak@thincast.com>
Mon, 2 Mar 2020 07:40:40 +0000 (08:40 +0100)
committerakallabeth <akallabeth@users.noreply.github.com>
Mon, 2 Mar 2020 10:40:05 +0000 (11:40 +0100)
channels/urbdrc/client/libusb/libusb_udevman.c
channels/urbdrc/client/urbdrc_main.c
channels/urbdrc/client/urbdrc_main.h

index dbfed15..db45673 100644 (file)
@@ -628,7 +628,7 @@ static int hotplug_callback(struct libusb_context* ctx, struct libusb_device* de
                        break;
 
                case LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT:
-                       del_device(idevman, bus, addr, desc.idVendor, desc.idProduct);
+                       del_device(idevman, DEVICE_ADD_FLAG_ALL, bus, addr, desc.idVendor, desc.idProduct);
                        break;
 
                default:
index 15c4b71..ce7a9c7 100644 (file)
@@ -836,7 +836,8 @@ BOOL add_device(IUDEVMAN* idevman, UINT32 flags, BYTE busnum, BYTE devnum, UINT1
        return TRUE;
 }
 
-BOOL del_device(IUDEVMAN* idevman, BYTE busnum, BYTE devnum, UINT16 idVendor, UINT16 idProduct)
+BOOL del_device(IUDEVMAN* idevman, UINT32 flags, BYTE busnum, BYTE devnum, UINT16 idVendor,
+                UINT16 idProduct)
 {
        IUDEVICE* pdev = NULL;
        URBDRC_PLUGIN* urbdrc;
@@ -854,9 +855,36 @@ BOOL del_device(IUDEVMAN* idevman, BYTE busnum, BYTE devnum, UINT16 idVendor, UI
 
        while (idevman->has_next(idevman))
        {
+               BOOL match = TRUE;
                IUDEVICE* dev = idevman->get_next(idevman);
 
-               if (dev->get_bus_number(dev) == busnum && dev->get_dev_number(dev) == devnum)
+               if ((flags & (DEVICE_ADD_FLAG_BUS | DEVICE_ADD_FLAG_DEV | DEVICE_ADD_FLAG_VENDOR |
+                             DEVICE_ADD_FLAG_PRODUCT)) == 0)
+                       match = FALSE;
+               if (flags & DEVICE_ADD_FLAG_BUS)
+               {
+                       if (dev->get_bus_number(dev) != busnum)
+                               match = FALSE;
+               }
+               if (flags & DEVICE_ADD_FLAG_DEV)
+               {
+                       if (dev->get_dev_number(dev) != devnum)
+                               match = FALSE;
+               }
+               if (flags & DEVICE_ADD_FLAG_VENDOR)
+               {
+                       int vid = dev->query_device_descriptor(dev, ID_VENDOR);
+                       if (vid != idVendor)
+                               match = FALSE;
+               }
+               if (flags & DEVICE_ADD_FLAG_PRODUCT)
+               {
+                       int pid = dev->query_device_descriptor(dev, ID_PRODUCT);
+                       if (pid != idProduct)
+                               match = FALSE;
+               }
+
+               if (match)
                {
                        pdev = dev;
                        break;
index 5a7a6a1..ca6ab1f 100644 (file)
@@ -236,8 +236,8 @@ enum
 
 FREERDP_API BOOL add_device(IUDEVMAN* idevman, UINT32 flags, BYTE busnum, BYTE devnum,
                             UINT16 idVendor, UINT16 idProduct);
-FREERDP_API BOOL del_device(IUDEVMAN* idevman, BYTE busnum, BYTE devnum, UINT16 idVendor,
-                            UINT16 idProduct);
+FREERDP_API BOOL del_device(IUDEVMAN* idevman, UINT32 flags, BYTE busnum, BYTE devnum,
+                            UINT16 idVendor, UINT16 idProduct);
 
 UINT stream_write_and_free(IWTSPlugin* plugin, IWTSVirtualChannel* channel, wStream* s);