config: use flags argument in config-changed signal instead of a hash table

This commit is contained in:
Thomas Haller 2015-01-21 12:58:32 +01:00
parent cc46b182ed
commit 5b47462f32
5 changed files with 66 additions and 42 deletions

View file

@ -157,33 +157,31 @@ _keyfile_a_contains_all_in_b (GKeyFile *kf_a, GKeyFile *kf_b)
return TRUE;
}
GHashTable *
NMConfigChangeFlags
nm_config_data_diff (NMConfigData *old_data, NMConfigData *new_data)
{
GHashTable *changes;
NMConfigChangeFlags changes = NM_CONFIG_CHANGE_NONE;
NMConfigDataPrivate *priv_old, *priv_new;
GSList *spec_old, *spec_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);
g_return_val_if_fail (NM_IS_CONFIG_DATA (old_data), NM_CONFIG_CHANGE_NONE);
g_return_val_if_fail (NM_IS_CONFIG_DATA (new_data), NM_CONFIG_CHANGE_NONE);
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);
changes |= NM_CONFIG_CHANGE_VALUES;
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);
changes |= NM_CONFIG_CHANGE_CONFIG_FILES;
if ( nm_config_data_get_connectivity_interval (old_data) != nm_config_data_get_connectivity_interval (new_data)
|| g_strcmp0 (nm_config_data_get_connectivity_uri (old_data), nm_config_data_get_connectivity_uri (new_data))
|| g_strcmp0 (nm_config_data_get_connectivity_response (old_data), nm_config_data_get_connectivity_response (new_data)))
g_hash_table_insert (changes, NM_CONFIG_CHANGES_CONNECTIVITY, NULL);
changes |= NM_CONFIG_CHANGE_CONNECTIVITY;
spec_old = priv_old->no_auto_default.specs;
spec_new = priv_new->no_auto_default.specs;
@ -192,12 +190,8 @@ nm_config_data_diff (NMConfigData *old_data, NMConfigData *new_data)
spec_new = spec_new->next;
}
if (spec_old || spec_new)
g_hash_table_insert (changes, NM_CONFIG_CHANGES_NO_AUTO_DEFAULT, NULL);
changes |= NM_CONFIG_CHANGE_NO_AUTO_DEFAULT;
if (!g_hash_table_size (changes)) {
g_hash_table_destroy (changes);
return NULL;
}
return changes;
}

View file

@ -44,6 +44,17 @@ G_BEGIN_DECLS
#define NM_CONFIG_DATA_CONNECTIVITY_RESPONSE "connectivity-response"
#define NM_CONFIG_DATA_NO_AUTO_DEFAULT "no-auto-default"
typedef enum { /*< flags >*/
NM_CONFIG_CHANGE_NONE = 0,
NM_CONFIG_CHANGE_CONFIG_FILES = (1L << 0),
NM_CONFIG_CHANGE_VALUES = (1L << 1),
NM_CONFIG_CHANGE_CONNECTIVITY = (1L << 2),
NM_CONFIG_CHANGE_NO_AUTO_DEFAULT = (1L << 3),
_NM_CONFIG_CHANGE_LAST,
NM_CONFIG_CHANGE_ALL = ((_NM_CONFIG_CHANGE_LAST - 1) << 1) - 1,
} NMConfigChangeFlags;
struct _NMConfigData {
GObject parent;
};
@ -60,7 +71,7 @@ NMConfigData *nm_config_data_new (const char *config_main_file,
GKeyFile *keyfile);
NMConfigData *nm_config_data_new_update_no_auto_default (const NMConfigData *base, const char *const*no_auto_default);
GHashTable *nm_config_data_diff (NMConfigData *old_data, NMConfigData *new_data);
NMConfigChangeFlags nm_config_data_diff (NMConfigData *old_data, NMConfigData *new_data);
const char *nm_config_data_get_config_main_file (const NMConfigData *config_data);
const char *nm_config_data_get_config_description (const NMConfigData *config_data);

View file

