summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUri Lublin <uril@redhat.com>2012-07-08 18:12:39 +0300
committerUri Lublin <uril@redhat.com>2012-07-10 17:09:00 +0300
commit6b806a6e1e31489db78e7ebb8d51ab677ef4a92c (patch)
treec7635579d2b58521f6c385300bdda460ff9c9b22
parent147c0d1bb293c3888b34880f7a7adcf7ac622523 (diff)
Win32/mingw: usb-device-manager: uninstall win usb driver upon device disconnect
-rw-r--r--gtk/usb-device-manager.c42
1 files changed, 37 insertions, 5 deletions
diff --git a/gtk/usb-device-manager.c b/gtk/usb-device-manager.c
index 2f0d6f1..e5b02c0 100644
--- a/gtk/usb-device-manager.c
+++ b/gtk/usb-device-manager.c
@@ -746,6 +746,7 @@ typedef struct _UsbInstallCbInfo {
GCancellable *cancellable;
GAsyncReadyCallback callback;
gpointer user_data;
+ gboolean is_install;
} UsbInstallCbInfo;
/**
@@ -774,8 +775,8 @@ static void spice_usb_device_manager_drv_install_cb(GObject *gobject,
UsbInstallCbInfo *cbinfo;
GCancellable *cancellable;
GAsyncReadyCallback callback;
-
- SPICE_DEBUG("Win USB driver Installation finished");
+ gboolean is_install;
+ const gchar *opstr;
g_return_if_fail(user_data != NULL);
@@ -786,6 +787,7 @@ static void spice_usb_device_manager_drv_install_cb(GObject *gobject,
cancellable = cbinfo->cancellable;
callback = cbinfo->callback;
user_data = cbinfo->user_data;
+ is_install = cbinfo->is_install;
g_free(cbinfo);
@@ -793,19 +795,25 @@ static void spice_usb_device_manager_drv_install_cb(GObject *gobject,
g_return_if_fail(SPICE_IS_WIN_USB_DRIVER(installer));
g_return_if_fail(device!= NULL);
+ opstr = is_install ? "install" : "uninstall";
+ SPICE_DEBUG("Win USB driver %s finished", opstr);
+
status = spice_win_usb_driver_install_finish(installer, res, &err);
g_object_unref(installer);
spice_usb_device_unref(device);
if (err) {
- g_warning("win usb driver installation failed -- %s",
- err->message);
+ g_warning("win usb driver %s failed -- %s", opstr, err->message);
g_error_free(err);
}
if (!status) {
- g_warning("failed to install win usb driver (status=0)");
+ g_warning("failed to %s win usb driver (status=0)", opstr);
+ }
+
+ if (! is_install) {
+ return;
}
/* device is already ref'ed */
@@ -1074,6 +1082,8 @@ void spice_usb_device_manager_connect_device_async(SpiceUsbDeviceManager *self,
cbinfo->cancellable = cancellable;
cbinfo->callback = callback;
cbinfo->user_data = user_data;
+ cbinfo->is_install = TRUE;
+
spice_win_usb_driver_install(installer, device, cancellable,
spice_usb_device_manager_drv_install_cb,
cbinfo);
@@ -1122,6 +1132,28 @@ void spice_usb_device_manager_disconnect_device(SpiceUsbDeviceManager *self,
channel = spice_usb_device_manager_get_channel_for_dev(self, device);
if (channel)
spice_usbredir_channel_disconnect_device(channel);
+
+#ifdef G_OS_WIN32
+ SpiceWinUsbDriver *installer;
+ UsbInstallCbInfo *cbinfo;
+
+ g_warn_if_fail(device != NULL);
+
+ installer = spice_win_usb_driver_new();
+ cbinfo = g_new0(UsbInstallCbInfo, 1);
+ cbinfo->manager = self;
+ cbinfo->device = spice_usb_device_ref(device);
+ cbinfo->installer = installer;
+ cbinfo->cancellable = NULL;
+ cbinfo->callback = NULL;
+ cbinfo->user_data = NULL;
+ cbinfo->is_install = FALSE;
+
+ spice_win_usb_driver_uninstall(installer, device, NULL,
+ spice_usb_device_manager_drv_install_cb,
+ cbinfo);
+#endif
+
#endif
}