From e5c562262632b88b87be8aaf13f4b961273d3e96 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Thu, 26 Aug 2010 18:05:33 -0500 Subject: [PATCH] core: flatten connection listing from the settings service While it may not reduce the LOC it saves a few memory allocations and is somewhat less error prone since callers don't need to free the returned lists. --- src/nm-manager.c | 36 +++++------- src/system-settings/nm-sysconfig-settings.c | 65 +++++++++++---------- src/system-settings/nm-sysconfig-settings.h | 9 ++- 3 files changed, 57 insertions(+), 53 deletions(-) diff --git a/src/nm-manager.c b/src/nm-manager.c index 2368eeef03..04931b9d7d 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -822,43 +822,33 @@ system_connection_removed_cb (NMSysconfigConnection *connection, } static void -system_internal_new_connection (NMManager *manager, - NMSysconfigConnection *connection) +_new_connection (NMSysconfigSettings *settings, + NMSysconfigConnection *connection, + gpointer user_data) { - NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (manager); + NMManager *self = NM_MANAGER (user_data); + NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self); const char *path; g_return_if_fail (connection != NULL); g_signal_connect (connection, NM_SYSCONFIG_CONNECTION_UPDATED, - G_CALLBACK (system_connection_updated_cb), manager); + G_CALLBACK (system_connection_updated_cb), self); g_signal_connect (connection, NM_SYSCONFIG_CONNECTION_REMOVED, - G_CALLBACK (system_connection_removed_cb), manager); + G_CALLBACK (system_connection_removed_cb), self); path = nm_connection_get_path (NM_CONNECTION (connection)); g_hash_table_insert (priv->system_connections, g_strdup (path), g_object_ref (connection)); - g_signal_emit (manager, signals[CONNECTION_ADDED], 0, connection); + g_signal_emit (self, signals[CONNECTION_ADDED], 0, connection); } static void system_new_connection_cb (NMSysconfigSettings *settings, NMSysconfigConnection *connection, - NMManager *manager) + NMManager *self) { - system_internal_new_connection (manager, connection); -} - -static void -system_query_connections (NMManager *manager) -{ - NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (manager); - GSList *system_connections, *iter; - - system_connections = nm_sysconfig_settings_list_connections (priv->sys_settings); - for (iter = system_connections; iter; iter = g_slist_next (iter)) - system_internal_new_connection (manager, NM_SYSCONFIG_CONNECTION (iter->data)); - g_slist_free (system_connections); + _new_connection (settings, connection, self); } static void @@ -2932,7 +2922,11 @@ nm_manager_start (NMManager *self) system_unmanaged_devices_changed_cb (priv->sys_settings, NULL, self); system_hostname_changed_cb (priv->sys_settings, NULL, self); - system_query_connections (self); + + /* Get all connections */ + nm_sysconfig_settings_for_each_connection (NM_MANAGER_GET_PRIVATE (self)->sys_settings, + _new_connection, + self); nm_udev_manager_query_devices (priv->udev_mgr); bluez_manager_resync_devices (self); diff --git a/src/system-settings/nm-sysconfig-settings.c b/src/system-settings/nm-sysconfig-settings.c index 197c01584a..5841e625a8 100644 --- a/src/system-settings/nm-sysconfig-settings.c +++ b/src/system-settings/nm-sysconfig-settings.c @@ -168,25 +168,26 @@ load_connections (NMSysconfigSettings *self) unmanaged_specs_changed (NULL, self); } -GSList * -nm_sysconfig_settings_list_connections (NMSysconfigSettings *settings) +void +nm_sysconfig_settings_for_each_connection (NMSysconfigSettings *self, + NMSysconfigSettingsForEachFunc for_each_func, + gpointer user_data) { NMSysconfigSettingsPrivate *priv; GHashTableIter iter; gpointer key; - GSList *list = NULL; - g_return_val_if_fail (settings != NULL, NULL); - g_return_val_if_fail (NM_IS_SYSCONFIG_SETTINGS (settings), NULL); + g_return_if_fail (self != NULL); + g_return_if_fail (NM_IS_SYSCONFIG_SETTINGS (self)); + g_return_if_fail (for_each_func != NULL); - priv = NM_SYSCONFIG_SETTINGS_GET_PRIVATE (settings); + priv = NM_SYSCONFIG_SETTINGS_GET_PRIVATE (self); - load_connections (settings); + load_connections (self); g_hash_table_iter_init (&iter, priv->visible_connections); while (g_hash_table_iter_next (&iter, &key, NULL)) - list = g_slist_prepend (list, NM_SYSCONFIG_CONNECTION (key)); - return g_slist_reverse (list); + for_each_func (self, NM_SYSCONFIG_CONNECTION (key), user_data); } static gboolean @@ -194,38 +195,40 @@ impl_settings_list_connections (NMSysconfigSettings *self, GPtrArray **connections, GError **error) { - GSList *list = NULL, *iter; + NMSysconfigSettingsPrivate *priv = NM_SYSCONFIG_SETTINGS_GET_PRIVATE (self); + GHashTableIter iter; + gpointer key; - list = nm_sysconfig_settings_list_connections (self); - *connections = g_ptr_array_sized_new (g_slist_length (list) + 1); - for (iter = list; iter; iter = g_slist_next (iter)) { - g_ptr_array_add (*connections, - g_strdup (nm_connection_get_path (NM_CONNECTION (iter->data)))); - } - g_slist_free (list); + load_connections (self); + + *connections = g_ptr_array_sized_new (g_hash_table_size (priv->visible_connections) + 1); + g_hash_table_iter_init (&iter, priv->visible_connections); + while (g_hash_table_iter_next (&iter, &key, NULL)) + g_ptr_array_add (*connections, g_strdup (nm_connection_get_path (NM_CONNECTION (key)))); return TRUE; } NMSysconfigConnection * -nm_sysconfig_settings_get_connection_by_path (NMSysconfigSettings *settings, const char *path) +nm_sysconfig_settings_get_connection_by_path (NMSysconfigSettings *self, const char *path) { - NMSysconfigConnection *connection = NULL; - GSList *list = NULL, *iter; + NMSysconfigSettingsPrivate *priv; + GHashTableIter iter; + gpointer key; - g_return_val_if_fail (settings != NULL, NULL); - g_return_val_if_fail (NM_IS_SYSCONFIG_SETTINGS (settings), NULL); + g_return_val_if_fail (self != NULL, NULL); + g_return_val_if_fail (NM_IS_SYSCONFIG_SETTINGS (self), NULL); g_return_val_if_fail (path != NULL, NULL); - list = nm_sysconfig_settings_list_connections (settings); - for (iter = list; iter; iter = g_slist_next (iter)) { - if (!strcmp (nm_connection_get_path (NM_CONNECTION (iter->data)), path)) { - connection = NM_SYSCONFIG_CONNECTION (iter->data); - break; - } - } - g_slist_free (list); + priv = NM_SYSCONFIG_SETTINGS_GET_PRIVATE (self); - return connection; + load_connections (self); + + g_hash_table_iter_init (&iter, priv->visible_connections); + while (g_hash_table_iter_next (&iter, &key, NULL)) { + if (!strcmp (nm_connection_get_path (NM_CONNECTION (key)), path)) + return NM_SYSCONFIG_CONNECTION (key); + } + return NULL; } static void diff --git a/src/system-settings/nm-sysconfig-settings.h b/src/system-settings/nm-sysconfig-settings.h index d4e58a6964..948349820b 100644 --- a/src/system-settings/nm-sysconfig-settings.h +++ b/src/system-settings/nm-sysconfig-settings.h @@ -62,7 +62,14 @@ NMSysconfigSettings *nm_sysconfig_settings_new (const char *config_file, const char *plugins, GError **error); -/* Returns a list of NMSysconfigConnections */ +typedef void (*NMSysconfigSettingsForEachFunc) (NMSysconfigSettings *settings, + NMSysconfigConnection *connection, + gpointer user_data); + +void nm_sysconfig_settings_for_each_connection (NMSysconfigSettings *settings, + NMSysconfigSettingsForEachFunc for_each_func, + gpointer user_data); + GSList * nm_sysconfig_settings_list_connections (NMSysconfigSettings *settings); NMSysconfigConnection * nm_sysconfig_settings_get_connection_by_path (NMSysconfigSettings *settings,