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.
This commit is contained in:
Dan Williams 2009-08-10 23:25:11 -05:00
parent f64354d0cc
commit 890866bef9
11 changed files with 162 additions and 283 deletions

View file

@ -6,19 +6,6 @@
Implemented by the system settings service to provide additional settings to NetworkManager. Implemented by the system settings service to provide additional settings to NetworkManager.
</tp:docstring> </tp:docstring>
<method name="AddConnection">
<tp:docstring>
DEPRECATED. Adds new connection.
</tp:docstring>
<annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_settings_add_connection"/>
<annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
<arg name="connection" type="a{sa{sv}}" direction="in">
<tp:docstring>
Connection properties.
</tp:docstring>
</arg>
</method>
<method name="SaveHostname"> <method name="SaveHostname">
<tp:docstring> <tp:docstring>
Save the hostname to persistent configuration. Save the hostname to persistent configuration.

View file

@ -120,6 +120,7 @@ global:
nm_settings_interface_get_type; nm_settings_interface_get_type;
nm_settings_interface_list_connections; nm_settings_interface_list_connections;
nm_settings_service_export; nm_settings_service_export;
nm_settings_service_export_connection;
nm_settings_service_get_connection_by_path; nm_settings_service_get_connection_by_path;
nm_settings_service_get_type; nm_settings_service_get_type;
nm_settings_system_interface_get_type; nm_settings_system_interface_get_type;

View file

