/* Chrysalide - Outil d'analyse de fichiers binaires * configuration.c - prototypes pour l'équivalent Python du fichier "glibext/configuration.c" * * Copyright (C) 2014-2017 Cyrille Bagard * * This file is part of Chrysalide. * * Chrysalide is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Chrysalide is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "configuration.h" #include #include #include "../access.h" #include "../helpers.h" /* ---------------------------- ELEMENT DE CONFIGURATION ---------------------------- */ /* Crée un nouvel objet Python de type 'ConfigParam'. */ static PyObject *py_config_param_new(PyTypeObject *, PyObject *, PyObject *); /* Efface toute valeur courante d'un paramètre de configuration. */ static PyObject *py_config_param_make_empty(PyObject *, PyObject *); /* Réinitialise la valeur d'un paramètre de configuration. */ static PyObject *py_config_param_reset(PyObject *, PyObject *); /* Indique le chemin d'accès utilisé pour un paramètre. */ static PyObject *py_config_param_get_path(PyObject *, void *); /* Indique le type de valeur utilisée par un paramètre. */ static PyObject *py_config_param_get_type(PyObject *, void *); /* Indique le statut d'une valeur utilisée par un paramètre. */ static PyObject *py_config_param_get_state(PyObject *, void *); /* Indique la valeur courante d'un paramètre de configuration. */ static PyObject *py_config_param_get_value(PyObject *, void *); /* Modifie la valeur courante d'un paramètre de configuration. */ static int py_config_param_set_value(PyObject *, PyObject *, void *); /* Définit les constantes pour les paramètres. */ static bool py_config_param_define_constants(PyObject *); /* ----------------------------- PARCOURS DE PARAMETRES ----------------------------- */ /* Parcours des éléments de configuration */ typedef struct _pyConfigParamIterator { PyObject_HEAD /* A laisser en premier */ GGenConfig *config; /* Configuration à parcourir */ GList *params; /* Liste de paramètres */ GList *last; /* Dernier élément retourné */ } pyConfigParamIterator; /* Prend acte d'un compteur de référence à 0. */ static void py_config_param_iterator_dealloc(PyObject *); /* Fournit un itérateur pour paramètres de configuration. */ static PyObject *py_config_param_iterator_next(PyObject *); /* Initialise un objet Python de type 'ConfigParamIterator'. */ static int py_config_param_iterator_init(PyObject *, PyObject *, PyObject *); /* ----------------------- GESTION GENERIQUE DE CONFIGURATION ----------------------- */ /* Crée un nouvel objet Python de type 'GenConfig'. */ static PyObject *py_generic_config_new(PyTypeObject *, PyObject *, PyObject *); /* Lit la configuration depuis un fichier. */ static PyObject *py_generic_config_read(PyObject *, PyObject *); /* Ecrit la configuration dans un fichier. */ static PyObject *py_generic_config_write(PyObject *, PyObject *); /* Retrouve un élément de configuration par son chemin. */ static PyObject *py_generic_config_search(PyObject *, PyObject *); /* Ajoute un paramètre à une configuration. */ static PyObject *py_generic_config_add(PyObject *, PyObject *); /* Retire un paramètre d'une configuration. */ static PyObject *py_generic_config_delete(PyObject *, PyObject *); /* Fournit le chemin d'accès au binaire représenté. */ static PyObject *py_generic_config_get_filename(PyObject *, void *); /* ---------------------------------------------------------------------------------- */ /* ELEMENT DE CONFIGURATION */ /* ---------------------------------------------------------------------------------- */ /****************************************************************************** * * * Paramètres : type = type de l'objet à instancier. * * args = arguments fournis à l'appel. * * kwds = arguments de type key=val fournis. * * * * Description : Crée un nouvel objet Python de type 'ConfigParam'. * * * * Retour : Instance Python mise en place. * * * * Remarques : - * * * ******************************************************************************/ static PyObject *py_config_param_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { PyObject *result; /* Instance à retourner */ const char *path; /* Accès au paramètre */ unsigned int ptype; /* Type de paramètre */ PyObject *value; /* Valeur par défaut éventuelle*/ int ret; /* Bilan de lecture des args. */ GCfgParam *param; /* Paramètre mis en place */ value = NULL; ret = PyArg_ParseTuple(args, "sI|O", &path, &ptype, &value); if (!ret) Py_RETURN_NONE; if (value == NULL || value == Py_None) param = g_config_param_new_empty(path, ptype); else switch (ptype) { case CPT_BOOLEAN: if (PyBool_Check(value)) param = g_config_param_new(path, CPT_BOOLEAN, (bool)(value == Py_True)); else param = NULL; break; case CPT_INTEGER: if (PyLong_Check(value)) param = g_config_param_new(path, CPT_INTEGER, (int)PyLong_AsLong(value)); else param = NULL; break; case CPT_STRING: if (PyUnicode_Check(value)) param = g_config_param_new(path, CPT_STRING, PyUnicode_DATA(value)); else param = NULL; break; default: param = NULL; break; } if (param != NULL) { result = pygobject_new(G_OBJECT(param)); g_object_unref(param); } else result = NULL; return result; } /****************************************************************************** * * * Paramètres : self = paramètre de configuration à manipuler. * * args = non utilisé ici. * * * * Description : Efface toute valeur courante d'un paramètre de configuration.* * * * Retour : None. * * * * Remarques : - * * * ******************************************************************************/ static PyObject *py_config_param_make_empty(PyObject *self, PyObject *args) { GCfgParam *param; /* Paramètre visé par l'opérat°*/ param = G_CFG_PARAM(pygobject_get(self)); g_config_param_make_empty(param); Py_RETURN_NONE; } /****************************************************************************** * * * Paramètres : self = paramètre de configuration à manipuler. * * args = non utilisé ici. * * * * Description : Réinitialise la valeur d'un paramètre de configuration. * * * * Retour : None. * * * * Remarques : - * * * ******************************************************************************/ static PyObject *py_config_param_reset(PyObject *self, PyObject *args) { GCfgParam *param; /* Paramètre visé par l'opérat°*/ param = G_CFG_PARAM(pygobject_get(self)); g_config_param_reset(param); Py_RETURN_NONE; } /****************************************************************************** * * * Paramètres : self = paramètre de configuration à manipuler. * * closure = non utilisé ici. * * * * Description : Indique le chemin d'accès utilisé pour un paramètre. * * * * Retour : Chemin d'accès en Python. * * * * Remarques : - * * * ******************************************************************************/ static PyObject *py_config_param_get_path(PyObject *self, void *closure) { GCfgParam *param; /* Paramètre visé par l'opérat°*/ const char *path; /* Chemin d'accès à diffuser */ param = G_CFG_PARAM(pygobject_get(self)); path = g_config_param_get_path(param); return PyUnicode_FromString(path); } /****************************************************************************** * * * Paramètres : self = paramètre de configuration à manipuler. * * closure = non utilisé ici. * * * * Description : Indique le type de valeur utilisée par un paramètre. * * * * Retour : Type en Python. * * * * Remarques : - * * * ******************************************************************************/ static PyObject *py_config_param_get_type(PyObject *self, void *closure) { GCfgParam *param; /* Paramètre visé par l'opérat°*/ ConfigParamType type; /* Type de paramètre */ param = G_CFG_PARAM(pygobject_get(self)); type = g_config_param_get_ptype(param); return PyLong_FromLong(type); } /****************************************************************************** * * * Paramètres : self = paramètre de configuration à manipuler. * * closure = non utilisé ici. * * * * Description : Indique le statut d'une valeur utilisée par un paramètre. * * * * Retour : Etat en Python. * * * * Remarques : - * * * ******************************************************************************/ static PyObject *py_config_param_get_state(PyObject *self, void *closure) { GCfgParam *param; /* Paramètre visé par l'opérat°*/ ConfigParamState state; /* Statut de paramètre */ param = G_CFG_PARAM(pygobject_get(self)); state = g_config_param_get_state(param); return PyLong_FromLong(state); } /****************************************************************************** * * * Paramètres : self = paramètre de configuration à manipuler. * * closure = non utilisé ici. * * * * Description : Indique la valeur courante d'un paramètre de configuration. * * * * Retour : Etat en Python. * * * * Remarques : - * * * ******************************************************************************/ static PyObject *py_config_param_get_value(PyObject *self, void *closure) { PyObject *result; /* Valeur à retourner */ GCfgParam *param; /* Paramètre visé par l'opérat°*/ ConfigParamType type; /* Type de paramètre manipulé */ bool boolean; /* Valeur booléenne */ int integer; /* Valeur entière */ char *string; /* Chaîne de caractères */ param = G_CFG_PARAM(pygobject_get(self)); type = g_config_param_get_ptype(param); switch (type) { case CPT_BOOLEAN: g_config_param_get_value(param, &boolean); result = (boolean ? Py_True : Py_False); Py_INCREF(result); break; case CPT_INTEGER: g_config_param_get_value(param, &integer); result = PyLong_FromLong(integer); break; case CPT_STRING: g_config_param_get_value(param, &string); if (string != NULL) result = PyUnicode_FromString(string); else { result = Py_None; Py_INCREF(result); } break; default: result = NULL; break; } return result; } /****************************************************************************** * * * Paramètres : self = paramètre de configuration à manipuler. * * value = nouvelle valeur à convertir et définir. * * closure = non utilisé ici. * * * * Description : Modifie la valeur courante d'un paramètre de configuration. * * * * Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ static int py_config_param_set_value(PyObject *self, PyObject *value, void *closure) { int result; /* Conclusion à remonter */ GCfgParam *param; /* Paramètre visé par l'opérat°*/ ConfigParamType type; /* Type de paramètre manipulé */ result = -1; param = G_CFG_PARAM(pygobject_get(self)); if (value == Py_None) { g_config_param_make_empty(param); result = 0; } else { type = g_config_param_get_ptype(param); switch (type) { case CPT_BOOLEAN: if (PyBool_Check(value)) { g_config_param_set_value(param, (bool)(value == Py_True)); result = 0; } break; case CPT_INTEGER: if (PyLong_Check(value)) { g_config_param_set_value(param, (int)PyLong_AsLong(value)); result = 0; } break; case CPT_STRING: if (PyUnicode_Check(value)) { g_config_param_set_value(param, PyUnicode_DATA(value)); result = 0; } break; default: break; } } return result; } /****************************************************************************** * * * Paramètres : - * * * * Description : Fournit un accès à une définition de type à diffuser. * * * * Retour : Définition d'objet pour Python. * * * * Remarques : - * * * ******************************************************************************/ PyTypeObject *get_python_config_param_type(void) { static PyMethodDef py_config_param_methods[] = { { "make_empty", py_config_param_make_empty, METH_NOARGS, "make_empty($self, /)\n--\n\nUnset the value of the current parameter." }, { "reset", py_config_param_reset, METH_NOARGS, "reset($self, /)\n--\n\nReset the content of the current parameter." }, { NULL } }; static PyGetSetDef py_config_param_getseters[] = { { "path", py_config_param_get_path, NULL, "Show the path used as key for a configuration parameter.", NULL }, { "type", py_config_param_get_type, NULL, "Show the type of value provided by a configuration parameter.", NULL }, { "state", py_config_param_get_state, NULL, "Show the state of a configuration parameter.", NULL }, { "value", py_config_param_get_value, py_config_param_set_value, "Handle the value of a configuration parameter.", NULL }, { NULL } }; static PyTypeObject py_config_param_type = { PyVarObject_HEAD_INIT(NULL, 0) .tp_name = "pychrysalide.glibext.ConfigParam", .tp_basicsize = sizeof(PyGObject), .tp_flags = Py_TPFLAGS_DEFAULT, .tp_doc = "PyChrysalide generic configuration", .tp_methods = py_config_param_methods, .tp_getset = py_config_param_getseters, .tp_new = py_config_param_new }; return &py_config_param_type; } /****************************************************************************** * * * Paramètres : dict = dictionnaire à compléter. * * * * Description : Définit les constantes pour les paramètres. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static bool py_config_param_define_constants(PyObject *dict) { int ret; /* Bilan d'un ajout */ #define DEF_ULONG_CONST(name) \ ret = PyDict_SetItemString(dict, #name, PyLong_FromUnsignedLong(name)); \ if (ret == -1) return false; DEF_ULONG_CONST(CPT_BOOLEAN); DEF_ULONG_CONST(CPT_INTEGER); DEF_ULONG_CONST(CPT_STRING); DEF_ULONG_CONST(CPT_COUNT); DEF_ULONG_CONST(CPS_UNDEFINED); DEF_ULONG_CONST(CPS_CHANGED); DEF_ULONG_CONST(CPS_DEFAULT); DEF_ULONG_CONST(CPS_EMPTY); return true; } /****************************************************************************** * * * Paramètres : module = module dont la définition est à compléter. * * * * Description : Prend en charge l'objet 'pychrysalide.glibext.ConfigParam'. * * * * Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ bool ensure_python_config_param_is_registered(void) { PyTypeObject *type; /* Type Python 'ConfigParam' */ PyObject *module; /* Module à recompléter */ PyObject *dict; /* Dictionnaire du module */ type = get_python_config_param_type(); if (!PyType_HasFeature(type, Py_TPFLAGS_READY)) { module = get_access_to_python_module("pychrysalide.glibext"); dict = PyModule_GetDict(module); if (!register_class_for_pygobject(dict, G_TYPE_CFG_PARAM, type, &PyGObject_Type)) return false; if (!py_config_param_define_constants(type->tp_dict)) return false; } return true; } /* ---------------------------------------------------------------------------------- */ /* PARCOURS DE PARAMETRES */ /* ---------------------------------------------------------------------------------- */ /****************************************************************************** * * * Paramètres : self = instance Python à libérer de la mémoire. * * * * Description : Prend acte d'un compteur de référence à 0. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void py_config_param_iterator_dealloc(PyObject *self) { pyConfigParamIterator *iterator; /* Références pour le parcours */ /** * Il aurait été sans doute mieux de reposer ici sur .tp_finalize, * mais cela semble impliquer de mettre en place tous les mécanismes de GC... * * cf. https://docs.python.org/3/extending/newtypes.html#finalization-and-de-allocation */ iterator = (pyConfigParamIterator *)self; g_generic_config_runlock(iterator->config); g_object_unref(G_OBJECT(iterator->config)); Py_TYPE(self)->tp_free((PyObject *)self); } /****************************************************************************** * * * Paramètres : self = itérateur à manipuler. * * * * Description : Fournit un itérateur pour paramètres de configuration. * * * * Retour : Instance Python prête à emploi. * * * * Remarques : - * * * ******************************************************************************/ static PyObject *py_config_param_iterator_next(PyObject *self) { PyObject *result; /* Instance à retourner */ pyConfigParamIterator *iterator; /* Références pour le parcours */ GList *item; /* Nouvel élément courant */ iterator = (pyConfigParamIterator *)self; if (iterator->last == NULL) item = iterator->params; else item = g_list_next(iterator->last); iterator->last = item; if (item != NULL) { result = pygobject_new(G_OBJECT(item->data)); Py_INCREF(result); } else { PyErr_SetNone(PyExc_StopIteration); result = NULL; } return result; } /****************************************************************************** * * * Paramètres : self = objet instancié à initialiser. * * args = arguments fournis à l'appel. * * kwds = arguments de type key=val fournis. * * * * Description : Initialise un objet Python de type 'ConfigParamIterator'. * * * * Retour : Instance Python mise en place. * * * * Remarques : - * * * ******************************************************************************/ static int py_config_param_iterator_init(PyObject *self, PyObject *args, PyObject *kwds) { pyConfigParamIterator *iterator; /* Références pour le parcours */ PyObject *config; /* Configuration format Python */ int ret; /* Bilan de lecture des args. */ ret = PyArg_ParseTuple(args, "O", &config); if (!ret) return -1; ret = PyObject_IsInstance(config, (PyObject *)get_python_generic_config_type()); if (!ret) return -1; iterator = (pyConfigParamIterator *)self; iterator->config = G_GEN_CONFIG(pygobject_get(config)); g_object_ref(G_OBJECT(iterator->config)); g_generic_config_rlock(iterator->config); iterator->params = g_generic_config_list_params(iterator->config); iterator->last = NULL; return 0; } /****************************************************************************** * * * Paramètres : - * * * * Description : Fournit un accès à une définition de type à diffuser. * * * * Retour : Définition d'objet pour Python. * * * * Remarques : - * * * ******************************************************************************/ PyTypeObject *get_python_config_param_iterator_type(void) { static PyTypeObject py_config_param_iterator_type = { PyVarObject_HEAD_INIT(NULL, 0) .tp_name = "pychrysalide.glibext.ConfigParamIterator", .tp_basicsize = sizeof(pyConfigParamIterator), .tp_dealloc = py_config_param_iterator_dealloc, .tp_flags = Py_TPFLAGS_DEFAULT, .tp_doc = "Iterator for configuration parameters", .tp_iter = PyObject_SelfIter, .tp_iternext = py_config_param_iterator_next, .tp_init = py_config_param_iterator_init, .tp_new = PyType_GenericNew, }; return &py_config_param_iterator_type; } /****************************************************************************** * * * Paramètres : module = module dont la définition est à compléter. * * * * Description : Prend en charge l'objet 'pychrysalide...ConfigParamIterator'.* * * * Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ bool ensure_python_config_param_iterator_is_registered(void) { PyTypeObject *type; /* Type Python 'Cnf...Iter'*/ PyObject *module; /* Module à recompléter */ int ret; /* Bilan d'un appel */ type = get_python_config_param_iterator_type(); type->tp_base = &PyBaseObject_Type; if (!PyType_HasFeature(type, Py_TPFLAGS_READY)) { module = get_access_to_python_module("pychrysalide.glibext"); if (PyType_Ready(type) != 0) return false; Py_INCREF(type); ret = PyModule_AddObject(module, "ConfigParamIterator", (PyObject *)type); if (ret != 0) return false; } return true; } /* ---------------------------------------------------------------------------------- */ /* GESTION GENERIQUE DE CONFIGURATION */ /* ---------------------------------------------------------------------------------- */ /****************************************************************************** * * * Paramètres : type = type de l'objet à instancier. * * args = arguments fournis à l'appel. * * kwds = arguments de type key=val fournis. * * * * Description : Crée un nouvel objet Python de type 'GenConfig'. * * * * Retour : Instance Python mise en place. * * * * Remarques : - * * * ******************************************************************************/ static PyObject *py_generic_config_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { PyObject *result; /* Instance à retourner */ const char *name; /* Nom du fichier à charger */ int ret; /* Bilan de lecture des args. */ GGenConfig *config; /* Version GLib du format */ ret = PyArg_ParseTuple(args, "s", &name); if (!ret) Py_RETURN_NONE; config = g_generic_config_new(name); result = pygobject_new(G_OBJECT(config)); g_object_unref(config); return result; } /****************************************************************************** * * * Paramètres : self = configuration à manipuler. * * args = non utilisé ici. * * * * Description : Lit la configuration depuis un fichier. * * * * Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ static PyObject *py_generic_config_read(PyObject *self, PyObject *args) { PyObject *result; /* Instance à retourner */ GGenConfig *config; /* Version GLib du format */ bool status; /* Bilan de l'opération */ config = G_GEN_CONFIG(pygobject_get(self)); status = g_generic_config_read(config); result = status ? Py_True : Py_False; Py_INCREF(result); return result; } /****************************************************************************** * * * Paramètres : self = configuration à manipuler. * * args = non utilisé ici. * * * * Description : Ecrit la configuration dans un fichier. * * * * Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ static PyObject *py_generic_config_write(PyObject *self, PyObject *args) { PyObject *result; /* Instance à retourner */ GGenConfig *config; /* Version GLib du format */ bool status; /* Bilan de l'opération */ config = G_GEN_CONFIG(pygobject_get(self)); status = g_generic_config_write(config); result = status ? Py_True : Py_False; Py_INCREF(result); return result; } /****************************************************************************** * * * Paramètres : self = configuration à manipuler. * * args = indication sur l'élément à retrouver. * * * * Description : Retrouve un élément de configuration par son chemin. * * * * Retour : Elément trouvé ou NULL en cas d'échec. * * * * Remarques : - * * * ******************************************************************************/ static PyObject *py_generic_config_search(PyObject *self, PyObject *args) { PyObject *result; /* Instance à retourner */ GGenConfig *config; /* Version GLib du format */ const char *path; /* Chemin d'accès du paramètre */ int ret; /* Bilan de lecture des args. */ GCfgParam *param; /* Paramètre trouvé ou NULL */ config = G_GEN_CONFIG(pygobject_get(self)); ret = PyArg_ParseTuple(args, "s", &path); if (!ret) Py_RETURN_NONE; param = g_generic_config_search(config, path); result = pygobject_new(G_OBJECT(param)); Py_XINCREF(result); return result; } /****************************************************************************** * * * Paramètres : self = configuration à manipuler. * * args = indication sur l'élément à retrouver. * * * * Description : Ajoute un paramètre à une configuration. * * * * Retour : Elément ajouté ou NULL en cas d'échec. * * * * Remarques : - * * * ******************************************************************************/ static PyObject *py_generic_config_add(PyObject *self, PyObject *args) { PyObject *result; /* Instance à retourner */ GGenConfig *config; /* Version GLib du format */ PyObject *param; /* Paramètre transmis */ int ret; /* Bilan de lecture des args. */ GCfgParam *added; /* Elément ajouté ou NULL */ config = G_GEN_CONFIG(pygobject_get(self)); ret = PyArg_ParseTuple(args, "O", ¶m); if (!ret) Py_RETURN_NONE; ret = PyObject_IsInstance(param, (PyObject *)get_python_config_param_type()); if (!ret) Py_RETURN_NONE; added = g_generic_config_add_param(config, G_CFG_PARAM(pygobject_get(param))); if (added != NULL) { result = pygobject_new(G_OBJECT(added)); Py_XINCREF(result); } else result = NULL; return result; } /****************************************************************************** * * * Paramètres : self = configuration à manipuler. * * args = indication sur l'élément à retrouver. * * * * Description : Retire un paramètre d'une configuration. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static PyObject *py_generic_config_delete(PyObject *self, PyObject *args) { GGenConfig *config; /* Version GLib du format */ const char *path; /* Chemin d'accès du paramètre */ int ret; /* Bilan de lecture des args. */ config = G_GEN_CONFIG(pygobject_get(self)); ret = PyArg_ParseTuple(args, "s", &path); if (!ret) Py_RETURN_NONE; g_generic_config_delete_param(config, path); Py_RETURN_NONE; } /****************************************************************************** * * * Paramètres : self = configuration à manipuler. * * args = non utilisé ici. * * * * Description : Renvoie la liste des paramètres de configuration. * * * * Retour : Itérateur pour la liste des paramètres. * * * * Remarques : - * * * ******************************************************************************/ static PyObject *py_generic_config_list_params(PyObject *self, PyObject *args) { PyObject *result; /* Instance à retourner */ PyTypeObject *iterator_type; /* Type Python de l'itérateur */ PyObject *args_list; /* Arguments de mise en place */ iterator_type = get_python_config_param_iterator_type(); Py_INCREF(self); args_list = Py_BuildValue("(O)", self); result = PyObject_CallObject((PyObject *)iterator_type, args_list); Py_DECREF(args_list); return result; } /****************************************************************************** * * * Paramètres : self = NULL car méthode statique. * * closure = non utilisé ici. * * * * Description : Fournit le chemin d'accès au binaire représenté. * * * * Retour : Chemin d'accès en Python. * * * * Remarques : - * * * ******************************************************************************/ static PyObject *py_generic_config_get_filename(PyObject *self, void *closure) { GGenConfig *config; /* Version GLib du format */ const char *filename; /* Chemin d'accès au fichier */ config = G_GEN_CONFIG(pygobject_get(self)); filename = g_generic_config_get_filename(config); return PyUnicode_FromString(filename); } /****************************************************************************** * * * Paramètres : - * * * * Description : Fournit un accès à une définition de type à diffuser. * * * * Retour : Définition d'objet pour Python. * * * * Remarques : - * * * ******************************************************************************/ PyTypeObject *get_python_generic_config_type(void) { static PyMethodDef py_generic_config_methods[] = { { "read", py_generic_config_read, METH_NOARGS, "read(, /)\n--\n\nRead the configuration from its relative XML file." }, { "write", py_generic_config_write, METH_NOARGS, "write(, /)\n--\n\nWrite the configuration to its relative XML file." }, { "search", py_generic_config_search, METH_VARARGS, "search($self, path, /)\n--\n\nLook for a given configuration parameter." }, { "add", py_generic_config_add, METH_VARARGS, "add($self, param, /)\n--\n\nAdd an existing parameter to a configuration." }, { "delete", py_generic_config_delete, METH_VARARGS, "delete($self, path, /)\n--\n\nDelete an existing parameter from a configuration." }, { "params", py_generic_config_list_params, METH_NOARGS, "params($self, /)\n--\n\nList all registered configuration parameters." }, { NULL } }; static PyGetSetDef py_generic_config_getseters[] = { { "filename", py_generic_config_get_filename, NULL, "Show the filename of the loaded binary file.", NULL }, { NULL } }; static PyTypeObject py_generic_config_type = { PyVarObject_HEAD_INIT(NULL, 0) .tp_name = "pychrysalide.glibext.GenConfig", .tp_basicsize = sizeof(PyGObject), .tp_flags = Py_TPFLAGS_DEFAULT, .tp_doc = "PyChrysalide generic configuration", .tp_methods = py_generic_config_methods, .tp_getset = py_generic_config_getseters, .tp_new = py_generic_config_new }; return &py_generic_config_type; } /****************************************************************************** * * * Paramètres : module = module dont la définition est à compléter. * * * * Description : Prend en charge l'objet 'pychrysalide.glibext.GenConfig'. * * * * Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ bool ensure_python_generic_config_is_registered(void) { PyTypeObject *type; /* Type Python 'GenConfig' */ PyObject *module; /* Module à recompléter */ PyObject *dict; /* Dictionnaire du module */ type = get_python_generic_config_type(); if (!PyType_HasFeature(type, Py_TPFLAGS_READY)) { module = get_access_to_python_module("pychrysalide.glibext"); dict = PyModule_GetDict(module); if (!register_class_for_pygobject(dict, G_TYPE_GEN_CONFIG, type, &PyGObject_Type)) return false; } return true; }