diff options
Diffstat (limited to 'src/glibext')
-rw-r--r-- | src/glibext/configuration.c | 257 | ||||
-rw-r--r-- | src/glibext/configuration.h | 59 |
2 files changed, 305 insertions, 11 deletions
diff --git a/src/glibext/configuration.c b/src/glibext/configuration.c index 8717fb4..069dbc3 100644 --- a/src/glibext/configuration.c +++ b/src/glibext/configuration.c @@ -105,6 +105,44 @@ static bool g_config_param_write(GCfgParam *, xmlDocPtr, xmlXPathContextPtr); +/* --------------------- PARTIES IMPREVISIBLES DE CONFIGURATION --------------------- */ + + +/* Groupe de paramètres non fixés à l'avance (instance) */ +struct _GCfgGroup +{ + GObject parent; /* A laisser en premier */ + + char *root; /* Chemin d'accès commun */ + ConfigParamType type; /* Type de valeur */ + +}; + +/* Groupe de paramètres non fixés à l'avance (classe) */ +struct _GCfgGroupClass +{ + GObjectClass parent; /* A laisser en premier */ + +}; + + +/* Initialise la classe des groupes de paramètres. */ +static void g_config_group_class_init(GCfgGroupClass *); + +/* Initialise une instance de groupe de paramètres. */ +static void g_config_group_init(GCfgGroup *); + +/* Supprime toutes les références externes. */ +static void g_config_group_dispose(GCfgGroup *); + +/* Procède à la libération totale de la mémoire. */ +static void g_config_group_finalize(GCfgGroup *); + +/* Charge tous les paramètres correspondants au groupe. */ +static void g_config_group_load(GCfgGroup *, GGenConfig *, xmlXPathContextPtr); + + + /* ----------------------- GESTION GENERIQUE DE CONFIGURATION ----------------------- */ @@ -115,6 +153,7 @@ struct _GGenConfig char *filename; /* CHemin d'accès complet */ + GList *groups; /* Groupes d'éléments non fixés*/ GList *params; /* Eléments de configuration */ GRWLock params_access; /* Verrou de protection */ @@ -147,7 +186,7 @@ static void g_generic_config_finalize(GGenConfig *); /* ---------------------------------------------------------------------------------- */ -/* Indique le type défini par la GLib pour les configurations géénriques. */ +/* Indique le type défini par la GLib pour les configurations génériques. */ G_DEFINE_TYPE(GCfgParam, g_config_param, G_TYPE_OBJECT); @@ -257,9 +296,9 @@ static void g_config_param_finalize(GCfgParam *param) /****************************************************************************** * * -* Paramètres : path = chemin d'accès à un paramètre en guise de clef. * -* type = type de paramètre à installer. * -* ... = valeur par défaut du paramètre. * +* Paramètres : path = chemin d'accès à un paramètre en guise de clef. * +* type = type de paramètre à installer. * +* ... = valeur par défaut du paramètre. * * * * Description : Crée un paramètre de configuration. * * * @@ -352,7 +391,7 @@ GCfgParam *g_config_param_new_empty(const char *path, ConfigParamType type) /****************************************************************************** * * -* Paramètres : config = paramètre de configuration à charger. * +* Paramètres : param = paramètre de configuration à charger. * * context = contexte de lecture d'un fichier XML. * * * * Description : Lit un paramètre de configuration depuis un fichier. * @@ -412,7 +451,7 @@ static bool g_config_param_read(GCfgParam *param, xmlXPathContextPtr context) /****************************************************************************** * * -* Paramètres : config = paramètre de configuration à charger. * +* Paramètres : param = paramètre de configuration à charger. * * xdoc = document XML à mettre en place. * * context = contexte de lecture d'un fichier XML. * * * @@ -834,6 +873,172 @@ void g_config_param_get_value(GCfgParam *param, ...) /* ---------------------------------------------------------------------------------- */ +/* PARTIES IMPREVISIBLES DE CONFIGURATION */ +/* ---------------------------------------------------------------------------------- */ + + +/* Indique le type défini par la GLib pour les groupes de paramètres non prévisibiles. */ +G_DEFINE_TYPE(GCfgGroup, g_config_group, G_TYPE_OBJECT); + + +/****************************************************************************** +* * +* Paramètres : klass = classe à initialiser. * +* * +* Description : Initialise la classe des groupes de paramètres. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_config_group_class_init(GCfgGroupClass *klass) +{ + GObjectClass *object; /* Autre version de la classe */ + + object = G_OBJECT_CLASS(klass); + + object->dispose = (GObjectFinalizeFunc/* ! */)g_config_group_dispose; + object->finalize = (GObjectFinalizeFunc)g_config_group_finalize; + +} + + +/****************************************************************************** +* * +* Paramètres : group = instance à initialiser. * +* * +* Description : Initialise une instance de groupe de paramètres. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_config_group_init(GCfgGroup *group) +{ + +} + + +/****************************************************************************** +* * +* Paramètres : group = instance d'objet GLib à traiter. * +* * +* Description : Supprime toutes les références externes. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_config_group_dispose(GCfgGroup *group) +{ + G_OBJECT_CLASS(g_config_group_parent_class)->dispose(G_OBJECT(group)); + +} + + +/****************************************************************************** +* * +* Paramètres : group = instance d'objet GLib à traiter. * +* * +* Description : Procède à la libération totale de la mémoire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_config_group_finalize(GCfgGroup *group) +{ + free(group->root); + + G_OBJECT_CLASS(g_config_group_parent_class)->finalize(G_OBJECT(group)); + +} + + +/****************************************************************************** +* * +* Paramètres : root = base du chemin d'accès à un groupe de paramètres. * +* type = type de groupètre à installer. * +* * +* Description : Crée un groupe de paramètres de configuration. * +* * +* Retour : Groupe mis en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GCfgGroup *g_config_group_new(const char *root, ConfigParamType type) +{ + GCfgGroup *result; /* Structure à retourner */ + + result = g_object_new(G_TYPE_CFG_GROUP, NULL); + + result->root = strdup(root); + result->type = type; + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : group = groupe de paramètres de configuration à étudier. * +* context = contexte de lecture d'un fichier XML. * +* * +* Description : Charge tous les paramètres correspondants au groupe. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_config_group_load(GCfgGroup *group, GGenConfig *config, xmlXPathContextPtr context) +{ + char *access; /* Chemin d'accès XML */ + xmlXPathObjectPtr xpathObj; /* Cible d'une recherche */ + int i; /* Boucle de parcours */ + char *key; /* Clef d'accès à un paramètre */ + GCfgParam *param; /* Nouveau paramètre à ajouter */ + + access = strdup(group->root); + access = strrpl(access, ".", "/"); + access = stradd(access, "/*"); + access = strprep(access, "/ChrysalideConfig/"); + + xpathObj = get_node_xpath_object(context, access); + + for (i = 0; i < XPATH_OBJ_NODES_COUNT(xpathObj); i++) + { + asprintf(&key, "gui.panels.positions.%s", NODE_FROM_PATH_OBJ(xpathObj, i)->name); + + param = g_config_param_new(key, CPT_INTEGER, -1); + _g_generic_config_add_param(config, param, false); + + free(key); + + } + + if(xpathObj != NULL) /* FIXME */ + xmlXPathFreeObject(xpathObj); + + free(access); + +} + + + +/* ---------------------------------------------------------------------------------- */ /* GESTION GENERIQUE DE CONFIGURATION */ /* ---------------------------------------------------------------------------------- */ @@ -1046,6 +1251,13 @@ bool g_generic_config_read(GGenConfig *config) g_generic_config_rlock(config); + for (iter = g_list_first(config->groups); + iter != NULL; + iter = g_list_next(iter)) + { + g_config_group_load(G_CFG_GROUP(iter->data), config, context); + } + for (result = true, iter = g_list_first(config->params); result && iter != NULL; iter = g_list_next(iter)) @@ -1108,6 +1320,30 @@ bool g_generic_config_write(GGenConfig *config) /****************************************************************************** * * +* Paramètres : config = configuration à mettre à jour. * +* param = groupe de paramètres à prendre en compte. * +* * +* Description : Ajoute la définition d'un groupe à une configuration. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_generic_config_add_group(GGenConfig *config, GCfgGroup *group) +{ + g_generic_config_wlock(config); + + config->groups = g_list_append(config->groups, group); + + g_generic_config_wunlock(config); + +} + + +/****************************************************************************** +* * * Paramètres : config = ensemble de paramètres de configuration. * * path = chemin d'accès au paramètre visé. * * lock = pose un verrou si ce n'est déjà fait. * @@ -1145,6 +1381,7 @@ GCfgParam *_g_generic_config_search(GGenConfig *config, const char *path, bool l * * * Paramètres : config = configuration à mettre à jour. * * param = paramètre à intégrer dans la configuration. * +* lock = pose un verrou si ce n'est déjà fait. * * * * Description : Ajoute un paramètre à une configuration. * * * @@ -1154,14 +1391,15 @@ GCfgParam *_g_generic_config_search(GGenConfig *config, const char *path, bool l * * ******************************************************************************/ -GCfgParam *g_generic_config_add_param(GGenConfig *config, GCfgParam *param) +GCfgParam *_g_generic_config_add_param(GGenConfig *config, GCfgParam *param, bool lock) { const char *path; /* Chemin d'accès unique */ GCfgParam *old; /* Test de présence */ path = g_config_param_get_path(param); - g_generic_config_wlock(config); + if (lock) + g_generic_config_wlock(config); old = _g_generic_config_search(config, path, false); if (old != NULL) @@ -1172,7 +1410,8 @@ GCfgParam *g_generic_config_add_param(GGenConfig *config, GCfgParam *param) config->params = g_list_append(config->params, param); - g_generic_config_wunlock(config); + if (lock) + g_generic_config_wunlock(config); return param; diff --git a/src/glibext/configuration.h b/src/glibext/configuration.h index 84d494f..016a382 100644 --- a/src/glibext/configuration.h +++ b/src/glibext/configuration.h @@ -71,7 +71,7 @@ typedef struct _GCfgParam GCfgParam; typedef struct _GCfgParamClass GCfgParamClass; -/* Indique le type défini par la GLib pour les configurations géénriques. */ +/* Indique le type défini par la GLib pour les configurations génériques. */ GType g_config_param_get_type(void); /* Crée un paramètre de configuration. */ @@ -106,6 +106,32 @@ void g_config_param_get_value(GCfgParam *, ...); +/* --------------------- PARTIES IMPREVISIBLES DE CONFIGURATION --------------------- */ + + +#define G_TYPE_CFG_GROUP (g_config_group_get_type()) +#define G_CFG_GROUP(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_CFG_GROUP, GCfgGroup)) +#define G_IS_CFG_GROUP(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_CFG_GROUP)) +#define G_CFG_GROUP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_CFG_GROUP, GCfgGroupClass)) +#define G_IS_CFG_GROUP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_CFG_GROUP)) +#define G_CFG_GROUP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_CFG_GROUP, GCfgGroupClass)) + + +/* Groupe de paramètres non fixés à l'avance (instance) */ +typedef struct _GCfgGroup GCfgGroup; + +/* Groupe de paramètres non fixés à l'avance (classe) */ +typedef struct _GCfgGroupClass GCfgGroupClass; + + +/* Indique le type défini par la GLib pour les groupes de paramètres non prévisibiles. */ +GType g_config_group_get_type(void); + +/* Crée un groupe de paramètres de configuration. */ +GCfgGroup *g_config_group_new(const char *, ConfigParamType); + + + /* ----------------------- GESTION GENERIQUE DE CONFIGURATION ----------------------- */ @@ -150,6 +176,18 @@ bool g_generic_config_read(GGenConfig *); /* Ecrit la configuration dans un fichier. */ bool g_generic_config_write(GGenConfig *); +/* Ajoute la définition d'un groupe à une configuration. */ +void g_generic_config_add_group(GGenConfig *, GCfgGroup *); + + +#define g_generic_config_create_group(c, p, t) \ + ({ \ + GCfgGroup *__group; \ + __group = g_config_group_new(p, t); \ + g_generic_config_add_group(c, __group); \ + }) + + /* Retrouve un élément de configuration par son chemin. */ GCfgParam *_g_generic_config_search(GGenConfig *, const char *, bool); @@ -176,9 +214,11 @@ GCfgParam *_g_generic_config_search(GGenConfig *, const char *, bool); /* Ajoute un paramètre à une configuration. */ -GCfgParam *g_generic_config_add_param(GGenConfig *, GCfgParam *); +GCfgParam *_g_generic_config_add_param(GGenConfig *, GCfgParam *, bool); +#define g_generic_config_add_param(c, p) _g_generic_config_add_param(c, p, true) + #define g_generic_config_create_param(c, p, t, ...) \ ({ \ GCfgParam *__result; \ @@ -188,6 +228,21 @@ GCfgParam *g_generic_config_add_param(GGenConfig *, GCfgParam *); }) +#define g_generic_config_create_or_udpdate_param(c, p, t, ...) \ + ({ \ + GCfgParam *__param; \ + __param = g_generic_config_search(c, p); \ + if (__param == NULL) \ + { \ + __param = g_config_param_new(p, t, __VA_ARGS__); \ + __param = g_generic_config_add_param(c, __param); \ + } \ + if (__param != NULL) \ + g_config_param_set_value(__param, __VA_ARGS__); \ + __param != NULL ? true : false; \ + }) + + /* Retire un paramètre d'une configuration. */ void g_generic_config_delete_param(GGenConfig *, const char *); |