diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2012-07-22 21:00:42 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-08-06 20:07:50 +0200 |
commit | f6415a71b6ee3998b144393c3c4facdb7a77c545 (patch) | |
tree | 6c99e5de6f3c339f662d111c9aa06926b0ab4ccb /src/mm-device.c | |
parent | 1811bb015c79b319c517d0bd23ae04899d2bc981 (diff) |
device: keep all unsupported ports in a separate list
Ports being marked as unsupported should not be passed to the plugin specific
create_modem() or grab_port() methods.
Diffstat (limited to 'src/mm-device.c')
-rw-r--r-- | src/mm-device.c | 43 |
1 files changed, 37 insertions, 6 deletions
diff --git a/src/mm-device.c b/src/mm-device.c index 0f5d4292..1733f943 100644 --- a/src/mm-device.c +++ b/src/mm-device.c @@ -59,8 +59,9 @@ struct _MMDevicePrivate { /* Best plugin to manage this device */ MMPlugin *plugin; - /* List of port probes in the device */ + /* Lists of port probes in the device */ GList *port_probes; + GList *ignored_port_probes; /* The Modem object for this device */ MMBaseModem *modem; @@ -73,7 +74,8 @@ struct _MMDevicePrivate { static MMPortProbe * device_find_probe_with_device (MMDevice *self, - GUdevDevice *udev_port) + GUdevDevice *udev_port, + gboolean lookup_ignored) { GList *l; @@ -85,6 +87,17 @@ device_find_probe_with_device (MMDevice *self, return probe; } + if (!lookup_ignored) + return NULL; + + for (l = self->priv->ignored_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; } @@ -92,7 +105,7 @@ gboolean mm_device_owns_port (MMDevice *self, GUdevDevice *udev_port) { - return !!device_find_probe_with_device (self, udev_port); + return !!device_find_probe_with_device (self, udev_port, FALSE); } static gboolean @@ -239,7 +252,7 @@ mm_device_release_port (MMDevice *self, { MMPortProbe *probe; - probe = device_find_probe_with_device (self, udev_port); + probe = device_find_probe_with_device (self, udev_port, TRUE); if (probe) { /* Found, remove from list and destroy probe */ self->priv->port_probes = g_list_remove (self->priv->port_probes, probe); @@ -248,6 +261,23 @@ mm_device_release_port (MMDevice *self, } } +void +mm_device_ignore_port (MMDevice *self, + GUdevDevice *udev_port) +{ + MMPortProbe *probe; + + probe = device_find_probe_with_device (self, udev_port, FALSE); + if (probe) { + /* Found, remove from list and add to the ignored list */ + mm_dbg ("Fully ignoring port '%s/%s' from now on", + g_udev_device_get_subsystem (udev_port), + g_udev_device_get_name (udev_port)); + self->priv->port_probes = g_list_remove (self->priv->port_probes, probe); + self->priv->ignored_port_probes = g_list_prepend (self->priv->ignored_port_probes, probe); + } +} + /*****************************************************************************/ static void @@ -485,7 +515,7 @@ mm_device_peek_port_probe (MMDevice *self, { MMPortProbe *probe; - probe = device_find_probe_with_device (self, udev_port); + probe = device_find_probe_with_device (self, udev_port, FALSE); return (probe ? G_OBJECT (probe) : NULL); } @@ -495,7 +525,7 @@ mm_device_get_port_probe (MMDevice *self, { MMPortProbe *probe; - probe = device_find_probe_with_device (self, udev_port); + probe = device_find_probe_with_device (self, udev_port, FALSE); return (probe ? g_object_ref (probe) : NULL); } @@ -594,6 +624,7 @@ dispose (GObject *object) g_clear_object (&(self->priv->udev_device)); g_clear_object (&(self->priv->plugin)); g_list_free_full (self->priv->port_probes, (GDestroyNotify)g_object_unref); + g_list_free_full (self->priv->ignored_port_probes, (GDestroyNotify)g_object_unref); g_clear_object (&(self->priv->modem)); G_OBJECT_CLASS (mm_device_parent_class)->dispose (object); |