diff --git a/include/nm-glib-compat.h b/include/nm-glib-compat.h index f9c1ae495..63d9598df 100644 --- a/include/nm-glib-compat.h +++ b/include/nm-glib-compat.h @@ -74,4 +74,13 @@ p##_get_type (void) \ } #endif +#if !GLIB_CHECK_VERSION(2,34,0) +static inline void +g_type_ensure (GType type) +{ + if (G_UNLIKELY (type == (GType)-1)) + g_error ("can't happen"); +} +#endif + #endif /* NM_GLIB_COMPAT_H */ diff --git a/libnm-util/nm-connection.c b/libnm-util/nm-connection.c index 66df511f9..d68bdc060 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 } }; +} SettingInfo; -static void -setting_register (const char *name, GType 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) { + SettingInfo *info; + g_return_if_fail (name != NULL); - g_return_if_fail (G_TYPE_IS_INSTANTIATABLE (type)); + 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); - if (G_UNLIKELY (!registered_settings)) { - registered_settings = g_hash_table_new_full (g_str_hash, g_str_equal, - (GDestroyNotify) g_free, - (GDestroyNotify) g_free); - } + _ensure_registered (); - 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 - -static void -register_one_setting (const char *name, - GType type, - GQuark error_quark, - guint32 priority, - gboolean base_type) -{ - 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++; - - setting_register (name, type); -} - -static void -register_default_settings (void) -{ - _nm_utils_register_value_transformations (); - - 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); + if (priority == 0) + g_assert_cmpstr (name, ==, NM_SETTING_CONNECTION_SETTING_NAME); - 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!! */ + 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 96735db21..32eda889f 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 6103c715c..de0850e6d 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 a74e55a02..161b37152 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 5702713b8..a3dbd7662 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 43bf93b19..d68531a6e 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 77aff4fae..1222f9763 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 39529003c..ea83c73c8 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 dbef5b8a7..ee40aa0ec 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 5dc9199b5..deef89e89 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 c6a84f8e1..aa95f577e 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 96770e4fc..bf87aa578 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 ee9b5f590..09cf3de64 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 62c42f018..2785dfa9c 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 5c4e0a5ed..1460841c9 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 44f14986b..203f57480 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 48e35e7e5..ef742a8a4 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 d1fc8b767..0acd9a52d 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 a099cad20..b4a0d418f 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 f9efde270..f44d6df61 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 7db2225a5..404a38ad9 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 4102658fb..ace22cbc7 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))