summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2012-02-09 12:49:57 +0100
committerHans de Goede <hdegoede@redhat.com>2012-02-20 16:14:49 +0100
commit97648e4d0769f01800af21e43aeffee50aca503d (patch)
treed7d60aec1056751054c7ae0471d96a17cc56f414
parent05a1bf60e9805300c1ec54a4c3ea9aebf5d2f488 (diff)
usbutil: Add a spice_usb_util_get_device_strings helper function
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
-rw-r--r--gtk/usb-device-manager.c32
-rw-r--r--gtk/usbutil.c38
-rw-r--r--gtk/usbutil.h8
3 files changed, 50 insertions, 28 deletions
diff --git a/gtk/usb-device-manager.c b/gtk/usb-device-manager.c
index a20c18c..495a15b 100644
--- a/gtk/usb-device-manager.c
+++ b/gtk/usb-device-manager.c
@@ -907,32 +907,16 @@ gchar *spice_usb_device_get_description(SpiceUsbDevice *_device, const gchar *fo
bus = libusb_get_bus_number(device);
address = libusb_get_device_address(device);
-#if __linux__
- manufacturer = spice_usbutil_get_sysfs_attribute(bus, address, "manufacturer");
- product = spice_usbutil_get_sysfs_attribute(bus, address, "product");
-#endif
- if (!manufacturer)
- manufacturer = g_strdup(_("USB"));
- if (!product)
- product = g_strdup(_("Device"));
-
- /* Some devices have unwanted whitespace in their strings */
- g_strstrip(manufacturer);
- g_strstrip(product);
-
- /* Some devices repeat the manufacturer at the beginning of product */
- if (g_str_has_prefix(product, manufacturer) &&
- strlen(product) > strlen(manufacturer)) {
- gchar *tmp = g_strdup(product + strlen(manufacturer));
- g_free(product);
- product = tmp;
- g_strstrip(product);
- }
-
- if (libusb_get_device_descriptor(device, &desc) == LIBUSB_SUCCESS)
+ if (libusb_get_device_descriptor(device, &desc) == LIBUSB_SUCCESS) {
+ spice_usb_util_get_device_strings(bus, address,
+ desc.idVendor, desc.idProduct,
+ &manufacturer, &product);
descriptor = g_strdup_printf("[%04x:%04x]", desc.idVendor, desc.idProduct);
- else
+ } else {
+ spice_usb_util_get_device_strings(bus, address, -1, -1,
+ &manufacturer, &product);
descriptor = g_strdup("");
+ }
if (!format)
format = _("%s %s %s at %d-%d");
diff --git a/gtk/usbutil.c b/gtk/usbutil.c
index 4f9502d..0d1361e 100644
--- a/gtk/usbutil.c
+++ b/gtk/usbutil.c
@@ -74,7 +74,8 @@ const char *spice_usbutil_libusb_strerror(enum libusb_error error_code)
#ifdef __linux__
/* <Sigh> libusb does not allow getting the manufacturer and product strings
without opening the device, so grab them directly from sysfs */
-gchar *spice_usbutil_get_sysfs_attribute(int bus, int address, const char *attribute)
+static gchar *spice_usbutil_get_sysfs_attribute(int bus, int address,
+ const char *attribute)
{
struct stat stat_buf;
char filename[256];
@@ -96,4 +97,39 @@ gchar *spice_usbutil_get_sysfs_attribute(int bus, int address, const char *attri
return contents;
}
#endif
+
+G_GNUC_INTERNAL
+void spice_usb_util_get_device_strings(int bus, int address,
+ int vendor_id, int product_id,
+ gchar **manufacturer, gchar **product)
+{
+ g_return_if_fail(manufacturer != NULL);
+ g_return_if_fail(product != NULL);
+
+ *manufacturer = NULL;
+ *product = NULL;
+
+#if __linux__
+ *manufacturer = spice_usbutil_get_sysfs_attribute(bus, address, "manufacturer");
+ *product = spice_usbutil_get_sysfs_attribute(bus, address, "product");
+#endif
+ if (!*manufacturer)
+ *manufacturer = g_strdup(_("USB"));
+ if (!*product)
+ *product = g_strdup(_("Device"));
+
+ /* Some devices have unwanted whitespace in their strings */
+ g_strstrip(*manufacturer);
+ g_strstrip(*product);
+
+ /* Some devices repeat the manufacturer at the beginning of product */
+ if (g_str_has_prefix(*product, *manufacturer) &&
+ strlen(*product) > strlen(*manufacturer)) {
+ gchar *tmp = g_strdup(*product + strlen(*manufacturer));
+ g_free(*product);
+ *product = tmp;
+ g_strstrip(*product);
+ }
+}
+
#endif
diff --git a/gtk/usbutil.h b/gtk/usbutil.h
index a74f1aa..de5e92a 100644
--- a/gtk/usbutil.h
+++ b/gtk/usbutil.h
@@ -21,15 +21,17 @@
#ifndef __SPICE_USBUTIL_H__
#define __SPICE_USBUTIL_H__
+#include <glib.h>
+
#ifdef USE_USBREDIR
#include <libusb.h>
G_BEGIN_DECLS
const char *spice_usbutil_libusb_strerror(enum libusb_error error_code);
-#ifdef __linux__
-gchar *spice_usbutil_get_sysfs_attribute(int bus, int address, const char *attribute);
-#endif
+void spice_usb_util_get_device_strings(int bus, int address,
+ int vendor_id, int product_id,
+ gchar **manufacturer, gchar **product);
G_END_DECLS