api,introspection: report list of drivers, not just one

Different ports of the same modem may get handled by different drivers. We
therefore need to provide a list of drivers (new `Modem.Drivers' property with
signature 'as') instead of just one (removed `Modem.Driver' property with
signature 's').

$ sudo mmcli -m 0 | grep drivers
           |        drivers: 'qcserial, qmi_wwan'
This commit is contained in:
Aleksander Morgado
2012-08-24 13:28:22 +02:00
parent a595912d2d
commit 0436b3e457
84 changed files with 268 additions and 214 deletions

View File

@@ -53,8 +53,8 @@ struct _MMDevicePrivate {
guint16 vendor;
guint16 product;
/* Kernel driver managing this device */
gchar *driver;
/* Kernel drivers managing this device */
gchar **drivers;
/* Best plugin to manage this device */
MMPlugin *plugin;
@@ -217,6 +217,37 @@ get_driver_name (GUdevDevice *device)
return ret;
}
static void
add_port_driver (MMDevice *self,
GUdevDevice *udev_port)
{
gchar *driver = NULL;
guint n_items;
guint i;
driver = get_driver_name (udev_port);
n_items = (self->priv->drivers ? g_strv_length (self->priv->drivers) : 0);
if (n_items > 0) {
/* Add driver to our list of drivers, if not already there */
for (i = 0; self->priv->drivers[i]; i++) {
if (g_str_equal (self->priv->drivers[i], driver)) {
g_free (driver);
driver = NULL;
break;
}
}
}
if (!driver)
return;
self->priv->drivers = g_realloc (self->priv->drivers,
(n_items + 2) * sizeof (gchar *));
self->priv->drivers[n_items] = driver;
self->priv->drivers[n_items + 1] = NULL;
}
void
mm_device_grab_port (MMDevice *self,
GUdevDevice *udev_port)
@@ -226,10 +257,8 @@ mm_device_grab_port (MMDevice *self,
if (mm_device_owns_port (self, udev_port))
return;
/* Get the driver name and vendor/product IDs out of the first port
* grabbed */
/* Get the vendor/product IDs out of the first port grabbed */
if (!self->priv->port_probes) {
self->priv->driver = get_driver_name (udev_port);
if (!get_device_ids (udev_port,
&self->priv->vendor,
&self->priv->product)) {
@@ -238,6 +267,9 @@ mm_device_grab_port (MMDevice *self,
}
}
/* Add new port driver */
add_port_driver (self, udev_port);
/* Create and store new port probe */
probe = mm_port_probe_new (self, udev_port);
self->priv->port_probes = g_list_prepend (self->priv->port_probes, probe);
@@ -438,10 +470,10 @@ mm_device_get_path (MMDevice *self)
return self->priv->udev_device_path;
}
const gchar *
mm_device_get_driver (MMDevice *self)
const gchar **
mm_device_get_drivers (MMDevice *self)
{
return self->priv->driver;
return (const gchar **)self->priv->drivers;
}
guint16
@@ -636,7 +668,7 @@ finalize (GObject *object)
MMDevice *self = MM_DEVICE (object);
g_free (self->priv->udev_device_path);
g_free (self->priv->driver);
g_strfreev (self->priv->drivers);
G_OBJECT_CLASS (mm_device_parent_class)->finalize (object);
}