diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2020-11-22 22:36:53 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2020-11-22 22:36:53 (GMT) |
commit | 6122bb7f34b178d4c07285adae16afcc55294b1f (patch) | |
tree | cb9b2b2b19ef43d4782a228f28143e745e18c5dd /src/plugins | |
parent | f20d4a9ec9fa9382a562844de83b5380103283b3 (diff) |
Provided a configuration directory for plugins.
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/plugin-int.h | 5 | ||||
-rw-r--r-- | src/plugins/plugin.c | 133 | ||||
-rw-r--r-- | src/plugins/plugin.h | 6 |
3 files changed, 144 insertions, 0 deletions
diff --git a/src/plugins/plugin-int.h b/src/plugins/plugin-int.h index 6b7eb7f..876dc99 100644 --- a/src/plugins/plugin-int.h +++ b/src/plugins/plugin-int.h @@ -45,6 +45,9 @@ typedef bool (* pg_management_fc) (GPluginModule *); /* Accompagne la fin du chargement des modules natifs. */ typedef void (* pg_native_loaded_fc) (GPluginModule *, PluginAction); +/* Fournit le nom brut associé au greffon. */ +typedef char * (* pg_get_modname_fc) (const GPluginModule *); + /* Procède à une opération liée à un contenu binaire. */ typedef void (* pg_handle_content_fc) (const GPluginModule *, PluginAction, GBinContent *, wgroup_id_t, GtkStatusStack *); @@ -97,6 +100,8 @@ struct _GPluginModuleClass pg_native_loaded_fc native_loaded; /* Fin des chargements natifs */ + pg_get_modname_fc get_modname; /* Fourniture du nom brut */ + pg_include_theme_fc include_theme; /* Extension d'un thème */ pg_handle_content_fc handle_content; /* Explorations ou résolutions */ diff --git a/src/plugins/plugin.c b/src/plugins/plugin.c index e96ddc9..cc3db70 100644 --- a/src/plugins/plugin.c +++ b/src/plugins/plugin.c @@ -38,6 +38,9 @@ #include "dt.h" #include "pglist.h" #include "plugin-int.h" +#include "../common/extstr.h" +#include "../common/pathname.h" +#include "../common/xdg.h" @@ -56,6 +59,9 @@ static void g_plugin_module_finalize(GPluginModule *); /* Initialise la classe des greffons d'extension. */ static void g_plugin_module_init_gclass(GPluginModuleClass *, GModule *); +/* Fournit le nom brut associé au greffon. */ +static char *_g_plugin_module_get_modname(const GPluginModule *); + /* Indique le type défini pour un greffon. */ @@ -78,12 +84,17 @@ G_DEFINE_TYPE(GPluginModule, g_plugin_module, G_TYPE_OBJECT); static void g_plugin_module_class_init(GPluginModuleClass *class) { GObjectClass *object; /* Autre version de la classe */ + GPluginModuleClass *plugin; /* Version parente de la classe*/ object = G_OBJECT_CLASS(class); object->dispose = (GObjectFinalizeFunc/* ! */)g_plugin_module_dispose; object->finalize = (GObjectFinalizeFunc)g_plugin_module_finalize; + plugin = G_PLUGIN_MODULE_CLASS(class); + + plugin->get_modname = (pg_get_modname_fc)_g_plugin_module_get_modname; + } @@ -712,6 +723,75 @@ static void g_plugin_module_init_gclass(GPluginModuleClass *class, GModule *modu /****************************************************************************** * * +* Paramètres : plugin = greffon à valider. * +* * +* Description : Fournit le nom brut associé au greffon. * +* * +* Retour : Désignation brute du greffon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +char *g_plugin_module_get_modname(const GPluginModule *plugin) +{ + char *result; /* Désignation brute à renvoyer*/ + GPluginModuleClass *class; /* Classe de l'instance active */ + + class = G_PLUGIN_MODULE_GET_CLASS(plugin); + + result = class->get_modname(plugin); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : plugin = greffon à valider. * +* * +* Description : Fournit le nom brut associé au greffon. * +* * +* Retour : Désignation brute du greffon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static char *_g_plugin_module_get_modname(const GPluginModule *plugin) +{ + char *result; /* Désignation brute à renvoyer*/ + char *path; /* Chemin à traiter */ + char *filename; /* Nom de bibliothèque partagée*/ + size_t length; /* Taille du nom */ + + path = strdup(g_plugin_module_get_filename(G_PLUGIN_MODULE(plugin))); + + filename = basename(path); + + if (strncmp(filename, "lib", 3) == 0) + filename += 3; + + length = strlen(filename); + + if (length >= 3) + { + if (strncmp(&filename[length - 3], ".so", 3) == 0) + filename[length - 3] = '\0'; + } + + result = strdup(filename); + + free(path); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : plugin = greffon à consulter. * * * * Description : Indique le fichier contenant le greffon manipulé. * @@ -981,6 +1061,59 @@ bool g_plugin_module_load(GPluginModule *plugin, GPluginModule **list, size_t co /****************************************************************************** * * * Paramètres : plugin = greffon à consulter. * +* final = fin imposée du nom de fichier final. * +* create = amorce la création des répertoire ? * +* * +* Description : Construit le nom d'un fichier de configuration du greffon. * +* * +* Retour : Chemin d'accès déterminé, ou NULL en cas d'erreur. * +* * +* Remarques : - * +* * +******************************************************************************/ + +char *g_plugin_module_build_config_filename(const GPluginModule *plugin, const char *final, bool create) +{ + char *result; /* Chaîne à retourner */ + char *modname; /* Désignation brute de greffon*/ + char *suffix; /* Fin du répertoire personnel */ + bool status; /* Bilan d'une création */ + + modname = g_plugin_module_get_modname(plugin); + + suffix = strdup("chrysalide"); + suffix = stradd(suffix, G_DIR_SEPARATOR_S); + suffix = stradd(suffix, "plugins"); + suffix = stradd(suffix, G_DIR_SEPARATOR_S); + suffix = stradd(suffix, modname); + suffix = stradd(suffix, G_DIR_SEPARATOR_S); + suffix = stradd(suffix, final); + + result = get_xdg_config_dir(suffix); + + free(suffix); + free(modname); + + if (create) + { + status = mkpath(result); + + if (!status) + { + free(result); + result = NULL; + } + + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : plugin = greffon à consulter. * * msg = message à faire apparaître à l'écran. * * * * Description : Présente dans le journal un message simple. * diff --git a/src/plugins/plugin.h b/src/plugins/plugin.h index 37e4c57..70687fe 100644 --- a/src/plugins/plugin.h +++ b/src/plugins/plugin.h @@ -75,6 +75,9 @@ GType g_plugin_module_get_type(void); /* Crée un module pour un greffon donné. */ GPluginModule *g_plugin_module_new(const gchar *); +/* Fournit le nom brut associé au greffon. */ +char *g_plugin_module_get_modname(const GPluginModule *); + /* Indique le fichier contenant le greffon manipulé. */ const char *g_plugin_module_get_filename(const GPluginModule *); @@ -93,6 +96,9 @@ bool g_plugin_module_resolve_dependencies(GPluginModule *, GPluginModule **, siz /* Termine le chargement du greffon préparé. */ bool g_plugin_module_load(GPluginModule *, GPluginModule **, size_t); +/* Construit le nom d'un fichier de configuration du greffon. */ +char *g_plugin_module_build_config_filename(const GPluginModule *, const char *, bool); + /* Présente dans le journal un message simple. */ void g_plugin_module_log_simple_message(const GPluginModule *, LogMessageType, const char *); |