[Spice-devel] [spice-gtk 11/13] win-usb-dev: report libusb_device via signal
Yuri Benditovich
yuri.benditovich at daynix.com
Sun Mar 10 14:46:10 UTC 2019
Change the signal to report libusb_device instead of GUdevDevice
object. This simplifies the callback procedure in usb-dev-manager
and avoids additional reenumeration immediately after reenumeration
that already done by win-usb-dev.
Signed-off-by: Yuri Benditovich <yuri.benditovich at daynix.com>
---
src/usb-device-manager.c | 81 +++-------------------------------------
src/win-usb-dev.c | 48 +-----------------------
src/win-usb-dev.h | 2 +-
3 files changed, 8 insertions(+), 123 deletions(-)
diff --git a/src/usb-device-manager.c b/src/usb-device-manager.c
index c1a0c92..f4910b1 100644
--- a/src/usb-device-manager.c
+++ b/src/usb-device-manager.c
@@ -153,11 +153,9 @@ static void channel_event(SpiceChannel *channel, SpiceChannelEvent event,
gpointer user_data);
#ifdef G_OS_WIN32
static void spice_usb_device_manager_uevent_cb(GUdevClient *client,
- GUdevDevice *udevice,
+ libusb_device *udevice,
int add,
gpointer user_data);
-static void spice_usb_device_manager_add_udev(SpiceUsbDeviceManager *self,
- GUdevDevice *udev);
#else
static int spice_usb_device_manager_hotplug_cb(libusb_context *ctx,
libusb_device *device,
@@ -720,28 +718,6 @@ static void spice_usb_device_manager_class_init(SpiceUsbDeviceManagerClass *klas
/* ------------------------------------------------------------------ */
/* gudev / libusb Helper functions */
-#ifdef G_OS_WIN32
-static gboolean spice_usb_device_manager_get_udev_bus_n_address(
- SpiceUsbDeviceManager *manager, GUdevDevice *udev,
- int *bus, int *address)
-{
- const gchar *bus_str, *address_str;
-
- *bus = *address = 0;
-
- /* Linux or UsbDk backend on Windows*/
- bus_str = g_udev_device_get_property(udev, "BUSNUM");
- address_str = g_udev_device_get_property(udev, "DEVNUM");
-
- if (bus_str)
- *bus = atoi(bus_str);
- if (address_str)
- *address = atoi(address_str);
-
- return *bus && *address;
-}
-#endif
-
static gboolean spice_usb_device_manager_get_device_descriptor(
libusb_device *libdev,
struct libusb_device_descriptor *desc)
@@ -1022,64 +998,19 @@ static void spice_usb_device_manager_remove_dev(SpiceUsbDeviceManager *self,
}
#ifdef G_OS_WIN32
-static void spice_usb_device_manager_add_udev(SpiceUsbDeviceManager *self,
- GUdevDevice *udev)
-{
- SpiceUsbDeviceManagerPrivate *priv = self->priv;
- libusb_device *libdev = NULL, **dev_list = NULL;
- const gchar *devtype;
- int i, bus, address;
-
- devtype = g_udev_device_get_property(udev, "DEVTYPE");
- /* Check if this is a usb device (and not an interface) */
- if (!devtype || strcmp(devtype, "usb_device"))
- return;
-
- if (!spice_usb_device_manager_get_udev_bus_n_address(self, udev, &bus, &address)) {
- g_warning("USB device without bus number or device address");
- return;
- }
-
- libusb_get_device_list(priv->context, &dev_list);
-
- for (i = 0; dev_list && dev_list[i]; i++) {
- if (spice_usb_device_manager_libdev_match(self, dev_list[i], bus, address)) {
- libdev = dev_list[i];
- break;
- }
- }
-
- if (libdev)
- spice_usb_device_manager_add_dev(self, libdev);
- else
- g_warning("Could not find USB device to add " DEV_ID_FMT,
- (guint) bus, (guint) address);
-
- libusb_free_device_list(dev_list, 1);
-}
-
-static void spice_usb_device_manager_remove_udev(SpiceUsbDeviceManager *self,
- GUdevDevice *udev)
-{
- int bus, address;
-
- if (!spice_usb_device_manager_get_udev_bus_n_address(self, udev, &bus, &address))
- return;
-
- spice_usb_device_manager_remove_dev(self, bus, address);
-}
-
static void spice_usb_device_manager_uevent_cb(GUdevClient *client,
- GUdevDevice *udevice,
+ libusb_device *dev,
int add,
gpointer user_data)
{
SpiceUsbDeviceManager *self = SPICE_USB_DEVICE_MANAGER(user_data);
if (add)
- spice_usb_device_manager_add_udev(self, udevice);
+ spice_usb_device_manager_add_dev(self, dev);
else
- spice_usb_device_manager_remove_udev(self, udevice);
+ spice_usb_device_manager_remove_dev(self,
+ libusb_get_bus_number(dev),
+ libusb_get_device_address(dev));
}
#else
struct hotplug_idle_cb_args {
diff --git a/src/win-usb-dev.c b/src/win-usb-dev.c
index 5d878ea..f42ab86 100644
--- a/src/win-usb-dev.c
+++ b/src/win-usb-dev.c
@@ -83,9 +83,7 @@ enum
static guint signals[LAST_SIGNAL] = { 0, };
static GUdevClient *singleton = NULL;
-static GUdevDevice *g_udev_device_new(GUdevDeviceInfo *udevinfo);
static LRESULT CALLBACK wnd_proc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);
-static gboolean get_usb_dev_info(libusb_device *dev, GUdevDeviceInfo *udevinfo);
//uncomment to debug gudev device lists.
//#define DEBUG_GUDEV_DEVICE_LISTS
@@ -249,15 +247,7 @@ static void g_udev_client_initable_iface_init(GInitableIface *iface)
static void g_udev_notify_device(GUdevClient *self, libusb_device *dev, int add)
{
- GUdevDeviceInfo *udevinfo;
- GUdevDevice *udevice;
- udevinfo = g_new0(GUdevDeviceInfo, 1);
- if (get_usb_dev_info(dev, udevinfo)) {
- udevice = g_udev_device_new(udevinfo);
- g_signal_emit(self, signals[UEVENT_SIGNAL], 0, udevice, add);
- } else {
- g_free(udevinfo);
- }
+ g_signal_emit(self, signals[UEVENT_SIGNAL], 0, dev, add);
}
static void report_one_device(gpointer data, gpointer self)
@@ -376,31 +366,6 @@ static void g_udev_client_class_init(GUdevClientClass *klass)
g_object_class_install_property(gobject_class, PROP_REDIRECTING, pspec);
}
-static gboolean get_usb_dev_info(libusb_device *dev, GUdevDeviceInfo *udevinfo)
-{
- struct libusb_device_descriptor desc;
-
- g_return_val_if_fail(dev, FALSE);
- g_return_val_if_fail(udevinfo, FALSE);
-
- if (libusb_get_device_descriptor(dev, &desc) < 0) {
- g_warning("cannot get device descriptor %p", dev);
- return FALSE;
- }
-
- udevinfo->bus = libusb_get_bus_number(dev);
- udevinfo->addr = libusb_get_device_address(dev);
- udevinfo->class = desc.bDeviceClass;
- udevinfo->vid = desc.idVendor;
- udevinfo->pid = desc.idProduct;
- g_snprintf(udevinfo->sclass, sizeof(udevinfo->sclass), "%d", udevinfo->class);
- g_snprintf(udevinfo->sbus, sizeof(udevinfo->sbus), "%d", udevinfo->bus);
- g_snprintf(udevinfo->saddr, sizeof(udevinfo->saddr), "%d", udevinfo->addr);
- g_snprintf(udevinfo->svid, sizeof(udevinfo->svid), "%d", udevinfo->vid);
- g_snprintf(udevinfo->spid, sizeof(udevinfo->spid), "%d", udevinfo->pid);
- return TRUE;
-}
-
/* comparing bus:addr and vid:pid */
static gint compare_libusb_devices(gconstpointer a, gconstpointer b)
{
@@ -510,17 +475,6 @@ static void g_udev_device_init(GUdevDevice *device)
device->priv = g_udev_device_get_instance_private(device);
}
-static GUdevDevice *g_udev_device_new(GUdevDeviceInfo *udevinfo)
-{
- GUdevDevice *device;
-
- g_return_val_if_fail(udevinfo != NULL, NULL);
-
- device = G_UDEV_DEVICE(g_object_new(G_UDEV_TYPE_DEVICE, NULL));
- device->priv->udevinfo = udevinfo;
- return device;
-}
-
const gchar *g_udev_device_get_property(GUdevDevice *udev, const gchar *property)
{
GUdevDeviceInfo* udevinfo;
diff --git a/src/win-usb-dev.h b/src/win-usb-dev.h
index 96725b8..2f899e0 100644
--- a/src/win-usb-dev.h
+++ b/src/win-usb-dev.h
@@ -75,7 +75,7 @@ struct _GUdevClientClass
GObjectClass parent_class;
/* signals */
- void (*uevent)(GUdevClient *client, GUdevDevice *device, int add);
+ void (*uevent)(GUdevClient *client, libusb_device *device, int add);
};
GType g_udev_client_get_type(void) G_GNUC_CONST;
--
2.17.1
More information about the Spice-devel
mailing list