/* * 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; } }