kerneldevice: support reading interface 'description'

This commit is contained in:
Aleksander Morgado
2020-03-03 17:23:07 +00:00
parent 5da33df35b
commit 9ef84d2cff
4 changed files with 90 additions and 44 deletions
+57 -36
View File
@@ -59,6 +59,7 @@ struct _MMKernelDeviceGenericPrivate {
guint8 interface_subclass;
guint8 interface_protocol;
guint8 interface_number;
gchar *interface_description;
gchar *physdev_sysfs_path;
guint16 physdev_vid;
guint16 physdev_pid;
@@ -424,23 +425,34 @@ preload_interface_number (MMKernelDeviceGeneric *self)
g_object_set_data_full (G_OBJECT (self), "ID_USB_INTERFACE_NUM", g_strdup_printf ("%02x", self->priv->interface_number), g_free);
}
static void
preload_interface_description (MMKernelDeviceGeneric *self)
{
self->priv->interface_description = (self->priv->interface_sysfs_path ? read_sysfs_property_as_string (self->priv->interface_sysfs_path, "interface") : NULL);
mm_dbg ("(%s/%s) interface description: %s",
mm_kernel_event_properties_get_subsystem (self->priv->properties),
mm_kernel_event_properties_get_name (self->priv->properties),
self->priv->interface_description ? self->priv->interface_description : "unknown");
}
static void
preload_contents (MMKernelDeviceGeneric *self)
{
preload_sysfs_path (self);
preload_interface_sysfs_path (self);
preload_interface_class (self);
preload_interface_subclass (self);
preload_interface_protocol (self);
preload_interface_number (self);
preload_physdev_sysfs_path (self);
preload_manufacturer (self);
preload_product (self);
preload_driver (self);
preload_physdev_vid (self);
preload_physdev_pid (self);
preload_physdev_revision (self);
preload_physdev_subsystem (self);
preload_sysfs_path (self);
preload_interface_sysfs_path (self);
preload_interface_class (self);
preload_interface_subclass (self);
preload_interface_protocol (self);
preload_interface_number (self);
preload_interface_description (self);
preload_physdev_sysfs_path (self);
preload_manufacturer (self);
preload_product (self);
preload_driver (self);
preload_physdev_vid (self);
preload_physdev_pid (self);
preload_physdev_revision (self);
preload_physdev_subsystem (self);
}
/*****************************************************************************/
@@ -501,6 +513,14 @@ kernel_device_get_interface_sysfs_path (MMKernelDevice *self)
return MM_KERNEL_DEVICE_GENERIC (self)->priv->interface_sysfs_path;
}
static const gchar *
kernel_device_get_interface_description (MMKernelDevice *self)
{
g_return_val_if_fail (MM_IS_KERNEL_DEVICE_GENERIC (self), NULL);
return MM_KERNEL_DEVICE_GENERIC (self)->priv->interface_description;
}
static const gchar *
kernel_device_get_physdev_uid (MMKernelDevice *self)
{
@@ -1115,28 +1135,29 @@ mm_kernel_device_generic_class_init (MMKernelDeviceGenericClass *klass)
object_class->get_property = get_property;
object_class->set_property = set_property;
kernel_device_class->get_subsystem = kernel_device_get_subsystem;
kernel_device_class->get_name = kernel_device_get_name;
kernel_device_class->get_driver = kernel_device_get_driver;
kernel_device_class->get_sysfs_path = kernel_device_get_sysfs_path;
kernel_device_class->get_physdev_uid = kernel_device_get_physdev_uid;
kernel_device_class->get_physdev_vid = kernel_device_get_physdev_vid;
kernel_device_class->get_physdev_pid = kernel_device_get_physdev_pid;
kernel_device_class->get_physdev_revision = kernel_device_get_physdev_revision;
kernel_device_class->get_physdev_sysfs_path = kernel_device_get_physdev_sysfs_path;
kernel_device_class->get_physdev_subsystem = kernel_device_get_physdev_subsystem;
kernel_device_class->get_physdev_manufacturer = kernel_device_get_physdev_manufacturer;
kernel_device_class->get_physdev_product = kernel_device_get_physdev_product;
kernel_device_class->get_interface_class = kernel_device_get_interface_class;
kernel_device_class->get_interface_subclass = kernel_device_get_interface_subclass;
kernel_device_class->get_interface_protocol = kernel_device_get_interface_protocol;
kernel_device_class->get_interface_sysfs_path = kernel_device_get_interface_sysfs_path;
kernel_device_class->cmp = kernel_device_cmp;
kernel_device_class->has_property = kernel_device_has_property;
kernel_device_class->get_property = kernel_device_get_property;
kernel_device_class->get_property_as_boolean = kernel_device_get_property_as_boolean;
kernel_device_class->get_property_as_int = kernel_device_get_property_as_int;
kernel_device_class->get_property_as_int_hex = kernel_device_get_property_as_int_hex;
kernel_device_class->get_subsystem = kernel_device_get_subsystem;
kernel_device_class->get_name = kernel_device_get_name;
kernel_device_class->get_driver = kernel_device_get_driver;
kernel_device_class->get_sysfs_path = kernel_device_get_sysfs_path;
kernel_device_class->get_physdev_uid = kernel_device_get_physdev_uid;
kernel_device_class->get_physdev_vid = kernel_device_get_physdev_vid;
kernel_device_class->get_physdev_pid = kernel_device_get_physdev_pid;
kernel_device_class->get_physdev_revision = kernel_device_get_physdev_revision;
kernel_device_class->get_physdev_sysfs_path = kernel_device_get_physdev_sysfs_path;
kernel_device_class->get_physdev_subsystem = kernel_device_get_physdev_subsystem;
kernel_device_class->get_physdev_manufacturer = kernel_device_get_physdev_manufacturer;
kernel_device_class->get_physdev_product = kernel_device_get_physdev_product;
kernel_device_class->get_interface_class = kernel_device_get_interface_class;
kernel_device_class->get_interface_subclass = kernel_device_get_interface_subclass;
kernel_device_class->get_interface_protocol = kernel_device_get_interface_protocol;
kernel_device_class->get_interface_sysfs_path = kernel_device_get_interface_sysfs_path;
kernel_device_class->get_interface_description = kernel_device_get_interface_description;
kernel_device_class->cmp = kernel_device_cmp;
kernel_device_class->has_property = kernel_device_has_property;
kernel_device_class->get_property = kernel_device_get_property;
kernel_device_class->get_property_as_boolean = kernel_device_get_property_as_boolean;
kernel_device_class->get_property_as_int = kernel_device_get_property_as_int;
kernel_device_class->get_property_as_int_hex = kernel_device_get_property_as_int_hex;
/* Device-wide properties are stored per-port in the generic backend */
kernel_device_class->has_global_property = kernel_device_has_property;
+13
View File
@@ -534,6 +534,18 @@ kernel_device_get_interface_sysfs_path (MMKernelDevice *_self)
return (self->priv->parent ? g_udev_device_get_sysfs_path (self->priv->parent) : NULL);
}
static const gchar *
kernel_device_get_interface_description (MMKernelDevice *_self)
{
MMKernelDeviceUdev *self;
g_return_val_if_fail (MM_IS_KERNEL_DEVICE_UDEV (_self), NULL);
self = MM_KERNEL_DEVICE_UDEV (_self);
ensure_parent (self);
return (self->priv->parent ? g_udev_device_get_sysfs_attr (self->priv->parent, "interface") : NULL);
}
static gboolean
kernel_device_cmp (MMKernelDevice *_a,
MMKernelDevice *_b)
@@ -935,6 +947,7 @@ mm_kernel_device_udev_class_init (MMKernelDeviceUdevClass *klass)
kernel_device_class->get_interface_subclass = kernel_device_get_interface_subclass;
kernel_device_class->get_interface_protocol = kernel_device_get_interface_protocol;
kernel_device_class->get_interface_sysfs_path = kernel_device_get_interface_sysfs_path;
kernel_device_class->get_interface_description = kernel_device_get_interface_description;
kernel_device_class->cmp = kernel_device_cmp;
kernel_device_class->has_property = kernel_device_has_property;
kernel_device_class->get_property = kernel_device_get_property;
+10
View File
@@ -183,6 +183,16 @@ mm_kernel_device_get_interface_sysfs_path (MMKernelDevice *self)
NULL);
}
const gchar *
mm_kernel_device_get_interface_description (MMKernelDevice *self)
{
g_return_val_if_fail (MM_IS_KERNEL_DEVICE (self), NULL);
return (MM_KERNEL_DEVICE_GET_CLASS (self)->get_interface_description ?
MM_KERNEL_DEVICE_GET_CLASS (self)->get_interface_description (self) :
NULL);
}
gboolean
mm_kernel_device_cmp (MMKernelDevice *a,
MMKernelDevice *b)
+10 -8
View File
@@ -41,10 +41,11 @@ struct _MMKernelDeviceClass {
const gchar * (* get_driver) (MMKernelDevice *self);
const gchar * (* get_sysfs_path) (MMKernelDevice *self);
gint (* get_interface_class) (MMKernelDevice *self);
gint (* get_interface_subclass) (MMKernelDevice *self);
gint (* get_interface_protocol) (MMKernelDevice *self);
const gchar * (* get_interface_sysfs_path) (MMKernelDevice *self);
gint (* get_interface_class) (MMKernelDevice *self);
gint (* get_interface_subclass) (MMKernelDevice *self);
gint (* get_interface_protocol) (MMKernelDevice *self);
const gchar * (* get_interface_sysfs_path) (MMKernelDevice *self);
const gchar * (* get_interface_description) (MMKernelDevice *self);
const gchar * (* get_physdev_uid) (MMKernelDevice *self);
guint16 (* get_physdev_vid) (MMKernelDevice *self);
@@ -77,10 +78,11 @@ const gchar *mm_kernel_device_get_name (MMKernelDevice *self);
const gchar *mm_kernel_device_get_driver (MMKernelDevice *self);
const gchar *mm_kernel_device_get_sysfs_path (MMKernelDevice *self);
gint mm_kernel_device_get_interface_class (MMKernelDevice *self);
gint mm_kernel_device_get_interface_subclass (MMKernelDevice *self);
gint mm_kernel_device_get_interface_protocol (MMKernelDevice *self);
const gchar *mm_kernel_device_get_interface_sysfs_path (MMKernelDevice *self);
gint mm_kernel_device_get_interface_class (MMKernelDevice *self);
gint mm_kernel_device_get_interface_subclass (MMKernelDevice *self);
gint mm_kernel_device_get_interface_protocol (MMKernelDevice *self);
const gchar *mm_kernel_device_get_interface_sysfs_path (MMKernelDevice *self);
const gchar *mm_kernel_device_get_interface_description (MMKernelDevice *self);
const gchar *mm_kernel_device_get_physdev_uid (MMKernelDevice *self);
guint16 mm_kernel_device_get_physdev_vid (MMKernelDevice *self);