diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.c | 2 | ||||
| -rw-r--r-- | src/plugins/pglist.c | 28 | ||||
| -rw-r--r-- | src/plugins/pglist.h | 3 | ||||
| -rw-r--r-- | src/plugins/plugin-int.h | 4 | ||||
| -rw-r--r-- | src/plugins/plugin.c | 80 | 
5 files changed, 111 insertions, 6 deletions
@@ -164,6 +164,8 @@ int main(int argc, char **argv)      gtk_main();      gdk_threads_leave(); +    exit_all_plugins(); +      exit_global_pango_context();      unload_configuration(config); diff --git a/src/plugins/pglist.c b/src/plugins/pglist.c index 6b51690..e7a3ab0 100644 --- a/src/plugins/pglist.c +++ b/src/plugins/pglist.c @@ -76,6 +76,7 @@ void browse_directory_for_plugins(plugins_list *, const char *);  bool init_all_plugins(GObject *ref)  {      _list.ref = ref; +    g_object_ref(ref);      browse_directory_for_plugins(&_list, PACKAGE_SOURCE_DIR "/plugins"); @@ -86,6 +87,33 @@ bool init_all_plugins(GObject *ref)  /******************************************************************************  *                                                                             * +*  Paramètres  : -                                                            * +*                                                                             * +*  Description : Procède au déchargement des différents greffons présents.    * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +void exit_all_plugins(void) +{ +    size_t i;                               /* Boucle de parcours          */ + +    for (i = 0; i < _list.plugins_count; i++) +        g_object_unref(_list.plugins[i]); + +    if (_list.plugins != NULL) +        free(_list.plugins); + +    g_object_unref(_list.ref); + +} + + +/****************************************************************************** +*                                                                             *  *  Paramètres  : entry = entrée de répertoire à analyser.                     *  *                                                                             *  *  Description : Filtre les répertoire et les modules de greffons pootentels. * diff --git a/src/plugins/pglist.h b/src/plugins/pglist.h index e77bc8b..8e95050 100644 --- a/src/plugins/pglist.h +++ b/src/plugins/pglist.h @@ -38,6 +38,9 @@  /* Procède au chargement des différents greffons trouvés. */  bool init_all_plugins(GObject *); +/* Procède au déchargement des différents greffons présents. */ +void exit_all_plugins(void); +  /* Founit un greffon offrant le service demandé. */  GPluginModule *get_one_plugin_for_action(PluginAction); diff --git a/src/plugins/plugin-int.h b/src/plugins/plugin-int.h index 055f6ff..20d9720 100644 --- a/src/plugins/plugin-int.h +++ b/src/plugins/plugin-int.h @@ -40,6 +40,9 @@ typedef char * (* get_plugin_name_fc) (void);  /* Procède à l'initialisation du greffon. */  typedef bool (* init_plugin_fc) (GPluginModule *, GObject *); +/* Procède à l'extinction du greffon. */ +typedef void (* exit_plugin_fc) (GPluginModule *); +  /* Fournit une indication sur le type d'opération(s) menée(s). */  typedef PluginAction (* get_plugin_action_fc) (const GPluginModule *); @@ -65,6 +68,7 @@ struct _GPluginModule      PluginType type;                        /* Type(s) du greffon          */      init_plugin_fc init;                    /* Procédure d'initialisation  */ +    exit_plugin_fc exit;                    /* Procédure d'extinction      */      get_plugin_action_fc get_action;        /* Opération(s) menée(s)       */      is_matching_fc is_matching;             /* Recherche de correspondance */ 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; +      /*  | 
