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 /plugins | |
parent | f20d4a9ec9fa9382a562844de83b5380103283b3 (diff) |
Provided a configuration directory for plugins.
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/pychrysalide/plugin.c | 177 |
1 files changed, 177 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 } }; |