diff options
Diffstat (limited to 'plugins/pychrysalide')
| -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 }      };  | 
