summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2020-11-22 22:36:53 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2020-11-22 22:36:53 (GMT)
commit6122bb7f34b178d4c07285adae16afcc55294b1f (patch)
treecb9b2b2b19ef43d4782a228f28143e745e18c5dd
parentf20d4a9ec9fa9382a562844de83b5380103283b3 (diff)
Provided a configuration directory for plugins.
-rw-r--r--plugins/pychrysalide/plugin.c177
-rw-r--r--src/plugins/plugin-int.h5
-rw-r--r--src/plugins/plugin.c133
-rw-r--r--src/plugins/plugin.h6
4 files changed, 321 insertions, 0 deletions
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 <assert.h>
+#include <libgen.h>
#include <malloc.h>
#include <pygobject.h>
#include <string.h>
@@ -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 *);