summaryrefslogtreecommitdiff
path: root/src/glibext
diff options
context:
space:
mode:
Diffstat (limited to 'src/glibext')
-rw-r--r--src/glibext/configuration.c257
-rw-r--r--src/glibext/configuration.h59
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 *);