aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2012-07-10 12:11:52 +0200
committerAleksander Morgado <aleksander@lanedo.com>2012-08-06 20:06:45 +0200
commitb791e87b23b3cbfdad53edf1129a1428b14c191c (patch)
treea8b1dc0e08346cd498ac1e1d66a654f3f310f62e /src
parenta9075b0c09eb999eb64fda70154e055a9d0edb1d (diff)
device: keep a list of port probes instead of just ports
Diffstat (limited to 'src')
-rw-r--r--src/mm-device.c111
-rw-r--r--src/mm-device.h7
-rw-r--r--src/mm-plugin.c31
-rw-r--r--src/mm-plugin.h2
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 */