filter: additional strict rules when all device ports available

All the previous filter rules were applicable per-port independently.
But, we also want to apply rules on a port based on the existence of
other ports on the same device (e.g. allow TTY if the device also has
a NET port). In this case, we need to wait for all ports to appear and
then apply the additional rules.

We re-use the "min wait time" timeout in the plugin-manager for this
same purpose. This timeout is setup to wait for ports to appear before
starting the probing process (e.g. so that plugin filters like the
forbidden-drivers one work). The very same timeout can therefore be
used to check whether we start the probing or not based on additional
filter rules.
This commit is contained in:
Aleksander Morgado
2017-12-05 10:58:29 +01:00
parent ee570d44dc
commit 0850fe4f6d
5 changed files with 95 additions and 10 deletions
+40 -5
View File
@@ -38,12 +38,15 @@ G_DEFINE_TYPE_EXTENDED (MMPluginManager, mm_plugin_manager, G_TYPE_OBJECT, 0,
enum {
PROP_0,
PROP_PLUGIN_DIR,
PROP_FILTER,
LAST_PROP
};
struct _MMPluginManagerPrivate {
/* Path to look for plugins */
gchar *plugin_dir;
/* Device filter */
MMFilter *filter;
/* This list contains all plugins except for the generic one, order is not
* important. It is loaded once when the program starts, and the list is NOT
@@ -1106,19 +1109,34 @@ device_context_run_port_context (DeviceContext *device_context,
static gboolean
device_context_min_wait_time_elapsed (DeviceContext *device_context)
{
MMPluginManager *self;
GList *l;
GList *tmp;
self = device_context->self;
device_context->min_wait_time_id = 0;
mm_dbg ("[plugin manager] task %s: min wait time elapsed", device_context->name);
/* Move list of port contexts out of the wait list */
g_assert (!device_context->port_contexts);
device_context->port_contexts = device_context->wait_port_contexts;
tmp = device_context->wait_port_contexts;
device_context->wait_port_contexts = NULL;
/* Launch supports check for each port in the Plugin Manager */
for (l = device_context->port_contexts; l; l = g_list_next (l))
device_context_run_port_context (device_context, (PortContext *)(l->data));
for (l = tmp; l; l = g_list_next (l)) {
PortContext *port_context = (PortContext *)(l->data);
if (!mm_filter_device_and_port (self->priv->filter, port_context->device, port_context->port)) {
/* If port is filtered, unref it right away */
port_context_unref (port_context);
} else {
/* If port not filtered, store and run it */
device_context->port_contexts = g_list_append (device_context->port_contexts, port_context);
device_context_run_port_context (device_context, port_context);
}
}
g_list_free (tmp);
return G_SOURCE_REMOVE;
}
@@ -1620,13 +1638,15 @@ out:
}
MMPluginManager *
mm_plugin_manager_new (const gchar *plugin_dir,
GError **error)
mm_plugin_manager_new (const gchar *plugin_dir,
MMFilter *filter,
GError **error)
{
return g_initable_new (MM_TYPE_PLUGIN_MANAGER,
NULL,
error,
MM_PLUGIN_MANAGER_PLUGIN_DIR, plugin_dir,
MM_PLUGIN_MANAGER_FILTER, filter,
NULL);
}
@@ -1652,6 +1672,9 @@ set_property (GObject *object,
g_free (priv->plugin_dir);
priv->plugin_dir = g_value_dup_string (value);
break;
case PROP_FILTER:
priv->filter = g_value_dup_object (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -1670,6 +1693,9 @@ get_property (GObject *object,
case PROP_PLUGIN_DIR:
g_value_set_string (value, priv->plugin_dir);
break;
case PROP_FILTER:
g_value_set_object (value, priv->filter);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -1700,6 +1726,8 @@ dispose (GObject *object)
g_free (self->priv->plugin_dir);
self->priv->plugin_dir = NULL;
g_clear_object (&self->priv->filter);
G_OBJECT_CLASS (mm_plugin_manager_parent_class)->dispose (object);
}
@@ -1729,4 +1757,11 @@ mm_plugin_manager_class_init (MMPluginManagerClass *manager_class)
"Where to look for plugins",
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property
(object_class, PROP_FILTER,
g_param_spec_object (MM_PLUGIN_MANAGER_FILTER,
"Filter",
"Device filter",
MM_TYPE_FILTER,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
}