--- a/gplugin-query/gplugin-query.c Tue Aug 03 00:35:00 2021 -0500
+++ b/gplugin-query/gplugin-query.c Tue Aug 03 02:25:55 2021 -0500
@@ -100,6 +100,7 @@
output_plugin(const gchar *id)
+ GPluginManager *manager = gplugin_manager_get_default(); GSList *plugins = NULL, *l = NULL;
gboolean first = TRUE, header_output = FALSE;
@@ -108,7 +109,7 @@
#define MAIN_FORMAT MAIN_FORMAT_NEL "%s\n"
#define STR_OR_EMPTY(str) ((str) ? (str) : "")
- plugins = gplugin_manager_find_plugins(id);
+ plugins = gplugin_manager_find_plugins(manager, id); printf("%s not found\n", id);
@@ -291,6 +292,7 @@
main(gint argc, gchar **argv)
+ GPluginManager *manager = NULL; GOptionContext *ctx = NULL;
GOptionGroup *group = NULL;
@@ -322,10 +324,13 @@
gplugin_init(GPLUGIN_CORE_FLAGS_NONE);
+ manager = gplugin_manager_get_default(); - for(path = gplugin_manager_get_paths(); path; path = path->next) {
+ for(path = gplugin_manager_get_paths(manager); path; printf("%s\n", (gchar *)path->data);
@@ -338,7 +343,7 @@
- gplugin_manager_refresh();
+ gplugin_manager_refresh(manager); /* check if the user gave us atleast one plugin, and output them */
@@ -359,7 +364,7 @@
- GList *plugins = gplugin_manager_list_plugins();
+ GList *plugins = gplugin_manager_list_plugins(manager); if(!output_plugins(plugins))
--- a/gplugin/gplugin-loader-tests.c Tue Aug 03 00:35:00 2021 -0500
+++ b/gplugin/gplugin-loader-tests.c Tue Aug 03 02:25:55 2021 -0500
@@ -36,6 +36,7 @@
gplugin_test_loader_full(gconstpointer d)
+ GPluginManager *manager = gplugin_manager_get_default(); GPluginPlugin *plugin = NULL;
GPluginPluginInfo *info = NULL;
@@ -45,7 +46,7 @@
id = g_strdup_printf("gplugin/%s-basic-plugin", (const gchar *)d);
- plugin = gplugin_manager_find_plugin(id);
+ plugin = gplugin_manager_find_plugin(manager, id); g_assert_nonnull(plugin);
info = gplugin_plugin_get_info(plugin);
@@ -78,14 +79,14 @@
GPLUGIN_PLUGIN_STATE_QUERIED);
- gplugin_manager_load_plugin(plugin, &error);
+ gplugin_manager_load_plugin(manager, plugin, &error); g_assert_no_error(error);
gplugin_plugin_get_state(plugin),
GPLUGIN_PLUGIN_STATE_LOADED);
- gplugin_manager_unload_plugin(plugin, &error);
+ gplugin_manager_unload_plugin(manager, plugin, &error); g_assert_no_error(error);
gplugin_plugin_get_state(plugin),
@@ -98,17 +99,18 @@
gplugin_test_loader_load_failed(gconstpointer d)
+ GPluginManager *manager = gplugin_manager_get_default(); GPluginPlugin *plugin = NULL;
id = g_strdup_printf("gplugin/%s-load-failed", (const gchar *)d);
- plugin = gplugin_manager_find_plugin(id);
+ plugin = gplugin_manager_find_plugin(manager, id); g_assert_nonnull(plugin);
- ret = gplugin_manager_load_plugin(plugin, &error);
+ ret = gplugin_manager_load_plugin(manager, plugin, &error); g_assert_error(error, GPLUGIN_DOMAIN, 0);
@@ -130,17 +132,18 @@
gplugin_test_loader_load_exception(gconstpointer d)
+ GPluginManager *manager = gplugin_manager_get_default(); GPluginPlugin *plugin = NULL;
id = g_strdup_printf("gplugin/%s-load-exception", (const gchar *)d);
- plugin = gplugin_manager_find_plugin(id);
+ plugin = gplugin_manager_find_plugin(manager, id); g_assert_nonnull(plugin);
- ret = gplugin_manager_load_plugin(plugin, &error);
+ ret = gplugin_manager_load_plugin(manager, plugin, &error); g_assert_error(error, GPLUGIN_DOMAIN, 0);
@@ -162,17 +165,18 @@
gplugin_test_loader_unload_failed(gconstpointer d)
+ GPluginManager *manager = gplugin_manager_get_default(); GPluginPlugin *plugin = NULL;
id = g_strdup_printf("gplugin/%s-unload-failed", (const gchar *)d);
- plugin = gplugin_manager_find_plugin(id);
+ plugin = gplugin_manager_find_plugin(manager, id); g_assert_nonnull(plugin);
- ret = gplugin_manager_load_plugin(plugin, &error);
+ ret = gplugin_manager_load_plugin(manager, plugin, &error); g_assert_no_error(error);
@@ -180,7 +184,7 @@
GPLUGIN_PLUGIN_STATE_LOADED);
- ret = gplugin_manager_unload_plugin(plugin, &error);
+ ret = gplugin_manager_unload_plugin(manager, plugin, &error); g_assert_error(error, GPLUGIN_DOMAIN, 0);
@@ -202,6 +206,7 @@
gplugin_test_loader_dependencies(gconstpointer d)
+ GPluginManager *manager = gplugin_manager_get_default(); GPluginPlugin *plugin = NULL;
GPluginPluginInfo *info = NULL;
@@ -210,7 +215,7 @@
id = g_strdup_printf("gplugin/%s-dependent-plugin", (const gchar *)d);
- plugin = gplugin_manager_find_plugin(id);
+ plugin = gplugin_manager_find_plugin(manager, id); g_assert_nonnull(plugin);
@@ -256,17 +261,23 @@
+ GPluginManager *manager = NULL; gplugin_init(GPLUGIN_CORE_FLAGS_NONE);
+ manager = gplugin_manager_get_default(); g_setenv("GI_TYPELIB_PATH", GI_TYPELIB_PATH, TRUE);
- gplugin_manager_append_path(loader_dir);
+ gplugin_manager_append_path(manager, loader_dir);
- gplugin_manager_append_path(plugin_dir);
+ gplugin_manager_append_path(manager, plugin_dir); - gplugin_manager_refresh();
+ gplugin_manager_refresh(manager); gplugin_loader_tests_add_tests(short_name);
--- a/gplugin/gplugin-manager.c Tue Aug 03 00:35:00 2021 -0500
+++ b/gplugin/gplugin-manager.c Tue Aug 03 02:25:55 2021 -0500
@@ -47,42 +47,6 @@
- * @append_path: The <literal>append_path</literal> function is responsible for
- * adding a path to the end of the list of plugin search paths.
- * @prepend_path: The <literal>prepend_path</literal> function is responsible
- * for adding a path to the beginning of the list of plugin
- * @remove_path: The <literal>remove_path</literal> function is responsible
- * for removing a path from the list of plugin search paths.
- * @remove_paths: The <literal>remove_paths</literal> function is responsible
- * for clearing the list of plugin search paths.
- * @get_paths: The <literal>get_paths</literal> function is reponsible for
- * returning a list of plugin search paths.
- * @register_loader: The <literal>register_loader</literal> function is
- * responsible for registering plugin loaders.
- * @unregister_loader: The <literal>unregister_loader</literal> function is
- * responsible for unregistering plugin loaders.
- * @get_loaders: The <literal>get_loaders</literal> function is responsible
- * for returning a list of all registered plugin loaders.
- * @refresh: The <literal>refresh</literal> function is responsible for
- * refreshing the state of all plugins by searching the plugin search
- * @foreach: The <literal>foreach</literal> function is responsible for calling
- * the given #GPluginManagerForeachFunc for each plugin.
- * @find_plugins: The <literal>find_plugins</literal> function is responsible
- * for returning a list of all plugins that match the given id.
- * @find_plugins_with_state: The <literal>find_plugins_with_state</literal>
- * function is responsible for returning a list of
- * all plugins matching the given #GPluginPluginState.
- * @list_plugins: The <literal>list_plugins</literal> function is responsible
- * for returning a list of all known plugin ids.
- * @get_plugin_dependencies: The <literal>get_plugin_dependencies</literal>
- * function is responsible for returning a list of
- * #GPluginPlugin's that the given plugin depends on.
- * @load_plugin: The <literal>load_plugin</literal> method is responsible for
- * @unload_plugin: The <literal>unload_plugin</literal> method is responsible
- * for unloading plugins.
* @loading_plugin: Signal emitted before a plugin is loaded.
* @loaded_plugin: Signal emitted after a plugin is loaded.
* @load_failed: Signal emitted when a plugin fails to load.
@@ -92,6 +56,7 @@
* Virtual function table for #GPluginManager.
/******************************************************************************
*****************************************************************************/
@@ -126,7 +91,7 @@
/******************************************************************************
*****************************************************************************/
-GPluginManager *instance = NULL;
+GPluginManager *default_manager = NULL; static guint signals[N_SIGNALS] = {
@@ -249,19 +214,344 @@
+gplugin_manager_load_dependencies( + GPluginManager *manager, + GPluginPluginInfo *info, + GSList *dependencies = NULL, *l = NULL; + GError *ourerror = NULL; + gboolean all_loaded = TRUE; + gplugin_manager_get_plugin_dependencies(manager, plugin, &ourerror); + g_propagate_error(error, ourerror); + for(l = dependencies; l != NULL; l = l->next) { + GPluginPlugin *dependency = GPLUGIN_PLUGIN(l->data); + gboolean loaded = FALSE; + loaded = gplugin_manager_load_plugin(manager, dependency, &ourerror); + if(!loaded || ourerror != NULL) { + g_propagate_error(error, ourerror); + g_slist_free_full(dependencies, g_object_unref); /******************************************************************************
*****************************************************************************/
+gplugin_manager_loading_cb( + G_GNUC_UNUSED GPluginManager *manager, + G_GNUC_UNUSED GPluginPlugin *plugin, + G_GNUC_UNUSED GError **error) +gplugin_manager_unloading_cb( + G_GNUC_UNUSED GPluginManager *manager, + G_GNUC_UNUSED GPluginPlugin *plugin, + G_GNUC_UNUSED GError **error) +/****************************************************************************** + * GObject Implementation + *****************************************************************************/ -gplugin_manager_real_append_path(GPluginManager *manager, const gchar *path)
+gplugin_manager_finalize(GObject *obj) + GPluginManager *manager = GPLUGIN_MANAGER(obj); + GPluginManagerPrivate *priv = gplugin_manager_get_instance_private(manager); + g_queue_free_full(priv->paths, g_free); + /* unload all of the loaded plugins */ + gplugin_manager_foreach_unload_plugin, + /* free all the data in the plugins hash table and destroy it */ + g_hash_table_foreach_remove( + gplugin_manager_remove_list_value, + g_clear_pointer(&priv->plugins, g_hash_table_destroy); + /* destroy the filename view */ + g_clear_pointer(&priv->plugins_filename_view, g_hash_table_destroy); + /* clean up our list of loaders */ + g_slist_free_full(priv->loaders, g_object_unref); + /* free all the data in the loaders hash table and destroy it */ + g_hash_table_foreach_remove( + priv->loaders_by_extension, + gplugin_manager_remove_list_value, + g_clear_pointer(&priv->loaders_by_extension, g_hash_table_destroy); + /* call the base class's destructor */ + G_OBJECT_CLASS(gplugin_manager_parent_class)->finalize(obj); +gplugin_manager_class_init(GPluginManagerClass *klass) + GObjectClass *obj_class = G_OBJECT_CLASS(klass); + GPluginManagerClass *manager_class = GPLUGIN_MANAGER_CLASS(klass); + obj_class->finalize = gplugin_manager_finalize; + manager_class->loading_plugin = gplugin_manager_loading_cb; + manager_class->unloading_plugin = gplugin_manager_unloading_cb; + * GPluginManager::loading-plugin: + * @manager: The #GPluginManager instance. + * @plugin: The #GPluginPlugin that's about to be loaded. + * @error: Return address for a #GError. + * Emitted before @plugin is loaded. + * Return FALSE to stop loading + signals[SIG_LOADING] = g_signal_new( + G_OBJECT_CLASS_TYPE(manager_class), + G_STRUCT_OFFSET(GPluginManagerClass, loading_plugin), + gplugin_boolean_accumulator, + * GPluginManager::loaded-plugin: + * @manager: the #gpluginpluginmanager instance. + * @plugin: the #gpluginplugin that's about to be loaded. + * emitted after a plugin is loaded. + signals[SIG_LOADED] = g_signal_new( + G_OBJECT_CLASS_TYPE(manager_class), + G_STRUCT_OFFSET(GPluginManagerClass, loaded_plugin), + * GPluginManager::load-plugin-failed: + * @manager: The #GPluginManager instance. + * @plugin: The #GPluginPlugin that failed to load. + * emitted after a plugin fails to load. + signals[SIG_LOAD_FAILED] = g_signal_new( + G_OBJECT_CLASS_TYPE(manager_class), + G_STRUCT_OFFSET(GPluginManagerClass, load_failed), + * GPluginManager::unloading-plugin + * @manager: the #GPluginManager instance. + * @plugin: the #GPluginPlugin that's about to be unloaded. + * @error: Return address for a #GError. + * emitted before a plugin is unloaded. + * Return FALSE to stop unloading + signals[SIG_UNLOADING] = g_signal_new( + G_OBJECT_CLASS_TYPE(manager_class), + G_STRUCT_OFFSET(GPluginManagerClass, unloading_plugin), + gplugin_boolean_accumulator, + * GPluginManager::unloaded-plugin: + * @manager: the #gpluginpluginmanager instance. + * @plugin: the #gpluginplugin that's about to be loaded. + * emitted after a plugin is successfully unloaded. + signals[SIG_UNLOADED] = g_signal_new( + G_OBJECT_CLASS_TYPE(manager_class), + G_STRUCT_OFFSET(GPluginManagerClass, unloaded_plugin), + * GPluginManager::unload-plugin-failed: + * @manager: The #GPluginManager instance. + * @plugin: The #GPluginPlugin instance that failed to unload. + * @error: A #GError instance. + * Emitted when @manager was asked to unload @plugin, but @plugin returned + * %FALSE when its unload function was called. + signals[SIG_UNLOAD_FAILED] = g_signal_new( + "unload-plugin-failed", + G_OBJECT_CLASS_TYPE(manager_class), + G_STRUCT_OFFSET(GPluginManagerClass, unload_plugin_failed), +gplugin_manager_init(GPluginManager *manager) + GPluginManagerPrivate *priv = gplugin_manager_get_instance_private(manager); + priv->paths = g_queue_new(); + /* the plugins hashtable is keyed on a plugin id and holds a GSList of all + * plugins that share that id. + g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); + /* the filename view is hash table keyed on the filename of the plugin with + * a value of the plugin itself. + priv->plugins_filename_view = + g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_object_unref); + /* The loaders_by_extension hash table is keyed on the supported extensions + * of the loader. Which means that a loader that supports multiple + * extensions will be in the table multiple times. + * We deal with collisions by using a GSList for the value which will hold + * references to instances of the actual loaders. + * Storing this in this method allows us to quickly figure out which loader + * to use by the filename and helps us to avoid iterating the loaders table + priv->loaders_by_extension = g_hash_table_new_full( + gplugin_manager_str_hash, +/****************************************************************************** + *****************************************************************************/ +gplugin_manager_private_init(gboolean register_native_loader) + if(GPLUGIN_IS_MANAGER(default_manager)) { + default_manager = g_object_new(GPLUGIN_TYPE_MANAGER, NULL); + if(register_native_loader) { + if(!gplugin_manager_register_loader( + GPLUGIN_TYPE_NATIVE_LOADER, + g_error("failed to register loader: %s", error->message); + g_error("failed to register loader: unknown failure"); + dependency_regex = g_regex_new(dependency_pattern, 0, 0, NULL); +gplugin_manager_private_uninit(void) + g_regex_unref(dependency_regex); + g_clear_object(&default_manager); +/****************************************************************************** + *****************************************************************************/ + * gplugin_manager_append_path: + * @manager: The #GPluginManager instance. + * @path: A path to add to the end of the plugin search paths. + * Adds @path to the end of the list of paths to search for plugins. +gplugin_manager_append_path(GPluginManager *manager, const gchar *path) GPluginManagerPrivate *priv = NULL;
gchar *normalized = NULL;
+ g_return_if_fail(GPLUGIN_IS_MANAGER(manager)); + g_return_if_fail(path != NULL); normalized = gplugin_manager_normalize_path(path);
@@ -278,16 +568,22 @@
-gplugin_manager_real_prepend_path(GPluginManager *manager, const gchar *path)
+ * gplugin_manager_prepend_path: + * @manager: The #GPluginManager instance. + * @path: A path to add to the beginning of the plugin search paths. + * Adds @path to the beginning of the list of paths to search for plugins. +gplugin_manager_prepend_path(GPluginManager *manager, const gchar *path) GPluginManagerPrivate *priv = NULL;
gchar *normalized = NULL;
+ g_return_if_fail(GPLUGIN_IS_MANAGER(manager)); + g_return_if_fail(path != NULL); normalized = gplugin_manager_normalize_path(path);
@@ -304,13 +600,21 @@
-gplugin_manager_real_remove_path(GPluginManager *manager, const gchar *path)
+ * gplugin_manager_remove_path: + * @manager: The #GPluginManager instance. + * @path: A path to remove from the plugin search paths. + * Removes @path from the list of paths to search for plugins. +gplugin_manager_remove_path(GPluginManager *manager, const gchar *path) GPluginManagerPrivate *priv = NULL;
gchar *normalized = NULL;
+ g_return_if_fail(GPLUGIN_IS_MANAGER(manager)); g_return_if_fail(path != NULL);
normalized = gplugin_manager_normalize_path(path);
@@ -329,26 +633,114 @@
-gplugin_manager_real_remove_paths(GPluginManager *manager)
+ * gplugin_manager_remove_paths: + * @manager: The #GPluginManager instance. + * Clears all paths that are set to search for plugins. +gplugin_manager_remove_paths(GPluginManager *manager) - GPluginManagerPrivate *priv = gplugin_manager_get_instance_private(manager);
+ GPluginManagerPrivate *priv = NULL; + g_return_if_fail(GPLUGIN_IS_MANAGER(manager)); + priv = gplugin_manager_get_instance_private(manager); /* g_queue_clear_full was added in 2.60 but we require 2.40 */
g_queue_foreach(priv->paths, (GFunc)g_free, NULL);
g_queue_clear(priv->paths);
-gplugin_manager_real_get_paths(GPluginManager *manager)
+ * gplugin_manager_add_default_paths: + * @manager: The #GPluginManager instance. + * Adds the path that GPlugin was installed to to the plugin search path, as + * well as `${XDG_CONFIG_HOME}/gplugin` so users can install additional loaders +gplugin_manager_add_default_paths(GPluginManager *manager) - GPluginManagerPrivate *priv = gplugin_manager_get_instance_private(manager);
+ g_return_if_fail(GPLUGIN_IS_MANAGER(manager)); + path = g_build_filename(PREFIX, LIBDIR, "gplugin", NULL); + gplugin_manager_prepend_path(manager, path); + path = g_build_filename(g_get_user_config_dir(), "gplugin", NULL); + gplugin_manager_prepend_path(manager, path); + * gplugin_manager_add_app_paths: + * @manager: The #GPluginManager instance. + * @prefix: The installation prefix for the application. + * @appname: The name of the application whose paths to add. + * Adds the application installation path for @appname. This will add + * `@prefix/@appname/plugins` to the list as well as + * `${XDG_CONFIG_HOME}/@appname/plugins`. +gplugin_manager_add_app_paths( + GPluginManager *manager, + g_return_if_fail(GPLUGIN_IS_MANAGER(manager)); + g_return_if_fail(appname != NULL); + path = g_build_filename(prefix, LIBDIR, appname, NULL); + gplugin_manager_prepend_path(manager, path); + path = g_build_filename(g_get_user_config_dir(), appname, "plugins", NULL); + gplugin_manager_prepend_path(manager, path); + * gplugin_manager_get_paths: + * @manager: The #GPluginManager instance. + * Gets the list of paths which will be searched for plugins. + * Returns: (element-type utf8) (transfer none): The list of paths which will + * be searched for plugins. +gplugin_manager_get_paths(GPluginManager *manager) + GPluginManagerPrivate *priv = NULL; + g_return_val_if_fail(GPLUGIN_IS_MANAGER(manager), NULL); + priv = gplugin_manager_get_instance_private(manager); return priv->paths->head;
-gplugin_manager_real_register_loader(
+ * gplugin_manager_register_loader: + * @manager: The #GPluginManager instance. + * @type: #GType of a #GPluginLoader. + * @error: (out) (nullable): The return address for a #GError. + * Registers @type as an available loader. + * Returns: %TRUE if the loader was successfully register, %FALSE otherwise +gplugin_manager_register_loader( @@ -357,6 +749,7 @@
GPluginLoader *loader = NULL;
GSList *l = NULL, *exts = NULL;
+ g_return_val_if_fail(GPLUGIN_IS_MANAGER(manager), FALSE); g_return_val_if_fail(g_type_is_a(type, GPLUGIN_TYPE_LOADER), FALSE);
loader = gplugin_manager_find_loader_by_type(manager, type);
@@ -429,8 +822,19 @@
-gplugin_manager_real_unregister_loader(
+ * gplugin_manager_unregister_loader: + * @manager: The #GPluginManager instance. + * @type: #GType of a #GPluginLoader. + * @error: (out) (nullable): The return address for a #GError. + * Unregisters @type as an available loader. + * Returns: %TRUE if the loader was successfully unregistered, %FALSE + * otherwise with @error set. +gplugin_manager_unregister_loader( @@ -439,6 +843,7 @@
GPluginLoader *loader = NULL;
GSList *l = NULL, *exts = NULL;
+ g_return_val_if_fail(GPLUGIN_IS_MANAGER(manager), FALSE); g_return_val_if_fail(g_type_is_a(type, GPLUGIN_TYPE_LOADER), FALSE);
loader = gplugin_manager_find_loader_by_type(manager, type);
@@ -501,16 +906,35 @@
-gplugin_manager_real_get_loaders(GPluginManager *manager)
+ * gplugin_manager_get_loaders: + * @manager: The #GPluginManager instance. + * Returns a list of all registered #GPluginLoader's. + * Returns: (element-type GPlugin.Loader) (transfer full): Returns a list of all +gplugin_manager_get_loaders(GPluginManager *manager) - GPluginManagerPrivate *priv = gplugin_manager_get_instance_private(manager);
+ GPluginManagerPrivate *priv = NULL; + g_return_val_if_fail(GPLUGIN_IS_MANAGER(manager), FALSE); + priv = gplugin_manager_get_instance_private(manager); return g_slist_copy_deep(priv->loaders, (GCopyFunc)g_object_ref, NULL);
-gplugin_manager_real_refresh(GPluginManager *manager)
+ * gplugin_manager_refresh: + * @manager: The #GPluginManager instance. + * Forces a refresh of all plugins found in the search paths. +gplugin_manager_refresh(GPluginManager *manager) GPluginManagerPrivate *priv = NULL;
@@ -518,6 +942,8 @@
gchar *error_message = NULL;
+ g_return_if_fail(GPLUGIN_IS_MANAGER(manager)); priv = gplugin_manager_get_instance_private(manager);
/* build a tree of all possible plugins */
@@ -739,8 +1165,16 @@
gplugin_file_tree_free(root);
-gplugin_manager_real_foreach(
+ * gplugin_manager_foreach: + * @manager: The #GPluginManager instance. + * @func: (scope call): The #GPluginManagerForeachFunc to call. + * @data: User data to pass to func. + * Calls @func for each plugin that is known. +gplugin_manager_foreach( GPluginManagerForeachFunc func,
@@ -749,6 +1183,9 @@
gpointer id = NULL, plugins = NULL;
+ g_return_if_fail(GPLUGIN_IS_MANAGER(manager)); + g_return_if_fail(func != NULL); priv = gplugin_manager_get_instance_private(manager);
g_hash_table_iter_init(&iter, priv->plugins);
@@ -757,12 +1194,25 @@
-gplugin_manager_real_find_plugins(GPluginManager *manager, const gchar *id)
+ * gplugin_manager_find_plugins: + * @manager: The #GPluginManager instance. + * @id: id string of the plugin to find. + * Finds all plugins matching @id. + * Returns: (element-type GPlugin.Plugin) (transfer full): A #GSList of + * referenced #GPluginPlugin's matching @id. Call + * g_slist_free_full() with a `DestroyNotify` of g_object_unref() on + * the returned value when you're done with it. +gplugin_manager_find_plugins(GPluginManager *manager, const gchar *id) GPluginManagerPrivate *priv = NULL;
GSList *plugins_list = NULL, *l;
+ g_return_val_if_fail(GPLUGIN_IS_MANAGER(manager), NULL); g_return_val_if_fail(id != NULL, NULL);
priv = gplugin_manager_get_instance_private(manager);
@@ -773,914 +1223,9 @@
-gplugin_manager_real_find_plugins_with_state(
- GPluginManager *manager,
- GPluginPluginState state)
- GPluginManagerPrivate *priv = NULL;
- GSList *plugins = NULL;
- priv = gplugin_manager_get_instance_private(manager);
- g_hash_table_iter_init(&iter, priv->plugins);
- while(g_hash_table_iter_next(&iter, NULL, &value)) {
- for(l = (GSList *)value; l != NULL; l = l->next) {
- GPluginPlugin *plugin = GPLUGIN_PLUGIN(l->data);
- if(gplugin_plugin_get_state(plugin) == state) {
- g_slist_prepend(plugins, g_object_ref(G_OBJECT(plugin)));
-gplugin_manager_real_list_plugins(GPluginManager *manager)
- GPluginManagerPrivate *priv = NULL;
- GQueue *queue = g_queue_new();
- priv = gplugin_manager_get_instance_private(manager);
- g_hash_table_iter_init(&iter, priv->plugins);
- while(g_hash_table_iter_next(&iter, &key, NULL)) {
- g_queue_push_tail(queue, (gchar *)key);
- ret = g_list_copy(queue->head);
-gplugin_manager_load_dependencies(
- GPluginPluginInfo *info,
- GSList *dependencies = NULL, *l = NULL;
- GError *ourerror = NULL;
- gboolean all_loaded = TRUE;
- dependencies = gplugin_manager_get_plugin_dependencies(plugin, &ourerror);
- g_propagate_error(error, ourerror);
- for(l = dependencies; l != NULL; l = l->next) {
- GPluginPlugin *dependency = GPLUGIN_PLUGIN(l->data);
- gboolean loaded = FALSE;
- loaded = gplugin_manager_load_plugin(dependency, &ourerror);
- if(!loaded || ourerror != NULL) {
- g_propagate_error(error, ourerror);
- g_slist_free_full(dependencies, g_object_unref);
-gplugin_manager_real_get_plugin_dependencies(
- G_GNUC_UNUSED GPluginManager *manager,
- GPluginPluginInfo *info = NULL;
- const gchar *const *dependencies = NULL;
- info = gplugin_plugin_get_info(plugin);
- dependencies = gplugin_plugin_info_get_dependencies(info);
- g_object_unref(G_OBJECT(info));
- if(dependencies == NULL) {
- for(i = 0; dependencies[i] != NULL; i++) {
- gboolean found = FALSE;
- ors = g_strsplit(dependencies[i], "|", 0);
- for(o = 0; ors[o]; o++) {
- GMatchInfo *match = NULL;
- GSList *matches = NULL;
- gchar *oid = NULL, *oop = NULL, *over = NULL;
- if(!g_regex_match(dependency_regex, ors[o], 0, &match)) {
- /* grab the or'd id, op, and version */
- oid = g_match_info_fetch_named(match, "id");
- oop = g_match_info_fetch_named(match, "op");
- over = g_match_info_fetch_named(match, "version");
- /* free the match info */
- g_match_info_free(match);
- /* now look for a plugin matching the id */
- matches = gplugin_manager_find_plugins_with_version(oid, oop, over);
- /* prepend the first found match to our return value */
- ret = g_slist_prepend(ret, g_object_ref(matches->data));
- g_slist_free_full(matches, g_object_unref);
- _("failed to find dependency %s for %s"),
- gplugin_plugin_info_get_id(info));
- g_slist_free_full(ret, g_object_unref);
-gplugin_manager_real_load_plugin(
- GPluginManager *manager,
- GPluginPluginInfo *info = NULL;
- GPluginLoader *loader = NULL;
- g_return_val_if_fail(GPLUGIN_IS_PLUGIN(plugin), FALSE);
- /* if the plugin is already loaded there's nothing for us to do */
- if(gplugin_plugin_get_state(plugin) == GPLUGIN_PLUGIN_STATE_LOADED) {
- /* now try to get the plugin info from the plugin */
- info = gplugin_plugin_get_info(plugin);
- gchar *filename = gplugin_plugin_get_filename(plugin);
- _("Plugin %s did not return value plugin info"),
- gplugin_plugin_set_state(plugin, GPLUGIN_PLUGIN_STATE_LOAD_FAILED);
- if(!gplugin_manager_load_dependencies(plugin, info, ret_error)) {
- g_object_unref(G_OBJECT(info));
- g_object_unref(G_OBJECT(info));
- /* now load the actual plugin */
- loader = gplugin_plugin_get_loader(plugin);
- if(!GPLUGIN_IS_LOADER(loader)) {
- gchar *filename = gplugin_plugin_get_filename(plugin);
- _("The loader for %s is not a loader. This "
- "should not happened!"),
- gplugin_plugin_set_state(plugin, GPLUGIN_PLUGIN_STATE_LOAD_FAILED);
- g_signal_emit(manager, signals[SIG_LOADING], 0, plugin, &error, &ret);
- /* Set the plugin's error. */
- g_object_set(G_OBJECT(plugin), "error", error, NULL);
- g_propagate_error(ret_error, error);
- gplugin_plugin_set_state(plugin, GPLUGIN_PLUGIN_STATE_LOAD_FAILED);
- ret = gplugin_loader_load_plugin(loader, plugin, &error);
- g_signal_emit(manager, signals[SIG_LOADED], 0, plugin);
- g_signal_emit(manager, signals[SIG_LOAD_FAILED], 0, plugin);
- g_propagate_error(ret_error, error);
-gplugin_manager_real_unload_plugin(
- GPluginManager *manager,
- GPluginLoader *loader = NULL;
- g_return_val_if_fail(GPLUGIN_IS_PLUGIN(plugin), FALSE);
- if(gplugin_plugin_get_state(plugin) != GPLUGIN_PLUGIN_STATE_LOADED) {
- loader = gplugin_plugin_get_loader(plugin);
- if(!GPLUGIN_IS_LOADER(loader)) {
- _("Plugin loader is not a loader"));
- g_signal_emit(manager, signals[SIG_UNLOADING], 0, plugin, &error, &ret);
- /* Set the plugin's error. */
- g_object_set(G_OBJECT(plugin), "error", error, NULL);
- g_propagate_error(ret_error, error);
- gplugin_plugin_set_state(plugin, GPLUGIN_PLUGIN_STATE_LOAD_FAILED);
- ret = gplugin_loader_unload_plugin(loader, plugin, &error);
- g_signal_emit(manager, signals[SIG_UNLOADED], 0, plugin);
- g_signal_emit(manager, signals[SIG_UNLOAD_FAILED], 0, plugin);
- g_propagate_error(ret_error, error);
-gplugin_manager_loading_cb(
- G_GNUC_UNUSED GPluginManager *manager,
- G_GNUC_UNUSED GPluginPlugin *plugin,
- G_GNUC_UNUSED GError **error)
-gplugin_manager_unloading_cb(
- G_GNUC_UNUSED GPluginManager *manager,
- G_GNUC_UNUSED GPluginPlugin *plugin,
- G_GNUC_UNUSED GError **error)
-/******************************************************************************
- * GObject Implementation
- *****************************************************************************/
-gplugin_manager_finalize(GObject *obj)
- GPluginManager *manager = GPLUGIN_MANAGER(obj);
- GPluginManagerPrivate *priv = gplugin_manager_get_instance_private(manager);
- g_queue_free_full(priv->paths, g_free);
- /* unload all of the loaded plugins */
- gplugin_manager_foreach_unload_plugin,
- /* free all the data in the plugins hash table and destroy it */
- g_hash_table_foreach_remove(
- gplugin_manager_remove_list_value,
- g_clear_pointer(&priv->plugins, g_hash_table_destroy);
- /* destroy the filename view */
- g_clear_pointer(&priv->plugins_filename_view, g_hash_table_destroy);
- /* clean up our list of loaders */
- g_slist_free_full(priv->loaders, g_object_unref);
- /* free all the data in the loaders hash table and destroy it */
- g_hash_table_foreach_remove(
- priv->loaders_by_extension,
- gplugin_manager_remove_list_value,
- g_clear_pointer(&priv->loaders_by_extension, g_hash_table_destroy);
- /* call the base class's destructor */
- G_OBJECT_CLASS(gplugin_manager_parent_class)->finalize(obj);
-gplugin_manager_class_init(GPluginManagerClass *klass)
- GObjectClass *obj_class = G_OBJECT_CLASS(klass);
- GPluginManagerClass *manager_class = GPLUGIN_MANAGER_CLASS(klass);
- obj_class->finalize = gplugin_manager_finalize;
- manager_class->append_path = gplugin_manager_real_append_path;
- manager_class->prepend_path = gplugin_manager_real_prepend_path;
- manager_class->remove_path = gplugin_manager_real_remove_path;
- manager_class->remove_paths = gplugin_manager_real_remove_paths;
- manager_class->get_paths = gplugin_manager_real_get_paths;
- manager_class->register_loader = gplugin_manager_real_register_loader;
- manager_class->unregister_loader = gplugin_manager_real_unregister_loader;
- manager_class->get_loaders = gplugin_manager_real_get_loaders;
- manager_class->refresh = gplugin_manager_real_refresh;
- manager_class->foreach = gplugin_manager_real_foreach;
- manager_class->find_plugins = gplugin_manager_real_find_plugins;
- manager_class->find_plugins_with_state =
- gplugin_manager_real_find_plugins_with_state;
- manager_class->list_plugins = gplugin_manager_real_list_plugins;
- manager_class->get_plugin_dependencies =
- gplugin_manager_real_get_plugin_dependencies;
- manager_class->load_plugin = gplugin_manager_real_load_plugin;
- manager_class->unload_plugin = gplugin_manager_real_unload_plugin;
- manager_class->loading_plugin = gplugin_manager_loading_cb;
- manager_class->unloading_plugin = gplugin_manager_unloading_cb;
- * GPluginManager::loading-plugin:
- * @manager: The #GPluginManager instance.
- * @plugin: The #GPluginPlugin that's about to be loaded.
- * @error: Return address for a #GError.
- * Emitted before @plugin is loaded.
- * Return FALSE to stop loading
- signals[SIG_LOADING] = g_signal_new(
- G_OBJECT_CLASS_TYPE(manager_class),
- G_STRUCT_OFFSET(GPluginManagerClass, loading_plugin),
- gplugin_boolean_accumulator,
- * GPluginManager::loaded-plugin:
- * @manager: the #gpluginpluginmanager instance.
- * @plugin: the #gpluginplugin that's about to be loaded.
- * emitted after a plugin is loaded.
- signals[SIG_LOADED] = g_signal_new(
- G_OBJECT_CLASS_TYPE(manager_class),
- G_STRUCT_OFFSET(GPluginManagerClass, loaded_plugin),
- * GPluginManager::load-plugin-failed:
- * @manager: The #GPluginManager instance.
- * @plugin: The #GPluginPlugin that failed to load.
- * emitted after a plugin fails to load.
- signals[SIG_LOAD_FAILED] = g_signal_new(
- G_OBJECT_CLASS_TYPE(manager_class),
- G_STRUCT_OFFSET(GPluginManagerClass, load_failed),
- * GPluginManager::unloading-plugin
- * @manager: the #GPluginManager instance.
- * @plugin: the #GPluginPlugin that's about to be unloaded.
- * @error: Return address for a #GError.
- * emitted before a plugin is unloaded.
- * Return FALSE to stop unloading
- signals[SIG_UNLOADING] = g_signal_new(
- G_OBJECT_CLASS_TYPE(manager_class),
- G_STRUCT_OFFSET(GPluginManagerClass, unloading_plugin),
- gplugin_boolean_accumulator,
- * GPluginManager::unloaded-plugin:
- * @manager: the #gpluginpluginmanager instance.
- * @plugin: the #gpluginplugin that's about to be loaded.
- * emitted after a plugin is successfully unloaded.
- signals[SIG_UNLOADED] = g_signal_new(
- G_OBJECT_CLASS_TYPE(manager_class),
- G_STRUCT_OFFSET(GPluginManagerClass, unloaded_plugin),
- * GPluginManager::unload-plugin-failed:
- * @manager: The #GPluginManager instance.
- * @plugin: The #GPluginPlugin instance that failed to unload.
- * @error: A #GError instance.
- * Emitted when @manager was asked to unload @plugin, but @plugin returned
- * %FALSE when its unload function was called.
- signals[SIG_UNLOAD_FAILED] = g_signal_new(
- "unload-plugin-failed",
- G_OBJECT_CLASS_TYPE(manager_class),
- G_STRUCT_OFFSET(GPluginManagerClass, unload_plugin_failed),
-gplugin_manager_init(GPluginManager *manager)
- GPluginManagerPrivate *priv = gplugin_manager_get_instance_private(manager);
- priv->paths = g_queue_new();
- /* the plugins hashtable is keyed on a plugin id and holds a GSList of all
- * plugins that share that id.
- g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
- /* the filename view is hash table keyed on the filename of the plugin with
- * a value of the plugin itself.
- priv->plugins_filename_view =
- g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_object_unref);
- /* The loaders_by_extension hash table is keyed on the supported extensions
- * of the loader. Which means that a loader that supports multiple
- * extensions will be in the table multiple times.
- * We deal with collisions by using a GSList for the value which will hold
- * references to instances of the actual loaders.
- * Storing this in this method allows us to quickly figure out which loader
- * to use by the filename and helps us to avoid iterating the loaders table
- priv->loaders_by_extension = g_hash_table_new_full(
- gplugin_manager_str_hash,
-/******************************************************************************
- *****************************************************************************/
-gplugin_manager_private_init(gboolean register_native_loader)
- instance = g_object_new(GPLUGIN_TYPE_MANAGER, NULL);
- if(register_native_loader) {
- if(!gplugin_manager_register_loader(
- GPLUGIN_TYPE_NATIVE_LOADER,
- g_error("failed to register loader: %s", error->message);
- g_error("failed to register loader: unknown failure");
- dependency_regex = g_regex_new(dependency_pattern, 0, 0, NULL);
-gplugin_manager_private_uninit(void)
- g_regex_unref(dependency_regex);
- g_clear_object(&instance);
-/******************************************************************************
- *****************************************************************************/
- * gplugin_manager_append_path:
- * @path: A path to add to the end of the plugin search paths.
- * Adds @path to the end of the list of paths to search for plugins.
-gplugin_manager_append_path(const gchar *path)
- GPluginManagerClass *klass = NULL;
- g_return_if_fail(GPLUGIN_IS_MANAGER(instance));
- klass = GPLUGIN_MANAGER_GET_CLASS(instance);
- if(klass && klass->append_path) {
- klass->append_path(instance, path);
- * gplugin_manager_prepend_path:
- * @path: A path to add to the beginning of the plugin search paths.
- * Adds @path to the beginning of the list of paths to search for plugins.
-gplugin_manager_prepend_path(const gchar *path)
- GPluginManagerClass *klass = NULL;
- g_return_if_fail(GPLUGIN_IS_MANAGER(instance));
- klass = GPLUGIN_MANAGER_GET_CLASS(instance);
- if(klass && klass->prepend_path) {
- klass->prepend_path(instance, path);
- * gplugin_manager_remove_path:
- * @path: A path to remove from the plugin search paths.
- * Removes @path from the list of paths to search for plugins.
-gplugin_manager_remove_path(const gchar *path)
- GPluginManagerClass *klass = NULL;
- g_return_if_fail(GPLUGIN_IS_MANAGER(instance));
- klass = GPLUGIN_MANAGER_GET_CLASS(instance);
- if(klass && klass->remove_path) {
- klass->remove_path(instance, path);
- * gplugin_manager_remove_paths:
- * Clears all paths that are set to search for plugins.
-gplugin_manager_remove_paths(void)
- GPluginManagerClass *klass = NULL;
- g_return_if_fail(GPLUGIN_IS_MANAGER(instance));
- klass = GPLUGIN_MANAGER_GET_CLASS(instance);
- if(klass && klass->remove_paths) {
- klass->remove_paths(instance);
- * gplugin_manager_add_default_paths:
- * Adds the path that GPlugin was installed to to the plugin search path, as
- * well as `${XDG_CONFIG_HOME}/gplugin` so users can install additional loaders
-gplugin_manager_add_default_paths(void)
- path = g_build_filename(PREFIX, LIBDIR, "gplugin", NULL);
- gplugin_manager_prepend_path(path);
- path = g_build_filename(g_get_user_config_dir(), "gplugin", NULL);
- gplugin_manager_prepend_path(path);
- * gplugin_manager_add_app_paths:
- * @prefix: The installation prefix for the application.
- * @appname: The name of the application whose paths to add.
- * Adds the application installation path for @appname. This will add
- * `@prefix/@appname/plugins` to the list as well as
- * `${XDG_CONFIG_HOME}/@appname/plugins`.
-gplugin_manager_add_app_paths(const gchar *prefix, const gchar *appname)
- g_return_if_fail(appname != NULL);
- path = g_build_filename(prefix, LIBDIR, appname, NULL);
- gplugin_manager_prepend_path(path);
- path = g_build_filename(g_get_user_config_dir(), appname, "plugins", NULL);
- gplugin_manager_prepend_path(path);
- * gplugin_manager_get_paths:
- * Gets the list of paths which will be searched for plugins.
- * Returns: (element-type utf8) (transfer none): The list of paths which will
- * be searched for plugins.
-gplugin_manager_get_paths(void)
- GPluginManagerClass *klass = NULL;
- g_return_val_if_fail(GPLUGIN_IS_MANAGER(instance), NULL);
- klass = GPLUGIN_MANAGER_GET_CLASS(instance);
- if(klass && klass->get_paths) {
- return klass->get_paths(instance);
- * gplugin_manager_register_loader:
- * @type: #GType of a #GPluginLoader.
- * @error: (out) (nullable): The return address for a #GError.
- * Registers @type as an available loader.
- * Returns: %TRUE if the loader was successfully register, %FALSE otherwise
-gplugin_manager_register_loader(GType type, GError **error)
- GPluginManagerClass *klass = NULL;
- g_return_val_if_fail(GPLUGIN_IS_MANAGER(instance), FALSE);
- klass = GPLUGIN_MANAGER_GET_CLASS(instance);
- if(klass && klass->register_loader) {
- return klass->register_loader(instance, type, error);
- "register_loader method not implemented");
- * gplugin_manager_unregister_loader:
- * @type: #GType of a #GPluginLoader.
- * @error: (out) (nullable): The return address for a #GError.
- * Unregisters @type as an available loader.
- * Returns: %TRUE if the loader was successfully unregistered, %FALSE
- * otherwise with @error set.
-gplugin_manager_unregister_loader(GType type, GError **error)
- GPluginManagerClass *klass = NULL;
- g_return_val_if_fail(GPLUGIN_IS_MANAGER(instance), FALSE);
- klass = GPLUGIN_MANAGER_GET_CLASS(instance);
- if(klass && klass->unregister_loader) {
- return klass->unregister_loader(instance, type, error);
- "unregister_loader method not implemented");
- * gplugin_manager_get_loaders:
- * Returns a list of all registered #GPluginLoader's.
- * Returns: (element-type GPlugin.Loader) (transfer full): Returns a list of all
-gplugin_manager_get_loaders(void)
- GPluginManagerClass *klass = NULL;
- g_return_val_if_fail(GPLUGIN_IS_MANAGER(instance), FALSE);
- klass = GPLUGIN_MANAGER_GET_CLASS(instance);
- if(klass && klass->get_loaders) {
- return klass->get_loaders(instance);
- * gplugin_manager_refresh:
- * Forces a refresh of all plugins found in the search paths.
-gplugin_manager_refresh(void)
- GPluginManagerClass *klass = NULL;
- g_return_if_fail(GPLUGIN_IS_MANAGER(instance));
- klass = GPLUGIN_MANAGER_GET_CLASS(instance);
- if(klass && klass->refresh) {
- klass->refresh(instance);
- * gplugin_manager_foreach:
- * @func: (scope call): The #GPluginManagerForeachFunc to call.
- * @data: User data to pass to func.
- * Calls @func for each plugin that is known.
-gplugin_manager_foreach(GPluginManagerForeachFunc func, gpointer data)
- GPluginManagerClass *klass = NULL;
- g_return_if_fail(GPLUGIN_IS_MANAGER(instance));
- g_return_if_fail(func != NULL);
- klass = GPLUGIN_MANAGER_GET_CLASS(instance);
- if(klass && klass->foreach) {
- klass->foreach(instance, func, data);
- * gplugin_manager_find_plugins:
- * @id: id string of the plugin to find.
- * Finds all plugins matching @id.
- * Returns: (element-type GPlugin.Plugin) (transfer full): A #GSList of
- * referenced #GPluginPlugin's matching @id. Call
- * g_slist_free_full() with a `DestroyNotify` of g_object_unref() on
- * the returned value when you're done with it.
-gplugin_manager_find_plugins(const gchar *id)
- GPluginManagerClass *klass = NULL;
- g_return_val_if_fail(GPLUGIN_IS_MANAGER(instance), NULL);
- klass = GPLUGIN_MANAGER_GET_CLASS(instance);
- if(klass && klass->find_plugins) {
- return klass->find_plugins(instance, id);
* gplugin_manager_find_plugins_with_version:
+ * @manager: The #GPluginManager instance. * @id: The ID of the plugin to find.
* @op: one of <, <=, =, ==, >=, >.
* @version: The version to compare against.
@@ -1697,15 +1242,16 @@
gplugin_manager_find_plugins_with_version(
+ GPluginManager *manager, GSList *plugins = NULL, *filtered = NULL, *l = NULL;
- g_return_val_if_fail(GPLUGIN_IS_MANAGER(instance), NULL);
+ g_return_val_if_fail(GPLUGIN_IS_MANAGER(manager), NULL); - plugins = gplugin_manager_find_plugins(id);
+ plugins = gplugin_manager_find_plugins(manager, id); if((op == NULL || *op == '\0') && (version == NULL || *version == '\0')) {
/* we weren't actually passed an operator and a version so just return
@@ -1757,6 +1303,7 @@
* gplugin_manager_find_plugins_with_state:
+ * @manager: The #GPluginManager instance. * @state: The #GPluginPluginState to look for.
* Finds all plugins that currently have a state of @state.
@@ -1767,22 +1314,39 @@
* the returned value when you're done with it.
-gplugin_manager_find_plugins_with_state(GPluginPluginState state)
+gplugin_manager_find_plugins_with_state( + GPluginManager *manager, + GPluginPluginState state) - GPluginManagerClass *klass = NULL;
+ GPluginManagerPrivate *priv = NULL; + GSList *plugins = NULL; + g_return_val_if_fail(GPLUGIN_IS_MANAGER(manager), NULL); + priv = gplugin_manager_get_instance_private(manager); - g_return_val_if_fail(GPLUGIN_IS_MANAGER(instance), NULL);
+ g_hash_table_iter_init(&iter, priv->plugins); + while(g_hash_table_iter_next(&iter, NULL, &value)) { - klass = GPLUGIN_MANAGER_GET_CLASS(instance);
- if(klass && klass->find_plugins_with_state) {
- return klass->find_plugins_with_state(instance, state);
+ for(l = (GSList *)value; l != NULL; l = l->next) { + GPluginPlugin *plugin = GPLUGIN_PLUGIN(l->data); + if(gplugin_plugin_get_state(plugin) == state) { + g_slist_prepend(plugins, g_object_ref(G_OBJECT(plugin)));
* gplugin_manager_find_plugin:
+ * @manager: The #GPluginManager instance. * @id: The id of the plugin to find.
* Finds the first plugin matching @id. This function uses
@@ -1793,14 +1357,14 @@
* if no plugin matching @id was found.
-gplugin_manager_find_plugin(const gchar *id)
+gplugin_manager_find_plugin(GPluginManager *manager, const gchar *id) GSList *plugins_list = NULL;
GPluginPlugin *plugin = NULL;
g_return_val_if_fail(id != NULL, NULL);
- plugins_list = gplugin_manager_find_plugins(id);
+ plugins_list = gplugin_manager_find_plugins(manager, id); if(plugins_list == NULL) {
@@ -1814,6 +1378,7 @@
* gplugin_manager_find_plugin_with_newest_version:
+ * @manager: The #GPluginManager instance. * @id: The id of the plugin to find.
* Calls gplugin_manager_find_plugins() with @id, and then returns the plugins
@@ -1823,7 +1388,9 @@
* highest version number, or %NULL if no plugins were found with @id.
-gplugin_manager_find_plugin_with_newest_version(const gchar *id)
+gplugin_manager_find_plugin_with_newest_version( + GPluginManager *manager, GPluginPlugin *plugin_a = NULL;
GPluginPluginInfo *info_a = NULL;
@@ -1832,7 +1399,7 @@
g_return_val_if_fail(id != NULL, NULL);
- l = gplugin_manager_find_plugins(id);
+ l = gplugin_manager_find_plugins(manager, id); for(; l != NULL; l = g_slist_delete_link(l, l)) {
GPluginPlugin *plugin_b = NULL;
GPluginPluginInfo *info_b = NULL;
@@ -1886,6 +1453,7 @@
* gplugin_manager_get_plugin_dependencies:
+ * @manager: The #GPluginManager instance. * @plugin: The #GPluginPlugin whose dependencies to get.
* @error: (out) (nullable): Return address for a #GError.
@@ -1898,24 +1466,95 @@
-gplugin_manager_get_plugin_dependencies(GPluginPlugin *plugin, GError **error)
+gplugin_manager_get_plugin_dependencies( + GPluginManager *manager, - GPluginManagerClass *klass = NULL;
+ GPluginPluginInfo *info = NULL; + const gchar *const *dependencies = NULL; + g_return_val_if_fail(GPLUGIN_IS_MANAGER(manager), NULL); g_return_val_if_fail(GPLUGIN_IS_PLUGIN(plugin), NULL);
- g_return_val_if_fail(GPLUGIN_IS_MANAGER(instance), NULL);
+ info = gplugin_plugin_get_info(plugin); + dependencies = gplugin_plugin_info_get_dependencies(info); + g_object_unref(G_OBJECT(info)); - klass = GPLUGIN_MANAGER_GET_CLASS(instance);
- if(klass && klass->get_plugin_dependencies) {
- return klass->get_plugin_dependencies(instance, plugin, error);
+ if(dependencies == NULL) {
+ for(i = 0; dependencies[i] != NULL; i++) { + gboolean found = FALSE; + ors = g_strsplit(dependencies[i], "|", 0); + for(o = 0; ors[o]; o++) { + GMatchInfo *match = NULL; + GSList *matches = NULL; + gchar *oid = NULL, *oop = NULL, *over = NULL; + if(!g_regex_match(dependency_regex, ors[o], 0, &match)) { + /* grab the or'd id, op, and version */ + oid = g_match_info_fetch_named(match, "id"); + oop = g_match_info_fetch_named(match, "op"); + over = g_match_info_fetch_named(match, "version"); + /* free the match info */ + g_match_info_free(match); + /* now look for a plugin matching the id */ + matches = gplugin_manager_find_plugins_with_version( + /* prepend the first found match to our return value */ + ret = g_slist_prepend(ret, g_object_ref(matches->data)); + g_slist_free_full(matches, g_object_unref); + _("failed to find dependency %s for %s"), + gplugin_plugin_info_get_id(info)); + g_slist_free_full(ret, g_object_unref); * gplugin_manager_load_plugin:
+ * @manager: The #GPluginManager instance. * @plugin: #GPluginPlugin instance.
* @error: (out) (nullable): return location for a #GError or %NULL.
@@ -1927,24 +1566,100 @@
-gplugin_manager_load_plugin(GPluginPlugin *plugin, GError **error)
+gplugin_manager_load_plugin( + GPluginManager *manager, - GPluginManagerClass *klass = NULL;
+ GPluginPluginInfo *info = NULL; + GPluginLoader *loader = NULL; + GError *real_error = NULL; + g_return_val_if_fail(GPLUGIN_IS_MANAGER(manager), FALSE); g_return_val_if_fail(GPLUGIN_IS_PLUGIN(plugin), FALSE);
- g_return_val_if_fail(GPLUGIN_IS_MANAGER(instance), FALSE);
+ /* if the plugin is already loaded there's nothing for us to do */ + if(gplugin_plugin_get_state(plugin) == GPLUGIN_PLUGIN_STATE_LOADED) { + /* now try to get the plugin info from the plugin */ + info = gplugin_plugin_get_info(plugin); + gchar *filename = gplugin_plugin_get_filename(plugin); - klass = GPLUGIN_MANAGER_GET_CLASS(instance);
- if(klass && klass->load_plugin) {
- return klass->load_plugin(instance, plugin, error);
+ _("Plugin %s did not return value plugin info"), + gplugin_plugin_set_state(plugin, GPLUGIN_PLUGIN_STATE_LOAD_FAILED); + if(!gplugin_manager_load_dependencies(manager, plugin, info, &real_error)) { + g_object_unref(G_OBJECT(info)); + g_propagate_error(error, real_error);
+ g_object_unref(G_OBJECT(info)); + /* now load the actual plugin */ + loader = gplugin_plugin_get_loader(plugin); + if(!GPLUGIN_IS_LOADER(loader)) { + gchar *filename = gplugin_plugin_get_filename(plugin); + _("The loader for %s is not a loader. This " + "should not happened!"), + gplugin_plugin_set_state(plugin, GPLUGIN_PLUGIN_STATE_LOAD_FAILED); + g_signal_emit(manager, signals[SIG_LOADING], 0, plugin, &real_error, &ret); + /* Set the plugin's error. */ + g_object_set(G_OBJECT(plugin), "error", real_error, NULL); + g_propagate_error(error, real_error); + gplugin_plugin_set_state(plugin, GPLUGIN_PLUGIN_STATE_LOAD_FAILED); + ret = gplugin_loader_load_plugin(loader, plugin, &real_error); + g_clear_error(&real_error); + g_signal_emit(manager, signals[SIG_LOADED], 0, plugin); + g_signal_emit(manager, signals[SIG_LOAD_FAILED], 0, plugin); + g_propagate_error(error, real_error); * gplugin_manager_unload_plugin:
+ * @manager: The #GPluginManager instance. * @plugin: #GPluginPlugin instance.
* @error: (out) (nullable): Return location for a #GError or %NULL.
@@ -1954,24 +1669,67 @@
-gplugin_manager_unload_plugin(GPluginPlugin *plugin, GError **error)
+gplugin_manager_unload_plugin( + GPluginManager *manager, - GPluginManagerClass *klass = NULL;
+ GPluginLoader *loader = NULL; + GError *real_error = NULL; + g_return_val_if_fail(GPLUGIN_IS_MANAGER(manager), FALSE); g_return_val_if_fail(GPLUGIN_IS_PLUGIN(plugin), FALSE);
- g_return_val_if_fail(GPLUGIN_IS_MANAGER(instance), FALSE);
+ if(gplugin_plugin_get_state(plugin) != GPLUGIN_PLUGIN_STATE_LOADED) { - klass = GPLUGIN_MANAGER_GET_CLASS(instance);
- if(klass && klass->unload_plugin) {
- return klass->unload_plugin(instance, plugin, error);
+ loader = gplugin_plugin_get_loader(plugin); + if(!GPLUGIN_IS_LOADER(loader)) { + _("Plugin loader is not a loader"));
+ signals[SIG_UNLOADING], + /* Set the plugin's error. */ + g_object_set(G_OBJECT(plugin), "error", real_error, NULL); + g_propagate_error(error, real_error); + gplugin_plugin_set_state(plugin, GPLUGIN_PLUGIN_STATE_LOAD_FAILED); + ret = gplugin_loader_unload_plugin(loader, plugin, &real_error); + g_clear_error(&real_error); + g_signal_emit(manager, signals[SIG_UNLOADED], 0, plugin); + g_signal_emit(manager, signals[SIG_UNLOAD_FAILED], 0, plugin); + g_propagate_error(error, real_error); * gplugin_manager_list_plugins:
+ * @manager: The #GPluginManager instance. * Returns a #GList of all plugin id's. Each id should be queried directly
@@ -1980,34 +1738,42 @@
-gplugin_manager_list_plugins(void)
+gplugin_manager_list_plugins(GPluginManager *manager) - GPluginManagerClass *klass = NULL;
+ GPluginManagerPrivate *priv = NULL; - g_return_val_if_fail(GPLUGIN_IS_MANAGER(instance), NULL);
+ g_return_val_if_fail(GPLUGIN_IS_MANAGER(manager), NULL); - klass = GPLUGIN_MANAGER_GET_CLASS(instance);
- if(klass && klass->list_plugins) {
- return klass->list_plugins(instance);
+ priv = gplugin_manager_get_instance_private(manager); + g_hash_table_iter_init(&iter, priv->plugins); + while(g_hash_table_iter_next(&iter, &key, NULL)) { + g_queue_push_tail(queue, (gchar *)key);
+ ret = g_list_copy(queue->head); - * gplugin_manager_get_instance:
+ * gplugin_manager_get_default: - * Returns a #GObject that is the instance of the plugin manager that is being
+ * Gets the default #GPluginManager in GPlugin. - * This is provided so that signals can be connected and should not be tinkered
+ * Returns: (transfer none): The default GPluginManager instance. - * Returns: (transfer none): The #GObject that is the instance of the plugin
-gplugin_manager_get_instance(void)
+gplugin_manager_get_default(void)
+ return default_manager; --- a/gplugin/tests/test-core.c Tue Aug 03 00:35:00 2021 -0500
+++ b/gplugin/tests/test-core.c Tue Aug 03 02:25:55 2021 -0500
@@ -25,17 +25,18 @@
test_gplugin_count_ids_and_plugins(gint *n_ids, gint *n_plugins)
+ GPluginManager *manager = gplugin_manager_get_default(); GList *l_ids = NULL, *l_id = NULL;
gint ids = 0, plugins = 0;
- l_ids = gplugin_manager_list_plugins();
+ l_ids = gplugin_manager_list_plugins(manager); for(l_id = l_ids; l_id; l_id = l_id->next) {
GSList *l_plugins = NULL, *l_plugin = NULL;
const gchar *id = (const gchar *)l_id->data;
- l_plugins = gplugin_manager_find_plugins(id);
+ l_plugins = gplugin_manager_find_plugins(manager, id); for(l_plugin = l_plugins; l_plugin; l_plugin = l_plugin->next) {
@@ -73,35 +74,49 @@
test_gplugin_init_uninit_with_refresh(void)
+ GPluginManager *manager = NULL; gplugin_init(GPLUGIN_CORE_FLAGS_NONE);
- gplugin_manager_refresh();
+ manager = gplugin_manager_get_default(); + gplugin_manager_refresh(manager); test_gplugin_init_uninit_with_refresh_plugins(void)
+ GPluginManager *manager = NULL; gplugin_init(GPLUGIN_CORE_FLAGS_NONE);
- gplugin_manager_append_path(TEST_DIR);
- gplugin_manager_refresh();
+ manager = gplugin_manager_get_default(); + gplugin_manager_append_path(manager, TEST_DIR); + gplugin_manager_refresh(manager); test_gplugin_init_uninit_with_double_refresh_plugins(void)
+ GPluginManager *manager = NULL; gint f_ids = 0, s_ids = 0, f_plugins = 0, s_plugins = 0;
gplugin_init(GPLUGIN_CORE_FLAGS_NONE);
- gplugin_manager_append_path(TEST_DIR);
- gplugin_manager_append_path(TEST_ID_DIR);
+ manager = gplugin_manager_get_default(); + gplugin_manager_append_path(manager, TEST_DIR); + gplugin_manager_append_path(manager, TEST_ID_DIR); /* run the first refresh and count everything */
- gplugin_manager_refresh();
+ gplugin_manager_refresh(manager); test_gplugin_count_ids_and_plugins(&f_ids, &f_plugins);
/* now run the second refresh and make sure the counts match */
- gplugin_manager_refresh();
+ gplugin_manager_refresh(manager); test_gplugin_count_ids_and_plugins(&s_ids, &s_plugins);
g_assert_cmpint(f_ids, >, 0);
@@ -116,9 +131,13 @@
test_gplugin_init_no_native_loader(void)
+ GPluginManager *manager = NULL; gplugin_init(GPLUGIN_CORE_FLAGS_DISABLE_NATIVE_LOADER);
- g_assert_null(gplugin_manager_get_loaders());
+ manager = gplugin_manager_get_default(); + g_assert_null(gplugin_manager_get_loaders(manager)); --- a/gplugin/tests/test-dynamic-type.c Tue Aug 03 00:35:00 2021 -0500
+++ b/gplugin/tests/test-dynamic-type.c Tue Aug 03 02:25:55 2021 -0500
@@ -29,28 +29,30 @@
+ GPluginManager *manager = gplugin_manager_get_default(); GPluginPlugin *provider = NULL, *user = NULL;
GPluginPluginState state;
- gplugin_manager_append_path(TEST_DYNAMIC_DIR);
- gplugin_manager_refresh();
+ gplugin_manager_append_path(manager, TEST_DYNAMIC_DIR); + gplugin_manager_refresh(manager); - provider = gplugin_manager_find_plugin("gplugin/dynamic-type-provider");
+ gplugin_manager_find_plugin(manager, "gplugin/dynamic-type-provider"); g_assert_nonnull(provider);
- ret = gplugin_manager_load_plugin(provider, &error);
+ ret = gplugin_manager_load_plugin(manager, provider, &error); g_assert_no_error(error);
state = gplugin_plugin_get_state(provider);
g_assert_cmpint(state, ==, GPLUGIN_PLUGIN_STATE_LOADED);
- user = gplugin_manager_find_plugin("gplugin/dynamic-type-user");
+ user = gplugin_manager_find_plugin(manager, "gplugin/dynamic-type-user"); - ret = gplugin_manager_load_plugin(user, &error);
+ ret = gplugin_manager_load_plugin(manager, user, &error); g_assert_no_error(error);
@@ -58,14 +60,14 @@
g_assert_cmpint(state, ==, GPLUGIN_PLUGIN_STATE_LOADED);
/* now unload the plugin */
- ret = gplugin_manager_unload_plugin(user, &error);
+ ret = gplugin_manager_unload_plugin(manager, user, &error); g_assert_no_error(error);
state = gplugin_plugin_get_state(user);
g_assert_cmpint(state, ==, GPLUGIN_PLUGIN_STATE_QUERIED);
- ret = gplugin_manager_unload_plugin(provider, &error);
+ ret = gplugin_manager_unload_plugin(manager, provider, &error); g_assert_no_error(error);
--- a/gplugin/tests/test-find-plugins.c Tue Aug 03 00:35:00 2021 -0500
+++ b/gplugin/tests/test-find-plugins.c Tue Aug 03 02:25:55 2021 -0500
@@ -28,10 +28,11 @@
+ GPluginManager *manager = gplugin_manager_get_default(); for(l = plugins; l != NULL; l = l->next) {
- gplugin_manager_load_plugin(GPLUGIN_PLUGIN(l->data), NULL);
+ gplugin_manager_load_plugin(manager, GPLUGIN_PLUGIN(l->data), NULL); @@ -41,10 +42,11 @@
+ GPluginManager *manager = gplugin_manager_get_default(); for(l = plugins; l != NULL; l = l->next) {
- gplugin_manager_unload_plugin(GPLUGIN_PLUGIN(l->data), NULL);
+ gplugin_manager_unload_plugin(manager, GPLUGIN_PLUGIN(l->data), NULL); @@ -64,6 +66,7 @@
test_gplugin_manager_find_plugins_with_state(void)
+ GPluginManager *manager = NULL; /* this is the list of the current plugins and the furthest state they can
@@ -84,41 +87,54 @@
gplugin_init(GPLUGIN_CORE_FLAGS_NONE);
- gplugin_manager_append_path(TEST_DIR);
- gplugin_manager_refresh();
+ manager = gplugin_manager_get_default(); + gplugin_manager_append_path(manager, TEST_DIR); + gplugin_manager_refresh(manager); /* make sure that all the plugins are queried */
- gplugin_manager_find_plugins_with_state(GPLUGIN_PLUGIN_STATE_QUERIED);
+ plugins = gplugin_manager_find_plugins_with_state( + GPLUGIN_PLUGIN_STATE_QUERIED); g_assert_cmpint(g_slist_length(plugins), ==, QUERIED);
g_slist_free_full(plugins, g_object_unref);
/* now load all of the plugins */
- gplugin_manager_foreach(test_gplugin_manager_foreach_load_plugins, NULL);
+ gplugin_manager_foreach( + test_gplugin_manager_foreach_load_plugins, /* make sure we have the proper number loaded */
- gplugin_manager_find_plugins_with_state(GPLUGIN_PLUGIN_STATE_LOADED);
+ plugins = gplugin_manager_find_plugins_with_state( + GPLUGIN_PLUGIN_STATE_LOADED); g_assert_cmpint(g_slist_length(plugins), ==, LOADED);
g_slist_free_full(plugins, g_object_unref);
/* make sure we have the proper number of load failed */
plugins = gplugin_manager_find_plugins_with_state(
GPLUGIN_PLUGIN_STATE_LOAD_FAILED);
g_assert_cmpint(g_slist_length(plugins), ==, LOAD_FAILED);
g_slist_free_full(plugins, g_object_unref);
/* unload all of the plugins */
- gplugin_manager_foreach(test_gplugin_manager_foreach_unload_plugins, NULL);
+ gplugin_manager_foreach( + test_gplugin_manager_foreach_unload_plugins, /* make sure we have the proper number unloaded */
- gplugin_manager_find_plugins_with_state(GPLUGIN_PLUGIN_STATE_QUERIED);
+ plugins = gplugin_manager_find_plugins_with_state( + GPLUGIN_PLUGIN_STATE_QUERIED); g_assert_cmpint(g_slist_length(plugins), ==, UNLOADED);
g_slist_free_full(plugins, g_object_unref);
/* make sure we have the proper number of unload failed */
plugins = gplugin_manager_find_plugins_with_state(
GPLUGIN_PLUGIN_STATE_UNLOAD_FAILED);
g_assert_cmpint(g_slist_length(plugins), ==, UNLOAD_FAILED);
g_slist_free_full(plugins, g_object_unref);
--- a/gplugin/tests/test-loader-registration.c Tue Aug 03 00:35:00 2021 -0500
+++ b/gplugin/tests/test-loader-registration.c Tue Aug 03 02:25:55 2021 -0500
@@ -94,17 +94,26 @@
test_gplugin_manager_loader_register_unregister(void)
+ GPluginManager *manager = NULL; gplugin_manager_private_uninit();
gplugin_manager_private_init(TRUE);
- ret = gplugin_manager_register_loader(TEST_GPLUGIN_TYPE_LOADER, &error);
+ manager = gplugin_manager_get_default(); + ret = gplugin_manager_register_loader( + TEST_GPLUGIN_TYPE_LOADER, g_assert_no_error(error);
- ret = gplugin_manager_unregister_loader(TEST_GPLUGIN_TYPE_LOADER, &error);
+ ret = gplugin_manager_unregister_loader( + TEST_GPLUGIN_TYPE_LOADER, g_assert_no_error(error);
@@ -112,22 +121,34 @@
test_gplugin_manager_loader_register_twice(void)
+ GPluginManager *manager = NULL; gplugin_manager_private_uninit();
gplugin_manager_private_init(TRUE);
- ret = gplugin_manager_register_loader(TEST_GPLUGIN_TYPE_LOADER, &error);
+ manager = gplugin_manager_get_default(); + ret = gplugin_manager_register_loader( + TEST_GPLUGIN_TYPE_LOADER, g_assert_no_error(error);
- ret = gplugin_manager_register_loader(TEST_GPLUGIN_TYPE_LOADER, &error);
+ ret = gplugin_manager_register_loader( + TEST_GPLUGIN_TYPE_LOADER, g_assert_error(error, GPLUGIN_DOMAIN, 0);
- ret = gplugin_manager_unregister_loader(TEST_GPLUGIN_TYPE_LOADER, &error);
+ ret = gplugin_manager_unregister_loader( + TEST_GPLUGIN_TYPE_LOADER, g_assert_no_error(error);
@@ -135,21 +156,33 @@
test_gplugin_manager_loader_unregister_twice(void)
+ GPluginManager *manager = NULL; gplugin_manager_private_uninit();
gplugin_manager_private_init(TRUE);
- ret = gplugin_manager_register_loader(TEST_GPLUGIN_TYPE_LOADER, &error);
+ manager = gplugin_manager_get_default(); + ret = gplugin_manager_register_loader( + TEST_GPLUGIN_TYPE_LOADER, g_assert_no_error(error);
- ret = gplugin_manager_unregister_loader(TEST_GPLUGIN_TYPE_LOADER, &error);
+ ret = gplugin_manager_unregister_loader( + TEST_GPLUGIN_TYPE_LOADER, g_assert_no_error(error);
- ret = gplugin_manager_unregister_loader(TEST_GPLUGIN_TYPE_LOADER, &error);
+ ret = gplugin_manager_unregister_loader( + TEST_GPLUGIN_TYPE_LOADER, g_assert_error(error, GPLUGIN_DOMAIN, 0);
--- a/gplugin/tests/test-native-loader.c Tue Aug 03 00:35:00 2021 -0500
+++ b/gplugin/tests/test-native-loader.c Tue Aug 03 02:25:55 2021 -0500
@@ -29,26 +29,28 @@
test_broken_depend_plugin_load(void)
+ GPluginManager *manager = gplugin_manager_get_default(); GPluginPlugin *plugin = NULL;
GPluginPluginState state;
/* add the test directory to the plugin manager's search paths */
- gplugin_manager_append_path(TEST_DIR);
+ gplugin_manager_append_path(manager, TEST_DIR); /* refresh the plugin manager */
- gplugin_manager_refresh();
+ gplugin_manager_refresh(manager); /* find the dependent plugin and make sure it isn't loaded */
- gplugin_manager_find_plugin("gplugin/broken-dependent-native-plugin");
+ plugin = gplugin_manager_find_plugin( + "gplugin/broken-dependent-native-plugin"); g_assert_nonnull(plugin);
state = gplugin_plugin_get_state(plugin);
g_assert_cmpint(state, !=, GPLUGIN_PLUGIN_STATE_LOADED);
/* now attempt to load the dependent plugin, it's supposed to fail */
- g_assert_false(gplugin_manager_load_plugin(plugin, &error));
+ g_assert_false(gplugin_manager_load_plugin(manager, plugin, &error)); g_assert_error(error, GPLUGIN_DOMAIN, 0);
@@ -59,16 +61,17 @@
test_query_error_subprocess(void)
+ GPluginManager *manager = gplugin_manager_get_default(); GPluginPlugin *plugin = NULL;
/* add the test directory to the plugin manager's search paths */
- gplugin_manager_append_path(TEST_BAD_DIR);
+ gplugin_manager_append_path(manager, TEST_BAD_DIR); /* refresh the plugin manager */
- gplugin_manager_refresh();
+ gplugin_manager_refresh(manager); /* find the query-error plugin */
- plugin = gplugin_manager_find_plugin("gplugin/query-error");
+ plugin = gplugin_manager_find_plugin(manager, "gplugin/query-error"); --- a/gplugin/tests/test-plugin-manager-paths.c Tue Aug 03 00:35:00 2021 -0500
+++ b/gplugin/tests/test-plugin-manager-paths.c Tue Aug 03 02:25:55 2021 -0500
@@ -19,10 +19,10 @@
-#define test_path_count(e) \
+#define test_path_count(manager, e) \ - GList *paths = gplugin_manager_get_paths(); \
+ GList *paths = gplugin_manager_get_paths((manager)); \ g_assert_cmpint(g_list_length(paths), ==, (e)); \
@@ -33,100 +33,113 @@
test_gplugin_manager_paths_single(void)
- gplugin_manager_append_path("foo");
+ GPluginManager *manager = gplugin_manager_get_default(); - gplugin_manager_remove_path("foo");
+ gplugin_manager_append_path(manager, "foo"); + test_path_count(manager, 1); + gplugin_manager_remove_path(manager, "foo"); + test_path_count(manager, 0); test_gplugin_manager_paths_duplicate(void)
- gplugin_manager_append_path("foo");
- gplugin_manager_append_path("foo");
+ GPluginManager *manager = gplugin_manager_get_default(); + gplugin_manager_append_path(manager, "foo"); + gplugin_manager_append_path(manager, "foo");
+ test_path_count(manager, 1); - gplugin_manager_remove_path("foo");
+ gplugin_manager_remove_path(manager, "foo"); + test_path_count(manager, 0); test_gplugin_manager_paths_multiple_fifo(void)
+ GPluginManager *manager = gplugin_manager_get_default(); - gplugin_manager_append_path("foo");
+ gplugin_manager_append_path(manager, "foo"); + test_path_count(manager, 1); - gplugin_manager_append_path("bar");
+ gplugin_manager_append_path(manager, "bar"); + test_path_count(manager, 2); - gplugin_manager_remove_path("foo");
+ gplugin_manager_remove_path(manager, "foo"); + test_path_count(manager, 1); - gplugin_manager_remove_path("bar");
+ gplugin_manager_remove_path(manager, "bar"); + test_path_count(manager, 0); test_gplugin_manager_paths_multiple_filo(void)
+ GPluginManager *manager = gplugin_manager_get_default(); - gplugin_manager_append_path("foo");
+ gplugin_manager_append_path(manager, "foo"); + test_path_count(manager, 1); - gplugin_manager_append_path("bar");
+ gplugin_manager_append_path(manager, "bar"); + test_path_count(manager, 2); - gplugin_manager_remove_path("bar");
+ gplugin_manager_remove_path(manager, "bar"); + test_path_count(manager, 1); - gplugin_manager_remove_path("foo");
+ gplugin_manager_remove_path(manager, "foo"); + test_path_count(manager, 0); test_gplugin_manager_paths_unicode(void)
+ GPluginManager *manager = gplugin_manager_get_default(); - gplugin_manager_append_path("/home/🐦/.plugins");
+ test_path_count(manager, 0); + gplugin_manager_append_path(manager, "/home/🐦/.plugins"); + test_path_count(manager, 1); - gplugin_manager_append_path("/home/user/.plugins");
+ gplugin_manager_append_path(manager, "/home/user/.plugins"); + test_path_count(manager, 2); - gplugin_manager_remove_path("/home/🐦/.plugins");
+ gplugin_manager_remove_path(manager, "/home/🐦/.plugins"); + test_path_count(manager, 1); - gplugin_manager_remove_path("/home/user/.plugins");
+ gplugin_manager_remove_path(manager, "/home/user/.plugins"); + test_path_count(manager, 0); test_gplugin_manager_add_multiple_mixed_trailing_slashes(void)
+ GPluginManager *manager = gplugin_manager_get_default(); - gplugin_manager_append_path("/home/user1/.plugins");
+ test_path_count(manager, 0); + gplugin_manager_append_path(manager, "/home/user1/.plugins"); + test_path_count(manager, 1); - gplugin_manager_append_path("/home/user2/.plugins/");
+ gplugin_manager_append_path(manager, "/home/user2/.plugins/"); + test_path_count(manager, 2); - gplugin_manager_remove_path("/home/user1/.plugins/");
+ gplugin_manager_remove_path(manager, "/home/user1/.plugins/"); + test_path_count(manager, 1); - gplugin_manager_remove_path("/home/user2/.plugins");
+ gplugin_manager_remove_path(manager, "/home/user2/.plugins"); + test_path_count(manager, 0); test_gplugin_manager_add_default_paths(void)
+ GPluginManager *manager = gplugin_manager_get_default(); GList *paths = NULL, *l = NULL;
@@ -147,10 +160,10 @@
g_hash_table_insert(req, path, GINT_TO_POINTER(FALSE));
/* now tell the plugin manager to add the default paths */
- gplugin_manager_add_default_paths();
+ gplugin_manager_add_default_paths(manager); /* now remove each path that the manager knows about from our table */
- paths = gplugin_manager_get_paths();
+ paths = gplugin_manager_get_paths(manager); for(l = paths; l; l = l->next) {
g_hash_table_remove(req, l->data);
@@ -165,6 +178,7 @@
test_gplugin_manager_add_app_paths(void)
+ GPluginManager *manager = gplugin_manager_get_default(); GList *paths = NULL, *l = NULL;
const gchar *prefix = "/usr/local/";
@@ -187,14 +201,15 @@
g_hash_table_insert(req, path, GINT_TO_POINTER(FALSE));
/* now add the app paths */
- gplugin_manager_add_app_paths(prefix, "foo");
+ gplugin_manager_add_app_paths(manager, prefix, "foo"); /* now get all the paths that the manager is managing and remove them from
- paths = gplugin_manager_get_paths();
- for(l = paths; l != NULL; l = l->next)
+ paths = gplugin_manager_get_paths(manager); + for(l = paths; l != NULL; l = l->next) { g_hash_table_remove(req, l->data);
/* now check the hash table size, if it's > 0 then an expected path wasn't
--- a/gplugin/tests/test-signals.c Tue Aug 03 00:35:00 2021 -0500
+++ b/gplugin/tests/test-signals.c Tue Aug 03 02:25:55 2021 -0500
@@ -142,7 +142,7 @@
test_gplugin_manager_signals_normal(void)
GPluginPlugin *plugin = NULL;
- GPluginManager *manager = gplugin_manager_get_instance();
+ GPluginManager *manager = gplugin_manager_get_default(); TestGPluginManagerSignalsData data = {
@@ -173,16 +173,17 @@
G_CALLBACK(test_gplugin_manager_signals_normal_unloaded),
- gplugin_manager_append_path(TEST_DIR);
- gplugin_manager_refresh();
+ gplugin_manager_append_path(manager, TEST_DIR); + gplugin_manager_refresh(manager); - plugin = gplugin_manager_find_plugin("gplugin/native-basic-plugin");
- gplugin_manager_load_plugin(plugin, &error);
+ gplugin_manager_find_plugin(manager, "gplugin/native-basic-plugin"); + gplugin_manager_load_plugin(manager, plugin, &error); g_assert_no_error(error);
g_assert_true(data.loading);
g_assert_true(data.loaded);
- gplugin_manager_unload_plugin(plugin, &error);
+ gplugin_manager_unload_plugin(manager, plugin, &error); g_assert_no_error(error);
g_assert_true(data.unloading);
g_assert_true(data.unloaded);
@@ -197,7 +198,7 @@
test_gplugin_manager_signals_loading_stopped(void)
GPluginPlugin *plugin = NULL;
- GPluginManager *manager = gplugin_manager_get_instance();
+ GPluginManager *manager = gplugin_manager_get_default(); TestGPluginManagerSignalsData data = {
@@ -228,11 +229,12 @@
G_CALLBACK(test_gplugin_manager_signals_normal_unloaded),
- gplugin_manager_append_path(TEST_DIR);
- gplugin_manager_refresh();
+ gplugin_manager_append_path(manager, TEST_DIR); + gplugin_manager_refresh(manager); - plugin = gplugin_manager_find_plugin("gplugin/native-basic-plugin");
- gplugin_manager_load_plugin(plugin, &error);
+ gplugin_manager_find_plugin(manager, "gplugin/native-basic-plugin"); + gplugin_manager_load_plugin(manager, plugin, &error); g_assert_error(error, GPLUGIN_DOMAIN, 0);
@@ -251,7 +253,7 @@
test_gplugin_manager_signals_unloading_stopped(void)
GPluginPlugin *plugin = NULL;
- GPluginManager *manager = gplugin_manager_get_instance();
+ GPluginManager *manager = gplugin_manager_get_default(); TestGPluginManagerSignalsData data = {
@@ -282,16 +284,17 @@
G_CALLBACK(test_gplugin_manager_signals_normal_unloaded),
- gplugin_manager_append_path(TEST_DIR);
- gplugin_manager_refresh();
+ gplugin_manager_append_path(manager, TEST_DIR); + gplugin_manager_refresh(manager); - plugin = gplugin_manager_find_plugin("gplugin/native-basic-plugin");
- gplugin_manager_load_plugin(plugin, &error);
+ gplugin_manager_find_plugin(manager, "gplugin/native-basic-plugin"); + gplugin_manager_load_plugin(manager, plugin, &error); g_assert_no_error(error);
g_assert_true(data.loading);
g_assert_true(data.loaded);
- gplugin_manager_unload_plugin(plugin, &error);
+ gplugin_manager_unload_plugin(manager, plugin, &error); g_assert_error(error, GPLUGIN_DOMAIN, 0);
@@ -308,7 +311,7 @@
test_gplugin_manager_signals_load_failure(void)
GPluginPlugin *plugin = NULL;
- GPluginManager *manager = gplugin_manager_get_instance();
+ GPluginManager *manager = gplugin_manager_get_default(); TestGPluginManagerSignalsData data = {
@@ -327,11 +330,11 @@
G_CALLBACK(test_gplugin_manager_signals_load_failed),
- gplugin_manager_append_path(TEST_DIR);
- gplugin_manager_refresh();
+ gplugin_manager_append_path(manager, TEST_DIR); + gplugin_manager_refresh(manager); - plugin = gplugin_manager_find_plugin("gplugin/native-load-failed");
- gplugin_manager_load_plugin(plugin, &error);
+ plugin = gplugin_manager_find_plugin(manager, "gplugin/native-load-failed"); + gplugin_manager_load_plugin(manager, plugin, &error); g_assert_error(error, GPLUGIN_DOMAIN, 0);
@@ -346,7 +349,7 @@
test_gplugin_manager_signals_unload_failure(void)
GPluginPlugin *plugin = NULL;
- GPluginManager *manager = gplugin_manager_get_instance();
+ GPluginManager *manager = gplugin_manager_get_default(); TestGPluginManagerSignalsData data = {
@@ -377,16 +380,17 @@
G_CALLBACK(test_gplugin_manager_signals_unload_failed),
- gplugin_manager_append_path(TEST_DIR);
- gplugin_manager_refresh();
+ gplugin_manager_append_path(manager, TEST_DIR); + gplugin_manager_refresh(manager); - plugin = gplugin_manager_find_plugin("gplugin/native-unload-failed");
- gplugin_manager_load_plugin(plugin, &error);
+ gplugin_manager_find_plugin(manager, "gplugin/native-unload-failed"); + gplugin_manager_load_plugin(manager, plugin, &error); g_assert_no_error(error);
g_assert_true(data.loading);
g_assert_true(data.loaded);
- gplugin_manager_unload_plugin(plugin, &error);
+ gplugin_manager_unload_plugin(manager, plugin, &error); g_assert_error(error, GPLUGIN_DOMAIN, 0);