@ -30,6 +30,8 @@
#include "nm-glib-compat.h"
#include "nm-device.h"
#include "NetworkManagerUtils.h"
#include "gsystem-local-alloc.h"
#include "nm-enum-types.h"
#include <gio/gio.h>
#include <glib/gi18n.h>
@ -716,40 +718,60 @@ nm_config_reload (NMConfig *self)
_set_config_data (self, new_data);
}
static const char *
_change_flags_one_to_string (NMConfigChangeFlags flag)
{
switch (flag) {
case NM_CONFIG_CHANGE_CONFIG_FILES:
return "config-files";
case NM_CONFIG_CHANGE_VALUES:
return "values";
case NM_CONFIG_CHANGE_CONNECTIVITY:
return "connectivity";
case NM_CONFIG_CHANGE_NO_AUTO_DEFAULT:
return "no-auto-default";
default:
g_return_val_if_reached ("unknown");
}
}
char *
nm_config_change_flags_to_string (NMConfigChangeFlags flags)
{
GString *str = g_string_new ("");
NMConfigChangeFlags s = 0x01;
while (flags) {
if (NM_FLAGS_HAS (flags, s)) {
if (str->len)
g_string_append_c (str, ',');
g_string_append (str, _change_flags_one_to_string (s));
}
flags = flags & ~s;
s <<= 1;
}
return g_string_free (str, FALSE);
}
static void
_set_config_data (NMConfig *self, NMConfigData *new_data)
{
NMConfigPrivate *priv = NM_CONFIG_GET_PRIVATE (self);
NMConfigData *old_data = priv->config_data;
GHashTable *changes;
NMConfigChangeFlags changes;
gs_free char *log_str = NULL;
changes = nm_config_data_diff (old_data, new_data);
if (!changes) {
if (changes == NM_CONFIG_CHANGE_NONE) {
g_object_unref (new_data);
return;
}
if (nm_logging_enabled (LOGL_INFO, LOGD_CORE)) {
GString *str = g_string_new (NULL);
GHashTableIter iter;
const char *key;
g_hash_table_iter_init (&iter, changes);
while (g_hash_table_iter_next (&iter, (gpointer) &key, NULL)) {
if (str->len)
g_string_append (str, ",");
g_string_append (str, key);
}
nm_log_info (LOGD_CORE, "config: update %s (%s)", nm_config_data_get_config_description (new_data), str->str);
g_string_free (str, TRUE);
}
nm_log_info (LOGD_CORE, "config: update %s (%s)", nm_config_data_get_config_description (new_data),
(log_str = nm_config_change_flags_to_string (changes)));
priv->config_data = new_data;
g_signal_emit (self, signals[SIGNAL_CONFIG_CHANGED], 0, new_data, changes, old_data);
g_object_unref (old_data);
g_hash_table_destroy (changes);
}
NM_DEFINE_SINGLETON_DESTRUCTOR (NMConfig);
@ -934,7 +956,7 @@ nm_config_class_init (NMConfigClass *config_class)
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (NMConfigClass, config_changed),
NULL, NULL, NULL,
G_TYPE_NONE, 3, NM_TYPE_CONFIG_DATA, G_TYPE_HASH_TABLE, NM_TYPE_CONFIG_DATA);
G_TYPE_NONE, 3, NM_TYPE_CONFIG_DATA, NM_TYPE_CONFIG_CHANGE_FLAGS, NM_TYPE_CONFIG_DATA);
}
static void

View file

@ -43,11 +43,6 @@ G_BEGIN_DECLS
/* Signals */
#define NM_CONFIG_SIGNAL_CONFIG_CHANGED "config-changed"
#define NM_CONFIG_CHANGES_CONFIG_FILES "config-files"
#define NM_CONFIG_CHANGES_VALUES "values"
#define NM_CONFIG_CHANGES_CONNECTIVITY "connectivity"
#define NM_CONFIG_CHANGES_NO_AUTO_DEFAULT "no-auto-default"
typedef struct NMConfigCmdLineOptions NMConfigCmdLineOptions;
struct _NMConfig {
@ -65,6 +60,8 @@ GType nm_config_get_type (void);
NMConfig *nm_config_get (void);
char *nm_config_change_flags_to_string (NMConfigChangeFlags flags);
NMConfigData *nm_config_get_data (NMConfig *config);
NMConfigData *nm_config_get_data_orig (NMConfig *config);
const char **nm_config_get_plugins (NMConfig *config);

View file

@ -465,7 +465,7 @@ active_connection_get_by_path (NMManager *manager, const char *path)
/************************************************************************/
static void
_config_changed_cb (NMConfig *config, NMConfigData *config_data, GHashTable *changes, NMConfigData *old_data, NMManager *self)
_config_changed_cb (NMConfig *config, NMConfigData *config_data, NMConfigChangeFlags changes, NMConfigData *old_data, NMManager *self)
{
g_object_set (NM_MANAGER_GET_PRIVATE (self)->connectivity,
NM_CONNECTIVITY_URI, nm_config_data_get_connectivity_uri (config_data),