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.c80
1 files changed, 74 insertions, 6 deletions
diff --git a/src/plugins/plugin.c b/src/plugins/plugin.c
index dabe493..968cf65 100644
--- a/src/plugins/plugin.c
+++ b/src/plugins/plugin.c
@@ -44,6 +44,11 @@ static void g_plugin_module_class_init(GPluginModuleClass *);
/* Initialise une instance de greffon. */
static void g_plugin_module_init(GPluginModule *);
+/* Supprime toutes les références externes. */
+static void g_plugin_module_dispose(GPluginModule *);
+
+/* Procède à la libération totale de la mémoire. */
+static void g_plugin_module_finalize(GPluginModule *);
/* Indique le type défini pour un greffon. */
@@ -53,7 +58,7 @@ G_DEFINE_TYPE(GPluginModule, g_plugin_module, G_TYPE_OBJECT);
/******************************************************************************
* *
-* Paramètres : klass = classe à initialiser. *
+* Paramètres : class = classe à initialiser. *
* *
* Description : Initialise la classe des greffons. *
* *
@@ -63,15 +68,21 @@ G_DEFINE_TYPE(GPluginModule, g_plugin_module, G_TYPE_OBJECT);
* *
******************************************************************************/
-static void g_plugin_module_class_init(GPluginModuleClass *klass)
+static void g_plugin_module_class_init(GPluginModuleClass *class)
{
+ GObjectClass *object; /* Autre version de la classe */
+
+ object = G_OBJECT_CLASS(class);
+
+ object->dispose = (GObjectFinalizeFunc/* ! */)g_plugin_module_dispose;
+ object->finalize = (GObjectFinalizeFunc)g_plugin_module_finalize;
}
/******************************************************************************
* *
-* Paramètres : line = instance à initialiser. *
+* Paramètres : plugin = instance à initialiser. *
* *
* Description : Initialise une instance de greffon. *
* *
@@ -81,8 +92,57 @@ static void g_plugin_module_class_init(GPluginModuleClass *klass)
* *
******************************************************************************/
-static void g_plugin_module_init(GPluginModule *line)
+static void g_plugin_module_init(GPluginModule *plugin)
+{
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : plugin = instance d'objet GLib à traiter. *
+* *
+* Description : Supprime toutes les références externes. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_plugin_module_dispose(GPluginModule *plugin)
+{
+ if (plugin->exit != NULL)
+ plugin->exit(plugin);
+
+ if (plugin->module != NULL)
+ g_module_close(plugin->module);
+
+ G_OBJECT_CLASS(g_plugin_module_parent_class)->dispose(G_OBJECT(plugin));
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : plugin = instance d'objet GLib à traiter. *
+* *
+* Description : Procède à la libération totale de la mémoire. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_plugin_module_finalize(GPluginModule *plugin)
{
+ if (plugin->name != NULL)
+ free(plugin->name);
+ if (plugin->filename != NULL)
+ free(plugin->filename);
+
+ G_OBJECT_CLASS(g_plugin_module_parent_class)->finalize(G_OBJECT(plugin));
}
@@ -109,9 +169,14 @@ GPluginModule *g_plugin_module_new(const gchar *filename)
result = g_object_new(G_TYPE_PLUGIN_MODULE, NULL);
-
result->module = g_module_open(filename, G_MODULE_BIND_LAZY);
- if (!result->module) goto bad_plugin;
+ if (result->module == NULL)
+ {
+ log_variadic_message(LMT_ERROR,
+ _("Error while loading the plugin candidate '%s' : %s"),
+ filename, g_module_error());
+ goto bad_plugin;
+ }
if (!g_module_symbol(result->module, "get_plugin_name", (gpointer *)&get_name))
{
@@ -127,6 +192,9 @@ GPluginModule *g_plugin_module_new(const gchar *filename)
if (!g_module_symbol(result->module, "init_plugin", (gpointer *)&result->init))
result->init = NULL;
+ if (!g_module_symbol(result->module, "exit_plugin", (gpointer *)&result->exit))
+ result->exit = NULL;
+
/*