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 | |
| parent | f20d4a9ec9fa9382a562844de83b5380103283b3 (diff) | |
Provided a configuration directory for plugins.
| -rw-r--r-- | plugins/pychrysalide/plugin.c | 177 | ||||
| -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 | 
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 *); | 
