[Spice-devel] [PATCH spice-gtk] add optional format string to spice_usb_device_get_description()

Marc-André Lureau marcandre.lureau at gmail.com
Tue Jan 3 07:20:32 PST 2012


---
 gtk/usb-device-manager.c |   39 +++++++++++++++++++++++++--------------
 gtk/usb-device-manager.h |    2 +-
 2 files changed, 26 insertions(+), 15 deletions(-)

diff --git a/gtk/usb-device-manager.c b/gtk/usb-device-manager.c
index e55caae..0f53755 100644
--- a/gtk/usb-device-manager.c
+++ b/gtk/usb-device-manager.c
@@ -490,7 +490,7 @@ static void spice_usb_device_manager_auto_connect_cb(GObject      *gobject,
 
     spice_usb_device_manager_connect_device_finish(self, res, &err);
     if (err) {
-        gchar *desc = spice_usb_device_get_description((SpiceUsbDevice *)device);
+        gchar *desc = spice_usb_device_get_description((SpiceUsbDevice *)device, NULL);
         g_prefix_error(&err, "Could not auto-redirect %s: ", desc);
         g_free(desc);
 
@@ -871,20 +871,30 @@ void spice_usb_device_manager_disconnect_device(SpiceUsbDeviceManager *self,
 /**
  * spice_usb_device_get_description:
  * @device: #SpiceUsbDevice to get the description of
+ * @format: an optionnal printf() format string with positionnal parameters
  *
  * Get a string describing the device which is suitable as a description of
  * the device for the end user. The returned string should be freed with
  * g_free() when no longer needed.
  *
- * Returns: a newly-allocated string holding the description
+ * The @format positionnal parameters are the following:
+ * - '%%1$s' manufacturer
+ * - '%%2$s' product
+ * - '%%3$s' descriptor (a [vendor_id:product_id] string)
+ * - '%%4$d' bus
+ * - '%%5$d' address
+ *
+ * (the default format string is "%%s %%s %%s at %%d-%%d")
+ *
+ * Returns: a newly-allocated string holding the description, or %NULL if failed
  */
-gchar *spice_usb_device_get_description(SpiceUsbDevice *_device)
+gchar *spice_usb_device_get_description(SpiceUsbDevice *_device, const gchar *format)
 {
 #ifdef USE_USBREDIR
     libusb_device *device = (libusb_device *)_device;
     struct libusb_device_descriptor desc;
-    int rc, bus, address;
-    gchar *description, *manufacturer = NULL, *product = NULL;
+    int bus, address;
+    gchar *description, *descriptor, *manufacturer = NULL, *product = NULL;
 
     g_return_val_if_fail(device != NULL, NULL);
 
@@ -902,17 +912,18 @@ gchar *spice_usb_device_get_description(SpiceUsbDevice *_device)
     if (!product)
         product = g_strdup(_("Device"));
 
-    rc = libusb_get_device_descriptor(device, &desc);
-    if (rc == LIBUSB_SUCCESS) {
-        description = g_strdup_printf(_("%s %s [%04x:%04x] at %d-%d"),
-                                      manufacturer, product, desc.idVendor,
-                                      desc.idProduct, bus, address);
-    } else {
-        description = g_strdup_printf(_("%s %s at %d-%d"), manufacturer,
-                                      product, bus, address);
-    }
+    if (libusb_get_device_descriptor(device, &desc) == LIBUSB_SUCCESS)
+        descriptor = g_strdup_printf("[%04x:%04x]", desc.idVendor, desc.idProduct);
+    else
+        descriptor = g_strdup("");
+
+    if (!format)
+        format = _("%s %s %s at %d-%d");
+
+    description = g_strdup_printf(format, manufacturer, product, descriptor, bus, address);
 
     g_free(manufacturer);
+    g_free(descriptor);
     g_free(product);
 
     return description;
diff --git a/gtk/usb-device-manager.h b/gtk/usb-device-manager.h
index a8b3969..d01bc12 100644
--- a/gtk/usb-device-manager.h
+++ b/gtk/usb-device-manager.h
@@ -87,7 +87,7 @@ struct _SpiceUsbDeviceManagerClass
 GType spice_usb_device_get_type(void);
 GType spice_usb_device_manager_get_type(void);
 
-gchar *spice_usb_device_get_description(SpiceUsbDevice *device);
+gchar *spice_usb_device_get_description(SpiceUsbDevice *device, const gchar *format);
 
 SpiceUsbDeviceManager *spice_usb_device_manager_get(SpiceSession *session,
                                                     GError **err);
-- 
1.7.7.5



More information about the Spice-devel mailing list