@ -51,41 +51,12 @@ G_DEFINE_TYPE (NMExportedConnection, nm_exported_connection, NM_TYPE_CONNECTION)
NMExportedConnectionPrivate)) NMExportedConnectionPrivate))
typedef struct { typedef struct {
DBusGConnection *bus; gboolean foo;
gboolean disposed;
} NMExportedConnectionPrivate; } 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 * static GHashTable *
real_get_settings (NMExportedConnection *self, GError **error) real_get_settings (NMExportedConnection *self, GError **error)
{ {
@ -183,124 +154,35 @@ impl_exported_connection_get_secrets (NMExportedConnection *self,
/** /**
* nm_exported_connection_new: * nm_exported_connection_new:
* @bus: a valid and connected D-Bus connection
* @scope: the Connection scope (either user or system) * @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. * Creates a new object representing the remote connection.
* *
* Returns: the new exported connection object on success, or %NULL on failure * Returns: the new exported connection object on success, or %NULL on failure
**/ **/
NMExportedConnection * NMExportedConnection *
nm_exported_connection_new (DBusGConnection *bus, nm_exported_connection_new (NMConnectionScope scope)
NMConnectionScope scope)
{ {
g_return_val_if_fail (bus != NULL, NULL);
g_return_val_if_fail (scope != NM_CONNECTION_SCOPE_UNKNOWN, NULL); g_return_val_if_fail (scope != NM_CONNECTION_SCOPE_UNKNOWN, NULL);
return (NMExportedConnection *) g_object_new (NM_TYPE_EXPORTED_CONNECTION, return (NMExportedConnection *) g_object_new (NM_TYPE_EXPORTED_CONNECTION,
NM_EXPORTED_CONNECTION_BUS, bus,
NM_CONNECTION_SCOPE, scope, NM_CONNECTION_SCOPE, scope,
NULL); 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 static void
nm_exported_connection_init (NMExportedConnection *self) 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 static void
nm_exported_connection_class_init (NMExportedConnectionClass *class) nm_exported_connection_class_init (NMExportedConnectionClass *class)
{ {
GObjectClass *object_class = G_OBJECT_CLASS (class);
g_type_class_add_private (class, sizeof (NMExportedConnectionPrivate)); g_type_class_add_private (class, sizeof (NMExportedConnectionPrivate));
/* Virtual methods */ /* 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; 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_g_object_type_install_info (G_TYPE_FROM_CLASS (class),
&dbus_glib_nm_exported_connection_object_info); &dbus_glib_nm_exported_connection_object_info);
} }

View file

@ -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_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_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_EXPORTED_CONNECTION, NMExportedConnectionClass))
#define NM_EXPORTED_CONNECTION_BUS "bus"
typedef struct { typedef struct {
NMConnection parent; NMConnection parent;
} NMExportedConnection; } NMExportedConnection;
@ -61,10 +59,7 @@ typedef struct {
GType nm_exported_connection_get_type (void); GType nm_exported_connection_get_type (void);
NMExportedConnection *nm_exported_connection_new (DBusGConnection *bus, NMExportedConnection *nm_exported_connection_new (NMConnectionScope scope);
NMConnectionScope scope);
void nm_exported_connection_export (NMExportedConnection *self);
G_END_DECLS G_END_DECLS

View file

@ -19,6 +19,7 @@
* (C) Copyright 2008 - 2009 Red Hat, Inc. * (C) Copyright 2008 - 2009 Red Hat, Inc.
*/ */
#include <string.h>
#include <NetworkManager.h> #include <NetworkManager.h>
#include <dbus/dbus-glib-lowlevel.h> #include <dbus/dbus-glib-lowlevel.h>
@ -115,11 +116,18 @@ impl_settings_list_connections (NMSettingsService *self,
static NMSettingsConnectionInterface * static NMSettingsConnectionInterface *
get_connection_by_path (NMSettingsInterface *settings, const char *path) 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; 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); 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 static void
impl_settings_add_connection (NMSettingsService *self, impl_settings_add_connection (NMSettingsService *self,
GHashTable *settings, GHashTable *settings,
@ -149,11 +199,14 @@ impl_settings_add_connection (NMSettingsService *self,
g_error_free (error); g_error_free (error);
return; return;
} }
g_object_unref (tmp);
if (NM_SETTINGS_SERVICE_GET_CLASS (self)->add_connection) if (NM_SETTINGS_SERVICE_GET_CLASS (self)->add_connection) {
NM_SETTINGS_SERVICE_GET_CLASS (self)->add_connection (self, settings, context); NM_SETTINGS_SERVICE_GET_CLASS (self)->add_connection (NM_SETTINGS_SERVICE (self),
else { NM_SETTINGS_CONNECTION_INTERFACE (tmp),
context,
dbus_add_connection_cb,
context);
} else {
error = g_error_new (NM_SETTINGS_INTERFACE_ERROR, error = g_error_new (NM_SETTINGS_INTERFACE_ERROR,
NM_SETTINGS_INTERFACE_ERROR_INTERNAL_ERROR, NM_SETTINGS_INTERFACE_ERROR_INTERNAL_ERROR,
"%s: %s:%d add_connection() not implemented", "%s: %s:%d add_connection() not implemented",
@ -161,6 +214,30 @@ impl_settings_add_connection (NMSettingsService *self,
dbus_g_method_return_error (context, error); dbus_g_method_return_error (context, error);
g_error_free (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 */ /* interface implementation */
iface->list_connections = list_connections; iface->list_connections = list_connections;
iface->get_connection_by_path = get_connection_by_path; 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 * static GObject *
@ -181,8 +262,10 @@ constructor (GType type,
GObject *object; GObject *object;
object = G_OBJECT_CLASS (nm_settings_service_parent_class)->constructor (type, n_construct_params, construct_params); 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)->scope != NM_CONNECTION_SCOPE_UNKNOWN);
g_assert (NM_SETTINGS_SERVICE_GET_PRIVATE (object)->bus != NULL);
}
return object; return object;
} }
@ -196,11 +279,14 @@ set_property (GObject *object, guint prop_id,
const GValue *value, GParamSpec *pspec) const GValue *value, GParamSpec *pspec)
{ {
NMSettingsServicePrivate *priv = NM_SETTINGS_SERVICE_GET_PRIVATE (object); NMSettingsServicePrivate *priv = NM_SETTINGS_SERVICE_GET_PRIVATE (object);
DBusGConnection *bus;
switch (prop_id) { switch (prop_id) {
case PROP_BUS: case PROP_BUS:
/* Construct only */ /* 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; break;
case PROP_SCOPE: case PROP_SCOPE:
/* Construct only */ /* Construct only */
@ -277,9 +363,9 @@ nm_settings_service_class_init (NMSettingsServiceClass *class)
g_param_spec_uint (NM_SETTINGS_SERVICE_SCOPE, g_param_spec_uint (NM_SETTINGS_SERVICE_SCOPE,
"Scope", "Scope",
"Scope", "Scope",
NM_CONNECTION_SCOPE_USER,
NM_CONNECTION_SCOPE_SYSTEM, NM_CONNECTION_SCOPE_SYSTEM,
NM_CONNECTION_SCOPE_USER, NM_CONNECTION_SCOPE_USER,
NM_CONNECTION_SCOPE_USER,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (class), dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (class),

View file

@ -51,12 +51,11 @@ typedef struct {
*/ */
GSList * (*list_connections) (NMSettingsService *self); GSList * (*list_connections) (NMSettingsService *self);
NMExportedConnection * (*get_connection_by_path) (NMSettingsService *self,
const char *path);
void (*add_connection) (NMSettingsService *self, void (*add_connection) (NMSettingsService *self,
GHashTable *settings, NMSettingsConnectionInterface *connection,
DBusGMethodInvocation *context); DBusGMethodInvocation *context, /* Only present for D-Bus calls */
NMSettingsAddConnectionFunc callback,
gpointer user_data);
} NMSettingsServiceClass; } NMSettingsServiceClass;
GType nm_settings_service_get_type (void); 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 (NMSettingsService *self);
void nm_settings_service_export_connection (NMSettingsService *self,
NMSettingsConnectionInterface *exported);
G_END_DECLS G_END_DECLS
#endif /* NM_SETTINGS_SERVICE_H */ #endif /* NM_SETTINGS_SERVICE_H */

View file

@ -2508,6 +2508,7 @@ nm_manager_get (const char *config_file, const char *plugins, GError **error)
{ {
static NMManager *singleton = NULL; static NMManager *singleton = NULL;
NMManagerPrivate *priv; NMManagerPrivate *priv;
DBusGConnection *bus;
if (singleton) if (singleton)
return g_object_ref (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 = 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) { if (!priv->sys_settings) {
g_object_unref (singleton); g_object_unref (singleton);
return NULL; return NULL;
} }
nm_settings_service_export (NM_SETTINGS_SERVICE (priv->sys_settings));
priv->config_file = g_strdup (config_file); priv->config_file = g_strdup (config_file);

View file

@ -41,7 +41,6 @@ G_DEFINE_TYPE_EXTENDED (NMSysconfigConnection, nm_sysconfig_connection, NM_TYPE_
NMSysconfigConnectionPrivate)) NMSysconfigConnectionPrivate))
typedef struct { typedef struct {
DBusGConnection *bus;
PolkitAuthority *authority; PolkitAuthority *authority;
} NMSysconfigConnectionPrivate; } NMSysconfigConnectionPrivate;

View file

@ -43,7 +43,6 @@
#include "nm-dbus-glib-types.h" #include "nm-dbus-glib-types.h"
#include "nm-sysconfig-settings.h" #include "nm-sysconfig-settings.h"
#include "nm-sysconfig-connection.h" #include "nm-sysconfig-connection.h"
#include "nm-dbus-manager.h"
#include "nm-polkit-helpers.h" #include "nm-polkit-helpers.h"
#include "nm-system-config-error.h" #include "nm-system-config-error.h"
#include "nm-utils.h" #include "nm-utils.h"
@ -67,25 +66,15 @@ static void claim_connection (NMSysconfigSettings *self,
NMSettingsConnectionInterface *connection, NMSettingsConnectionInterface *connection,
gboolean do_export); 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, static void impl_settings_save_hostname (NMSysconfigSettings *self,
const char *hostname, const char *hostname,
DBusGMethodInvocation *context); DBusGMethodInvocation *context);
#include "nm-settings-glue.h"
#include "nm-settings-system-glue.h" #include "nm-settings-system-glue.h"
static void unmanaged_specs_changed (NMSystemConfigInterface *config, gpointer user_data); static void unmanaged_specs_changed (NMSystemConfigInterface *config, gpointer user_data);
typedef struct { typedef struct {
NMDBusManager *dbus_mgr;
PolkitAuthority *authority; PolkitAuthority *authority;
char *config_file; char *config_file;
@ -96,13 +85,9 @@ typedef struct {
char *orig_hostname; char *orig_hostname;
} NMSysconfigSettingsPrivate; } NMSysconfigSettingsPrivate;
static void settings_interface_init (NMSettingsInterface *klass);
static void settings_system_interface_init (NMSettingsSystemInterface *klass); static void settings_system_interface_init (NMSettingsSystemInterface *klass);
G_DEFINE_TYPE_WITH_CODE (NMSysconfigSettings, nm_sysconfig_settings, G_TYPE_OBJECT, G_DEFINE_TYPE_WITH_CODE (NMSysconfigSettings, nm_sysconfig_settings, NM_TYPE_SETTINGS_SERVICE,
G_IMPLEMENT_INTERFACE (NM_TYPE_SETTINGS_INTERFACE,
settings_interface_init)
G_IMPLEMENT_INTERFACE (NM_TYPE_SETTINGS_SYSTEM_INTERFACE, G_IMPLEMENT_INTERFACE (NM_TYPE_SETTINGS_SYSTEM_INTERFACE,
settings_system_interface_init)) settings_system_interface_init))
@ -157,50 +142,20 @@ load_connections (NMSysconfigSettings *self)
unmanaged_specs_changed (NULL, self); unmanaged_specs_changed (NULL, self);
} }
static gboolean static GSList *
impl_settings_list_connections (NMSysconfigSettings *self, list_connections (NMSettingsService *settings)
GPtrArray **connections,
GError **error)
{ {
NMSysconfigSettingsPrivate *priv = NM_SYSCONFIG_SETTINGS_GET_PRIVATE (self); NMSysconfigSettingsPrivate *priv = NM_SYSCONFIG_SETTINGS_GET_PRIVATE (settings);
GHashTableIter iter; GHashTableIter iter;
gpointer key; gpointer key;
GSList *list = NULL;
load_connections (self); load_connections (NM_SYSCONFIG_SETTINGS (settings));
*connections = g_ptr_array_sized_new (g_hash_table_size (priv->connections));
g_hash_table_iter_init (&iter, priv->connections); g_hash_table_iter_init (&iter, priv->connections);
while (g_hash_table_iter_next (&iter, &key, NULL)) { while (g_hash_table_iter_next (&iter, &key, NULL))
NMSettingsConnectionInterface *connection = key; list = g_slist_prepend (list, NM_EXPORTED_CONNECTION (key));
char *path = NULL; return g_slist_reverse (list);
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;
} }
static void static void
@ -514,28 +469,6 @@ connection_removed (NMSettingsConnectionInterface *connection,
g_hash_table_remove (priv->connections, 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 static void
claim_connection (NMSysconfigSettings *self, claim_connection (NMSysconfigSettings *self,
NMSettingsConnectionInterface *connection, NMSettingsConnectionInterface *connection,
@ -554,7 +487,7 @@ claim_connection (NMSysconfigSettings *self,
g_signal_connect (connection, "removed", G_CALLBACK (connection_removed), self); g_signal_connect (connection, "removed", G_CALLBACK (connection_removed), self);
if (do_export) { 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); g_signal_emit_by_name (self, "new-connection", connection);
} }
} }
@ -582,6 +515,9 @@ typedef struct {
GCancellable *cancellable; GCancellable *cancellable;
NMConnection *connection; NMConnection *connection;
NMSettingsAddConnectionFunc callback;
gpointer callback_data;
char *hostname; char *hostname;
} PolkitCall; } PolkitCall;
@ -589,6 +525,8 @@ static PolkitCall *
polkit_call_new (NMSysconfigSettings *self, polkit_call_new (NMSysconfigSettings *self,
DBusGMethodInvocation *context, DBusGMethodInvocation *context,
NMConnection *connection, NMConnection *connection,
NMSettingsAddConnectionFunc callback,
gpointer callback_data,
const char *hostname) const char *hostname)
{ {
PolkitCall *call; PolkitCall *call;
@ -600,7 +538,12 @@ polkit_call_new (NMSysconfigSettings *self,
call = g_malloc0 (sizeof (PolkitCall)); call = g_malloc0 (sizeof (PolkitCall));
call->self = self; call->self = self;
call->context = context; 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) if (hostname)
call->hostname = g_strdup (hostname); call->hostname = g_strdup (hostname);
call->cancellable = g_cancellable_new (); call->cancellable = g_cancellable_new ();
@ -668,7 +611,7 @@ pk_add_cb (GObject *object, GAsyncResult *result, gpointer user_data)
&error); &error);
/* Some random error happened */ /* Some random error happened */
if (error) { if (error) {
dbus_g_method_return_error (call->context, error); call->callback (NM_SETTINGS_INTERFACE (self), error, call->callback_data);
goto out; 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, error = g_error_new_literal (NM_SYSCONFIG_SETTINGS_ERROR,
NM_SYSCONFIG_SETTINGS_ERROR_NOT_PRIVILEGED, NM_SYSCONFIG_SETTINGS_ERROR_NOT_PRIVILEGED,
"Insufficient privileges."); "Insufficient privileges.");
dbus_g_method_return_error (call->context, error); call->callback (NM_SETTINGS_INTERFACE (self), error, call->callback_data);
goto out; goto out;
} }
if (add_new_connection (self, call->connection, &add_error)) { if (add_new_connection (self, call->connection, &add_error))
dbus_g_method_return (call->context); call->callback (NM_SETTINGS_INTERFACE (self), NULL, call->callback_data);
} else { else {
error = g_error_new (NM_SYSCONFIG_SETTINGS_ERROR, error = g_error_new (NM_SYSCONFIG_SETTINGS_ERROR,
NM_SYSCONFIG_SETTINGS_ERROR_ADD_FAILED, NM_SYSCONFIG_SETTINGS_ERROR_ADD_FAILED,
"Saving connection failed: (%d) %s", "Saving connection failed: (%d) %s",
add_error ? add_error->code : -1, add_error ? add_error->code : -1,
(add_error && add_error->message) ? add_error->message : "(unknown)"); (add_error && add_error->message) ? add_error->message : "(unknown)");
g_error_free (add_error); g_error_free (add_error);
dbus_g_method_return_error (call->context, error); call->callback (NM_SETTINGS_INTERFACE (self), error, call->callback_data);
} }
out: out:
@ -701,13 +644,15 @@ out:
} }
static void static void
impl_settings_add_connection (NMSysconfigSettings *self, add_connection (NMSettingsService *service,
GHashTable *settings, NMSettingsConnectionInterface *connection,
DBusGMethodInvocation *context) 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); NMSysconfigSettingsPrivate *priv = NM_SYSCONFIG_SETTINGS_GET_PRIVATE (self);
PolkitCall *call; PolkitCall *call;
NMConnection *tmp;
GError *error = NULL; GError *error = NULL;
/* Do any of the plugins support adding? */ /* 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, error = g_error_new_literal (NM_SYSCONFIG_SETTINGS_ERROR,
NM_SYSCONFIG_SETTINGS_ERROR_ADD_NOT_SUPPORTED, NM_SYSCONFIG_SETTINGS_ERROR_ADD_NOT_SUPPORTED,
"None of the registered plugins support add."); "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); g_error_free (error);
return; return;
} }
/* Check if the settings are valid first */ call = polkit_call_new (self, context, NM_CONNECTION (connection), callback, user_data, NULL);
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);
g_assert (call); g_assert (call);
polkit_authority_check_authorization (priv->authority, polkit_authority_check_authorization (priv->authority,
call->subject, call->subject,
@ -816,7 +752,7 @@ impl_settings_save_hostname (NMSysconfigSettings *self,
return; return;
} }
call = polkit_call_new (self, context, NULL, hostname); call = polkit_call_new (self, context, NULL, NULL, NULL, hostname);
g_assert (call); g_assert (call);
polkit_authority_check_authorization (priv->authority, polkit_authority_check_authorization (priv->authority,
call->subject, call->subject,
@ -1123,13 +1059,16 @@ nm_sysconfig_settings_device_removed (NMSysconfigSettings *self, NMDevice *devic
NMSysconfigSettings * NMSysconfigSettings *
nm_sysconfig_settings_new (const char *config_file, nm_sysconfig_settings_new (const char *config_file,
const char *plugins, const char *plugins,
DBusGConnection *bus,
GError **error) GError **error)
{ {
NMSysconfigSettings *self; NMSysconfigSettings *self;
NMSysconfigSettingsPrivate *priv; 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) if (!self)
return NULL; return NULL;
@ -1137,12 +1076,6 @@ nm_sysconfig_settings_new (const char *config_file,
priv->config_file = g_strdup (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) { if (plugins) {
/* Load the plugins; fail if a plugin is not found. */ /* Load the plugins; fail if a plugin is not found. */
if (!load_plugins (self, plugins, error)) { if (!load_plugins (self, plugins, error)) {
@ -1172,23 +1105,12 @@ finalize (GObject *object)
if (priv->authority) if (priv->authority)
g_object_unref (priv->authority); g_object_unref (priv->authority);
g_object_unref (priv->dbus_mgr);
g_free (priv->orig_hostname); g_free (priv->orig_hostname);
g_free (priv->config_file); g_free (priv->config_file);
G_OBJECT_CLASS (nm_sysconfig_settings_parent_class)->finalize (object); 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 static void
settings_system_interface_init (NMSettingsSystemInterface *iface) settings_system_interface_init (NMSettingsSystemInterface *iface)
{ {
@ -1231,6 +1153,7 @@ static void
nm_sysconfig_settings_class_init (NMSysconfigSettingsClass *class) nm_sysconfig_settings_class_init (NMSysconfigSettingsClass *class)
{ {
GObjectClass *object_class = G_OBJECT_CLASS (class); GObjectClass *object_class = G_OBJECT_CLASS (class);
NMSettingsServiceClass *ss_class = NM_SETTINGS_SERVICE_CLASS (class);
g_type_class_add_private (class, sizeof (NMSysconfigSettingsPrivate)); 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->notify = notify;
object_class->get_property = get_property; object_class->get_property = get_property;
object_class->finalize = finalize; object_class->finalize = finalize;
ss_class->list_connections = list_connections;
ss_class->add_connection = add_connection;
/* properties */ /* properties */
g_object_class_install_property g_object_class_install_property
@ -1266,9 +1191,6 @@ nm_sysconfig_settings_class_init (NMSysconfigSettingsClass *class)
g_cclosure_marshal_VOID__BOXED, g_cclosure_marshal_VOID__BOXED,
G_TYPE_NONE, 1, DBUS_TYPE_G_MAP_OF_VARIANT); 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, dbus_g_error_domain_register (NM_SYSCONFIG_SETTINGS_ERROR,
NM_DBUS_IFACE_SETTINGS_SYSTEM, NM_DBUS_IFACE_SETTINGS_SYSTEM,
NM_TYPE_SYSCONFIG_SETTINGS_ERROR); NM_TYPE_SYSCONFIG_SETTINGS_ERROR);

View file

@ -27,6 +27,7 @@
#define __NM_SYSCONFIG_SETTINGS_H__ #define __NM_SYSCONFIG_SETTINGS_H__
#include <nm-connection.h> #include <nm-connection.h>
#include <nm-settings-service.h>
#include "nm-sysconfig-connection.h" #include "nm-sysconfig-connection.h"
#include "nm-system-config-interface.h" #include "nm-system-config-interface.h"
@ -42,11 +43,11 @@
#define NM_SYSCONFIG_SETTINGS_UNMANAGED_SPECS "unmanaged-specs" #define NM_SYSCONFIG_SETTINGS_UNMANAGED_SPECS "unmanaged-specs"
typedef struct { typedef struct {
GObject parent_instance; NMSettingsService parent_instance;
} NMSysconfigSettings; } NMSysconfigSettings;
typedef struct { typedef struct {
GObjectClass parent_class; NMSettingsServiceClass parent_class;
/* Signals */ /* Signals */
void (*properties_changed) (NMSysconfigSettings *self, GHashTable *properties); 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, NMSysconfigSettings *nm_sysconfig_settings_new (const char *config_file,
const char *plugins, const char *plugins,
DBusGConnection *bus,
GError **error); GError **error);
const GSList *nm_sysconfig_settings_get_unmanaged_specs (NMSysconfigSettings *self); const GSList *nm_sysconfig_settings_get_unmanaged_specs (NMSysconfigSettings *self);

View file

@ -31,8 +31,6 @@
#include <net/ethernet.h> #include <net/ethernet.h>
#include <netinet/ether.h> #include <netinet/ether.h>
#include <dbus/dbus-glib.h>
#include <nm-setting-connection.h> #include <nm-setting-connection.h>
#ifndef NO_GIO #ifndef NO_GIO