Re: [spice-gtk][PATCHv2] usb-device-manager: Add spice_usb_device_manager_get_devices_by_classes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 






On Thu, Jul 17, 2014 at 11:43 AM, Fabiano Fidêncio <fidencio@xxxxxxxxxx> wrote:
This function allows the applications to get USB devices filtered by the
devices' classes. The applications that are going to use this function
should provide a list of USB devices class code (based on
http://www.usb.org/developers/defined_class), then the function will
create a string in the expcted format, representing the filter, and call
spice_usb_device_manager_get_devices_with_filter()

This doesn't bring significant improvement to the string  get_devices_with_filter(). I disagree with adding this utility function, which can be implemented by apps.

---
 doc/reference/spice-gtk-sections.txt |  1 +
 gtk/map-file                         |  1 +
 gtk/spice-glib-sym-file              |  1 +
 gtk/usb-device-manager.c             | 45 ++++++++++++++++++++++++++++++++++++
 gtk/usb-device-manager.h             |  2 ++
 5 files changed, 50 insertions(+)

diff --git a/doc/reference/spice-gtk-sections.txt b/doc/reference/spice-gtk-sections.txt
index caaa92c..03dcec3 100644
--- a/doc/reference/spice-gtk-sections.txt
+++ b/doc/reference/spice-gtk-sections.txt
@@ -298,6 +298,7 @@ SpiceUsbDeviceManagerClass
 spice_usb_device_manager_get
 spice_usb_device_manager_get_devices
 spice_usb_device_manager_get_devices_with_filter
+spice_usb_device_manager_get_devices_by_classes
 spice_usb_device_manager_is_device_connected
 spice_usb_device_manager_disconnect_device
 spice_usb_device_manager_can_redirect_device
diff --git a/gtk/map-file b/gtk/map-file
index 90f14f1..0a31dc0 100644
--- a/gtk/map-file
+++ b/gtk/map-file
@@ -110,6 +110,7 @@ spice_usb_device_manager_connect_device_finish;
 spice_usb_device_manager_disconnect_device;
 spice_usb_device_manager_get;
 spice_usb_device_manager_get_devices;
+spice_usb_device_manager_get_devices_by_classes;
 spice_usb_device_manager_get_devices_with_filter;
 spice_usb_device_manager_get_type;
 spice_usb_device_manager_is_device_connected;
diff --git a/gtk/spice-glib-sym-file b/gtk/spice-glib-sym-file
index 878dd12..3c5a785 100644
--- a/gtk/spice-glib-sym-file
+++ b/gtk/spice-glib-sym-file
@@ -85,6 +85,7 @@ spice_usb_device_manager_connect_device_finish
 spice_usb_device_manager_disconnect_device
 spice_usb_device_manager_get
 spice_usb_device_manager_get_devices
+spice_usb_device_manager_get_devices_by_classes
 spice_usb_device_manager_get_devices_with_filter
 spice_usb_device_manager_get_type
 spice_usb_device_manager_is_device_connected
diff --git a/gtk/usb-device-manager.c b/gtk/usb-device-manager.c
index 5013b6c..7e65991 100644
--- a/gtk/usb-device-manager.c
+++ b/gtk/usb-device-manager.c
@@ -1379,6 +1379,51 @@ GPtrArray* spice_usb_device_manager_get_devices(SpiceUsbDeviceManager *self)
 }

 /**
+ * spice_usb_device_manager_get_devices_by_classes:
+ * @manager: the #SpiceUsbDeviceManager manager
+ * @classes: (element-type gint) (allow-none): a %GList of classes for selecting
+ *           which devices to return or %NULL

Again, I'd prefer a regular C array here. A GList is overkill

+ *
+ * Returns: (element-type SpiceUsbDevice) (transfer full): a %GPtrArray array of %SpiceUsbDevice
+ *
+ * Since: 0.26
+ */
+GPtrArray* spice_usb_device_manager_get_devices_by_classes(SpiceUsbDeviceManager *self,
+                                                           GList *classes)
+{
+    GPtrArray *devices;
+    GList *l;
+    gchar *filter = NULL;
+
+    /* Builds the filter based on the USB classes received from the user. As this function
+       filters only by the device class, another fields as vendor id, product id and device
+       version bcd are automatically set to match any id/version and allow is always set to
+       "allows redir for this device" (actually, it doesn't matter when we are just querying
+       a list of devices).
+
+       A filter rule has the form of @class,@vendor,@product,@version,@allow and the rules,
+       themselves, are concatenated like @rule1|@rule2|@rule3 */
+    for (l = classes; l != NULL; l = l->next) {
+        enum libusb_class_code code = GPOINTER_TO_INT(l->data);
+        if (filter == NULL) {
+            filter = g_strdup_printf("0x%02x,-1,-1,-1,1", code);
+        } else {
+            gchar *tmp_filter = NULL;
+
+            tmp_filter = g_strdup_printf("%s|0x%02x,-1,-1,-1,1", filter, code);
+
+            g_free(filter);
+            filter = tmp_filter;
+        }
+    }
+
+    devices = spice_usb_device_manager_get_devices_with_filter(self, filter);
+    g_free(filter);
+
+    return devices;
+}
+
+/**
  * spice_usb_device_manager_is_device_connected:
  * @manager: the #SpiceUsbDeviceManager manager
  * @device: a #SpiceUsbDevice
diff --git a/gtk/usb-device-manager.h b/gtk/usb-device-manager.h
index a7e3515..e6db56f 100644
--- a/gtk/usb-device-manager.h
+++ b/gtk/usb-device-manager.h
@@ -96,6 +96,8 @@ SpiceUsbDeviceManager *spice_usb_device_manager_get(SpiceSession *session,
 GPtrArray *spice_usb_device_manager_get_devices(SpiceUsbDeviceManager *manager);
 GPtrArray* spice_usb_device_manager_get_devices_with_filter(
     SpiceUsbDeviceManager *manager, const gchar *filter);
+GPtrArray* spice_usb_device_manager_get_devices_by_classes(
+    SpiceUsbDeviceManager *manager, GList *classes);

 gboolean spice_usb_device_manager_is_device_connected(SpiceUsbDeviceManager *manager,
                                                       SpiceUsbDevice *device);
--
1.9.3

_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/spice-devel



--
Marc-André Lureau
_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/spice-devel

[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]