summaryrefslogtreecommitdiff
path: root/libnm-util
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2012-10-22 12:36:09 -0500
committerDan Williams <dcbw@redhat.com>2012-10-29 15:12:58 -0500
commit38e3819b4ee9b68e877e0452875ab6d5cbcfdff5 (patch)
treeb4bf46e86c57a47c0232226be8aea025264a1d02 /libnm-util
parent1277f9986c83594faba4dd305678a27db1c7c9d1 (diff)
downloadNetworkManager-38e3819b4ee9b68e877e0452875ab6d5cbcfdff5.tar.gz
libnm-util: clean up setting registration
Make setting type registration less icky; instead of having the connection register all the settings, have the settings themselves register that information at library load time. Putting this sort of thing in G_DEFINE_TYPE_WITH_CODE is apparently more standard than the home-rolled stuff we had before. Also document the priority stuff so when adding new settings, people know what priority to use. (cleanups by jklimes)
Diffstat (limited to 'libnm-util')
-rw-r--r--libnm-util/nm-connection.c330
-rw-r--r--libnm-util/nm-setting-8021x.c7
-rw-r--r--libnm-util/nm-setting-adsl.c7
-rw-r--r--libnm-util/nm-setting-bluetooth.c8
-rw-r--r--libnm-util/nm-setting-bond.c8
-rw-r--r--libnm-util/nm-setting-cdma.c7
-rw-r--r--libnm-util/nm-setting-connection.c8
-rw-r--r--libnm-util/nm-setting-gsm.c7
-rw-r--r--libnm-util/nm-setting-infiniband.c8
-rw-r--r--libnm-util/nm-setting-ip4-config.c9
-rw-r--r--libnm-util/nm-setting-ip6-config.c8
-rw-r--r--libnm-util/nm-setting-olpc-mesh.c8
-rw-r--r--libnm-util/nm-setting-ppp.c8
-rw-r--r--libnm-util/nm-setting-pppoe.c7
-rw-r--r--libnm-util/nm-setting-private.h12
-rw-r--r--libnm-util/nm-setting-serial.c8
-rw-r--r--libnm-util/nm-setting-vlan.c8
-rw-r--r--libnm-util/nm-setting-vpn.c7
-rw-r--r--libnm-util/nm-setting-wimax.c8
-rw-r--r--libnm-util/nm-setting-wired.c8
-rw-r--r--libnm-util/nm-setting-wireless-security.c7
-rw-r--r--libnm-util/nm-setting-wireless.c8
22 files changed, 258 insertions, 238 deletions
diff --git a/libnm-util/nm-connection.c b/libnm-util/nm-connection.c
index 66df511f97..d68bdc0605 100644
--- a/libnm-util/nm-connection.c
+++ b/libnm-util/nm-connection.c
@@ -30,6 +30,7 @@
#include "nm-utils.h"
#include "nm-utils-private.h"
#include "nm-dbus-glib-types.h"
+#include "nm-setting-private.h"
#include "nm-setting-8021x.h"
#include "nm-setting-bluetooth.h"
@@ -116,203 +117,116 @@ enum {
static guint signals[LAST_SIGNAL] = { 0 };
+/*************************************************************/
+
static GHashTable *registered_settings = NULL;
-#define DEFAULT_MAP_SIZE 20
+static void __attribute__((constructor))
+_ensure_registered (void)
+{
+ g_type_init ();
+ _nm_utils_register_value_transformations ();
+ if (G_UNLIKELY (registered_settings == NULL))
+ registered_settings = g_hash_table_new (g_str_hash, g_str_equal);
+}
-static struct SettingInfo {
- const char *name;
+typedef struct {
GType type;
guint32 priority;
- gboolean base_type;
GQuark error_quark;
-} default_map[DEFAULT_MAP_SIZE] = { { NULL } };
-
-static void
-setting_register (const char *name, GType type)
-{
- g_return_if_fail (name != NULL);
- g_return_if_fail (G_TYPE_IS_INSTANTIATABLE (type));
-
- if (G_UNLIKELY (!registered_settings)) {
- registered_settings = g_hash_table_new_full (g_str_hash, g_str_equal,
- (GDestroyNotify) g_free,
- (GDestroyNotify) g_free);
- }
-
- if (g_hash_table_lookup (registered_settings, name))
- g_warning ("Already have a creator function for '%s', overriding", name);
-
- g_hash_table_insert (registered_settings, g_strdup (name), g_strdup (g_type_name (type)));
-}
-
-#if 0
-static void
-setting_unregister (const char *name)
-{
- if (registered_settings)
- g_hash_table_remove (registered_settings, name);
-}
-#endif
+} SettingInfo;
-static void
-register_one_setting (const char *name,
- GType type,
- GQuark error_quark,
- guint32 priority,
- gboolean base_type)
+/*
+ * _nm_register_setting:
+ * @name: the name of the #NMSetting object to register
+ * @type: the #GType of the #NMSetting
+ * @priority: the sort priority of the setting, see below
+ * @error_quark: the setting's error quark
+ *
+ * INTERNAL ONLY: registers a setting's internal properties, like its priority
+ * and its error quark type, with libnm-util.
+ *
+ * A setting's priority should roughly follow the OSI layer model, but it also
+ * controls which settings get asked for secrets first. Thus settings which
+ * relate to things that must be working first, like hardware, should get a
+ * higher priority than things which layer on top of the hardware. For example,
+ * the GSM/CDMA settings should provide secrets before the PPP setting does,
+ * because a PIN is required to unlock the device before PPP can even start.
+ * Even settings without secrets should be assigned the right priority.
+ *
+ * 0: reserved for the Connection setting
+ *
+ * 1: hardware-related settings like Ethernet, WiFi, Infiniband, Bridge, etc.
+ * These priority 1 settings are also "base types", which means that at least
+ * one of them is required for the connection to be valid, and their name is
+ * valid in the 'type' property of the Connection setting.
+ *
+ * 2: hardware-related auxiliary settings that require a base setting to be
+ * successful first, like WiFi security, 802.1x, etc.
+ *
+ * 3: hardware-independent settings that are required before IP connectivity
+ * can be established, like PPP, PPPoE, etc.
+ *
+ * 4: IP-level stuff
+ */
+void
+_nm_register_setting (const char *name,
+ const GType type,
+ const guint32 priority,
+ const GQuark error_quark)
{
- static guint32 i = 0;
-
- g_return_if_fail (i < DEFAULT_MAP_SIZE);
- g_return_if_fail (default_map[i].name == NULL);
-
- default_map[i].name = name;
- default_map[i].type = type;
- default_map[i].error_quark = error_quark;
- default_map[i].priority = priority;
- default_map[i].base_type = base_type;
- i++;
+ SettingInfo *info;
- setting_register (name, type);
-}
+ g_return_if_fail (name != NULL);
+ g_return_if_fail (type != G_TYPE_INVALID);
+ g_return_if_fail (type != G_TYPE_NONE);
+ g_return_if_fail (error_quark != 0);
+ g_return_if_fail (priority <= 4);
-static void
-register_default_settings (void)
-{
- _nm_utils_register_value_transformations ();
+ _ensure_registered ();
- if (G_LIKELY (default_map[0].name))
+ if (G_LIKELY (g_hash_table_lookup (registered_settings, name)))
return;
- register_one_setting (NM_SETTING_CONNECTION_SETTING_NAME,
- NM_TYPE_SETTING_CONNECTION,
- NM_SETTING_CONNECTION_ERROR,
- 0, FALSE);
-
- register_one_setting (NM_SETTING_WIRED_SETTING_NAME,
- NM_TYPE_SETTING_WIRED,
- NM_SETTING_WIRED_ERROR,
- 1, TRUE);
-
- register_one_setting (NM_SETTING_WIRELESS_SETTING_NAME,
- NM_TYPE_SETTING_WIRELESS,
- NM_SETTING_WIRELESS_ERROR,
- 1, TRUE);
-
- register_one_setting (NM_SETTING_OLPC_MESH_SETTING_NAME,
- NM_TYPE_SETTING_OLPC_MESH,
- NM_SETTING_OLPC_MESH_ERROR,
- 1, TRUE);
-
- register_one_setting (NM_SETTING_GSM_SETTING_NAME,
- NM_TYPE_SETTING_GSM,
- NM_SETTING_GSM_ERROR,
- 1, TRUE);
-
- register_one_setting (NM_SETTING_CDMA_SETTING_NAME,
- NM_TYPE_SETTING_CDMA,
- NM_SETTING_CDMA_ERROR,
- 1, TRUE);
-
- register_one_setting (NM_SETTING_BLUETOOTH_SETTING_NAME,
- NM_TYPE_SETTING_BLUETOOTH,
- NM_SETTING_BLUETOOTH_ERROR,
- 1, TRUE);
-
- register_one_setting (NM_SETTING_WIMAX_SETTING_NAME,
- NM_TYPE_SETTING_WIMAX,
- NM_SETTING_WIMAX_ERROR,
- 1, TRUE);
-
- register_one_setting (NM_SETTING_BOND_SETTING_NAME,
- NM_TYPE_SETTING_BOND,
- NM_SETTING_BOND_ERROR,
- 1, TRUE);
-
- register_one_setting (NM_SETTING_INFINIBAND_SETTING_NAME,
- NM_TYPE_SETTING_INFINIBAND,
- NM_SETTING_INFINIBAND_ERROR,
- 1, TRUE);
-
- register_one_setting (NM_SETTING_VLAN_SETTING_NAME,
- NM_TYPE_SETTING_VLAN,
- NM_SETTING_VLAN_ERROR,
- 1, TRUE);
-
- register_one_setting (NM_SETTING_WIRELESS_SECURITY_SETTING_NAME,
- NM_TYPE_SETTING_WIRELESS_SECURITY,
- NM_SETTING_WIRELESS_SECURITY_ERROR,
- 2, FALSE);
-
- register_one_setting (NM_SETTING_SERIAL_SETTING_NAME,
- NM_TYPE_SETTING_SERIAL,
- NM_SETTING_SERIAL_ERROR,
- 2, FALSE);
-
- register_one_setting (NM_SETTING_PPP_SETTING_NAME,
- NM_TYPE_SETTING_PPP,
- NM_SETTING_PPP_ERROR,
- 3, FALSE);
-
- register_one_setting (NM_SETTING_PPPOE_SETTING_NAME,
- NM_TYPE_SETTING_PPPOE,
- NM_SETTING_PPPOE_ERROR,
- 3, TRUE);
-
- register_one_setting (NM_SETTING_ADSL_SETTING_NAME,
- NM_TYPE_SETTING_ADSL,
- NM_SETTING_ADSL_ERROR,
- 3, TRUE);
-
- register_one_setting (NM_SETTING_802_1X_SETTING_NAME,
- NM_TYPE_SETTING_802_1X,
- NM_SETTING_802_1X_ERROR,
- 3, FALSE);
-
- register_one_setting (NM_SETTING_VPN_SETTING_NAME,
- NM_TYPE_SETTING_VPN,
- NM_SETTING_VPN_ERROR,
- 4, TRUE);
-
- register_one_setting (NM_SETTING_IP4_CONFIG_SETTING_NAME,
- NM_TYPE_SETTING_IP4_CONFIG,
- NM_SETTING_IP4_CONFIG_ERROR,
- 6, FALSE);
-
- register_one_setting (NM_SETTING_IP6_CONFIG_SETTING_NAME,
- NM_TYPE_SETTING_IP6_CONFIG,
- NM_SETTING_IP6_CONFIG_ERROR,
- 6, FALSE);
-
- /* Be sure to update DEFAULT_MAP_SIZE if you add another setting!! */
+ if (priority == 0)
+ g_assert_cmpstr (name, ==, NM_SETTING_CONNECTION_SETTING_NAME);
+
+ info = g_slice_new0 (SettingInfo);
+ info->type = type;
+ info->priority = priority;
+ info->error_quark = error_quark;
+ g_hash_table_insert (registered_settings, (gpointer) name, info);
}
static guint32
-get_priority_for_setting_type (GType type)
+_get_setting_priority (NMSetting *setting)
{
- int i;
+ GHashTableIter iter;
+ SettingInfo *info;
- for (i = 0; default_map[i].name; i++) {
- if (default_map[i].type == type)
- return default_map[i].priority;
- }
+ _ensure_registered ();
+ g_hash_table_iter_init (&iter, registered_settings);
+ while (g_hash_table_iter_next (&iter, NULL, (gpointer) &info)) {
+ if (G_OBJECT_TYPE (setting) == info->type)
+ return info->priority;
+ }
return G_MAXUINT32;
}
static gboolean
-get_base_type_for_setting_type (GType type)
+_is_setting_base_type (NMSetting *setting)
{
- int i;
-
- for (i = 0; default_map[i].name; i++) {
- if (default_map[i].type == type)
- return default_map[i].base_type;
- }
- return FALSE;
+ /* Historical oddity: PPPoE is a base-type even though it's not
+ * priority 1. It needs to be sorted *after* lower-level stuff like
+ * WiFi security or 802.1x for secrets, but it's still allowed as a
+ * base type.
+ */
+ return _get_setting_priority (setting) == 1 || NM_IS_SETTING_PPPOE (setting);
}
+/*************************************************************/
+
/**
* nm_connection_lookup_setting_type:
* @name: a setting name
@@ -324,25 +238,18 @@ get_base_type_for_setting_type (GType type)
GType
nm_connection_lookup_setting_type (const char *name)
{
- char *type_name;
- GType type;
+ SettingInfo *info;
g_return_val_if_fail (name != NULL, G_TYPE_NONE);
- if (!registered_settings)
- register_default_settings ();
+ _ensure_registered ();
- type_name = (char *) g_hash_table_lookup (registered_settings, name);
- if (type_name) {
- type = g_type_from_name (type_name);
- if (!type)
- g_warning ("Can not get type for '%s'.", type_name);
- } else {
- type = 0;
- g_warning ("Unknown setting '%s'", name);
- }
+ info = g_hash_table_lookup (registered_settings, name);
+ if (info)
+ return info->type;
- return type;
+ g_warning ("Unknown setting '%s'", name);
+ return G_TYPE_INVALID;
}
/**
@@ -357,13 +264,16 @@ nm_connection_lookup_setting_type (const char *name)
GType
nm_connection_lookup_setting_type_by_quark (GQuark error_quark)
{
- int i;
+ SettingInfo *info;
+ GHashTableIter iter;
- for (i = 0; default_map[i].name; i++) {
- if (default_map[i].error_quark == error_quark)
- return default_map[i].type;
- }
+ _ensure_registered ();
+ g_hash_table_iter_init (&iter, registered_settings);
+ while (g_hash_table_iter_next (&iter, NULL, (gpointer) &info)) {
+ if (info->error_quark == error_quark)
+ return info->type;
+ }
return G_TYPE_INVALID;
}
@@ -739,8 +649,8 @@ nm_connection_verify (NMConnection *connection, GError **error)
gpointer value;
GSList *all_settings = NULL;
gboolean success = TRUE;
+ NMSetting *base;
const char *ctype;
- GType base_type;
if (error)
g_return_val_if_fail (*error == NULL, FALSE);
@@ -791,8 +701,8 @@ nm_connection_verify (NMConnection *connection, GError **error)
return FALSE;
}
- base_type = nm_connection_lookup_setting_type (ctype);
- if (base_type == 0) {
+ base = nm_connection_get_setting_by_name (connection, ctype);
+ if (!base) {
g_set_error_literal (error,
NM_CONNECTION_ERROR,
NM_CONNECTION_ERROR_CONNECTION_TYPE_INVALID,
@@ -800,7 +710,7 @@ nm_connection_verify (NMConnection *connection, GError **error)
return FALSE;
}
- if (!get_base_type_for_setting_type (base_type)) {
+ if (!_is_setting_base_type (base)) {
g_set_error (error,
NM_CONNECTION_ERROR,
NM_CONNECTION_ERROR_CONNECTION_TYPE_INVALID,
@@ -896,8 +806,8 @@ setting_priority_compare (gconstpointer a, gconstpointer b)
{
guint32 prio_a, prio_b;
- prio_a = get_priority_for_setting_type (G_OBJECT_TYPE (NM_SETTING (a)));
- prio_b = get_priority_for_setting_type (G_OBJECT_TYPE (NM_SETTING (b)));
+ prio_a = _get_setting_priority (NM_SETTING (a));
+ prio_b = _get_setting_priority (NM_SETTING (b));
if (prio_a < prio_b)
return -1;
@@ -906,14 +816,6 @@ setting_priority_compare (gconstpointer a, gconstpointer b)
return 1;
}
-static void
-add_setting_to_list (gpointer key, gpointer data, gpointer user_data)
-{
- GSList **list = (GSList **) user_data;
-
- *list = g_slist_insert_sorted (*list, NM_SETTING (data), setting_priority_compare);
-}
-
/**
* nm_connection_need_secrets:
* @connection: the #NMConnection
@@ -938,9 +840,11 @@ nm_connection_need_secrets (NMConnection *connection,
GPtrArray **hints)
{
NMConnectionPrivate *priv;
+ GHashTableIter hiter;
GSList *settings = NULL;
GSList *iter;
const char *name = NULL;
+ NMSetting *setting;
g_return_val_if_fail (connection != NULL, NULL);
g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL);
@@ -950,15 +854,14 @@ nm_connection_need_secrets (NMConnection *connection,
priv = NM_CONNECTION_GET_PRIVATE (connection);
/* Get list of settings in priority order */
- g_hash_table_foreach (priv->settings, add_setting_to_list, &settings);
+ g_hash_table_iter_init (&hiter, priv->settings);
+ while (g_hash_table_iter_next (&hiter, NULL, (gpointer) &setting))
+ settings = g_slist_insert_sorted (settings, setting, setting_priority_compare);
for (iter = settings; iter; iter = g_slist_next (iter)) {
- NMSetting *setting = NM_SETTING (iter->data);
GPtrArray *secrets;
- // FIXME: do something with requested secrets rather than asking for
- // all of them. Maybe make secrets a hash table mapping
- // settings name :: [list of secrets key names].
+ setting = NM_SETTING (iter->data);
secrets = nm_setting_need_secrets (setting);
if (secrets) {
if (hints)
@@ -1234,14 +1137,7 @@ nm_connection_get_virtual_iface_name (NMConnection *connection)
NMConnection *
nm_connection_new (void)
{
- GObject *object;
-
- if (!registered_settings)
- register_default_settings ();
-
- object = g_object_new (NM_TYPE_CONNECTION, NULL);
-
- return NM_CONNECTION (object);
+ return (NMConnection *) g_object_new (NM_TYPE_CONNECTION, NULL);
}
/**
diff --git a/libnm-util/nm-setting-8021x.c b/libnm-util/nm-setting-8021x.c
index 96735db21f..32eda889f6 100644
--- a/libnm-util/nm-setting-8021x.c
+++ b/libnm-util/nm-setting-8021x.c
@@ -81,7 +81,12 @@ nm_setting_802_1x_error_quark (void)
return quark;
}
-G_DEFINE_TYPE (NMSetting8021x, nm_setting_802_1x, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSetting8021x, nm_setting_802_1x, NM_TYPE_SETTING,
+ _nm_register_setting (NM_SETTING_802_1X_SETTING_NAME,
+ g_define_type_id,
+ 2,
+ NM_SETTING_802_1X_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_802_1X)
#define NM_SETTING_802_1X_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_802_1X, NMSetting8021xPrivate))
diff --git a/libnm-util/nm-setting-adsl.c b/libnm-util/nm-setting-adsl.c
index 6103c715c1..de0850e6df 100644
--- a/libnm-util/nm-setting-adsl.c
+++ b/libnm-util/nm-setting-adsl.c
@@ -55,7 +55,12 @@ nm_setting_adsl_error_quark (void)
return quark;
}
-G_DEFINE_TYPE (NMSettingAdsl, nm_setting_adsl, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingAdsl, nm_setting_adsl, NM_TYPE_SETTING,
+ _nm_register_setting (NM_SETTING_ADSL_SETTING_NAME,
+ g_define_type_id,
+ 1,
+ NM_SETTING_ADSL_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_ADSL)
#define NM_SETTING_ADSL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_ADSL, NMSettingAdslPrivate))
diff --git a/libnm-util/nm-setting-bluetooth.c b/libnm-util/nm-setting-bluetooth.c
index a74e55a021..161b371524 100644
--- a/libnm-util/nm-setting-bluetooth.c
+++ b/libnm-util/nm-setting-bluetooth.c
@@ -32,6 +32,7 @@
#include "nm-setting-bluetooth.h"
#include "nm-setting-cdma.h"
#include "nm-setting-gsm.h"
+#include "nm-setting-private.h"
/**
* SECTION:nm-setting-bluetooth
@@ -62,7 +63,12 @@ nm_setting_bluetooth_error_quark (void)
}
-G_DEFINE_TYPE (NMSettingBluetooth, nm_setting_bluetooth, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingBluetooth, nm_setting_bluetooth, NM_TYPE_SETTING,
+ _nm_register_setting (NM_SETTING_BLUETOOTH_SETTING_NAME,
+ g_define_type_id,
+ 1,
+ NM_SETTING_BLUETOOTH_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_BLUETOOTH)
#define NM_SETTING_BLUETOOTH_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_BLUETOOTH, NMSettingBluetoothPrivate))
diff --git a/libnm-util/nm-setting-bond.c b/libnm-util/nm-setting-bond.c
index 5702713b8d..a3dbd7662d 100644
--- a/libnm-util/nm-setting-bond.c
+++ b/libnm-util/nm-setting-bond.c
@@ -30,6 +30,7 @@
#include "nm-utils.h"
#include "nm-utils-private.h"
#include "nm-dbus-glib-types.h"
+#include "nm-setting-private.h"
/**
* SECTION:nm-setting-bond
@@ -58,7 +59,12 @@ nm_setting_bond_error_quark (void)
}
-G_DEFINE_TYPE (NMSettingBond, nm_setting_bond, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingBond, nm_setting_bond, NM_TYPE_SETTING,
+ _nm_register_setting (NM_SETTING_BOND_SETTING_NAME,
+ g_define_type_id,
+ 1,
+ NM_SETTING_BOND_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_BOND)
#define NM_SETTING_BOND_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_BOND, NMSettingBondPrivate))
diff --git a/libnm-util/nm-setting-cdma.c b/libnm-util/nm-setting-cdma.c
index 43bf93b198..d68531a6ee 100644
--- a/libnm-util/nm-setting-cdma.c
+++ b/libnm-util/nm-setting-cdma.c
@@ -54,7 +54,12 @@ nm_setting_cdma_error_quark (void)
}
-G_DEFINE_TYPE (NMSettingCdma, nm_setting_cdma, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingCdma, nm_setting_cdma, NM_TYPE_SETTING,
+ _nm_register_setting (NM_SETTING_CDMA_SETTING_NAME,
+ g_define_type_id,
+ 1,
+ NM_SETTING_CDMA_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_CDMA)
#define NM_SETTING_CDMA_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_CDMA, NMSettingCdmaPrivate))
diff --git a/libnm-util/nm-setting-connection.c b/libnm-util/nm-setting-connection.c
index 77aff4faef..1222f9763b 100644
--- a/libnm-util/nm-setting-connection.c
+++ b/libnm-util/nm-setting-connection.c
@@ -28,6 +28,7 @@
#include "nm-dbus-glib-types.h"
#include "nm-param-spec-specialized.h"
#include "nm-setting-connection.h"
+#include "nm-setting-private.h"
/**
* SECTION:nm-setting-connection
@@ -58,7 +59,12 @@ nm_setting_connection_error_quark (void)
}
-G_DEFINE_TYPE (NMSettingConnection, nm_setting_connection, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingConnection, nm_setting_connection, NM_TYPE_SETTING,
+ _nm_register_setting (NM_SETTING_CONNECTION_SETTING_NAME,
+ g_define_type_id,
+ 0,
+ NM_SETTING_CONNECTION_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_CONNECTION)
#define NM_SETTING_CONNECTION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_CONNECTION, NMSettingConnectionPrivate))
diff --git a/libnm-util/nm-setting-gsm.c b/libnm-util/nm-setting-gsm.c
index 39529003c2..ea83c73c8c 100644
--- a/libnm-util/nm-setting-gsm.c
+++ b/libnm-util/nm-setting-gsm.c
@@ -56,7 +56,12 @@ nm_setting_gsm_error_quark (void)
}
-G_DEFINE_TYPE (NMSettingGsm, nm_setting_gsm, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingGsm, nm_setting_gsm, NM_TYPE_SETTING,
+ _nm_register_setting (NM_SETTING_GSM_SETTING_NAME,
+ g_define_type_id,
+ 1,
+ NM_SETTING_GSM_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_GSM)
#define NM_SETTING_GSM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_GSM, NMSettingGsmPrivate))
diff --git a/libnm-util/nm-setting-infiniband.c b/libnm-util/nm-setting-infiniband.c
index dbef5b8a72..ee40aa0ec9 100644
--- a/libnm-util/nm-setting-infiniband.c
+++ b/libnm-util/nm-setting-infiniband.c
@@ -25,6 +25,7 @@
#include "nm-setting-infiniband.h"
#include "nm-param-spec-specialized.h"
#include "nm-utils-private.h"
+#include "nm-setting-private.h"
/**
* SECTION:nm-setting-infiniband
@@ -52,7 +53,12 @@ nm_setting_infiniband_error_quark (void)
return quark;
}
-G_DEFINE_TYPE (NMSettingInfiniband, nm_setting_infiniband, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingInfiniband, nm_setting_infiniband, NM_TYPE_SETTING,
+ _nm_register_setting (NM_SETTING_INFINIBAND_SETTING_NAME,
+ g_define_type_id,
+ 1,
+ NM_SETTING_INFINIBAND_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_INFINIBAND)
#define NM_SETTING_INFINIBAND_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_INFINIBAND, NMSettingInfinibandPrivate))
diff --git a/libnm-util/nm-setting-ip4-config.c b/libnm-util/nm-setting-ip4-config.c
index 5dc9199b5e..deef89e89c 100644
--- a/libnm-util/nm-setting-ip4-config.c
+++ b/libnm-util/nm-setting-ip4-config.c
@@ -31,7 +31,7 @@
#include "nm-utils.h"
#include "nm-dbus-glib-types.h"
#include "nm-glib-compat.h"
-
+#include "nm-setting-private.h"
/**
@@ -63,7 +63,12 @@ nm_setting_ip4_config_error_quark (void)
G_DEFINE_BOXED_TYPE (NMIP4Address, nm_ip4_address, nm_ip4_address_dup, nm_ip4_address_unref)
G_DEFINE_BOXED_TYPE (NMIP4Route, nm_ip4_route, nm_ip4_route_dup, nm_ip4_route_unref)
-G_DEFINE_TYPE (NMSettingIP4Config, nm_setting_ip4_config, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingIP4Config, nm_setting_ip4_config, NM_TYPE_SETTING,
+ _nm_register_setting (NM_SETTING_IP4_CONFIG_SETTING_NAME,
+ g_define_type_id,
+ 4,
+ NM_SETTING_IP4_CONFIG_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_IP4_CONFIG)
#define NM_SETTING_IP4_CONFIG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_IP4_CONFIG, NMSettingIP4ConfigPrivate))
diff --git a/libnm-util/nm-setting-ip6-config.c b/libnm-util/nm-setting-ip6-config.c
index c6a84f8e17..aa95f577e4 100644
--- a/libnm-util/nm-setting-ip6-config.c
+++ b/libnm-util/nm-setting-ip6-config.c
@@ -30,6 +30,7 @@
#include "nm-utils.h"
#include "nm-dbus-glib-types.h"
#include "nm-glib-compat.h"
+#include "nm-setting-private.h"
/**
* SECTION:nm-setting-ip6-config
@@ -60,7 +61,12 @@ nm_setting_ip6_config_error_quark (void)
G_DEFINE_BOXED_TYPE (NMIP6Address, nm_ip6_address, nm_ip6_address_dup, nm_ip6_address_unref)
G_DEFINE_BOXED_TYPE (NMIP6Route, nm_ip6_route, nm_ip6_route_dup, nm_ip6_route_unref)
-G_DEFINE_TYPE (NMSettingIP6Config, nm_setting_ip6_config, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingIP6Config, nm_setting_ip6_config, NM_TYPE_SETTING,
+ _nm_register_setting (NM_SETTING_IP6_CONFIG_SETTING_NAME,
+ g_define_type_id,
+ 4,
+ NM_SETTING_IP6_CONFIG_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_IP6_CONFIG)
#define NM_SETTING_IP6_CONFIG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_IP6_CONFIG, NMSettingIP6ConfigPrivate))
diff --git a/libnm-util/nm-setting-olpc-mesh.c b/libnm-util/nm-setting-olpc-mesh.c
index 96770e4fc8..bf87aa578e 100644
--- a/libnm-util/nm-setting-olpc-mesh.c
+++ b/libnm-util/nm-setting-olpc-mesh.c
@@ -35,6 +35,7 @@
#include "nm-utils.h"
#include "nm-dbus-glib-types.h"
#include "nm-utils-private.h"
+#include "nm-setting-private.h"
GQuark
nm_setting_olpc_mesh_error_quark (void)
@@ -48,7 +49,12 @@ nm_setting_olpc_mesh_error_quark (void)
static void nm_setting_olpc_mesh_init (NMSettingOlpcMesh *setting);
-G_DEFINE_TYPE (NMSettingOlpcMesh, nm_setting_olpc_mesh, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingOlpcMesh, nm_setting_olpc_mesh, NM_TYPE_SETTING,
+ _nm_register_setting (NM_SETTING_OLPC_MESH_SETTING_NAME,
+ g_define_type_id,
+ 1,
+ NM_SETTING_OLPC_MESH_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_OLPC_MESH)
#define NM_SETTING_OLPC_MESH_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_OLPC_MESH, NMSettingOlpcMeshPrivate))
diff --git a/libnm-util/nm-setting-ppp.c b/libnm-util/nm-setting-ppp.c
index ee9b5f5905..09cf3de647 100644
--- a/libnm-util/nm-setting-ppp.c
+++ b/libnm-util/nm-setting-ppp.c
@@ -24,6 +24,7 @@
*/
#include "nm-setting-ppp.h"
+#include "nm-setting-private.h"
/**
* SECTION:nm-setting-ppp
@@ -54,7 +55,12 @@ nm_setting_ppp_error_quark (void)
}
-G_DEFINE_TYPE (NMSettingPPP, nm_setting_ppp, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingPPP, nm_setting_ppp, NM_TYPE_SETTING,
+ _nm_register_setting (NM_SETTING_PPP_SETTING_NAME,
+ g_define_type_id,
+ 3,
+ NM_SETTING_PPP_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_PPP)
#define NM_SETTING_PPP_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_PPP, NMSettingPPPPrivate))
diff --git a/libnm-util/nm-setting-pppoe.c b/libnm-util/nm-setting-pppoe.c
index 62c42f0189..2785dfa9ce 100644
--- a/libnm-util/nm-setting-pppoe.c
+++ b/libnm-util/nm-setting-pppoe.c
@@ -56,7 +56,12 @@ nm_setting_pppoe_error_quark (void)
}
-G_DEFINE_TYPE (NMSettingPPPOE, nm_setting_pppoe, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingPPPOE, nm_setting_pppoe, NM_TYPE_SETTING,
+ _nm_register_setting (NM_SETTING_PPPOE_SETTING_NAME,
+ g_define_type_id,
+ 3,
+ NM_SETTING_PPPOE_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_PPPOE)
#define NM_SETTING_PPPOE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_PPPOE, NMSettingPPPOEPrivate))
diff --git a/libnm-util/nm-setting-private.h b/libnm-util/nm-setting-private.h
index 5c4e0a5ede..1460841c97 100644
--- a/libnm-util/nm-setting-private.h
+++ b/libnm-util/nm-setting-private.h
@@ -21,11 +21,23 @@
#ifndef NM_SETTING_PRIVATE_H
#define NM_SETTING_PRIVATE_H
+#include "nm-glib-compat.h"
+
#define NM_SETTING_SECRET_FLAGS_ALL \
(NM_SETTING_SECRET_FLAG_NONE | \
NM_SETTING_SECRET_FLAG_AGENT_OWNED | \
NM_SETTING_SECRET_FLAG_NOT_SAVED | \
NM_SETTING_SECRET_FLAG_NOT_REQUIRED)
+void _nm_register_setting (const char *name,
+ const GType type,
+ const guint32 priority,
+ const GQuark error_quark);
+
+/* Ensure the setting's GType is registered at library load time */
+#define NM_SETTING_REGISTER_TYPE(x) \
+static void __attribute__((constructor)) register_setting (void) \
+{ g_type_init (); g_type_ensure (x); }
+
#endif /* NM_SETTING_PRIVATE_H */
diff --git a/libnm-util/nm-setting-serial.c b/libnm-util/nm-setting-serial.c
index 44f14986bb..203f57480b 100644
--- a/libnm-util/nm-setting-serial.c
+++ b/libnm-util/nm-setting-serial.c
@@ -27,6 +27,7 @@
#include "nm-setting-serial.h"
#include "nm-glib-compat.h"
+#include "nm-setting-private.h"
/**
* SECTION:nm-setting-serial
@@ -57,7 +58,12 @@ nm_setting_serial_error_quark (void)
}
-G_DEFINE_TYPE (NMSettingSerial, nm_setting_serial, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingSerial, nm_setting_serial, NM_TYPE_SETTING,
+ _nm_register_setting (NM_SETTING_SERIAL_SETTING_NAME,
+ g_define_type_id,
+ 2,
+ NM_SETTING_SERIAL_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_SERIAL)
#define NM_SETTING_SERIAL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_SERIAL, NMSettingSerialPrivate))
diff --git a/libnm-util/nm-setting-vlan.c b/libnm-util/nm-setting-vlan.c
index 48e35e7e55..ef742a8a48 100644
--- a/libnm-util/nm-setting-vlan.c
+++ b/libnm-util/nm-setting-vlan.c
@@ -30,6 +30,7 @@
#include "nm-utils.h"
#include "nm-dbus-glib-types.h"
#include "nm-setting-connection.h"
+#include "nm-setting-private.h"
/**
* SECTION:nm-setting-vlan
@@ -57,7 +58,12 @@ nm_setting_vlan_error_quark (void)
return quark;
}
-G_DEFINE_TYPE (NMSettingVlan, nm_setting_vlan, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingVlan, nm_setting_vlan, NM_TYPE_SETTING,
+ _nm_register_setting (NM_SETTING_VLAN_SETTING_NAME,
+ g_define_type_id,
+ 1,
+ NM_SETTING_VLAN_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_VLAN)
#define NM_SETTING_VLAN_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_VLAN, NMSettingVlanPrivate))
diff --git a/libnm-util/nm-setting-vpn.c b/libnm-util/nm-setting-vpn.c
index d1fc8b7670..0acd9a52d8 100644
--- a/libnm-util/nm-setting-vpn.c
+++ b/libnm-util/nm-setting-vpn.c
@@ -64,7 +64,12 @@ nm_setting_vpn_error_quark (void)
}
-G_DEFINE_TYPE (NMSettingVPN, nm_setting_vpn, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingVPN, nm_setting_vpn, NM_TYPE_SETTING,
+ _nm_register_setting (NM_SETTING_VPN_SETTING_NAME,
+ g_define_type_id,
+ 1,
+ NM_SETTING_VPN_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_VPN)
#define NM_SETTING_VPN_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_VPN, NMSettingVPNPrivate))
diff --git a/libnm-util/nm-setting-wimax.c b/libnm-util/nm-setting-wimax.c
index a099cad202..b4a0d418fe 100644
--- a/libnm-util/nm-setting-wimax.c
+++ b/libnm-util/nm-setting-wimax.c
@@ -26,6 +26,7 @@
#include "nm-setting-wimax.h"
#include "nm-param-spec-specialized.h"
+#include "nm-setting-private.h"
/**
* SECTION:nm-setting-wimax
@@ -54,7 +55,12 @@ nm_setting_wimax_error_quark (void)
}
-G_DEFINE_TYPE (NMSettingWimax, nm_setting_wimax, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingWimax, nm_setting_wimax, NM_TYPE_SETTING,
+ _nm_register_setting (NM_SETTING_WIMAX_SETTING_NAME,
+ g_define_type_id,
+ 1,
+ NM_SETTING_WIMAX_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_WIMAX)
#define NM_SETTING_WIMAX_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_WIMAX, NMSettingWimaxPrivate))
diff --git a/libnm-util/nm-setting-wired.c b/libnm-util/nm-setting-wired.c
index f9efde270e..f44d6df618 100644
--- a/libnm-util/nm-setting-wired.c
+++ b/libnm-util/nm-setting-wired.c
@@ -33,6 +33,7 @@
#include "nm-utils.h"
#include "nm-utils-private.h"
#include "nm-dbus-glib-types.h"
+#include "nm-setting-private.h"
/**
* SECTION:nm-setting-wired
@@ -61,7 +62,12 @@ nm_setting_wired_error_quark (void)
}
-G_DEFINE_TYPE (NMSettingWired, nm_setting_wired, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingWired, nm_setting_wired, NM_TYPE_SETTING,
+ _nm_register_setting (NM_SETTING_WIRED_SETTING_NAME,
+ g_define_type_id,
+ 1,
+ NM_SETTING_WIRED_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_WIRED)
#define NM_SETTING_WIRED_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_WIRED, NMSettingWiredPrivate))
diff --git a/libnm-util/nm-setting-wireless-security.c b/libnm-util/nm-setting-wireless-security.c
index 7db2225a5b..404a38ad9d 100644
--- a/libnm-util/nm-setting-wireless-security.c
+++ b/libnm-util/nm-setting-wireless-security.c
@@ -75,7 +75,12 @@ nm_setting_wireless_security_error_quark (void)
}
-G_DEFINE_TYPE (NMSettingWirelessSecurity, nm_setting_wireless_security, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingWirelessSecurity, nm_setting_wireless_security, NM_TYPE_SETTING,
+ _nm_register_setting (NM_SETTING_WIRELESS_SECURITY_SETTING_NAME,
+ g_define_type_id,
+ 2,
+ NM_SETTING_WIRELESS_SECURITY_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_WIRELESS_SECURITY)
#define NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_WIRELESS_SECURITY, NMSettingWirelessSecurityPrivate))
diff --git a/libnm-util/nm-setting-wireless.c b/libnm-util/nm-setting-wireless.c
index 4102658fbe..ace22cbc77 100644
--- a/libnm-util/nm-setting-wireless.c
+++ b/libnm-util/nm-setting-wireless.c
@@ -34,6 +34,7 @@
#include "nm-utils.h"
#include "nm-dbus-glib-types.h"
#include "nm-utils-private.h"
+#include "nm-setting-private.h"
/**
* SECTION:nm-setting-wireless
@@ -62,7 +63,12 @@ nm_setting_wireless_error_quark (void)
}
-G_DEFINE_TYPE (NMSettingWireless, nm_setting_wireless, NM_TYPE_SETTING)
+G_DEFINE_TYPE_WITH_CODE (NMSettingWireless, nm_setting_wireless, NM_TYPE_SETTING,
+ _nm_register_setting (NM_SETTING_WIRELESS_SETTING_NAME,
+ g_define_type_id,
+ 1,
+ NM_SETTING_WIRELESS_ERROR))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_WIRELESS)
#define NM_SETTING_WIRELESS_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_WIRELESS, NMSettingWirelessPrivate))