summaryrefslogtreecommitdiff
path: root/src/glibext/configuration.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2016-03-12 21:31:35 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2016-03-12 21:31:35 (GMT)
commitda22d42c9644de808dfc3484352c444ee4176bee (patch)
tree67d1533baad0a80cc9f435c781c5d094243fa425 /src/glibext/configuration.c
parent491e9837f33831f94747a6063f709ba2c5d2703e (diff)
Loaded all custom parameters storing positions of panels divisions.
Diffstat (limited to 'src/glibext/configuration.c')
-rw-r--r--src/glibext/configuration.c257
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;