2 * Copyright (C) 2010-2011 Robert Ancell.
3 * Author: Robert Ancell <robert.ancell@canonical.com>
5 * This program is free software: you can redistribute it and/or modify it under
6 * the terms of the GNU General Public License as published by the Free Software
7 * Foundation, either version 3 of the License, or (at your option) any later
8 * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
14 #include "configuration.h"
16 struct ConfigurationPrivate
21 G_DEFINE_TYPE (Configuration, config, G_TYPE_OBJECT);
23 static Configuration *configuration_instance = NULL;
26 config_get_instance (void)
28 if (!configuration_instance)
29 configuration_instance = g_object_new (CONFIGURATION_TYPE, NULL);
30 return configuration_instance;
34 config_load_from_file (Configuration *config, const gchar *path, GError **error)
40 key_file = g_key_file_new ();
41 if (!g_key_file_load_from_file (key_file, path, G_KEY_FILE_NONE, error))
43 g_key_file_free (key_file);
47 groups = g_key_file_get_groups (key_file, NULL);
48 for (i = 0; groups[i]; i++)
53 keys = g_key_file_get_keys (key_file, groups[i], NULL, error);
57 for (j = 0; keys[j]; j++)
61 value = g_key_file_get_value (key_file, groups[i], keys[j], NULL);
62 g_key_file_set_value (config->priv->key_file, groups[i], keys[j], value);
70 g_key_file_free (key_file);
76 path_make_absolute (gchar *path)
78 gchar *cwd, *abs_path;
83 if (g_path_is_absolute (path))
86 cwd = g_get_current_dir ();
87 abs_path = g_build_filename (cwd, path, NULL);
94 compare_strings (gconstpointer a, gconstpointer b)
100 load_config_directory (const gchar *path, GList **messages)
103 GList *files = NULL, *link;
104 GError *error = NULL;
106 /* Find configuration files */
107 dir = g_dir_open (path, 0, &error);
108 if (error && !g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOENT))
109 g_printerr ("Failed to open configuration directory %s: %s\n", path, error->message);
110 g_clear_error (&error);
114 while ((name = g_dir_read_name (dir)))
115 files = g_list_append (files, g_strdup (name));
119 /* Sort alphabetically and load onto existing configuration */
120 files = g_list_sort (files, compare_strings);
121 for (link = files; link; link = link->next)
123 gchar *filename = link->data;
126 conf_path = g_build_filename (path, filename, NULL);
127 if (g_str_has_suffix (filename, ".conf"))
130 *messages = g_list_append (*messages, g_strdup_printf ("Loading configuration from %s", conf_path));
131 config_load_from_file (config_get_instance (), conf_path, &error);
132 if (error && !g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOENT))
133 g_printerr ("Failed to load configuration from %s: %s\n", filename, error->message);
134 g_clear_error (&error);
137 g_debug ("Ignoring configuration file %s, it does not have .conf suffix", conf_path);
140 g_list_free_full (files, g_free);
144 config_load_from_standard_locations (Configuration *config, const gchar *config_path, GList **messages)
146 gchar *config_dir, *config_d_dir = NULL;
147 gboolean explicit_config = FALSE;
148 gboolean success = TRUE;
149 GError *error = NULL;
153 config_dir = g_path_get_basename (config_path);
154 config_dir = path_make_absolute (config_dir);
155 explicit_config = TRUE;
159 config_dir = g_strdup (CONFIG_DIR);
160 config_d_dir = g_build_filename (config_dir, "lightdm.conf.d", NULL);
161 config_path = g_build_filename (config_dir, "lightdm.conf", NULL);
163 config_set_string (config, "LightDM", "config-directory", config_dir);
166 load_config_directory (SYSTEM_CONFIG_DIR, messages);
168 load_config_directory (config_d_dir, messages);
169 g_free (config_d_dir);
172 *messages = g_list_append (*messages, g_strdup_printf ("Loading configuration from %s", config_path));
173 if (!config_load_from_file (config, config_path, &error))
177 is_empty = error && g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOENT);
179 if (explicit_config || !is_empty)
182 g_printerr ("Failed to load configuration from %s: %s\n", config_path, error->message);
186 g_clear_error (&error);
192 config_get_groups (Configuration *config)
194 return g_key_file_get_groups (config->priv->key_file, NULL);
198 config_get_keys (Configuration *config, const gchar *group_name)
200 return g_key_file_get_keys (config->priv->key_file, group_name, NULL, NULL);
204 config_has_key (Configuration *config, const gchar *section, const gchar *key)
206 return g_key_file_has_key (config->priv->key_file, section, key, NULL);
210 config_set_string (Configuration *config, const gchar *section, const gchar *key, const gchar *value)
212 g_key_file_set_string (config->priv->key_file, section, key, value);
216 config_get_string (Configuration *config, const gchar *section, const gchar *key)
218 return g_key_file_get_string (config->priv->key_file, section, key, NULL);
222 config_set_string_list (Configuration *config, const gchar *section, const gchar *key, const gchar **value, gsize length)
224 g_key_file_set_string_list (config->priv->key_file, section, key, value, length);
228 config_get_string_list (Configuration *config, const gchar *section, const gchar *key)
230 return g_key_file_get_string_list (config->priv->key_file, section, key, NULL, NULL);
234 config_set_integer (Configuration *config, const gchar *section, const gchar *key, gint value)
236 g_key_file_set_integer (config->priv->key_file, section, key, value);
240 config_get_integer (Configuration *config, const gchar *section, const gchar *key)
242 return g_key_file_get_integer (config->priv->key_file, section, key, NULL);
246 config_set_boolean (Configuration *config, const gchar *section, const gchar *key, gboolean value)
248 g_key_file_set_boolean (config->priv->key_file, section, key, value);
252 config_get_boolean (Configuration *config, const gchar *section, const gchar *key)
254 return g_key_file_get_boolean (config->priv->key_file, section, key, NULL);
258 config_init (Configuration *config)
260 config->priv = G_TYPE_INSTANCE_GET_PRIVATE (config, CONFIGURATION_TYPE, ConfigurationPrivate);
261 config->priv->key_file = g_key_file_new ();
265 config_finalize (GObject *object)
269 self = CONFIGURATION (object);
271 g_key_file_free (self->priv->key_file);
273 G_OBJECT_CLASS (config_parent_class)->finalize (object);
277 config_class_init (ConfigurationClass *klass)
279 GObjectClass *object_class = G_OBJECT_CLASS (klass);
281 object_class->finalize = config_finalize;
283 g_type_class_add_private (klass, sizeof (ConfigurationPrivate));