diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2012-07-10 12:11:52 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-08-06 20:06:45 +0200 |
commit | b791e87b23b3cbfdad53edf1129a1428b14c191c (patch) | |
tree | a8b1dc0e08346cd498ac1e1d66a654f3f310f62e /src | |
parent | a9075b0c09eb999eb64fda70154e055a9d0edb1d (diff) |
device: keep a list of port probes instead of just ports
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-device.c | 111 | ||||
-rw-r--r-- | src/mm-device.h | 7 | ||||
-rw-r--r-- | src/mm-plugin.c | 31 | ||||
-rw-r--r-- | src/mm-plugin.h | 2 |
4 files changed, 89 insertions, 62 deletions
diff --git a/src/mm-device.c b/src/mm-device.c index 531c6706..0c3c9a89 100644 --- a/src/mm-device.c +++ b/src/mm-device.c @@ -56,8 +56,8 @@ struct _MMDevicePrivate { /* Best plugin to manage this device */ MMPlugin *plugin; - /* List of ports in the device */ - GList *udev_ports; + /* List of port probes in the device */ + GList *port_probes; /* The Modem object for this device */ MMBaseModem *modem; @@ -68,21 +68,28 @@ struct _MMDevicePrivate { /*****************************************************************************/ -static gint -udev_port_cmp (GUdevDevice *a, - GUdevDevice *b) +static MMPortProbe * +device_find_probe_with_device (MMDevice *self, + GUdevDevice *udev_port) { - return strcmp (g_udev_device_get_sysfs_path (a), - g_udev_device_get_sysfs_path (b)); + GList *l; + + 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 mm_device_owns_port (MMDevice *self, GUdevDevice *udev_port) { - return !!g_list_find_custom (self->priv->udev_ports, - udev_port, - (GCompareFunc)udev_port_cmp); + return !!device_find_probe_with_device (self, udev_port); } static gchar * @@ -120,36 +127,37 @@ void mm_device_grab_port (MMDevice *self, GUdevDevice *udev_port) { - if (!g_list_find_custom (self->priv->udev_ports, - udev_port, - (GCompareFunc)udev_port_cmp)) { + MMPortProbe *probe; - /* Get the driver name out of the first port grabbed */ - if (!self->priv->udev_ports) - self->priv->driver = get_driver_name (udev_port); + if (mm_device_owns_port (self, udev_port)) + return; - self->priv->udev_ports = g_list_prepend (self->priv->udev_ports, - g_object_ref (udev_port)); + /* Get the driver name out of the first port grabbed */ + 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 mm_device_release_port (MMDevice *self, GUdevDevice *udev_port) { - GList *found; - - found = g_list_find_custom (self->priv->udev_ports, - udev_port, - (GCompareFunc)udev_port_cmp); - if (found) { - GUdevDevice *found_port = found->data; - - 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); + MMPortProbe *probe; + + probe = device_find_probe_with_device (self, udev_port); + if (probe) { + /* Found, remove from list and destroy probe */ + self->priv->port_probes = g_list_remove (self->priv->port_probes, probe); + g_signal_emit (self, signals[SIGNAL_PORT_RELEASED], 0, mm_port_probe_peek_port (probe)); + g_object_unref (probe); } } @@ -277,14 +285,14 @@ mm_device_create_modem (MMDevice *self, { g_assert (self->priv->modem == 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_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->udev_ports, + self->priv->port_probes, error); if (self->priv->modem) { /* Keep the object manager */ @@ -365,6 +373,39 @@ mm_device_get_modem (MMDevice *self) 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 * @@ -443,7 +484,7 @@ dispose (GObject *object) g_clear_object (&(self->priv->udev_device)); 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_OBJECT_CLASS (mm_device_parent_class)->dispose (object); diff --git a/src/mm-device.h b/src/mm-device.h index 0cdef2a4..97289dda 100644 --- a/src/mm-device.h +++ b/src/mm-device.h @@ -83,4 +83,11 @@ MMPlugin *mm_device_get_plugin (MMDevice *self); MMBaseModem *mm_device_peek_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 */ diff --git a/src/mm-plugin.c b/src/mm-plugin.c index c2b75f97..40362863 100644 --- a/src/mm-plugin.c +++ b/src/mm-plugin.c @@ -756,38 +756,19 @@ mm_plugin_supports_port_cancel (MMPlugin *plugin, g_free (key); } +/*****************************************************************************/ + MMBaseModem * mm_plugin_create_modem (MMPlugin *self, - GList *ports, + GList *port_probes, GError **error) { MMBaseModem *modem = NULL; MMPluginPrivate *priv = MM_PLUGIN_GET_PRIVATE (self); - GList *probes = NULL; GList *l; const gchar *name, *subsys, *sysfs_path, *driver; 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 */ subsys = mm_port_probe_get_port_subsys (probes->data); name = mm_port_probe_get_port_name (probes->data); @@ -809,7 +790,7 @@ mm_plugin_create_modem (MMPlugin *self, error); if (modem) { /* 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; /* 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); } - for (l = probes; l; l = g_list_next (l)) { + for (l = port_probes; l; l = g_list_next (l)) { gchar *key; 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_list_free_full (probes, (GDestroyNotify) g_object_unref); - return modem; } diff --git a/src/mm-plugin.h b/src/mm-plugin.h index 89eeca67..6b8e7bab 100644 --- a/src/mm-plugin.h +++ b/src/mm-plugin.h @@ -111,7 +111,7 @@ void mm_plugin_supports_port_cancel (MMPlugin *plugin, const char *name); MMBaseModem *mm_plugin_create_modem (MMPlugin *plugin, - GList *ports, + GList *port_probes, GError **error); #endif /* MM_PLUGIN_H */ |