diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-base-modem.c | 36 | ||||
-rw-r--r-- | src/mm-base-modem.h | 8 | ||||
-rw-r--r-- | src/mm-broadband-modem.c | 4 | ||||
-rw-r--r-- | src/mm-broadband-modem.h | 2 | ||||
-rw-r--r-- | src/mm-device.c | 50 | ||||
-rw-r--r-- | src/mm-device.h | 24 | ||||
-rw-r--r-- | src/mm-iface-modem.c | 12 | ||||
-rw-r--r-- | src/mm-plugin.c | 37 | ||||
-rw-r--r-- | src/mm-plugin.h | 2 |
9 files changed, 109 insertions, 66 deletions
diff --git a/src/mm-base-modem.c b/src/mm-base-modem.c index 5517fcc4..aa844642 100644 --- a/src/mm-base-modem.c +++ b/src/mm-base-modem.c @@ -39,7 +39,7 @@ enum { PROP_VALID, PROP_MAX_TIMEOUTS, PROP_DEVICE, - PROP_DRIVER, + PROP_DRIVERS, PROP_PLUGIN, PROP_VENDOR_ID, PROP_PRODUCT_ID, @@ -59,7 +59,7 @@ struct _MMBaseModemPrivate { gulong invalid_if_cancelled; gchar *device; - gchar *driver; + gchar **drivers; gchar *plugin; guint vendor_id; @@ -809,12 +809,12 @@ mm_base_modem_get_device (MMBaseModem *self) return self->priv->device; } -const gchar * -mm_base_modem_get_driver (MMBaseModem *self) +const gchar ** +mm_base_modem_get_drivers (MMBaseModem *self) { g_return_val_if_fail (MM_IS_BASE_MODEM (self), NULL); - return self->priv->driver; + return (const gchar **)self->priv->drivers; } const gchar * @@ -909,9 +909,9 @@ set_property (GObject *object, g_free (self->priv->device); self->priv->device = g_value_dup_string (value); break; - case PROP_DRIVER: - g_free (self->priv->driver); - self->priv->driver = g_value_dup_string (value); + case PROP_DRIVERS: + g_strfreev (self->priv->drivers); + self->priv->drivers = g_value_dup_boxed (value); break; case PROP_PLUGIN: g_free (self->priv->plugin); @@ -951,8 +951,8 @@ get_property (GObject *object, case PROP_DEVICE: g_value_set_string (value, self->priv->device); break; - case PROP_DRIVER: - g_value_set_string (value, self->priv->driver); + case PROP_DRIVERS: + g_value_set_boxed (value, self->priv->drivers); break; case PROP_PLUGIN: g_value_set_string (value, self->priv->plugin); @@ -986,7 +986,7 @@ finalize (GObject *object) self->priv->device); g_free (self->priv->device); - g_free (self->priv->driver); + g_strfreev (self->priv->drivers); g_free (self->priv->plugin); G_OBJECT_CLASS (mm_base_modem_parent_class)->finalize (object); @@ -1065,13 +1065,13 @@ mm_base_modem_class_init (MMBaseModemClass *klass) G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); g_object_class_install_property (object_class, PROP_DEVICE, properties[PROP_DEVICE]); - properties[PROP_DRIVER] = - g_param_spec_string (MM_BASE_MODEM_DRIVER, - "Driver", - "Kernel driver", - NULL, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); - g_object_class_install_property (object_class, PROP_DRIVER, properties[PROP_DRIVER]); + properties[PROP_DRIVERS] = + g_param_spec_boxed (MM_BASE_MODEM_DRIVERS, + "Drivers", + "Kernel drivers", + G_TYPE_STRV, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); + g_object_class_install_property (object_class, PROP_DRIVERS, properties[PROP_DRIVERS]); properties[PROP_PLUGIN] = g_param_spec_string (MM_BASE_MODEM_PLUGIN, diff --git a/src/mm-base-modem.h b/src/mm-base-modem.h index c6cc752d..e0eb18d7 100644 --- a/src/mm-base-modem.h +++ b/src/mm-base-modem.h @@ -44,7 +44,7 @@ typedef struct _MMBaseModemPrivate MMBaseModemPrivate; #define MM_BASE_MODEM_MAX_TIMEOUTS "base-modem-max-timeouts" #define MM_BASE_MODEM_VALID "base-modem-valid" #define MM_BASE_MODEM_DEVICE "base-modem-device" -#define MM_BASE_MODEM_DRIVER "base-modem-driver" +#define MM_BASE_MODEM_DRIVERS "base-modem-drivers" #define MM_BASE_MODEM_PLUGIN "base-modem-plugin" #define MM_BASE_MODEM_VENDOR_ID "base-modem-vendor-id" #define MM_BASE_MODEM_PRODUCT_ID "base-modem-product-id" @@ -131,9 +131,9 @@ void mm_base_modem_set_valid (MMBaseModem *self, gboolean valid); gboolean mm_base_modem_get_valid (MMBaseModem *self); -const gchar *mm_base_modem_get_device (MMBaseModem *self); -const gchar *mm_base_modem_get_driver (MMBaseModem *self); -const gchar *mm_base_modem_get_plugin (MMBaseModem *self); +const gchar *mm_base_modem_get_device (MMBaseModem *self); +const gchar **mm_base_modem_get_drivers (MMBaseModem *self); +const gchar *mm_base_modem_get_plugin (MMBaseModem *self); guint mm_base_modem_get_vendor_id (MMBaseModem *self); guint mm_base_modem_get_product_id (MMBaseModem *self); diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c index 4d11562c..4193651f 100644 --- a/src/mm-broadband-modem.c +++ b/src/mm-broadband-modem.c @@ -7631,14 +7631,14 @@ mm_broadband_modem_take_and_convert_to_current_charset (MMBroadbandModem *self, MMBroadbandModem * mm_broadband_modem_new (const gchar *device, - const gchar *driver, + const gchar **drivers, const gchar *plugin, guint16 vendor_id, guint16 product_id) { return g_object_new (MM_TYPE_BROADBAND_MODEM, MM_BASE_MODEM_DEVICE, device, - MM_BASE_MODEM_DRIVER, driver, + MM_BASE_MODEM_DRIVERS, drivers, MM_BASE_MODEM_PLUGIN, plugin, MM_BASE_MODEM_VENDOR_ID, vendor_id, MM_BASE_MODEM_PRODUCT_ID, product_id, diff --git a/src/mm-broadband-modem.h b/src/mm-broadband-modem.h index 74324847..a8c10581 100644 --- a/src/mm-broadband-modem.h +++ b/src/mm-broadband-modem.h @@ -75,7 +75,7 @@ struct _MMBroadbandModemClass { GType mm_broadband_modem_get_type (void); MMBroadbandModem *mm_broadband_modem_new (const gchar *device, - const gchar *driver, + const gchar **drivers, const gchar *plugin, guint16 vendor_id, guint16 product_id); diff --git a/src/mm-device.c b/src/mm-device.c index 1733f943..6af43dae 100644 --- a/src/mm-device.c +++ b/src/mm-device.c @@ -53,8 +53,8 @@ struct _MMDevicePrivate { guint16 vendor; guint16 product; - /* Kernel driver managing this device */ - gchar *driver; + /* Kernel drivers managing this device */ + gchar **drivers; /* Best plugin to manage this device */ MMPlugin *plugin; @@ -217,6 +217,37 @@ get_driver_name (GUdevDevice *device) return ret; } +static void +add_port_driver (MMDevice *self, + GUdevDevice *udev_port) +{ + gchar *driver = NULL; + guint n_items; + guint i; + + driver = get_driver_name (udev_port); + + n_items = (self->priv->drivers ? g_strv_length (self->priv->drivers) : 0); + if (n_items > 0) { + /* Add driver to our list of drivers, if not already there */ + for (i = 0; self->priv->drivers[i]; i++) { + if (g_str_equal (self->priv->drivers[i], driver)) { + g_free (driver); + driver = NULL; + break; + } + } + } + + if (!driver) + return; + + self->priv->drivers = g_realloc (self->priv->drivers, + (n_items + 2) * sizeof (gchar *)); + self->priv->drivers[n_items] = driver; + self->priv->drivers[n_items + 1] = NULL; +} + void mm_device_grab_port (MMDevice *self, GUdevDevice *udev_port) @@ -226,10 +257,8 @@ mm_device_grab_port (MMDevice *self, if (mm_device_owns_port (self, udev_port)) return; - /* Get the driver name and vendor/product IDs out of the first port - * grabbed */ + /* Get the vendor/product IDs out of the first port grabbed */ if (!self->priv->port_probes) { - self->priv->driver = get_driver_name (udev_port); if (!get_device_ids (udev_port, &self->priv->vendor, &self->priv->product)) { @@ -238,6 +267,9 @@ mm_device_grab_port (MMDevice *self, } } + /* Add new port driver */ + add_port_driver (self, udev_port); + /* Create and store new port probe */ probe = mm_port_probe_new (self, udev_port); self->priv->port_probes = g_list_prepend (self->priv->port_probes, probe); @@ -438,10 +470,10 @@ mm_device_get_path (MMDevice *self) return self->priv->udev_device_path; } -const gchar * -mm_device_get_driver (MMDevice *self) +const gchar ** +mm_device_get_drivers (MMDevice *self) { - return self->priv->driver; + return (const gchar **)self->priv->drivers; } guint16 @@ -636,7 +668,7 @@ finalize (GObject *object) MMDevice *self = MM_DEVICE (object); g_free (self->priv->udev_device_path); - g_free (self->priv->driver); + g_strfreev (self->priv->drivers); G_OBJECT_CLASS (mm_device_parent_class)->finalize (object); } diff --git a/src/mm-device.h b/src/mm-device.h index 36b905e1..c8aa6412 100644 --- a/src/mm-device.h +++ b/src/mm-device.h @@ -74,18 +74,18 @@ gboolean mm_device_create_modem (MMDevice *self, GError **error); void mm_device_remove_modem (MMDevice *self); -const gchar *mm_device_get_path (MMDevice *self); -const gchar *mm_device_get_driver (MMDevice *self); -guint16 mm_device_get_vendor (MMDevice *self); -guint16 mm_device_get_product (MMDevice *self); -GUdevDevice *mm_device_peek_udev_device (MMDevice *self); -GUdevDevice *mm_device_get_udev_device (MMDevice *self); -void mm_device_set_plugin (MMDevice *self, - GObject *plugin); -GObject *mm_device_peek_plugin (MMDevice *self); -GObject *mm_device_get_plugin (MMDevice *self); -MMBaseModem *mm_device_peek_modem (MMDevice *self); -MMBaseModem *mm_device_get_modem (MMDevice *self); +const gchar *mm_device_get_path (MMDevice *self); +const gchar **mm_device_get_drivers (MMDevice *self); +guint16 mm_device_get_vendor (MMDevice *self); +guint16 mm_device_get_product (MMDevice *self); +GUdevDevice *mm_device_peek_udev_device (MMDevice *self); +GUdevDevice *mm_device_get_udev_device (MMDevice *self); +void mm_device_set_plugin (MMDevice *self, + GObject *plugin); +GObject *mm_device_peek_plugin (MMDevice *self); +GObject *mm_device_get_plugin (MMDevice *self); +MMBaseModem *mm_device_peek_modem (MMDevice *self); +MMBaseModem *mm_device_get_modem (MMDevice *self); GObject *mm_device_peek_port_probe (MMDevice *self, GUdevDevice *udev_port); diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c index c8d1b96b..6bb38224 100644 --- a/src/mm-iface-modem.c +++ b/src/mm-iface-modem.c @@ -3185,14 +3185,14 @@ interface_initialization_step (InitializationContext *ctx) g_free (device); } /* Load driver if not done before */ - if (!mm_gdbus_modem_get_driver (ctx->skeleton)) { - gchar *driver; + if (!mm_gdbus_modem_get_drivers (ctx->skeleton)) { + gchar **drivers; g_object_get (ctx->self, - MM_BASE_MODEM_DRIVER, &driver, + MM_BASE_MODEM_DRIVERS, &drivers, NULL); - mm_gdbus_modem_set_driver (ctx->skeleton, driver); - g_free (driver); + mm_gdbus_modem_set_drivers (ctx->skeleton, (const gchar * const *)drivers); + g_strfreev (drivers); } /* Load plugin if not done before */ if (!mm_gdbus_modem_get_plugin (ctx->skeleton)) { @@ -3563,7 +3563,7 @@ mm_iface_modem_initialize (MMIfaceModem *self, mm_gdbus_modem_set_own_numbers (skeleton, NULL); mm_gdbus_modem_set_device_identifier (skeleton, NULL); mm_gdbus_modem_set_device (skeleton, NULL); - mm_gdbus_modem_set_driver (skeleton, NULL); + mm_gdbus_modem_set_drivers (skeleton, NULL); mm_gdbus_modem_set_plugin (skeleton, NULL); mm_gdbus_modem_set_equipment_identifier (skeleton, NULL); mm_gdbus_modem_set_unlock_required (skeleton, MM_MODEM_LOCK_UNKNOWN); diff --git a/src/mm-plugin.c b/src/mm-plugin.c index d078667a..a9ce28b0 100644 --- a/src/mm-plugin.c +++ b/src/mm-plugin.c @@ -199,34 +199,45 @@ apply_pre_probing_filters (MMPlugin *self, * drivers are not supported. If that is the case, filter by driver */ if (self->priv->drivers || self->priv->forbidden_drivers) { - const gchar *driver; + static const gchar *virtual_drivers [] = { "virtual", NULL }; + const gchar **drivers; /* Detect any modems accessible through the list of virtual ports */ - driver = (is_virtual_port (g_udev_device_get_name (port)) ? - "virtual" : - mm_device_get_driver (device)); + drivers = (is_virtual_port (g_udev_device_get_name (port)) ? + virtual_drivers : + mm_device_get_drivers (device)); /* If error retrieving driver: unsupported */ - if (!driver) + if (!drivers) return TRUE; /* Filtering by allowed drivers */ if (self->priv->drivers) { - for (i = 0; self->priv->drivers[i]; i++) { - if (g_str_equal (driver, self->priv->drivers[i])) - break; + gboolean found = FALSE; + + for (i = 0; self->priv->drivers[i] && !found; i++) { + guint j; + + for (j = 0; drivers[j] && !found; j++) { + if (g_str_equal (drivers[j], self->priv->drivers[i])) + found = TRUE; + } } /* If we didn't match any driver: unsupported */ - if (!self->priv->drivers[i]) + if (!found) return TRUE; } /* Filtering by forbidden drivers */ else { for (i = 0; self->priv->forbidden_drivers[i]; i++) { - /* If we match a forbidden driver: unsupported */ - if (g_str_equal (driver, self->priv->forbidden_drivers[i])) - return TRUE; + guint j; + + for (j = 0; drivers[j]; j++) { + /* If we match a forbidden driver: unsupported */ + if (g_str_equal (drivers[j], self->priv->forbidden_drivers[i])) + return TRUE; + } } } } @@ -662,7 +673,7 @@ mm_plugin_create_modem (MMPlugin *self, /* Let the plugin create the modem from the port probe results */ modem = MM_PLUGIN_GET_CLASS (self)->create_modem (MM_PLUGIN (self), mm_device_get_path (device), - mm_device_get_driver (device), + mm_device_get_drivers (device), mm_device_get_vendor (device), mm_device_get_product (device), port_probes, diff --git a/src/mm-plugin.h b/src/mm-plugin.h index e5796e63..14c16d35 100644 --- a/src/mm-plugin.h +++ b/src/mm-plugin.h @@ -84,7 +84,7 @@ struct _MMPluginClass { * a list of port probes (Mandatory) */ MMBaseModem *(*create_modem) (MMPlugin *plugin, const gchar *sysfs_path, - const gchar *driver, + const gchar **drivers, guint16 vendor, guint16 product, GList *probes, |