From 890866bef956bdca9317abdb2e033a8e3c5872e2 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Mon, 10 Aug 2009 23:25:11 -0500 Subject: [PATCH] system-settings: clean up settings service classes Make NMSettingsService implement most of the NMSettingsInterface API to make subclasses simpler, and consolidate exporting of NMExportedConnection subclasses in NMSettingsService instead of in 3 places. Make NMSysconfigSettings a subclass of NMSettingsService and save a ton of code. --- introspection/nm-settings-system.xml | 13 -- libnm-glib/libnm_glib.ver | 1 + libnm-glib/nm-exported-connection.c | 122 +------------ libnm-glib/nm-exported-connection.h | 7 +- libnm-glib/nm-settings-service.c | 108 ++++++++++-- libnm-glib/nm-settings-service.h | 12 +- src/nm-manager.c | 7 +- src/system-settings/nm-sysconfig-connection.c | 1 - src/system-settings/nm-sysconfig-settings.c | 166 +++++------------- src/system-settings/nm-sysconfig-settings.h | 6 +- system-settings/plugins/ifcfg-rh/plugin.c | 2 - 11 files changed, 162 insertions(+), 283 deletions(-) diff --git a/introspection/nm-settings-system.xml b/introspection/nm-settings-system.xml index d03b8dddb8..ff98719f8f 100644 --- a/introspection/nm-settings-system.xml +++ b/introspection/nm-settings-system.xml @@ -6,19 +6,6 @@ Implemented by the system settings service to provide additional settings to NetworkManager. - - - DEPRECATED. Adds new connection. - - - - - - Connection properties. - - - - Save the hostname to persistent configuration. diff --git a/libnm-glib/libnm_glib.ver b/libnm-glib/libnm_glib.ver index ef79722748..7946e60121 100644 --- a/libnm-glib/libnm_glib.ver +++ b/libnm-glib/libnm_glib.ver @@ -120,6 +120,7 @@ global: nm_settings_interface_get_type; nm_settings_interface_list_connections; nm_settings_service_export; + nm_settings_service_export_connection; nm_settings_service_get_connection_by_path; nm_settings_service_get_type; nm_settings_system_interface_get_type; diff --git a/libnm-glib/nm-exported-connection.c b/libnm-glib/nm-exported-connection.c index 57dde41442..8753224d49 100644 --- a/libnm-glib/nm-exported-connection.c +++ b/libnm-glib/nm-exported-connection.c @@ -51,41 +51,12 @@ G_DEFINE_TYPE (NMExportedConnection, nm_exported_connection, NM_TYPE_CONNECTION) NMExportedConnectionPrivate)) typedef struct { - DBusGConnection *bus; - gboolean disposed; + gboolean foo; } NMExportedConnectionPrivate; -enum { - PROP_0, - PROP_BUS, - - LAST_PROP -}; - /**************************************************************/ -void -nm_exported_connection_export (NMExportedConnection *self) -{ - NMExportedConnectionPrivate *priv; - static guint32 ec_counter = 0; - char *path; - - g_return_if_fail (self != NULL); - g_return_if_fail (NM_IS_EXPORTED_CONNECTION (self)); - - priv = NM_EXPORTED_CONNECTION_GET_PRIVATE (self); - - /* Don't allow exporting twice */ - g_return_if_fail (nm_connection_get_path (NM_CONNECTION (self)) == NULL); - - path = g_strdup_printf ("%s/%u", NM_DBUS_PATH_SETTINGS, ec_counter++); - nm_connection_set_path (NM_CONNECTION (self), path); - dbus_g_connection_register_g_object (priv->bus, path, G_OBJECT (self)); - g_free (path); -} - static GHashTable * real_get_settings (NMExportedConnection *self, GError **error) { @@ -183,124 +154,35 @@ impl_exported_connection_get_secrets (NMExportedConnection *self, /** * nm_exported_connection_new: - * @bus: a valid and connected D-Bus connection * @scope: the Connection scope (either user or system) - * @path: the D-Bus path of the connection as exported by the settings service - * indicated by @scope * * Creates a new object representing the remote connection. * * Returns: the new exported connection object on success, or %NULL on failure **/ NMExportedConnection * -nm_exported_connection_new (DBusGConnection *bus, - NMConnectionScope scope) +nm_exported_connection_new (NMConnectionScope scope) { - g_return_val_if_fail (bus != NULL, NULL); g_return_val_if_fail (scope != NM_CONNECTION_SCOPE_UNKNOWN, NULL); return (NMExportedConnection *) g_object_new (NM_TYPE_EXPORTED_CONNECTION, - NM_EXPORTED_CONNECTION_BUS, bus, NM_CONNECTION_SCOPE, scope, NULL); } -static GObject * -constructor (GType type, - guint n_construct_params, - GObjectConstructParam *construct_params) -{ - GObject *object; - NMExportedConnectionPrivate *priv; - - object = G_OBJECT_CLASS (nm_exported_connection_parent_class)->constructor (type, n_construct_params, construct_params); - if (!object) - return NULL; - - priv = NM_EXPORTED_CONNECTION_GET_PRIVATE (object); - g_assert (priv->bus); - - return object; -} - static void nm_exported_connection_init (NMExportedConnection *self) { } -static void -set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - NMExportedConnectionPrivate *priv = NM_EXPORTED_CONNECTION_GET_PRIVATE (object); - - switch (prop_id) { - case PROP_BUS: - /* Construct only */ - priv->bus = dbus_g_connection_ref ((DBusGConnection *) g_value_get_boxed (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - NMExportedConnectionPrivate *priv = NM_EXPORTED_CONNECTION_GET_PRIVATE (object); - - switch (prop_id) { - case PROP_BUS: - g_value_set_boxed (value, priv->bus); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -dispose (GObject *object) -{ - NMExportedConnectionPrivate *priv = NM_EXPORTED_CONNECTION_GET_PRIVATE (object); - - if (!priv->disposed) { - priv->disposed = TRUE; - dbus_g_connection_unref (priv->bus); - } - - G_OBJECT_CLASS (nm_exported_connection_parent_class)->dispose (object); -} - static void nm_exported_connection_class_init (NMExportedConnectionClass *class) { - GObjectClass *object_class = G_OBJECT_CLASS (class); - g_type_class_add_private (class, sizeof (NMExportedConnectionPrivate)); /* Virtual methods */ - object_class->dispose = dispose; - object_class->constructor = constructor; - object_class->get_property = get_property; - object_class->set_property = set_property; - class->get_settings = real_get_settings; - /** - * NMExportedConnection:bus: - * - * The %DBusGConnection which this object is exported on - **/ - g_object_class_install_property (object_class, PROP_BUS, - g_param_spec_boxed (NM_EXPORTED_CONNECTION_BUS, - "Bus", - "Bus", - DBUS_TYPE_G_CONNECTION, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); - dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (class), &dbus_glib_nm_exported_connection_object_info); } diff --git a/libnm-glib/nm-exported-connection.h b/libnm-glib/nm-exported-connection.h index 79c7f80c39..7455d4c8a7 100644 --- a/libnm-glib/nm-exported-connection.h +++ b/libnm-glib/nm-exported-connection.h @@ -33,8 +33,6 @@ G_BEGIN_DECLS #define NM_IS_EXPORTED_CONNECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), NM_TYPE_EXPORTED_CONNECTION)) #define NM_EXPORTED_CONNECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_EXPORTED_CONNECTION, NMExportedConnectionClass)) -#define NM_EXPORTED_CONNECTION_BUS "bus" - typedef struct { NMConnection parent; } NMExportedConnection; @@ -61,10 +59,7 @@ typedef struct { GType nm_exported_connection_get_type (void); -NMExportedConnection *nm_exported_connection_new (DBusGConnection *bus, - NMConnectionScope scope); - -void nm_exported_connection_export (NMExportedConnection *self); +NMExportedConnection *nm_exported_connection_new (NMConnectionScope scope); G_END_DECLS diff --git a/libnm-glib/nm-settings-service.c b/libnm-glib/nm-settings-service.c index c8e1d4ce50..e05c3bc48c 100644 --- a/libnm-glib/nm-settings-service.c +++ b/libnm-glib/nm-settings-service.c @@ -19,6 +19,7 @@ * (C) Copyright 2008 - 2009 Red Hat, Inc. */ +#include #include #include @@ -115,11 +116,18 @@ impl_settings_list_connections (NMSettingsService *self, static NMSettingsConnectionInterface * get_connection_by_path (NMSettingsInterface *settings, const char *path) { - NMExportedConnection *connection; + NMExportedConnection *connection = NULL; + GSList *list = NULL, *iter; + + list = 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_EXPORTED_CONNECTION (iter->data); + break; + } + } + g_slist_free (list); - /* Must always be implemented */ - g_assert (NM_SETTINGS_SERVICE_GET_CLASS (settings)->get_connection_by_path); - connection = NM_SETTINGS_SERVICE_GET_CLASS (settings)->get_connection_by_path (NM_SETTINGS_SERVICE (settings), path); return (NMSettingsConnectionInterface *) connection; } @@ -133,6 +141,48 @@ nm_settings_service_get_connection_by_path (NMSettingsService *self, return (NMExportedConnection *) get_connection_by_path (NM_SETTINGS_INTERFACE (self), path); } +static gboolean +add_connection (NMSettingsInterface *settings, + NMSettingsConnectionInterface *connection, + NMSettingsAddConnectionFunc callback, + gpointer user_data) +{ + NMSettingsService *self = NM_SETTINGS_SERVICE (settings); + GError *error = NULL; + gboolean success = FALSE; + + if (NM_SETTINGS_SERVICE_GET_CLASS (self)->add_connection) { + NM_SETTINGS_SERVICE_GET_CLASS (self)->add_connection (NM_SETTINGS_SERVICE (self), + connection, + NULL, + callback, + user_data); + success = TRUE; + } else { + error = g_error_new (NM_SETTINGS_INTERFACE_ERROR, + NM_SETTINGS_INTERFACE_ERROR_INTERNAL_ERROR, + "%s: %s:%d add_connection() not implemented", + __func__, __FILE__, __LINE__); + callback (settings, error, user_data); + g_error_free (error); + } + + return success; +} + +static void +dbus_add_connection_cb (NMSettingsInterface *settings, + GError *error, + gpointer user_data) +{ + DBusGMethodInvocation *context = user_data; + + if (error) + dbus_g_method_return_error (context, error); + else + dbus_g_method_return (context); +} + static void impl_settings_add_connection (NMSettingsService *self, GHashTable *settings, @@ -149,11 +199,14 @@ impl_settings_add_connection (NMSettingsService *self, g_error_free (error); return; } - g_object_unref (tmp); - if (NM_SETTINGS_SERVICE_GET_CLASS (self)->add_connection) - NM_SETTINGS_SERVICE_GET_CLASS (self)->add_connection (self, settings, context); - else { + if (NM_SETTINGS_SERVICE_GET_CLASS (self)->add_connection) { + NM_SETTINGS_SERVICE_GET_CLASS (self)->add_connection (NM_SETTINGS_SERVICE (self), + NM_SETTINGS_CONNECTION_INTERFACE (tmp), + context, + dbus_add_connection_cb, + context); + } else { error = g_error_new (NM_SETTINGS_INTERFACE_ERROR, NM_SETTINGS_INTERFACE_ERROR_INTERNAL_ERROR, "%s: %s:%d add_connection() not implemented", @@ -161,6 +214,30 @@ impl_settings_add_connection (NMSettingsService *self, dbus_g_method_return_error (context, error); g_error_free (error); } + + g_object_unref (tmp); +} + +void +nm_settings_service_export_connection (NMSettingsService *self, + NMSettingsConnectionInterface *connection) +{ + NMSettingsServicePrivate *priv = NM_SETTINGS_SERVICE_GET_PRIVATE (self); + static guint32 ec_counter = 0; + char *path; + + g_return_if_fail (connection != NULL); + g_return_if_fail (NM_IS_SETTINGS_CONNECTION_INTERFACE (connection)); + + /* Don't allow exporting twice */ + g_return_if_fail (nm_connection_get_path (NM_CONNECTION (connection)) == NULL); + + path = g_strdup_printf ("%s/%u", NM_DBUS_PATH_SETTINGS, ec_counter++); + nm_connection_set_path (NM_CONNECTION (connection), path); + nm_connection_set_scope (NM_CONNECTION (connection), priv->scope); + + dbus_g_connection_register_g_object (priv->bus, path, G_OBJECT (connection)); + g_free (path); } /**************************************************************/ @@ -171,6 +248,10 @@ settings_interface_init (NMSettingsInterface *iface) /* interface implementation */ iface->list_connections = list_connections; iface->get_connection_by_path = get_connection_by_path; + iface->add_connection = add_connection; + + dbus_g_object_type_install_info (G_TYPE_FROM_INTERFACE (iface), + &dbus_glib_nm_settings_object_info); } static GObject * @@ -181,8 +262,10 @@ constructor (GType type, GObject *object; object = G_OBJECT_CLASS (nm_settings_service_parent_class)->constructor (type, n_construct_params, construct_params); - if (object) + if (object) { g_assert (NM_SETTINGS_SERVICE_GET_PRIVATE (object)->scope != NM_CONNECTION_SCOPE_UNKNOWN); + g_assert (NM_SETTINGS_SERVICE_GET_PRIVATE (object)->bus != NULL); + } return object; } @@ -196,11 +279,14 @@ set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { NMSettingsServicePrivate *priv = NM_SETTINGS_SERVICE_GET_PRIVATE (object); + DBusGConnection *bus; switch (prop_id) { case PROP_BUS: /* Construct only */ - priv->bus = dbus_g_connection_ref ((DBusGConnection *) g_value_get_boxed (value)); + bus = g_value_get_boxed (value); + if (bus) + priv->bus = dbus_g_connection_ref (bus); break; case PROP_SCOPE: /* Construct only */ @@ -277,9 +363,9 @@ nm_settings_service_class_init (NMSettingsServiceClass *class) g_param_spec_uint (NM_SETTINGS_SERVICE_SCOPE, "Scope", "Scope", - NM_CONNECTION_SCOPE_USER, NM_CONNECTION_SCOPE_SYSTEM, NM_CONNECTION_SCOPE_USER, + NM_CONNECTION_SCOPE_USER, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (class), diff --git a/libnm-glib/nm-settings-service.h b/libnm-glib/nm-settings-service.h index 2a6bb86aa2..b8d93a7162 100644 --- a/libnm-glib/nm-settings-service.h +++ b/libnm-glib/nm-settings-service.h @@ -51,12 +51,11 @@ typedef struct { */ GSList * (*list_connections) (NMSettingsService *self); - NMExportedConnection * (*get_connection_by_path) (NMSettingsService *self, - const char *path); - void (*add_connection) (NMSettingsService *self, - GHashTable *settings, - DBusGMethodInvocation *context); + NMSettingsConnectionInterface *connection, + DBusGMethodInvocation *context, /* Only present for D-Bus calls */ + NMSettingsAddConnectionFunc callback, + gpointer user_data); } NMSettingsServiceClass; GType nm_settings_service_get_type (void); @@ -66,6 +65,9 @@ NMExportedConnection *nm_settings_service_get_connection_by_path (NMSettingsServ void nm_settings_service_export (NMSettingsService *self); +void nm_settings_service_export_connection (NMSettingsService *self, + NMSettingsConnectionInterface *exported); + G_END_DECLS #endif /* NM_SETTINGS_SERVICE_H */ diff --git a/src/nm-manager.c b/src/nm-manager.c index 9442db71a6..28a5f86843 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -2508,6 +2508,7 @@ nm_manager_get (const char *config_file, const char *plugins, GError **error) { static NMManager *singleton = NULL; NMManagerPrivate *priv; + DBusGConnection *bus; if (singleton) return g_object_ref (singleton); @@ -2517,11 +2518,15 @@ nm_manager_get (const char *config_file, const char *plugins, GError **error) priv = NM_MANAGER_GET_PRIVATE (singleton); - priv->sys_settings = nm_sysconfig_settings_new (config_file, plugins, error); + bus = nm_dbus_manager_get_connection (priv->dbus_mgr); + g_assert (bus); + + priv->sys_settings = nm_sysconfig_settings_new (config_file, plugins, bus, error); if (!priv->sys_settings) { g_object_unref (singleton); return NULL; } + nm_settings_service_export (NM_SETTINGS_SERVICE (priv->sys_settings)); priv->config_file = g_strdup (config_file); diff --git a/src/system-settings/nm-sysconfig-connection.c b/src/system-settings/nm-sysconfig-connection.c index 4dbef0daf5..db197a3f28 100644 --- a/src/system-settings/nm-sysconfig-connection.c +++ b/src/system-settings/nm-sysconfig-connection.c @@ -41,7 +41,6 @@ G_DEFINE_TYPE_EXTENDED (NMSysconfigConnection, nm_sysconfig_connection, NM_TYPE_ NMSysconfigConnectionPrivate)) typedef struct { - DBusGConnection *bus; PolkitAuthority *authority; } NMSysconfigConnectionPrivate; diff --git a/src/system-settings/nm-sysconfig-settings.c b/src/system-settings/nm-sysconfig-settings.c index 64259d83c1..e586669df4 100644 --- a/src/system-settings/nm-sysconfig-settings.c +++ b/src/system-settings/nm-sysconfig-settings.c @@ -43,7 +43,6 @@ #include "nm-dbus-glib-types.h" #include "nm-sysconfig-settings.h" #include "nm-sysconfig-connection.h" -#include "nm-dbus-manager.h" #include "nm-polkit-helpers.h" #include "nm-system-config-error.h" #include "nm-utils.h" @@ -67,25 +66,15 @@ static void claim_connection (NMSysconfigSettings *self, NMSettingsConnectionInterface *connection, gboolean do_export); -static gboolean impl_settings_list_connections (NMSysconfigSettings *self, - GPtrArray **connections, - GError **error); - -static void impl_settings_add_connection (NMSysconfigSettings *self, - GHashTable *settings, - DBusGMethodInvocation *context); - static void impl_settings_save_hostname (NMSysconfigSettings *self, const char *hostname, DBusGMethodInvocation *context); -#include "nm-settings-glue.h" #include "nm-settings-system-glue.h" static void unmanaged_specs_changed (NMSystemConfigInterface *config, gpointer user_data); typedef struct { - NMDBusManager *dbus_mgr; PolkitAuthority *authority; char *config_file; @@ -96,13 +85,9 @@ typedef struct { char *orig_hostname; } NMSysconfigSettingsPrivate; -static void settings_interface_init (NMSettingsInterface *klass); - static void settings_system_interface_init (NMSettingsSystemInterface *klass); -G_DEFINE_TYPE_WITH_CODE (NMSysconfigSettings, nm_sysconfig_settings, G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE (NM_TYPE_SETTINGS_INTERFACE, - settings_interface_init) +G_DEFINE_TYPE_WITH_CODE (NMSysconfigSettings, nm_sysconfig_settings, NM_TYPE_SETTINGS_SERVICE, G_IMPLEMENT_INTERFACE (NM_TYPE_SETTINGS_SYSTEM_INTERFACE, settings_system_interface_init)) @@ -157,50 +142,20 @@ load_connections (NMSysconfigSettings *self) unmanaged_specs_changed (NULL, self); } -static gboolean -impl_settings_list_connections (NMSysconfigSettings *self, - GPtrArray **connections, - GError **error) +static GSList * +list_connections (NMSettingsService *settings) { - NMSysconfigSettingsPrivate *priv = NM_SYSCONFIG_SETTINGS_GET_PRIVATE (self); + NMSysconfigSettingsPrivate *priv = NM_SYSCONFIG_SETTINGS_GET_PRIVATE (settings); GHashTableIter iter; gpointer key; + GSList *list = NULL; - load_connections (self); - - *connections = g_ptr_array_sized_new (g_hash_table_size (priv->connections)); + load_connections (NM_SYSCONFIG_SETTINGS (settings)); g_hash_table_iter_init (&iter, priv->connections); - while (g_hash_table_iter_next (&iter, &key, NULL)) { - NMSettingsConnectionInterface *connection = key; - char *path = NULL; - - g_object_get (G_OBJECT (connection), NM_SETTINGS_CONNECTION_INTERFACE_PATH, &path, NULL); - g_assert (path); - g_ptr_array_add (*connections, path); - } - return TRUE; -} - -static NMSettingsConnectionInterface * -get_connection_by_path (NMSettingsInterface *self, - const char *path) -{ - NMSysconfigSettingsPrivate *priv = NM_SYSCONFIG_SETTINGS_GET_PRIVATE (self); - GHashTableIter iter; - gpointer key; - - g_hash_table_iter_init (&iter, priv->connections); - while (g_hash_table_iter_next (&iter, &key, NULL)) { - NMConnection *candidate = NM_CONNECTION (key); - const char *candidate_path; - - candidate_path = nm_connection_get_path (candidate); - g_assert (candidate_path); - if (!strcmp (path, candidate_path)) - return NM_SETTINGS_CONNECTION_INTERFACE (candidate); - } - return NULL; + while (g_hash_table_iter_next (&iter, &key, NULL)) + list = g_slist_prepend (list, NM_EXPORTED_CONNECTION (key)); + return g_slist_reverse (list); } static void @@ -514,28 +469,6 @@ connection_removed (NMSettingsConnectionInterface *connection, g_hash_table_remove (priv->connections, connection); } -static void -export_connection (NMSysconfigSettings *self, - NMSettingsConnectionInterface *connection) -{ - NMSysconfigSettingsPrivate *priv = NM_SYSCONFIG_SETTINGS_GET_PRIVATE (self); - static guint32 ec_counter = 0; - char *path; - DBusGConnection *bus; - - g_return_if_fail (connection != NULL); - g_return_if_fail (NM_IS_SETTINGS_CONNECTION_INTERFACE (connection)); - - path = g_strdup_printf ("%s/%u", NM_DBUS_PATH_SETTINGS, ec_counter++); - nm_connection_set_path (NM_CONNECTION (connection), path); - nm_connection_set_scope (NM_CONNECTION (connection), NM_CONNECTION_SCOPE_SYSTEM); - - bus = nm_dbus_manager_get_connection (priv->dbus_mgr); - dbus_g_connection_register_g_object (bus, path, G_OBJECT (connection)); - - g_free (path); -} - static void claim_connection (NMSysconfigSettings *self, NMSettingsConnectionInterface *connection, @@ -554,7 +487,7 @@ claim_connection (NMSysconfigSettings *self, g_signal_connect (connection, "removed", G_CALLBACK (connection_removed), self); if (do_export) { - export_connection (self, connection); + nm_settings_service_export_connection (NM_SETTINGS_SERVICE (self), connection); g_signal_emit_by_name (self, "new-connection", connection); } } @@ -582,6 +515,9 @@ typedef struct { GCancellable *cancellable; NMConnection *connection; + NMSettingsAddConnectionFunc callback; + gpointer callback_data; + char *hostname; } PolkitCall; @@ -589,6 +525,8 @@ static PolkitCall * polkit_call_new (NMSysconfigSettings *self, DBusGMethodInvocation *context, NMConnection *connection, + NMSettingsAddConnectionFunc callback, + gpointer callback_data, const char *hostname) { PolkitCall *call; @@ -600,7 +538,12 @@ polkit_call_new (NMSysconfigSettings *self, call = g_malloc0 (sizeof (PolkitCall)); call->self = self; call->context = context; - call->connection = connection; + if (connection) + call->connection = g_object_ref (connection); + if (callback) { + call->callback = callback; + call->callback_data = callback_data; + } if (hostname) call->hostname = g_strdup (hostname); call->cancellable = g_cancellable_new (); @@ -668,7 +611,7 @@ pk_add_cb (GObject *object, GAsyncResult *result, gpointer user_data) &error); /* Some random error happened */ if (error) { - dbus_g_method_return_error (call->context, error); + call->callback (NM_SETTINGS_INTERFACE (self), error, call->callback_data); goto out; } @@ -677,20 +620,20 @@ pk_add_cb (GObject *object, GAsyncResult *result, gpointer user_data) error = g_error_new_literal (NM_SYSCONFIG_SETTINGS_ERROR, NM_SYSCONFIG_SETTINGS_ERROR_NOT_PRIVILEGED, "Insufficient privileges."); - dbus_g_method_return_error (call->context, error); + call->callback (NM_SETTINGS_INTERFACE (self), error, call->callback_data); goto out; } - if (add_new_connection (self, call->connection, &add_error)) { - dbus_g_method_return (call->context); - } else { + if (add_new_connection (self, call->connection, &add_error)) + call->callback (NM_SETTINGS_INTERFACE (self), NULL, call->callback_data); + else { error = g_error_new (NM_SYSCONFIG_SETTINGS_ERROR, NM_SYSCONFIG_SETTINGS_ERROR_ADD_FAILED, "Saving connection failed: (%d) %s", add_error ? add_error->code : -1, (add_error && add_error->message) ? add_error->message : "(unknown)"); g_error_free (add_error); - dbus_g_method_return_error (call->context, error); + call->callback (NM_SETTINGS_INTERFACE (self), error, call->callback_data); } out: @@ -701,13 +644,15 @@ out: } static void -impl_settings_add_connection (NMSysconfigSettings *self, - GHashTable *settings, - DBusGMethodInvocation *context) +add_connection (NMSettingsService *service, + NMSettingsConnectionInterface *connection, + DBusGMethodInvocation *context, /* Only present for D-Bus calls */ + NMSettingsAddConnectionFunc callback, + gpointer user_data) { + NMSysconfigSettings *self = NM_SYSCONFIG_SETTINGS (service); NMSysconfigSettingsPrivate *priv = NM_SYSCONFIG_SETTINGS_GET_PRIVATE (self); PolkitCall *call; - NMConnection *tmp; GError *error = NULL; /* Do any of the plugins support adding? */ @@ -715,21 +660,12 @@ impl_settings_add_connection (NMSysconfigSettings *self, error = g_error_new_literal (NM_SYSCONFIG_SETTINGS_ERROR, NM_SYSCONFIG_SETTINGS_ERROR_ADD_NOT_SUPPORTED, "None of the registered plugins support add."); - dbus_g_method_return_error (context, error); + callback (NM_SETTINGS_INTERFACE (service), error, user_data); g_error_free (error); return; } - /* Check if the settings are valid first */ - tmp = nm_connection_new_from_hash (settings, &error); - if (!tmp) { - g_assert (error); - dbus_g_method_return_error (context, error); - g_error_free (error); - return; - } - - call = polkit_call_new (self, context, tmp, NULL); + call = polkit_call_new (self, context, NM_CONNECTION (connection), callback, user_data, NULL); g_assert (call); polkit_authority_check_authorization (priv->authority, call->subject, @@ -816,7 +752,7 @@ impl_settings_save_hostname (NMSysconfigSettings *self, return; } - call = polkit_call_new (self, context, NULL, hostname); + call = polkit_call_new (self, context, NULL, NULL, NULL, hostname); g_assert (call); polkit_authority_check_authorization (priv->authority, call->subject, @@ -1123,13 +1059,16 @@ nm_sysconfig_settings_device_removed (NMSysconfigSettings *self, NMDevice *devic NMSysconfigSettings * nm_sysconfig_settings_new (const char *config_file, const char *plugins, + DBusGConnection *bus, GError **error) { NMSysconfigSettings *self; NMSysconfigSettingsPrivate *priv; - DBusGConnection *g_connection; - self = g_object_new (NM_TYPE_SYSCONFIG_SETTINGS, NULL); + self = g_object_new (NM_TYPE_SYSCONFIG_SETTINGS, + NM_SETTINGS_SERVICE_BUS, bus, + NM_SETTINGS_SERVICE_SCOPE, NM_CONNECTION_SCOPE_SYSTEM, + NULL); if (!self) return NULL; @@ -1137,12 +1076,6 @@ nm_sysconfig_settings_new (const char *config_file, priv->config_file = g_strdup (config_file); - priv->dbus_mgr = nm_dbus_manager_get (); - g_assert (priv->dbus_mgr); - - g_connection = nm_dbus_manager_get_connection (priv->dbus_mgr); - dbus_g_connection_register_g_object (g_connection, NM_DBUS_PATH_SETTINGS, G_OBJECT (self)); - if (plugins) { /* Load the plugins; fail if a plugin is not found. */ if (!load_plugins (self, plugins, error)) { @@ -1172,23 +1105,12 @@ finalize (GObject *object) if (priv->authority) g_object_unref (priv->authority); - g_object_unref (priv->dbus_mgr); - g_free (priv->orig_hostname); g_free (priv->config_file); G_OBJECT_CLASS (nm_sysconfig_settings_parent_class)->finalize (object); } -static void -settings_interface_init (NMSettingsInterface *iface) -{ - iface->get_connection_by_path = get_connection_by_path; - - dbus_g_object_type_install_info (G_TYPE_FROM_INTERFACE (iface), - &dbus_glib_nm_settings_object_info); -} - static void settings_system_interface_init (NMSettingsSystemInterface *iface) { @@ -1231,6 +1153,7 @@ static void nm_sysconfig_settings_class_init (NMSysconfigSettingsClass *class) { GObjectClass *object_class = G_OBJECT_CLASS (class); + NMSettingsServiceClass *ss_class = NM_SETTINGS_SERVICE_CLASS (class); g_type_class_add_private (class, sizeof (NMSysconfigSettingsPrivate)); @@ -1238,6 +1161,8 @@ nm_sysconfig_settings_class_init (NMSysconfigSettingsClass *class) object_class->notify = notify; object_class->get_property = get_property; object_class->finalize = finalize; + ss_class->list_connections = list_connections; + ss_class->add_connection = add_connection; /* properties */ g_object_class_install_property @@ -1266,9 +1191,6 @@ nm_sysconfig_settings_class_init (NMSysconfigSettingsClass *class) g_cclosure_marshal_VOID__BOXED, G_TYPE_NONE, 1, DBUS_TYPE_G_MAP_OF_VARIANT); - dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (class), - &dbus_glib_nm_settings_object_info); - dbus_g_error_domain_register (NM_SYSCONFIG_SETTINGS_ERROR, NM_DBUS_IFACE_SETTINGS_SYSTEM, NM_TYPE_SYSCONFIG_SETTINGS_ERROR); diff --git a/src/system-settings/nm-sysconfig-settings.h b/src/system-settings/nm-sysconfig-settings.h index badb6442e9..ae2ba68329 100644 --- a/src/system-settings/nm-sysconfig-settings.h +++ b/src/system-settings/nm-sysconfig-settings.h @@ -27,6 +27,7 @@ #define __NM_SYSCONFIG_SETTINGS_H__ #include +#include #include "nm-sysconfig-connection.h" #include "nm-system-config-interface.h" @@ -42,11 +43,11 @@ #define NM_SYSCONFIG_SETTINGS_UNMANAGED_SPECS "unmanaged-specs" typedef struct { - GObject parent_instance; + NMSettingsService parent_instance; } NMSysconfigSettings; typedef struct { - GObjectClass parent_class; + NMSettingsServiceClass parent_class; /* Signals */ void (*properties_changed) (NMSysconfigSettings *self, GHashTable *properties); @@ -56,6 +57,7 @@ GType nm_sysconfig_settings_get_type (void); NMSysconfigSettings *nm_sysconfig_settings_new (const char *config_file, const char *plugins, + DBusGConnection *bus, GError **error); const GSList *nm_sysconfig_settings_get_unmanaged_specs (NMSysconfigSettings *self); diff --git a/system-settings/plugins/ifcfg-rh/plugin.c b/system-settings/plugins/ifcfg-rh/plugin.c index f861aebebd..c8d37322cc 100644 --- a/system-settings/plugins/ifcfg-rh/plugin.c +++ b/system-settings/plugins/ifcfg-rh/plugin.c @@ -31,8 +31,6 @@ #include #include -#include - #include #ifndef NO_GIO