summaryrefslogtreecommitdiff
path: root/src/settings/nm-settings-plugin.c
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2018-08-24 13:37:06 +0200
committerThomas Haller <thaller@redhat.com>2018-09-06 07:41:22 +0200
commit657b0714b8e272129800e9fd406f9fcb150d7c1f (patch)
tree3eedfae50a33aa3478ad689a41f8e91efedf9c86 /src/settings/nm-settings-plugin.c
parent32442b2661305ae2b99177d516aec18450f2b6ed (diff)
settings: make NMSettingsPlugin a regular GObject instance and not an interface
NMSettingsPlugin was a glib interface, not a regular GObject instance. Accordingly, settings plugins would implement this interface instead of subclassing a parent type. Refactor the code, and make NMSettingsPlugin a GObject type. Plugins are now required to subclass this type. Glib interfaces are more cumbersome than helpful. At least, unless there is a good reason for using them. Our settings plugins are all internal API and are entirely under our control. It also means, this change is fine, as there are no implementations outside of this source tree. Using interfaces do would allow more flexibility in implementing the settings plugin. For example, the plugin would be able to derive from any other GObject type, like NMKimchiRefrigerator. But why would we even? Let's not add monster classes that implement house appliances beside NMSettingsPluginInterface. The settings plugin should have one purpose only: being a settings plugin. Hence, requiring it to subclass NMSettingsPlugin is more than resonable. We don't need interfaces for this. Now that NMSettingsPlugin is a regular object instance, it may also have state, and potentially could provide common functionality for the plugin implementation -- if that turns out to be useful. Arguably, an interface can have state too, for example by attaching the state somewhere else (like NMConnection does). But let's just say no. On a minor note, this also avoids some tiny overhead that comes with glib interfaces.
Diffstat (limited to 'src/settings/nm-settings-plugin.c')
-rw-r--r--src/settings/nm-settings-plugin.c183
1 files changed, 113 insertions, 70 deletions
diff --git a/src/settings/nm-settings-plugin.c b/src/settings/nm-settings-plugin.c
index 212311387b..e7275631dc 100644
--- a/src/settings/nm-settings-plugin.c
+++ b/src/settings/nm-settings-plugin.c
@@ -15,117 +15,94 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * Copyright (C) 2007 - 2011 Red Hat, Inc.
+ * Copyright (C) 2007 - 2018 Red Hat, Inc.
* Copyright (C) 2008 Novell, Inc.
*/
#include "nm-default.h"
#include "nm-settings-plugin.h"
+
#include "nm-settings-connection.h"
-G_DEFINE_INTERFACE (NMSettingsPlugin, nm_settings_plugin, G_TYPE_OBJECT)
+/*****************************************************************************/
-static void
-nm_settings_plugin_default_init (NMSettingsPluginInterface *g_iface)
-{
- GType iface_type = G_TYPE_FROM_INTERFACE (g_iface);
- static gboolean initialized = FALSE;
-
- if (initialized)
- return;
-
- /* Signals */
- g_signal_new (NM_SETTINGS_PLUGIN_CONNECTION_ADDED,
- iface_type,
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (NMSettingsPluginInterface, connection_added),
- NULL, NULL,
- g_cclosure_marshal_VOID__OBJECT,
- G_TYPE_NONE, 1,
- NM_TYPE_SETTINGS_CONNECTION);
-
- g_signal_new (NM_SETTINGS_PLUGIN_UNMANAGED_SPECS_CHANGED,
- iface_type,
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (NMSettingsPluginInterface, unmanaged_specs_changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-
- g_signal_new (NM_SETTINGS_PLUGIN_UNRECOGNIZED_SPECS_CHANGED,
- iface_type,
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (NMSettingsPluginInterface, unrecognized_specs_changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-
- initialized = TRUE;
-}
+enum {
+ CONNECTION_ADDED,
+ UNMANAGED_SPECS_CHANGED,
+ UNRECOGNIZED_SPECS_CHANGED,
+
+ LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL] = { 0 };
+
+G_DEFINE_TYPE (NMSettingsPlugin, nm_settings_plugin, G_TYPE_OBJECT)
+
+/*****************************************************************************/
void
-nm_settings_plugin_initialize (NMSettingsPlugin *config)
+nm_settings_plugin_initialize (NMSettingsPlugin *self)
{
- g_return_if_fail (config != NULL);
+ g_return_if_fail (NM_IS_SETTINGS_PLUGIN (self));
- if (NM_SETTINGS_PLUGIN_GET_INTERFACE (config)->initialize)
- NM_SETTINGS_PLUGIN_GET_INTERFACE (config)->initialize (config);
+ if (NM_SETTINGS_PLUGIN_GET_CLASS (self)->initialize)
+ NM_SETTINGS_PLUGIN_GET_CLASS (self)->initialize (self);
}
GSList *
-nm_settings_plugin_get_connections (NMSettingsPlugin *config)
+nm_settings_plugin_get_connections (NMSettingsPlugin *self)
{
- g_return_val_if_fail (config != NULL, NULL);
+ g_return_val_if_fail (NM_IS_SETTINGS_PLUGIN (self), NULL);
- if (NM_SETTINGS_PLUGIN_GET_INTERFACE (config)->get_connections)
- return NM_SETTINGS_PLUGIN_GET_INTERFACE (config)->get_connections (config);
+ if (NM_SETTINGS_PLUGIN_GET_CLASS (self)->get_connections)
+ return NM_SETTINGS_PLUGIN_GET_CLASS (self)->get_connections (self);
return NULL;
}
gboolean
-nm_settings_plugin_load_connection (NMSettingsPlugin *config,
+nm_settings_plugin_load_connection (NMSettingsPlugin *self,
const char *filename)
{
- g_return_val_if_fail (config != NULL, FALSE);
+ g_return_val_if_fail (NM_IS_SETTINGS_PLUGIN (self), FALSE);
- if (NM_SETTINGS_PLUGIN_GET_INTERFACE (config)->load_connection)
- return NM_SETTINGS_PLUGIN_GET_INTERFACE (config)->load_connection (config, filename);
+ if (NM_SETTINGS_PLUGIN_GET_CLASS (self)->load_connection)
+ return NM_SETTINGS_PLUGIN_GET_CLASS (self)->load_connection (self, filename);
return FALSE;
}
void
-nm_settings_plugin_reload_connections (NMSettingsPlugin *config)
+nm_settings_plugin_reload_connections (NMSettingsPlugin *self)
{
- g_return_if_fail (config != NULL);
+ g_return_if_fail (NM_IS_SETTINGS_PLUGIN (self));
- if (NM_SETTINGS_PLUGIN_GET_INTERFACE (config)->reload_connections)
- NM_SETTINGS_PLUGIN_GET_INTERFACE (config)->reload_connections (config);
+ if (NM_SETTINGS_PLUGIN_GET_CLASS (self)->reload_connections)
+ NM_SETTINGS_PLUGIN_GET_CLASS (self)->reload_connections (self);
}
GSList *
-nm_settings_plugin_get_unmanaged_specs (NMSettingsPlugin *config)
+nm_settings_plugin_get_unmanaged_specs (NMSettingsPlugin *self)
{
- g_return_val_if_fail (config != NULL, NULL);
+ g_return_val_if_fail (NM_IS_SETTINGS_PLUGIN (self), NULL);
- if (NM_SETTINGS_PLUGIN_GET_INTERFACE (config)->get_unmanaged_specs)
- return NM_SETTINGS_PLUGIN_GET_INTERFACE (config)->get_unmanaged_specs (config);
+ if (NM_SETTINGS_PLUGIN_GET_CLASS (self)->get_unmanaged_specs)
+ return NM_SETTINGS_PLUGIN_GET_CLASS (self)->get_unmanaged_specs (self);
return NULL;
}
GSList *
-nm_settings_plugin_get_unrecognized_specs (NMSettingsPlugin *config)
+nm_settings_plugin_get_unrecognized_specs (NMSettingsPlugin *self)
{
- g_return_val_if_fail (config != NULL, NULL);
+ g_return_val_if_fail (NM_IS_SETTINGS_PLUGIN (self), NULL);
- if (NM_SETTINGS_PLUGIN_GET_INTERFACE (config)->get_unrecognized_specs)
- return NM_SETTINGS_PLUGIN_GET_INTERFACE (config)->get_unrecognized_specs (config);
+ if (NM_SETTINGS_PLUGIN_GET_CLASS (self)->get_unrecognized_specs)
+ return NM_SETTINGS_PLUGIN_GET_CLASS (self)->get_unrecognized_specs (self);
return NULL;
}
/**
* nm_settings_plugin_add_connection:
- * @config: the #NMSettingsPlugin
+ * @self: the #NMSettingsPlugin
* @connection: the source connection to create a plugin-specific
* #NMSettingsConnection from
* @save_to_disk: %TRUE to save the connection to disk immediately, %FALSE to
@@ -140,22 +117,88 @@ nm_settings_plugin_get_unrecognized_specs (NMSettingsPlugin *config)
* Returns: the new #NMSettingsConnection or %NULL
*/
NMSettingsConnection *
-nm_settings_plugin_add_connection (NMSettingsPlugin *config,
+nm_settings_plugin_add_connection (NMSettingsPlugin *self,
NMConnection *connection,
gboolean save_to_disk,
GError **error)
{
- NMSettingsPluginInterface *config_interface;
+ NMSettingsPluginClass *klass;
- g_return_val_if_fail (config != NULL, NULL);
+ g_return_val_if_fail (NM_IS_SETTINGS_PLUGIN (self), NULL);
g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL);
- config_interface = NM_SETTINGS_PLUGIN_GET_INTERFACE (config);
- if (!config_interface->add_connection) {
+ klass = NM_SETTINGS_PLUGIN_GET_CLASS (self);
+ if (!klass->add_connection) {
g_set_error_literal (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_NOT_SUPPORTED,
"Plugin does not support adding connections");
return NULL;
}
- return config_interface->add_connection (config, connection, save_to_disk, error);
+ return klass->add_connection (self, connection, save_to_disk, error);
+}
+
+/*****************************************************************************/
+
+void
+_nm_settings_plugin_emit_signal_connection_added (NMSettingsPlugin *self,
+ NMSettingsConnection *sett_conn)
+{
+ nm_assert (NM_IS_SETTINGS_PLUGIN (self));
+ nm_assert (NM_IS_SETTINGS_CONNECTION (sett_conn));
+
+ g_signal_emit (self, signals[CONNECTION_ADDED], 0, sett_conn);
+}
+
+void
+_nm_settings_plugin_emit_signal_unmanaged_specs_changed (NMSettingsPlugin *self)
+{
+ nm_assert (NM_IS_SETTINGS_PLUGIN (self));
+
+ g_signal_emit (self, signals[UNMANAGED_SPECS_CHANGED], 0);
+}
+
+void
+_nm_settings_plugin_emit_signal_unrecognized_specs_changed (NMSettingsPlugin *self)
+{
+ nm_assert (NM_IS_SETTINGS_PLUGIN (self));
+
+ g_signal_emit (self, signals[UNRECOGNIZED_SPECS_CHANGED], 0);
+}
+
+/*****************************************************************************/
+
+static void
+nm_settings_plugin_init (NMSettingsPlugin *self)
+{
+}
+
+static void
+nm_settings_plugin_class_init (NMSettingsPluginClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ signals[CONNECTION_ADDED] =
+ g_signal_new (NM_SETTINGS_PLUGIN_CONNECTION_ADDED,
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_FIRST,
+ 0, NULL, NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1,
+ NM_TYPE_SETTINGS_CONNECTION);
+
+ signals[UNMANAGED_SPECS_CHANGED] =
+ g_signal_new (NM_SETTINGS_PLUGIN_UNMANAGED_SPECS_CHANGED,
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_FIRST,
+ 0, NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
+ signals[UNRECOGNIZED_SPECS_CHANGED] =
+ g_signal_new (NM_SETTINGS_PLUGIN_UNRECOGNIZED_SPECS_CHANGED,
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_FIRST,
+ 0, NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
}