diff options
Diffstat (limited to 'src/glibext/configuration.c')
-rw-r--r-- | src/glibext/configuration.c | 257 |
1 files changed, 248 insertions, 9 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; |