device: keep a list of port probes instead of just ports

This commit is contained in:
Aleksander Morgado
2012-07-10 12:11:52 +02:00
parent a9075b0c09
commit b791e87b23
4 changed files with 88 additions and 61 deletions

View File

@@ -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);

View File

@@ -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 */

View File

@@ -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;
} }

View File

@@ -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 */