On Wed, Jul 16, 2014 at 4:49 PM, Marc-André Lureau <[email protected]> wrote:
> Hi > > ----- Original Message ----- > > This function allows the applications to get USB devices filtered by the > > devices' classes. The applications that are going to use this function > > should do: > > - Create a list of SpiceUsbDeviceFilter and set, for each > > SpiceUsbDeviceFilter: > > - the device class code based on > > http://www.usb.org/developers/defined_class > > - whether the device is allowed or not to auto connect > > The function will create a string in the expcted format, representing the > > filter, based on the list provided by the user and then call > > spice_usb_device_manager_get_devices_with_filter() > > I am not sure this kind of utility function belongs in spice-gtk. It > doesn't bring much to the existing call. > > Why is this change needed for? > Basically because the filter rule seems a bit cryptic and would be better if we could do that only by the device class code. Please, take a look on https://bugs.freedesktop.org/show_bug.cgi?id=63807#c2 for more info. > --- > > doc/reference/spice-gtk-sections.txt | 1 + > > gtk/map-file | 1 + > > gtk/spice-glib-sym-file | 1 + > > gtk/usb-device-manager.c | 47 > > +++++++++++++++++++++++++++++++++++- > > gtk/usb-device-manager.h | 13 ++++++++++ > > 5 files changed, 62 insertions(+), 1 deletion(-) > > > > 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..71bffe4 100644 > > --- a/gtk/usb-device-manager.c > > +++ b/gtk/usb-device-manager.c > > @@ -154,7 +154,6 @@ typedef struct _SpiceUsbDeviceInfo { > > gint ref; > > } SpiceUsbDeviceInfo; > > > > - > > static void channel_new(SpiceSession *session, SpiceChannel *channel, > > gpointer user_data); > > static void channel_destroy(SpiceSession *session, SpiceChannel > *channel, > > @@ -1379,6 +1378,52 @@ GPtrArray* > > spice_usb_device_manager_get_devices(SpiceUsbDeviceManager *self) > > } > > > > /** > > + * spice_usb_device_manager_get_devices_by_classes: > > + * @manager: the #SpiceUsbDeviceManager manager > > + * @classes: (element-type SpiceUsbDeviceFilter) (allow-none): a %GList > of > > classes for selecting > > + * which devices to return or %NULL to use the default filter, that > filters > > out HID (class 0x03) > > + * USB devices from auto connect and auto connects anything else. > > + * > > + * Returns: (element-type SpiceUsbDevice) (transfer full): a %GPtrArray > > array of %SpiceUsbDevice > > + */ > > missing Since: > > > +GPtrArray* > > spice_usb_device_manager_get_devices_by_classes(SpiceUsbDeviceManager > *self, > > + GList > *classes) > > I am not convinced using GList of structs make this function easier to use, > a string or a valist could do. Aee also below for my question about struct > content. > Maybe a GList of device codes? That would be exactly what I need, considering I don't have to set the allow field. > +{ > > + 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. > > + > > + 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) { > > + SpiceUsbDeviceFilter *device_filter = l->data; > > + if (filter == NULL) { > > + filter = g_strdup_printf( > > + "0x%02x,-1,-1,-1,%d", > > + device_filter->code, device_filter->allow); > > + } else { > > + gchar *tmp_filter = NULL; > > + > > + tmp_filter = g_strdup_printf( > > + "%s|0x%02x,-1,-1,-1,%d", > > + filter, device_filter->code, device_filter->allow); > > + > > + 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..7a048be 100644 > > --- a/gtk/usb-device-manager.h > > +++ b/gtk/usb-device-manager.h > > @@ -40,6 +40,7 @@ typedef struct _SpiceUsbDeviceManagerClass > > SpiceUsbDeviceManagerClass; > > typedef struct _SpiceUsbDeviceManagerPrivate > SpiceUsbDeviceManagerPrivate; > > > > typedef struct _SpiceUsbDevice SpiceUsbDevice; > > +typedef struct _SpiceUsbDeviceFilter SpiceUsbDeviceFilter; > > > > /** > > * SpiceUsbDeviceManager: > > @@ -85,6 +86,16 @@ struct _SpiceUsbDeviceManagerClass > > gchar _spice_reserved[SPICE_RESERVED_PADDING]; > > }; > > > > +/** > > + * SpiceUsbDeviceFilter: > > + * @code: the USB Class Code > > + * @allow: whether the device is allowed or not to auto connect > > I don't get why "allow" is necessary here. It make sense for > auto-connect-filter, but to query a list of devices? > Hmmm. I'm not sure if "allow" is necessary. Thinking a bit, probably not. > > > + */ > > +struct _SpiceUsbDeviceFilter { > > + guint code; > > + gboolean allow; > > +}; > > + > > GType spice_usb_device_get_type(void); > > GType spice_usb_device_manager_get_type(void); > > > > @@ -96,6 +107,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 > > [email protected] > > http://lists.freedesktop.org/mailman/listinfo/spice-devel > > > _______________________________________________ > Spice-devel mailing list > [email protected] > http://lists.freedesktop.org/mailman/listinfo/spice-devel > -- Fabiano Fidênciou
_______________________________________________ Spice-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/spice-devel
