From 90598c17e5c215d26f36f078f3a64050cbb0f7e1 Mon Sep 17 00:00:00 2001 From: Patrick McDermott Date: Wed, 04 Oct 2017 13:24:57 -0400 Subject: src/config.[ch]: New files --- (limited to 'src/config.c') diff --git a/src/config.c b/src/config.c new file mode 100644 index 0000000..ef9a4a7 --- /dev/null +++ b/src/config.c @@ -0,0 +1,120 @@ +/* + * Application configuration + * + * Copyright (C) 2017 Patrick McDermott + * + * This file is part of Marquee. + * + * Marquee 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. + * + * Marquee 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 Marquee. If not, see . + */ + +#include +#include + +#include + +#include "config.h" + +typedef enum { + TYPE_BOOLEAN, +} Type; + +typedef struct { + Type type; + GList *callbacks; +} ConfigItem; + +static void +split_name(const gchar *name, gchar **group, gchar **key) +{ + *group = g_strdup(name); + *key = strchr(*group, '.'); + *(key[0]) = '\0'; + ++*key; +} + +static void +set_boolean(MqConfig *config, const gchar *name, gboolean value) +{ + gchar *group; + gchar *key; + + split_name(name, &group, &key); + + g_key_file_set_boolean(config->key_file, group, name, value); + + if (!config->types_and_cbs_set) { + g_hash_table_insert(config->types_and_cbs, g_strdup(name), + TYPE_BOOLEAN); + } +} + +static void +set_defaults(MqConfig *config) +{ + config->types_and_cbs_set = FALSE; + + + config->types_and_cbs_set = TRUE; +} + +MqConfig * +mq_config_new(const gchar *profile) +{ + MqConfig *config; + + config = malloc(sizeof(*config)); + + config->file_name = g_strdup_printf("%s/%s/config", + g_get_user_config_dir(), profile); + config->key_file = g_key_file_new(); + config->types_and_cbs = g_hash_table_new(g_str_hash, g_int_equal); + set_defaults(config); + + return config; +} + +gboolean +mq_config_load(MqConfig *config) +{ + /* TODO: Handle parsing and ENOENT errors differently? */ + return g_key_file_load_from_file(config->key_file, config->file_name, + G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, NULL); +} + +gboolean +mq_config_save(MqConfig *config) +{ + /* TODO: Handle GFileError? */ + return g_key_file_save_to_file(config->key_file, config->file_name, + NULL); +} + +void +mq_config_set(MqConfig *config, const gchar *name, const gchar *value) +{ + ConfigItem *item; + + item = g_hash_table_lookup(config->types_and_cbs, name); + g_assert(item); + + switch (item->type) { + case TYPE_BOOLEAN: + /* value is "on" or "off" (as implemented in + * mq_html_input_checkbox()). */ + set_boolean(config, name, value[1] == 'n' ? TRUE : + FALSE); + break; + } +} -- cgit v0.9.1