diff options
Diffstat (limited to 'src/plugins/plugin.c')
-rw-r--r-- | src/plugins/plugin.c | 184 |
1 files changed, 160 insertions, 24 deletions
diff --git a/src/plugins/plugin.c b/src/plugins/plugin.c index 23ef34c..e563817 100644 --- a/src/plugins/plugin.c +++ b/src/plugins/plugin.c @@ -112,6 +112,7 @@ static void g_plugin_module_class_init(GPluginModuleClass *class) static void g_plugin_module_init(GPluginModule *plugin) { + plugin->config = NULL; } @@ -167,6 +168,14 @@ static void g_plugin_module_dispose(GPluginModule *plugin) if (class->exit != NULL) class->exit(plugin); + if (plugin->config != NULL) + { + g_generic_config_write(plugin->config); + + g_clear_object(&plugin->config); + + } + if (plugin->module != NULL) { g_module_close(plugin->module); @@ -306,6 +315,10 @@ GPluginModule *g_plugin_module_new(const gchar *filename) valid = check_plugin_symbol(module, "chrysalide_plugin_init"); break; + case PGA_PLUGIN_LOADED: + valid = check_plugin_symbol(module, "chrysalide_plugin_manage"); + break; + case PGA_PLUGIN_EXIT: valid = check_plugin_symbol(module, "chrysalide_plugin_exit"); break; @@ -325,7 +338,7 @@ GPluginModule *g_plugin_module_new(const gchar *filename) switch (action) { case PGA_NATIVE_PLUGINS_LOADED: - case PGA_PLUGINS_LOADED: + case PGA_ALL_PLUGINS_LOADED: valid = check_plugin_symbol(module, "chrysalide_plugin_on_plugins_loaded"); break; @@ -600,6 +613,10 @@ static void g_plugin_module_init_gclass(GPluginModuleClass *class, GModule *modu load_plugin_symbol(module, "chrysalide_plugin_init", &class->init); break; + case PGA_PLUGIN_LOADED: + load_plugin_symbol(module, "chrysalide_plugin_manage", &class->manage); + break; + case PGA_PLUGIN_EXIT: load_plugin_symbol(module, "chrysalide_plugin_exit", &class->exit); break; @@ -617,7 +634,7 @@ static void g_plugin_module_init_gclass(GPluginModuleClass *class, GModule *modu switch (action) { case PGA_NATIVE_PLUGINS_LOADED: - case PGA_PLUGINS_LOADED: + case PGA_ALL_PLUGINS_LOADED: load_plugin_symbol(module, "chrysalide_plugin_on_plugins_loaded", &class->plugins_loaded); break; @@ -1039,6 +1056,7 @@ bool g_plugin_module_load(GPluginModule *plugin, GPluginModule **list, size_t co size_t i; /* Boucle de parcours */ GPluginModule *dependency; /* Module nécessaire */ GPluginModuleClass *class; /* Classe de l'instance active */ + GGenConfig *config; /* Configuration à charger */ char *dir; /* Répertoire modifiable */ /* Si un essai précédent a déjà échoué ou réussi... */ @@ -1067,47 +1085,63 @@ bool g_plugin_module_load(GPluginModule *plugin, GPluginModule **list, size_t co } if (!result) + { log_variadic_message(LMT_ERROR, _("Some dependencies failed to load for plugin '%s'"), plugin->filename); + goto failure; + } /* Chargement du greffon courant */ - if (result) + class = G_PLUGIN_MODULE_GET_CLASS(plugin); + + if (class->init != NULL) { - class = G_PLUGIN_MODULE_GET_CLASS(plugin); + result = class->init(plugin); - if (class->init != NULL) + if (!result) { - result = class->init(plugin); + log_variadic_message(LMT_ERROR, + _("Plugin '%s' failed to load itself..."), plugin->filename); - if (!result) - { - log_variadic_message(LMT_ERROR, - _("Plugin '%s' failed to load itself..."), plugin->filename); - - plugin->flags |= PSF_FAILURE; - - } + plugin->flags |= PSF_FAILURE; + goto failure; } - if (result) - { - dir = strdup(plugin->filename); - dir = dirname(dir); + } - log_variadic_message(LMT_PROCESS, - _("Loaded the '<b>%s</b>' file as plugin from the '<b>%s</b>' directory"), - strrchr(plugin->filename, G_DIR_SEPARATOR) + 1, dir); + g_plugin_module_create_config(plugin); - free(dir); + result = g_plugin_module_manage(plugin, PGA_PLUGIN_LOADED); - plugin->flags |= PSF_LOADED; + if (!result) + { + log_variadic_message(LMT_ERROR, + _("Plugin '%s' failed to complete loading..."), plugin->filename); - } + plugin->flags |= PSF_FAILURE; + goto failure; } + config = g_plugin_module_get_config(plugin); + g_generic_config_read(config); + g_object_unref(G_OBJECT(config)); + + dir = strdup(plugin->filename); + dir = dirname(dir); + + log_variadic_message(LMT_PROCESS, + _("Loaded the '<b>%s</b>' file as plugin from the '<b>%s</b>' directory"), + strrchr(plugin->filename, G_DIR_SEPARATOR) + 1, dir); + + free(dir); + + plugin->flags |= PSF_LOADED; + + failure: + return result; } @@ -1168,6 +1202,57 @@ char *g_plugin_module_build_config_filename(const GPluginModule *plugin, const c /****************************************************************************** * * +* Paramètres : plugin = greffon à compléter. * +* * +* Description : Met en place la configuration dédiée au greffon. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_plugin_module_create_config(GPluginModule *plugin) +{ + char *filename; /* Chemin d'accès particulier */ + + filename = g_plugin_module_build_config_filename(plugin, "config.xml", false); + + plugin->config = g_generic_config_new_from_file(filename); + + free(filename); + +} + + +/****************************************************************************** +* * +* Paramètres : plugin = greffon à consulter. * +* * +* Description : Fournit la configuration mise en place pour le greffon. * +* * +* Retour : Configuration dédiée à l'extension. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GGenConfig *g_plugin_module_get_config(const GPluginModule *plugin) +{ + GGenConfig *result; /* Configuration à faire suivre*/ + + result = plugin->config; + + if (result != NULL) + g_object_ref(G_OBJECT(result)); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : plugin = greffon à consulter. * * msg = message à faire apparaître à l'écran. * * * @@ -1238,6 +1323,57 @@ void g_plugin_module_log_variadic_message(const GPluginModule *plugin, LogMessag * * * Paramètres : plugin = greffon à manipuler. * * action = type d'action attendue. * +* * +* Description : Encadre une étape de la vie d'un greffon. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_plugin_module_manage(GPluginModule *plugin, PluginAction action) +{ + bool result; /* Bilan à faire remonter */ + GPluginModuleClass *class; /* Classe de l'instance active */ + const plugin_interface *pg_iface; /* Informations à consulter */ + size_t i; /* Boucle de parcours */ + bool handle_action; /* Action supportée ? */ + + class = G_PLUGIN_MODULE_GET_CLASS(plugin); + + if (class->manage == NULL) + result = true; + + else + { + handle_action = false; + + pg_iface = g_plugin_module_get_interface(plugin); + + for (i = 0; i < pg_iface->actions_count; i++) + if (pg_iface->actions[i] == PGA_PLUGIN_LOADED) + { + handle_action = true; + break; + } + + if (handle_action) + result = class->manage(plugin/*, action*/); + else + result = true; + + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : plugin = greffon à manipuler. * +* action = type d'action attendue. * * unused = variable non utilisé pour l'usage de __VA_ARGS__. * * * * Description : Accompagne la fin du chargement des modules. * |