From 6122bb7f34b178d4c07285adae16afcc55294b1f Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Sun, 22 Nov 2020 23:36:53 +0100 Subject: Provided a configuration directory for plugins. --- plugins/pychrysalide/plugin.c | 177 ++++++++++++++++++++++++++++++++++++++++++ src/plugins/plugin-int.h | 5 ++ src/plugins/plugin.c | 133 +++++++++++++++++++++++++++++++ src/plugins/plugin.h | 6 ++ 4 files changed, 321 insertions(+) diff --git a/plugins/pychrysalide/plugin.c b/plugins/pychrysalide/plugin.c index 463fece..a552aaa 100644 --- a/plugins/pychrysalide/plugin.c +++ b/plugins/pychrysalide/plugin.c @@ -26,6 +26,7 @@ #include +#include #include #include #include @@ -116,14 +117,26 @@ static void g_python_plugin_dispose(GPythonPlugin *); /* Description : Procède à la libération totale de la mémoire. */ static void g_python_plugin_finalize(GPythonPlugin *); +/* Fournit le nom brut associé au greffon. */ +static char *g_python_plugin_get_modname(const GPythonPlugin *); + /* ------------------------- MODULE PYTHON POUR LES SCRIPTS ------------------------- */ +/* Construit le nom d'un fichier de configuration du greffon. */ +static PyObject *py_plugin_module_build_config_filename(PyObject *, PyObject *); + /* Affiche un message dans le journal des messages système. */ static PyObject *py_plugin_module_log_message(PyObject *, PyObject *); +/* Fournit le nom brut associé au greffon. */ +static PyObject *py_plugin_module_get_modname(PyObject *, void *); + +/* Indique le fichier contenant le greffon manipulé. */ +static PyObject *py_plugin_module_get_filename(PyObject *, void *); + /* ---------------------------------------------------------------------------------- */ @@ -1054,12 +1067,17 @@ G_DEFINE_TYPE(GPythonPlugin, g_python_plugin, G_TYPE_PLUGIN_MODULE); static void g_python_plugin_class_init(GPythonPluginClass *klass) { GObjectClass *object; /* Autre version de la classe */ + GPluginModuleClass *plugin; /* Version parente de la classe*/ object = G_OBJECT_CLASS(klass); object->dispose = (GObjectFinalizeFunc/* ! */)g_python_plugin_dispose; object->finalize = (GObjectFinalizeFunc)g_python_plugin_finalize; + plugin = G_PLUGIN_MODULE_CLASS(klass); + + plugin->get_modname = (pg_get_modname_fc)g_python_plugin_get_modname; + } @@ -1175,6 +1193,34 @@ static void g_python_plugin_finalize(GPythonPlugin *plugin) /****************************************************************************** * * +* Paramètres : plugin = greffon à valider. * +* * +* Description : Fournit le nom brut associé au greffon. * +* * +* Retour : Désignation brute du greffon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static char *g_python_plugin_get_modname(const GPythonPlugin *plugin) +{ + char *result; /* Désignation brute à renvoyer*/ + char *path; /* Chemin à traiter */ + + path = strdup(g_plugin_module_get_filename(G_PLUGIN_MODULE(plugin))); + + result = strdup(basename(path)); + + free(path); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : modname = nom du module à charger. * * filename = chemin d'accès au code Python à charger. * * * @@ -1261,6 +1307,62 @@ GPluginModule *g_python_plugin_new(const char *modname, const char *filename) * Paramètres : self = objet Python concerné par l'appel. * * args = arguments fournis à l'appel. * * * +* 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 : - * +* * +******************************************************************************/ + +static PyObject *py_plugin_module_build_config_filename(PyObject *self, PyObject *args) +{ + PyObject *result; /* Bilan à retourner */ + const char *final; /* Suffixe de fichier imposé */ + int create; /* Volonté de création */ + char *filename; /* Nom de fichier déterminé */ + +#define PLUGIN_MODULE_BUILD_CONFIG_FILENAME_METHOD PYTHON_METHOD_DEF \ +( \ + build_config_filename, "final, /, create=False", \ + METH_VARARGS, py_plugin_module, \ + "Build a filename suitable for the plugin configuration, ending with" \ + " the *final* suffix.\n" \ + "\n" \ + "If the *create* parameter is set, the path to this filename is" \ + " created.\n" \ + "\n" \ + "The result is a string or None on failure." \ +) + + create = 0; + + if (!PyArg_ParseTuple(args, "s|p", &final, &create)) + return NULL; + + filename = g_plugin_module_build_config_filename(G_PLUGIN_MODULE(pygobject_get(self)), final, create); + + if (filename != NULL) + { + result = PyUnicode_FromString(filename); + free(filename); + } + else + { + result = Py_None; + Py_INCREF(result); + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : self = objet Python concerné par l'appel. * +* args = arguments fournis à l'appel. * +* * * Description : Affiche un message dans le journal des messages système. * * * * Retour : Rien en équivalent Python. * @@ -1305,6 +1407,78 @@ static PyObject *py_plugin_module_log_message(PyObject *self, PyObject *args) /****************************************************************************** * * +* Paramètres : self = objet Python concerné par l'appel. * +* closure = non utilisé ici. * +* * +* Description : Fournit le nom brut associé au greffon. * +* * +* Retour : Désignation brute du greffon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_plugin_module_get_modname(PyObject *self, void *closure) +{ + PyObject *result; /* Valeur à retourner */ + GPluginModule *plugin; /* Version native du greffon */ + char *modname; /* Désignation brute */ + +#define PLUGIN_MODULE_MODNAME_ATTRIB PYTHON_GET_DEF_FULL \ +( \ + modname, py_plugin_module, \ + "Raw module name of the plugin." \ +) + + plugin = G_PLUGIN_MODULE(pygobject_get(self)); + modname = g_plugin_module_get_modname(plugin); + + result = PyUnicode_FromString(modname); + + free(modname); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : self = objet Python concerné par l'appel. * +* closure = non utilisé ici. * +* * +* Description : Indique le fichier contenant le greffon manipulé. * +* * +* Retour : Chemin d'accès au greffon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_plugin_module_get_filename(PyObject *self, void *closure) +{ + PyObject *result; /* Valeur à retourner */ + GPluginModule *plugin; /* Version native du greffon */ + const char *filename; /* Chemin d'accès associé */ + +#define PLUGIN_MODULE_FILENAME_ATTRIB PYTHON_GET_DEF_FULL \ +( \ + filename, py_plugin_module, \ + "Filename of the plugin." \ +) + + plugin = G_PLUGIN_MODULE(pygobject_get(self)); + filename = g_plugin_module_get_filename(plugin); + + result = PyUnicode_FromString(filename); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : - * * * * Description : Fournit un accès à une définition de type à diffuser. * @@ -1327,11 +1501,14 @@ PyTypeObject *get_python_plugin_module_type(void) PLUGIN_MODULE_ATTACH_DEBUG_FORMAT_WRAPPER, PLUGIN_MODULE_PROCESS_DISASSEMBLY_EVENT_WRAPPER, PLUGIN_MODULE_DETECT_EXTERNAL_TOOLS_WRAPPER, + PLUGIN_MODULE_BUILD_CONFIG_FILENAME_METHOD, PLUGIN_MODULE_LOG_MESSAGE_METHOD, { NULL } }; static PyGetSetDef py_plugin_module_getseters[] = { + PLUGIN_MODULE_MODNAME_ATTRIB, + PLUGIN_MODULE_FILENAME_ATTRIB, { NULL } }; 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 *); -- cgit v0.11.2-87-g4458