summaryrefslogtreecommitdiff
path: root/src/plugins/plugin.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/plugin.c')
-rw-r--r--src/plugins/plugin.c184
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. *