[Spice-devel] [PATCH v7 06/10] usbdk: Load hide rules for auto-redirected devices
Jonathon Jongsma
jjongsma at redhat.com
Fri Feb 19 21:31:49 UTC 2016
On Thu, 2016-02-11 at 18:04 +0200, Dmitry Fleytman wrote:
> Hide rules order UsbDk to avoid showing specific USB
> devices to Windows PnP manager.
>
> Spice-gtk loads hide rules for devices that should be
> automatically redirected on connection to prevent Windows
> from showing "New Hardware Found" wizard window for USB
> devices that do not have driver on the local system.
>
> Signed-off-by: Dmitry Fleytman <dmitry at daynix.com>
> ---
> src/usb-device-manager.c | 82
> ++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 82 insertions(+)
>
> diff --git a/src/usb-device-manager.c b/src/usb-device-manager.c
> index 9a3df97..ee8e490 100644
> --- a/src/usb-device-manager.c
> +++ b/src/usb-device-manager.c
> @@ -29,6 +29,10 @@
> #include <errno.h>
> #include <libusb.h>
>
> +#ifdef G_OS_WIN32
> +#include "usbdk_api.h"
> +#endif
> +
> #if defined(USE_GUDEV)
> #include <gudev/gudev.h>
> #elif defined(G_OS_WIN32)
> @@ -122,6 +126,8 @@ struct _SpiceUsbDeviceManagerPrivate {
> libusb_hotplug_callback_handle hp_handle;
> #endif
> #ifdef G_OS_WIN32
> + usbdk_api_wrapper *usbdk_api;
> + HANDLE usbdk_hider_handle;
> SpiceWinUsbDriver *installer;
> #endif
> gboolean use_usbclerk;
> @@ -184,6 +190,9 @@ static void spice_usb_device_unref(SpiceUsbDevice
> *device);
> #ifdef G_OS_WIN32
> static guint8 spice_usb_device_get_state(SpiceUsbDevice *device);
> static void spice_usb_device_set_state(SpiceUsbDevice *device, guint8 s);
> +
> +static void _usbdk_hider_update(SpiceUsbDeviceManager *manager);
> +static void _usbdk_hider_clear(SpiceUsbDeviceManager *manager);
> #endif
>
> static gboolean spice_usb_manager_device_equal_libdev(SpiceUsbDeviceManager
> *manager,
> @@ -359,6 +368,9 @@ static void spice_usb_device_manager_finalize(GObject
> *gobject)
> #ifdef G_OS_WIN32
> if (priv->installer)
> g_object_unref(priv->installer);
> + if (!priv->use_usbclerk) {
> + _usbdk_hider_clear(self);
> + }
> #endif
> #endif
>
> @@ -430,6 +442,11 @@ static void spice_usb_device_manager_set_property(GObject
> *gobject,
> break;
> case PROP_AUTO_CONNECT:
> priv->auto_connect = g_value_get_boolean(value);
> +#if defined(G_OS_WIN32) && defined(USE_USBREDIR)
> + if (!priv->use_usbclerk) {
> + _usbdk_hider_update(self);
> + }
> +#endif
> break;
> case PROP_AUTO_CONNECT_FILTER: {
> const gchar *filter = g_value_get_string(value);
> @@ -452,6 +469,12 @@ static void spice_usb_device_manager_set_property(GObject
> *gobject,
> #endif
> g_free(priv->auto_connect_filter);
> priv->auto_connect_filter = g_strdup(filter);
> +
> +#if defined(G_OS_WIN32) && defined(USE_USBREDIR)
> + if (!priv->use_usbclerk) {
> + _usbdk_hider_update(self);
> + }
> +#endif
> break;
> }
> case PROP_REDIRECT_ON_CONNECT: {
> @@ -1863,6 +1886,65 @@ guint8 spice_usb_device_get_state(SpiceUsbDevice
> *device)
>
> return info->state;
> }
> +
> +static
> +gboolean _usbdk_hider_prepare(SpiceUsbDeviceManager *manager)
> +{
> + SpiceUsbDeviceManagerPrivate *priv = manager->priv;
> +
> + g_return_val_if_fail(!priv->use_usbclerk, FALSE);
> +
> + if (priv->usbdk_hider_handle == NULL) {
> + priv->usbdk_hider_handle = usbdk_create_hider_handle(priv
> ->usbdk_api);
> + if (priv->usbdk_hider_handle == NULL) {
> + g_warning("Failed to instantiate UsbDk hider interface");
> + return FALSE;
> + }
> + }
> +
> + return TRUE;
> +}
> +
> +static
> +void _usbdk_hider_clear(SpiceUsbDeviceManager *manager)
> +{
> + SpiceUsbDeviceManagerPrivate *priv = manager->priv;
> +
> + g_return_if_fail(!priv->use_usbclerk);
> +
> + if (priv->usbdk_hider_handle != NULL) {
> + usbdk_clear_hide_rules(priv->usbdk_api, priv->usbdk_hider_handle);
> + usbdk_close_hider_handle(priv->usbdk_api, priv->usbdk_hider_handle);
> + priv->usbdk_hider_handle = NULL;
> + }
> +}
> +
> +static
> +void _usbdk_hider_update(SpiceUsbDeviceManager *manager)
> +{
> + SpiceUsbDeviceManagerPrivate *priv = manager->priv;
> +
> + g_return_if_fail(!priv->use_usbclerk);
> +
> + if (priv->auto_connect_filter == NULL) {
> + SPICE_DEBUG("No autoredirect rules, no hider setup needed");
> + _usbdk_hider_clear(manager);
> + return;
> + }
> +
> + if (!priv->auto_connect) {
> + SPICE_DEBUG("Auto-connect disabled, no hider setup needed");
> + _usbdk_hider_clear(manager);
> + return;
> + }
> +
> + if(_usbdk_hider_prepare(manager)) {
> + usbdk_api_set_hide_rules(priv->usbdk_api,
> + priv->usbdk_hider_handle,
> + priv->auto_connect_filter);
So, in the previous version of this patch, you passed priv->redirect_on_connect
as the third parameter to usbdk_api_set_hide_rules(). Why did you change this to
priv->auto_connect_filter?
> + }
> +}
> +
> #endif
>
> static SpiceUsbDevice *spice_usb_device_ref(SpiceUsbDevice *device)
More information about the Spice-devel
mailing list