aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@gnu.org>2011-09-15 22:30:12 +0200
committerAleksander Morgado <aleksander@lanedo.com>2012-03-15 14:14:21 +0100
commitf92fbcc906fe080afb29aeada8bbfe1beca060da (patch)
tree0d0adf19436540ecae5ac8bf1868e0ac9f7b1abd /src
parenta67d5dc1b84db6cc1517475b90a047d6d9a19968 (diff)
plugin-base: apply pre-probing filtering
Before any real probing is launched in the port, the plugin will check whether it can skip the request based on the following filters: - Subsystems - Drivers - udev-reported Vendor ID - udev-reported Product ID - udev-reported Tags
Diffstat (limited to 'src')
-rw-r--r--src/mm-plugin-base.c102
1 files changed, 102 insertions, 0 deletions
diff --git a/src/mm-plugin-base.c b/src/mm-plugin-base.c
index c5fe8d49..18a3c8ad 100644
--- a/src/mm-plugin-base.c
+++ b/src/mm-plugin-base.c
@@ -269,6 +269,96 @@ is_virtual_port (const gchar *device_name)
return FALSE;
}
+/* Returns TRUE if the support check request was filtered out */
+static gboolean
+apply_pre_probing_filters (MMPluginBase *self,
+ GUdevDevice *port,
+ const gchar *subsys,
+ const gchar *name,
+ const gchar *driver)
+{
+ MMPluginBasePrivate *priv = MM_PLUGIN_BASE_GET_PRIVATE (self);
+ guint i;
+
+ /* The plugin may specify that only some subsystems are supported. If that
+ * is the case, filter by subsystem */
+ if (priv->subsystems) {
+ for (i = 0; priv->subsystems[i]; i++) {
+ if (g_str_equal (subsys, priv->subsystems[i]))
+ break;
+ }
+ if (!priv->subsystems[i])
+ return TRUE; /* Filtered by subsystem! */
+ }
+
+ /* The plugin may specify that only some drivers are supported. If that
+ * is the case, filter by driver */
+ if (priv->drivers) {
+ for (i = 0; priv->drivers[i]; i++) {
+ if (g_str_equal (driver, priv->drivers[i]))
+ break;
+ }
+
+ /* If we didn't match any driver: unsupported */
+ if (!priv->drivers[i])
+ return TRUE;
+ }
+
+ /* The plugin may specify that only some vendor IDs are supported. If that
+ * is the case, filter by vendor ID. */
+ if (priv->vendor_ids) {
+ guint16 vendor = 0;
+ guint16 product = 0;
+
+ mm_plugin_base_get_device_ids (self, subsys, name, &vendor, &product);
+
+ /* If we didn't get any vendor: unsupported */
+ if (!vendor)
+ return TRUE;
+
+ for (i = 0; priv->vendor_ids[i]; i++)
+ if (vendor == priv->vendor_ids[i])
+ break;
+
+ /* If we didn't match any vendor: unsupported */
+ if (!priv->vendor_ids[i])
+ return TRUE;
+
+ /* The plugin may specify that only some product IDs are supported. If
+ * that is the case, filter by product ID */
+ if (priv->product_ids) {
+ /* If we didn't get any product: unsupported */
+ if (!product)
+ return TRUE;
+
+ for (i = 0; priv->product_ids[i]; i++)
+ if (product == priv->product_ids[i])
+ break;
+
+ /* If we didn't match any product: unsupported */
+ if (!priv->product_ids[i])
+ return TRUE;
+ }
+ }
+
+ /* The plugin may specify that only ports with some given udev tags are
+ * supported. If that is the case, filter by udev tag */
+ if (priv->udev_tags) {
+ for (i = 0; priv->udev_tags[i]; i++) {
+ /* Check if the port was tagged */
+ if (g_udev_device_get_property_as_boolean (port,
+ priv->udev_tags[i]))
+ break;
+ }
+
+ /* If we didn't match any udev tag: unsupported */
+ if (!priv->udev_tags[i])
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
static void
port_probe_run_ready (MMPortProbe *probe,
GAsyncResult *probe_result,
@@ -376,6 +466,18 @@ supports_port (MMPlugin *plugin,
goto out;
}
+ /* Apply filters before launching the probing */
+ if (apply_pre_probing_filters (self,
+ port,
+ subsys,
+ name,
+ driver)) {
+ /* Filtered! */
+ g_simple_async_result_set_op_res_gboolean (async_result, FALSE);
+ g_simple_async_result_complete_in_idle (async_result);
+ goto out;
+ }
+
/* Need to launch new probing */
probe = mm_port_probe_cache_get (port, physdev_path, driver);
g_assert (probe);