diff options
author | Thomas Haller <thaller@redhat.com> | 2015-01-07 13:25:41 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2015-02-03 13:01:53 +0100 |
commit | ba74f9d2428c937014c3bcd02ac25591bbc1abc5 (patch) | |
tree | b197ff449ecb0a3e014bb4508a45fcb8fa31caa8 /src/nm-config-data.c | |
parent | 045a576a7ab8dac3f7aa9302532fa94e790c1f05 (diff) | |
download | NetworkManager-ba74f9d2428c937014c3bcd02ac25591bbc1abc5.tar.gz |
config: move keyfile values to NMConfigData
Diffstat (limited to 'src/nm-config-data.c')
-rw-r--r-- | src/nm-config-data.c | 119 |
1 files changed, 86 insertions, 33 deletions
diff --git a/src/nm-config-data.c b/src/nm-config-data.c index 8683696e81..93a56df1e3 100644 --- a/src/nm-config-data.c +++ b/src/nm-config-data.c @@ -21,12 +21,17 @@ #include "nm-config-data.h" +#include <string.h> + #include "nm-config.h" +#include "gsystem-local-alloc.h" typedef struct { char *config_main_file; char *config_description; + GKeyFile *keyfile; + struct { char *uri; char *response; @@ -39,6 +44,7 @@ enum { PROP_0, PROP_CONFIG_MAIN_FILE, PROP_CONFIG_DESCRIPTION, + PROP_KEYFILE, PROP_CONNECTIVITY_URI, PROP_CONNECTIVITY_INTERVAL, PROP_CONNECTIVITY_RESPONSE, @@ -68,6 +74,14 @@ nm_config_data_get_config_description (const NMConfigData *self) return NM_CONFIG_DATA_GET_PRIVATE (self)->config_description; } +char * +nm_config_data_get_value (const NMConfigData *self, const char *group, const char *key, GError **error) +{ + g_return_val_if_fail (self, NULL); + + return g_key_file_get_string (NM_CONFIG_DATA_GET_PRIVATE (self)->keyfile, group, key, error); +} + const char * nm_config_data_get_connectivity_uri (const NMConfigData *self) { @@ -95,16 +109,51 @@ nm_config_data_get_connectivity_response (const NMConfigData *self) /************************************************************************/ +static gboolean +_keyfile_a_contains_all_in_b (GKeyFile *kf_a, GKeyFile *kf_b) +{ + gs_strfreev char **groups = NULL; + guint i, j; + + if (kf_a == kf_b) + return TRUE; + + groups = g_key_file_get_groups (kf_a, NULL); + for (i = 0; groups && groups[i]; i++) { + gs_strfreev char **keys = NULL; + + keys = g_key_file_get_keys (kf_a, groups[i], NULL, NULL); + if (keys) { + for (j = 0; keys[j]; j++) { + gs_free char *key_a = g_key_file_get_value (kf_a, groups[i], keys[j], NULL); + gs_free char *key_b = g_key_file_get_value (kf_b, groups[i], keys[j], NULL); + + if (g_strcmp0 (key_a, key_b) != 0) + return FALSE; + } + } + } + return TRUE; +} + GHashTable * nm_config_data_diff (NMConfigData *old_data, NMConfigData *new_data) { GHashTable *changes; + NMConfigDataPrivate *priv_old, *priv_new; g_return_val_if_fail (NM_IS_CONFIG_DATA (old_data), NULL); g_return_val_if_fail (NM_IS_CONFIG_DATA (new_data), NULL); changes = g_hash_table_new (g_str_hash, g_str_equal); + priv_old = NM_CONFIG_DATA_GET_PRIVATE (old_data); + priv_new = NM_CONFIG_DATA_GET_PRIVATE (new_data); + + if ( !_keyfile_a_contains_all_in_b (priv_old->keyfile, priv_new->keyfile) + || !_keyfile_a_contains_all_in_b (priv_new->keyfile, priv_old->keyfile)) + g_hash_table_insert (changes, NM_CONFIG_CHANGES_VALUES, NULL); + if ( g_strcmp0 (nm_config_data_get_config_main_file (old_data), nm_config_data_get_config_main_file (new_data)) != 0 || g_strcmp0 (nm_config_data_get_config_description (old_data), nm_config_data_get_config_description (new_data)) != 0) g_hash_table_insert (changes, NM_CONFIG_CHANGES_CONFIG_FILES, NULL); @@ -170,14 +219,10 @@ set_property (GObject *object, case PROP_CONFIG_DESCRIPTION: priv->config_description = g_value_dup_string (value); break; - case PROP_CONNECTIVITY_URI: - priv->connectivity.uri = g_value_dup_string (value); - break; - case PROP_CONNECTIVITY_INTERVAL: - priv->connectivity.interval = g_value_get_uint (value); - break; - case PROP_CONNECTIVITY_RESPONSE: - priv->connectivity.response = g_value_dup_string (value); + case PROP_KEYFILE: + priv->keyfile = g_value_dup_boxed (value); + if (!priv->keyfile) + priv->keyfile = nm_config_create_keyfile (); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -209,30 +254,32 @@ nm_config_data_init (NMConfigData *self) { } +static void +constructed (GObject *object) +{ + NMConfigData *self = NM_CONFIG_DATA (object); + NMConfigDataPrivate *priv = NM_CONFIG_DATA_GET_PRIVATE (self); + int interval; + + priv->connectivity.uri = g_key_file_get_value (priv->keyfile, "connectivity", "uri", NULL); + priv->connectivity.response = g_key_file_get_value (priv->keyfile, "connectivity", "response", NULL); + + interval = g_key_file_get_integer (priv->keyfile, "connectivity", "interval", NULL); + priv->connectivity.interval = MAX (0, interval); + + G_OBJECT_CLASS (nm_config_data_parent_class)->constructed (object); +} + NMConfigData * nm_config_data_new (const char *config_main_file, const char *config_description, GKeyFile *keyfile) { - char *connectivity_uri, *connectivity_response; - guint connectivity_interval; - NMConfigData *config_data; - - connectivity_uri = g_key_file_get_value (keyfile, "connectivity", "uri", NULL); - connectivity_interval = g_key_file_get_integer (keyfile, "connectivity", "interval", NULL); - connectivity_response = g_key_file_get_value (keyfile, "connectivity", "response", NULL); - - config_data = g_object_new (NM_TYPE_CONFIG_DATA, - NM_CONFIG_DATA_CONFIG_MAIN_FILE, config_main_file, - NM_CONFIG_DATA_CONFIG_DESCRIPTION, config_description, - NM_CONFIG_DATA_CONNECTIVITY_URI, connectivity_uri, - NM_CONFIG_DATA_CONNECTIVITY_INTERVAL, connectivity_interval, - NM_CONFIG_DATA_CONNECTIVITY_RESPONSE, connectivity_response, - NULL); - g_free (connectivity_uri); - g_free (connectivity_response); - - return config_data; + return g_object_new (NM_TYPE_CONFIG_DATA, + NM_CONFIG_DATA_CONFIG_MAIN_FILE, config_main_file, + NM_CONFIG_DATA_CONFIG_DESCRIPTION, config_description, + NM_CONFIG_DATA_KEYFILE, keyfile, + NULL); } static void @@ -242,6 +289,7 @@ nm_config_data_class_init (NMConfigDataClass *config_class) g_type_class_add_private (config_class, sizeof (NMConfigDataPrivate)); + object_class->constructed = constructed; object_class->dispose = dispose; object_class->finalize = finalize; object_class->get_property = get_property; @@ -264,27 +312,32 @@ nm_config_data_class_init (NMConfigDataClass *config_class) G_PARAM_STATIC_STRINGS)); g_object_class_install_property + (object_class, PROP_KEYFILE, + g_param_spec_boxed (NM_CONFIG_DATA_KEYFILE, "", "", + G_TYPE_KEY_FILE, + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (object_class, PROP_CONNECTIVITY_URI, g_param_spec_string (NM_CONFIG_DATA_CONNECTIVITY_URI, "", "", NULL, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (object_class, PROP_CONNECTIVITY_INTERVAL, g_param_spec_uint (NM_CONFIG_DATA_CONNECTIVITY_INTERVAL, "", "", 0, G_MAXUINT, 0, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (object_class, PROP_CONNECTIVITY_RESPONSE, g_param_spec_string (NM_CONFIG_DATA_CONNECTIVITY_RESPONSE, "", "", NULL, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); } |