device: keep a list of port probes instead of just ports
This commit is contained in:
109
src/mm-device.c
109
src/mm-device.c
@@ -56,8 +56,8 @@ struct _MMDevicePrivate {
|
|||||||
/* Best plugin to manage this device */
|
/* Best plugin to manage this device */
|
||||||
MMPlugin *plugin;
|
MMPlugin *plugin;
|
||||||
|
|
||||||
/* List of ports in the device */
|
/* List of port probes in the device */
|
||||||
GList *udev_ports;
|
GList *port_probes;
|
||||||
|
|
||||||
/* The Modem object for this device */
|
/* The Modem object for this device */
|
||||||
MMBaseModem *modem;
|
MMBaseModem *modem;
|
||||||
@@ -68,21 +68,28 @@ struct _MMDevicePrivate {
|
|||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static gint
|
static MMPortProbe *
|
||||||
udev_port_cmp (GUdevDevice *a,
|
device_find_probe_with_device (MMDevice *self,
|
||||||
GUdevDevice *b)
|
GUdevDevice *udev_port)
|
||||||
{
|
{
|
||||||
return strcmp (g_udev_device_get_sysfs_path (a),
|
GList *l;
|
||||||
g_udev_device_get_sysfs_path (b));
|
|
||||||
|
for (l = self->priv->port_probes; l; l = g_list_next (l)) {
|
||||||
|
MMPortProbe *probe = MM_PORT_PROBE (l->data);
|
||||||
|
|
||||||
|
if (g_str_equal (g_udev_device_get_sysfs_path (mm_port_probe_peek_port (probe)),
|
||||||
|
g_udev_device_get_sysfs_path (udev_port)))
|
||||||
|
return probe;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
mm_device_owns_port (MMDevice *self,
|
mm_device_owns_port (MMDevice *self,
|
||||||
GUdevDevice *udev_port)
|
GUdevDevice *udev_port)
|
||||||
{
|
{
|
||||||
return !!g_list_find_custom (self->priv->udev_ports,
|
return !!device_find_probe_with_device (self, udev_port);
|
||||||
udev_port,
|
|
||||||
(GCompareFunc)udev_port_cmp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gchar *
|
static gchar *
|
||||||
@@ -120,36 +127,37 @@ void
|
|||||||
mm_device_grab_port (MMDevice *self,
|
mm_device_grab_port (MMDevice *self,
|
||||||
GUdevDevice *udev_port)
|
GUdevDevice *udev_port)
|
||||||
{
|
{
|
||||||
if (!g_list_find_custom (self->priv->udev_ports,
|
MMPortProbe *probe;
|
||||||
udev_port,
|
|
||||||
(GCompareFunc)udev_port_cmp)) {
|
|
||||||
|
|
||||||
/* Get the driver name out of the first port grabbed */
|
if (mm_device_owns_port (self, udev_port))
|
||||||
if (!self->priv->udev_ports)
|
return;
|
||||||
self->priv->driver = get_driver_name (udev_port);
|
|
||||||
|
|
||||||
self->priv->udev_ports = g_list_prepend (self->priv->udev_ports,
|
/* Get the driver name out of the first port grabbed */
|
||||||
g_object_ref (udev_port));
|
if (!self->priv->port_probes)
|
||||||
|
self->priv->driver = get_driver_name (udev_port);
|
||||||
|
|
||||||
g_signal_emit (self, signals[SIGNAL_PORT_GRABBED], 0, udev_port);
|
/* Create and store new port probe */
|
||||||
}
|
probe = mm_port_probe_new (udev_port,
|
||||||
|
self->priv->udev_device_path,
|
||||||
|
self->priv->driver);
|
||||||
|
self->priv->port_probes = g_list_prepend (self->priv->port_probes, probe);
|
||||||
|
|
||||||
|
/* Notify about the grabbed port */
|
||||||
|
g_signal_emit (self, signals[SIGNAL_PORT_GRABBED], 0, udev_port);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
mm_device_release_port (MMDevice *self,
|
mm_device_release_port (MMDevice *self,
|
||||||
GUdevDevice *udev_port)
|
GUdevDevice *udev_port)
|
||||||
{
|
{
|
||||||
GList *found;
|
MMPortProbe *probe;
|
||||||
|
|
||||||
found = g_list_find_custom (self->priv->udev_ports,
|
probe = device_find_probe_with_device (self, udev_port);
|
||||||
udev_port,
|
if (probe) {
|
||||||
(GCompareFunc)udev_port_cmp);
|
/* Found, remove from list and destroy probe */
|
||||||
if (found) {
|
self->priv->port_probes = g_list_remove (self->priv->port_probes, probe);
|
||||||
GUdevDevice *found_port = found->data;
|
g_signal_emit (self, signals[SIGNAL_PORT_RELEASED], 0, mm_port_probe_peek_port (probe));
|
||||||
|
g_object_unref (probe);
|
||||||
self->priv->udev_ports = g_list_delete_link (self->priv->udev_ports, found);
|
|
||||||
g_signal_emit (self, signals[SIGNAL_PORT_RELEASED], 0, found_port);
|
|
||||||
g_object_unref (found_port);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -277,14 +285,14 @@ mm_device_create_modem (MMDevice *self,
|
|||||||
{
|
{
|
||||||
g_assert (self->priv->modem == NULL);
|
g_assert (self->priv->modem == NULL);
|
||||||
g_assert (self->priv->object_manager == NULL);
|
g_assert (self->priv->object_manager == NULL);
|
||||||
g_assert (self->priv->udev_ports != NULL);
|
g_assert (self->priv->port_probes != NULL);
|
||||||
|
|
||||||
mm_info ("Creating modem with plugin '%s' and '%u' ports",
|
mm_info ("Creating modem with plugin '%s' and '%u' ports",
|
||||||
mm_plugin_get_name (self->priv->plugin),
|
mm_plugin_get_name (self->priv->plugin),
|
||||||
g_list_length (self->priv->udev_ports));
|
g_list_length (self->priv->port_probes));
|
||||||
|
|
||||||
self->priv->modem = mm_plugin_create_modem (self->priv->plugin,
|
self->priv->modem = mm_plugin_create_modem (self->priv->plugin,
|
||||||
self->priv->udev_ports,
|
self->priv->port_probes,
|
||||||
error);
|
error);
|
||||||
if (self->priv->modem) {
|
if (self->priv->modem) {
|
||||||
/* Keep the object manager */
|
/* Keep the object manager */
|
||||||
@@ -365,6 +373,39 @@ mm_device_get_modem (MMDevice *self)
|
|||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MMPortProbe *
|
||||||
|
mm_device_peek_port_probe (MMDevice *self,
|
||||||
|
GUdevDevice *udev_port)
|
||||||
|
{
|
||||||
|
return device_find_probe_with_device (self, udev_port);
|
||||||
|
}
|
||||||
|
|
||||||
|
MMPortProbe *
|
||||||
|
mm_device_get_port_probe (MMDevice *self,
|
||||||
|
GUdevDevice *udev_port)
|
||||||
|
{
|
||||||
|
MMPortProbe *probe;
|
||||||
|
|
||||||
|
probe = device_find_probe_with_device (self, udev_port);
|
||||||
|
return (probe ? g_object_ref (probe) : NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
GList *
|
||||||
|
mm_device_peek_port_probe_list (MMDevice *self)
|
||||||
|
{
|
||||||
|
return self->priv->port_probes;
|
||||||
|
}
|
||||||
|
|
||||||
|
GList *
|
||||||
|
mm_device_get_port_probe_list (MMDevice *self)
|
||||||
|
{
|
||||||
|
GList *copy;
|
||||||
|
|
||||||
|
copy = g_list_copy (self->priv->port_probes);
|
||||||
|
g_list_foreach (copy, (GFunc)g_object_ref, NULL);
|
||||||
|
return copy;
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
MMDevice *
|
MMDevice *
|
||||||
@@ -443,7 +484,7 @@ dispose (GObject *object)
|
|||||||
|
|
||||||
g_clear_object (&(self->priv->udev_device));
|
g_clear_object (&(self->priv->udev_device));
|
||||||
g_clear_object (&(self->priv->plugin));
|
g_clear_object (&(self->priv->plugin));
|
||||||
g_list_free_full (self->priv->udev_ports, (GDestroyNotify)g_object_unref);
|
g_list_free_full (self->priv->port_probes, (GDestroyNotify)g_object_unref);
|
||||||
g_clear_object (&(self->priv->modem));
|
g_clear_object (&(self->priv->modem));
|
||||||
|
|
||||||
G_OBJECT_CLASS (mm_device_parent_class)->dispose (object);
|
G_OBJECT_CLASS (mm_device_parent_class)->dispose (object);
|
||||||
|
@@ -83,4 +83,11 @@ MMPlugin *mm_device_get_plugin (MMDevice *self);
|
|||||||
MMBaseModem *mm_device_peek_modem (MMDevice *self);
|
MMBaseModem *mm_device_peek_modem (MMDevice *self);
|
||||||
MMBaseModem *mm_device_get_modem (MMDevice *self);
|
MMBaseModem *mm_device_get_modem (MMDevice *self);
|
||||||
|
|
||||||
|
MMPortProbe *mm_device_peek_port_probe (MMDevice *self,
|
||||||
|
GUdevDevice *udev_port);
|
||||||
|
MMPortProbe *mm_device_get_port_probe (MMDevice *self,
|
||||||
|
GUdevDevice *udev_port);
|
||||||
|
GList *mm_device_peek_port_probe_list (MMDevice *self);
|
||||||
|
GList *mm_device_get_port_probe_list (MMDevice *self);
|
||||||
|
|
||||||
#endif /* MM_DEVICE_H */
|
#endif /* MM_DEVICE_H */
|
||||||
|
@@ -756,38 +756,19 @@ mm_plugin_supports_port_cancel (MMPlugin *plugin,
|
|||||||
g_free (key);
|
g_free (key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
MMBaseModem *
|
MMBaseModem *
|
||||||
mm_plugin_create_modem (MMPlugin *self,
|
mm_plugin_create_modem (MMPlugin *self,
|
||||||
GList *ports,
|
GList *port_probes,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
MMBaseModem *modem = NULL;
|
MMBaseModem *modem = NULL;
|
||||||
MMPluginPrivate *priv = MM_PLUGIN_GET_PRIVATE (self);
|
MMPluginPrivate *priv = MM_PLUGIN_GET_PRIVATE (self);
|
||||||
GList *probes = NULL;
|
|
||||||
GList *l;
|
GList *l;
|
||||||
const gchar *name, *subsys, *sysfs_path, *driver;
|
const gchar *name, *subsys, *sysfs_path, *driver;
|
||||||
guint16 vendor = 0, product = 0;
|
guint16 vendor = 0, product = 0;
|
||||||
|
|
||||||
/* Get the port probe results for each of the ports */
|
|
||||||
for (l = ports; l; l = g_list_next (l)) {
|
|
||||||
MMPortProbe *probe;
|
|
||||||
gchar *key;
|
|
||||||
|
|
||||||
subsys = g_udev_device_get_subsystem (G_UDEV_DEVICE (l->data));
|
|
||||||
name = g_udev_device_get_name (G_UDEV_DEVICE (l->data));
|
|
||||||
|
|
||||||
key = get_key (subsys, name);
|
|
||||||
probe = g_hash_table_lookup (priv->tasks, key);
|
|
||||||
if (!probe)
|
|
||||||
mm_warn ("(%s/%s) Ignoring port when creating modem with plugin '%s'",
|
|
||||||
subsys,
|
|
||||||
name,
|
|
||||||
priv->name);
|
|
||||||
else
|
|
||||||
probes = g_list_prepend (probes, g_object_ref (probe));
|
|
||||||
g_free (key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get info from the first probe in the list */
|
/* Get info from the first probe in the list */
|
||||||
subsys = mm_port_probe_get_port_subsys (probes->data);
|
subsys = mm_port_probe_get_port_subsys (probes->data);
|
||||||
name = mm_port_probe_get_port_name (probes->data);
|
name = mm_port_probe_get_port_name (probes->data);
|
||||||
@@ -809,7 +790,7 @@ mm_plugin_create_modem (MMPlugin *self,
|
|||||||
error);
|
error);
|
||||||
if (modem) {
|
if (modem) {
|
||||||
/* Grab each port */
|
/* Grab each port */
|
||||||
for (l = probes; l; l = g_list_next (l)) {
|
for (l = port_probes; l; l = g_list_next (l)) {
|
||||||
GError *inner_error = NULL;
|
GError *inner_error = NULL;
|
||||||
|
|
||||||
/* If grabbing a port fails, just warn. We'll decide if the modem is
|
/* If grabbing a port fails, just warn. We'll decide if the modem is
|
||||||
@@ -831,7 +812,7 @@ mm_plugin_create_modem (MMPlugin *self,
|
|||||||
g_clear_object (&modem);
|
g_clear_object (&modem);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (l = probes; l; l = g_list_next (l)) {
|
for (l = port_probes; l; l = g_list_next (l)) {
|
||||||
gchar *key;
|
gchar *key;
|
||||||
|
|
||||||
key = get_key (mm_port_probe_get_port_subsys (l->data),
|
key = get_key (mm_port_probe_get_port_subsys (l->data),
|
||||||
@@ -840,8 +821,6 @@ mm_plugin_create_modem (MMPlugin *self,
|
|||||||
g_free (key);
|
g_free (key);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_list_free_full (probes, (GDestroyNotify) g_object_unref);
|
|
||||||
|
|
||||||
return modem;
|
return modem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -111,7 +111,7 @@ void mm_plugin_supports_port_cancel (MMPlugin *plugin,
|
|||||||
const char *name);
|
const char *name);
|
||||||
|
|
||||||
MMBaseModem *mm_plugin_create_modem (MMPlugin *plugin,
|
MMBaseModem *mm_plugin_create_modem (MMPlugin *plugin,
|
||||||
GList *ports,
|
GList *port_probes,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
#endif /* MM_PLUGIN_H */
|
#endif /* MM_PLUGIN_H */
|
||||||
|
Reference in New Issue
Block a user