diff --git a/clients/common/nm-meta-setting-access.c b/clients/common/nm-meta-setting-access.c index cebf8ba8af..bd4064ded9 100644 --- a/clients/common/nm-meta-setting-access.c +++ b/clients/common/nm-meta-setting-access.c @@ -23,24 +23,32 @@ /*****************************************************************************/ +static const NMMetaSettingInfoEditor * +_get_meta_setting_info_editor_from_msi (const NMMetaSettingInfo *meta_setting_info) +{ + const NMMetaSettingInfoEditor *setting_info; + + if (!meta_setting_info) + return NULL; + + nm_assert (meta_setting_info->get_setting_gtype); + nm_assert (meta_setting_info->meta_type < G_N_ELEMENTS (nm_meta_setting_infos_editor)); + + setting_info = &nm_meta_setting_infos_editor[meta_setting_info->meta_type]; + + nm_assert (setting_info->general == meta_setting_info); + return setting_info; +} + const NMMetaSettingInfoEditor * nm_meta_setting_info_editor_find_by_name (const char *setting_name, gboolean use_alias) { - const NMMetaSettingInfo *meta_setting_info; const NMMetaSettingInfoEditor *setting_info; guint i; g_return_val_if_fail (setting_name, NULL); - meta_setting_info = nm_meta_setting_infos_by_name (setting_name); - setting_info = NULL; - if (meta_setting_info) { - nm_assert (nm_streq0 (meta_setting_info->setting_name, setting_name)); - if (meta_setting_info->meta_type < G_N_ELEMENTS (nm_meta_setting_infos_editor)) { - setting_info = &nm_meta_setting_infos_editor[meta_setting_info->meta_type]; - nm_assert (setting_info->general == meta_setting_info); - } - } + setting_info = _get_meta_setting_info_editor_from_msi (nm_meta_setting_infos_by_name (setting_name)); if (!setting_info && use_alias) { for (i = 0; i < _NM_META_SETTING_TYPE_NUM; i++) { if (nm_streq0 (nm_meta_setting_infos_editor[i].alias, setting_name)) { @@ -56,25 +64,7 @@ nm_meta_setting_info_editor_find_by_name (const char *setting_name, gboolean use const NMMetaSettingInfoEditor * nm_meta_setting_info_editor_find_by_gtype (GType gtype) { - const NMMetaSettingInfo *meta_setting_info; - const NMMetaSettingInfoEditor *setting_info; - - meta_setting_info = nm_meta_setting_infos_by_gtype (gtype); - - if (!meta_setting_info) - return NULL; - - g_return_val_if_fail (meta_setting_info->get_setting_gtype, NULL); - g_return_val_if_fail (meta_setting_info->get_setting_gtype () == gtype, NULL); - - if (meta_setting_info->meta_type >= G_N_ELEMENTS (nm_meta_setting_infos_editor)) - return NULL; - - setting_info = &nm_meta_setting_infos_editor[meta_setting_info->meta_type]; - - g_return_val_if_fail (setting_info->general == meta_setting_info, NULL); - - return setting_info; + return _get_meta_setting_info_editor_from_msi (nm_meta_setting_infos_by_gtype (gtype)); } const NMMetaSettingInfoEditor * @@ -86,12 +76,13 @@ nm_meta_setting_info_editor_find_by_setting (NMSetting *setting) setting_info = nm_meta_setting_info_editor_find_by_gtype (G_OBJECT_TYPE (setting)); - nm_assert (setting_info == nm_meta_setting_info_editor_find_by_name (nm_setting_get_name (setting), FALSE)); - nm_assert (!setting_info || G_TYPE_CHECK_INSTANCE_TYPE (setting, setting_info->general->get_setting_gtype ())); - + nm_assert (setting_info); + nm_assert (G_TYPE_CHECK_INSTANCE_TYPE (setting, setting_info->general->get_setting_gtype ())); return setting_info; } +/*****************************************************************************/ + const NMMetaPropertyInfo * nm_meta_setting_info_editor_get_property_info (const NMMetaSettingInfoEditor *setting_info, const char *property_name) { diff --git a/libnm-core/nm-core-internal.h b/libnm-core/nm-core-internal.h index 966566481b..b53f5c02f8 100644 --- a/libnm-core/nm-core-internal.h +++ b/libnm-core/nm-core-internal.h @@ -84,6 +84,7 @@ #include "nm-vpn-dbus-interface.h" #include "nm-core-types-internal.h" #include "nm-vpn-editor-plugin.h" +#include "nm-meta-setting.h" /* IEEE 802.1D-1998 timer values */ #define NM_BR_MIN_HELLO_TIME 1 @@ -168,45 +169,6 @@ NMConnection *_nm_simple_connection_new_from_dbus (GVariant *dict, NMSettingParseFlags parse_flags, GError **error); -/* - * 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 invalid - * - * 1: reserved for the Connection setting - * - * 2,3: hardware-related settings like Ethernet, Wi-Fi, 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. - * - * 4: hardware-related auxiliary settings that require a base setting to be - * successful first, like Wi-Fi security, 802.1x, etc. - * - * 5: hardware-independent settings that are required before IP connectivity - * can be established, like PPP, PPPoE, etc. - * - * 6: IP-level stuff - * - * 10: NMSettingUser - */ -typedef enum { /*< skip >*/ - NM_SETTING_PRIORITY_INVALID = 0, - NM_SETTING_PRIORITY_CONNECTION = 1, - NM_SETTING_PRIORITY_HW_BASE = 2, - NM_SETTING_PRIORITY_HW_NON_BASE = 3, - NM_SETTING_PRIORITY_HW_AUX = 4, - NM_SETTING_PRIORITY_AUX = 5, - NM_SETTING_PRIORITY_IP = 6, - NM_SETTING_PRIORITY_USER = 10, -} NMSettingPriority; - NMSettingPriority _nm_setting_get_setting_priority (NMSetting *setting); gboolean _nm_setting_get_property (NMSetting *setting, const char *name, GValue *value); diff --git a/libnm-core/nm-setting-6lowpan.c b/libnm-core/nm-setting-6lowpan.c index bcfb2fbf4d..6d2b510799 100644 --- a/libnm-core/nm-setting-6lowpan.c +++ b/libnm-core/nm-setting-6lowpan.c @@ -51,8 +51,7 @@ struct _NMSetting6LowpanClass { * necessary for connection to 6LoWPAN interfaces. **/ -G_DEFINE_TYPE_WITH_CODE (NMSetting6Lowpan, nm_setting_6lowpan, NM_TYPE_SETTING, - _nm_register_setting (6LOWPAN, NM_SETTING_PRIORITY_HW_BASE)) +G_DEFINE_TYPE (NMSetting6Lowpan, nm_setting_6lowpan, NM_TYPE_SETTING) #define NM_SETTING_6LOWPAN_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_6LOWPAN, NMSetting6LowpanPrivate)) @@ -207,7 +206,8 @@ nm_setting_6lowpan_class_init (NMSetting6LowpanClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; - setting_class->verify = verify; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_6LOWPAN]; + setting_class->verify = verify; /** * NMSetting6Lowpan:parent: diff --git a/libnm-core/nm-setting-8021x.c b/libnm-core/nm-setting-8021x.c index 2581eb15a8..8c08bfa53b 100644 --- a/libnm-core/nm-setting-8021x.c +++ b/libnm-core/nm-setting-8021x.c @@ -60,8 +60,7 @@ * ISBN: 978-1587051548 **/ -G_DEFINE_TYPE_WITH_CODE (NMSetting8021x, nm_setting_802_1x, NM_TYPE_SETTING, - _nm_register_setting (802_1X, NM_SETTING_PRIORITY_HW_AUX)) +G_DEFINE_TYPE (NMSetting8021x, nm_setting_802_1x, NM_TYPE_SETTING) #define NM_SETTING_802_1X_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_802_1X, NMSetting8021xPrivate)) @@ -3772,6 +3771,7 @@ nm_setting_802_1x_class_init (NMSetting8021xClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_802_1X]; setting_class->verify = verify; setting_class->need_secrets = need_secrets; diff --git a/libnm-core/nm-setting-adsl.c b/libnm-core/nm-setting-adsl.c index b8e85bb609..eb9aad41ab 100644 --- a/libnm-core/nm-setting-adsl.c +++ b/libnm-core/nm-setting-adsl.c @@ -37,8 +37,7 @@ * properties of ADSL connections. */ -G_DEFINE_TYPE_WITH_CODE (NMSettingAdsl, nm_setting_adsl, NM_TYPE_SETTING, - _nm_register_setting (ADSL, NM_SETTING_PRIORITY_HW_BASE)) +G_DEFINE_TYPE (NMSettingAdsl, nm_setting_adsl, NM_TYPE_SETTING) #define NM_SETTING_ADSL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_ADSL, NMSettingAdslPrivate)) @@ -356,6 +355,7 @@ nm_setting_adsl_class_init (NMSettingAdslClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_ADSL]; setting_class->verify = verify; setting_class->verify_secrets = verify_secrets; setting_class->need_secrets = need_secrets; diff --git a/libnm-core/nm-setting-bluetooth.c b/libnm-core/nm-setting-bluetooth.c index 43573c4fee..2cc3d7ad41 100644 --- a/libnm-core/nm-setting-bluetooth.c +++ b/libnm-core/nm-setting-bluetooth.c @@ -43,8 +43,7 @@ * Point (NAP) profiles. **/ -G_DEFINE_TYPE_WITH_CODE (NMSettingBluetooth, nm_setting_bluetooth, NM_TYPE_SETTING, - _nm_register_setting (BLUETOOTH, NM_SETTING_PRIORITY_HW_NON_BASE)) +G_DEFINE_TYPE (NMSettingBluetooth, nm_setting_bluetooth, NM_TYPE_SETTING) #define NM_SETTING_BLUETOOTH_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_BLUETOOTH, NMSettingBluetoothPrivate)) @@ -293,7 +292,8 @@ nm_setting_bluetooth_class_init (NMSettingBluetoothClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; - setting_class->verify = verify; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_BLUETOOTH]; + setting_class->verify = verify; /** * NMSettingBluetooth:bdaddr: diff --git a/libnm-core/nm-setting-bond.c b/libnm-core/nm-setting-bond.c index 8a81f4baa3..53db178218 100644 --- a/libnm-core/nm-setting-bond.c +++ b/libnm-core/nm-setting-bond.c @@ -57,8 +57,7 @@ typedef struct { NMUtilsNamedValue *options_idx_cache; } NMSettingBondPrivate; -G_DEFINE_TYPE_WITH_CODE (NMSettingBond, nm_setting_bond, NM_TYPE_SETTING, - _nm_register_setting (BOND, NM_SETTING_PRIORITY_HW_BASE)) +G_DEFINE_TYPE (NMSettingBond, nm_setting_bond, NM_TYPE_SETTING) #define NM_SETTING_BOND_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_BOND, NMSettingBondPrivate)) @@ -970,6 +969,7 @@ nm_setting_bond_class_init (NMSettingBondClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_BOND]; setting_class->verify = verify; setting_class->compare_property = compare_property; diff --git a/libnm-core/nm-setting-bridge-port.c b/libnm-core/nm-setting-bridge-port.c index c5df109101..23a431f4fe 100644 --- a/libnm-core/nm-setting-bridge-port.c +++ b/libnm-core/nm-setting-bridge-port.c @@ -40,8 +40,7 @@ * optional properties that apply to bridge ports. **/ -G_DEFINE_TYPE_WITH_CODE (NMSettingBridgePort, nm_setting_bridge_port, NM_TYPE_SETTING, - _nm_register_setting (BRIDGE_PORT, NM_SETTING_PRIORITY_AUX)) +G_DEFINE_TYPE (NMSettingBridgePort, nm_setting_bridge_port, NM_TYPE_SETTING) #define NM_SETTING_BRIDGE_PORT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_BRIDGE_PORT, NMSettingBridgePortPrivate)) @@ -221,7 +220,8 @@ nm_setting_bridge_port_class_init (NMSettingBridgePortClass *klass) object_class->set_property = set_property; object_class->get_property = get_property; - setting_class->verify = verify; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_BRIDGE_PORT]; + setting_class->verify = verify; /** * NMSettingBridgePort:priority: diff --git a/libnm-core/nm-setting-bridge.c b/libnm-core/nm-setting-bridge.c index d8efca6eae..951f35888b 100644 --- a/libnm-core/nm-setting-bridge.c +++ b/libnm-core/nm-setting-bridge.c @@ -38,8 +38,7 @@ * necessary for bridging connections. **/ -G_DEFINE_TYPE_WITH_CODE (NMSettingBridge, nm_setting_bridge, NM_TYPE_SETTING, - _nm_register_setting (BRIDGE, NM_SETTING_PRIORITY_HW_BASE)) +G_DEFINE_TYPE (NMSettingBridge, nm_setting_bridge, NM_TYPE_SETTING) #define NM_SETTING_BRIDGE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_BRIDGE, NMSettingBridgePrivate)) @@ -403,7 +402,8 @@ nm_setting_bridge_class_init (NMSettingBridgeClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; - setting_class->verify = verify; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_BRIDGE]; + setting_class->verify = verify; /** * NMSettingBridge:mac-address: diff --git a/libnm-core/nm-setting-cdma.c b/libnm-core/nm-setting-cdma.c index 880f926eff..bb49ec9d3f 100644 --- a/libnm-core/nm-setting-cdma.c +++ b/libnm-core/nm-setting-cdma.c @@ -37,8 +37,7 @@ * networks, including those using CDMA2000/EVDO technology. */ -G_DEFINE_TYPE_WITH_CODE (NMSettingCdma, nm_setting_cdma, NM_TYPE_SETTING, - _nm_register_setting (CDMA, NM_SETTING_PRIORITY_HW_BASE)) +G_DEFINE_TYPE (NMSettingCdma, nm_setting_cdma, NM_TYPE_SETTING) #define NM_SETTING_CDMA_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_CDMA, NMSettingCdmaPrivate)) @@ -295,6 +294,7 @@ nm_setting_cdma_class_init (NMSettingCdmaClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_CDMA]; setting_class->verify = verify; setting_class->verify_secrets = verify_secrets; setting_class->need_secrets = need_secrets; diff --git a/libnm-core/nm-setting-connection.c b/libnm-core/nm-setting-connection.c index b7066fc48f..6a6c76036f 100644 --- a/libnm-core/nm-setting-connection.c +++ b/libnm-core/nm-setting-connection.c @@ -45,8 +45,7 @@ * a #NMSettingConnection setting. **/ -G_DEFINE_TYPE_WITH_CODE (NMSettingConnection, nm_setting_connection, NM_TYPE_SETTING, - _nm_register_setting (CONNECTION, NM_SETTING_PRIORITY_CONNECTION)) +G_DEFINE_TYPE (NMSettingConnection, nm_setting_connection, NM_TYPE_SETTING) #define NM_SETTING_CONNECTION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_CONNECTION, NMSettingConnectionPrivate)) @@ -1513,6 +1512,7 @@ nm_setting_connection_class_init (NMSettingConnectionClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_CONNECTION]; setting_class->verify = verify; setting_class->compare_property = compare_property; diff --git a/libnm-core/nm-setting-dcb.c b/libnm-core/nm-setting-dcb.c index f57f2694a6..f306b77b16 100644 --- a/libnm-core/nm-setting-dcb.c +++ b/libnm-core/nm-setting-dcb.c @@ -40,8 +40,7 @@ * of storage technologies like Fibre Channel over Ethernet (FCoE) and iSCSI. **/ -G_DEFINE_TYPE_WITH_CODE (NMSettingDcb, nm_setting_dcb, NM_TYPE_SETTING, - _nm_register_setting (DCB, NM_SETTING_PRIORITY_HW_AUX)) +G_DEFINE_TYPE (NMSettingDcb, nm_setting_dcb, NM_TYPE_SETTING) #define NM_SETTING_DCB_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_DCB, NMSettingDcbPrivate)) @@ -917,7 +916,8 @@ nm_setting_dcb_class_init (NMSettingDcbClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; - setting_class->verify = verify; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_DCB]; + setting_class->verify = verify; /** * NMSettingDcb:app-fcoe-flags: diff --git a/libnm-core/nm-setting-dummy.c b/libnm-core/nm-setting-dummy.c index d43bbc7e53..78e67d1dd7 100644 --- a/libnm-core/nm-setting-dummy.c +++ b/libnm-core/nm-setting-dummy.c @@ -34,8 +34,7 @@ * necessary for connection to dummy devices **/ -G_DEFINE_TYPE_WITH_CODE (NMSettingDummy, nm_setting_dummy, NM_TYPE_SETTING, - _nm_register_setting (DUMMY, NM_SETTING_PRIORITY_HW_BASE)) +G_DEFINE_TYPE (NMSettingDummy, nm_setting_dummy, NM_TYPE_SETTING) /** * nm_setting_dummy_new: @@ -71,5 +70,6 @@ nm_setting_dummy_class_init (NMSettingDummyClass *klass) { NMSettingClass *setting_class = NM_SETTING_CLASS (klass); - setting_class->verify = verify; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_DUMMY]; + setting_class->verify = verify; } diff --git a/libnm-core/nm-setting-generic.c b/libnm-core/nm-setting-generic.c index 566d5826ae..762062417e 100644 --- a/libnm-core/nm-setting-generic.c +++ b/libnm-core/nm-setting-generic.c @@ -36,8 +36,7 @@ * the "connection type" setting on #NMConnections for generic devices. **/ -G_DEFINE_TYPE_WITH_CODE (NMSettingGeneric, nm_setting_generic, NM_TYPE_SETTING, - _nm_register_setting (GENERIC, NM_SETTING_PRIORITY_HW_BASE)) +G_DEFINE_TYPE (NMSettingGeneric, nm_setting_generic, NM_TYPE_SETTING) #define NM_SETTING_GENERIC_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_GENERIC, NMSettingGenericPrivate)) @@ -68,5 +67,9 @@ nm_setting_generic_init (NMSettingGeneric *setting) static void nm_setting_generic_class_init (NMSettingGenericClass *klass) { + NMSettingClass *setting_class = NM_SETTING_CLASS (klass); + g_type_class_add_private (klass, sizeof (NMSettingGenericPrivate)); + + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_GENERIC]; } diff --git a/libnm-core/nm-setting-gsm.c b/libnm-core/nm-setting-gsm.c index fce5fe262f..3b4f604628 100644 --- a/libnm-core/nm-setting-gsm.c +++ b/libnm-core/nm-setting-gsm.c @@ -38,8 +38,7 @@ * networks, including those using GPRS/EDGE and UMTS/HSPA technology. */ -G_DEFINE_TYPE_WITH_CODE (NMSettingGsm, nm_setting_gsm, NM_TYPE_SETTING, - _nm_register_setting (GSM, NM_SETTING_PRIORITY_HW_BASE)) +G_DEFINE_TYPE (NMSettingGsm, nm_setting_gsm, NM_TYPE_SETTING) #define NM_SETTING_GSM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_GSM, NMSettingGsmPrivate)) @@ -614,6 +613,7 @@ nm_setting_gsm_class_init (NMSettingGsmClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_GSM]; setting_class->verify = verify; setting_class->verify_secrets = verify_secrets; setting_class->need_secrets = need_secrets; diff --git a/libnm-core/nm-setting-infiniband.c b/libnm-core/nm-setting-infiniband.c index 75a2b3c92e..96997e9ebd 100644 --- a/libnm-core/nm-setting-infiniband.c +++ b/libnm-core/nm-setting-infiniband.c @@ -37,8 +37,7 @@ * necessary for connection to IP-over-InfiniBand networks. **/ -G_DEFINE_TYPE_WITH_CODE (NMSettingInfiniband, nm_setting_infiniband, NM_TYPE_SETTING, - _nm_register_setting (INFINIBAND, NM_SETTING_PRIORITY_HW_BASE)) +G_DEFINE_TYPE (NMSettingInfiniband, nm_setting_infiniband, NM_TYPE_SETTING) #define NM_SETTING_INFINIBAND_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_INFINIBAND, NMSettingInfinibandPrivate)) @@ -388,7 +387,8 @@ nm_setting_infiniband_class_init (NMSettingInfinibandClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; - setting_class->verify = verify; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_INFINIBAND]; + setting_class->verify = verify; /** * NMSettingInfiniband:mac-address: diff --git a/libnm-core/nm-setting-ip-tunnel.c b/libnm-core/nm-setting-ip-tunnel.c index 5dcb4d62ef..b255edf339 100644 --- a/libnm-core/nm-setting-ip-tunnel.c +++ b/libnm-core/nm-setting-ip-tunnel.c @@ -30,8 +30,7 @@ * @short_description: Describes connection properties for IP tunnel devices **/ -G_DEFINE_TYPE_WITH_CODE (NMSettingIPTunnel, nm_setting_ip_tunnel, NM_TYPE_SETTING, - _nm_register_setting (IP_TUNNEL, NM_SETTING_PRIORITY_HW_BASE)) +G_DEFINE_TYPE (NMSettingIPTunnel, nm_setting_ip_tunnel, NM_TYPE_SETTING) #define NM_SETTING_IP_TUNNEL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_IP_TUNNEL, NMSettingIPTunnelPrivate)) @@ -633,7 +632,8 @@ nm_setting_ip_tunnel_class_init (NMSettingIPTunnelClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; - setting_class->verify = verify; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_IP_TUNNEL]; + setting_class->verify = verify; /** * NMSettingIPTunnel:parent: diff --git a/libnm-core/nm-setting-ip4-config.c b/libnm-core/nm-setting-ip4-config.c index d3e2ca3708..95ff57ca1b 100644 --- a/libnm-core/nm-setting-ip4-config.c +++ b/libnm-core/nm-setting-ip4-config.c @@ -50,8 +50,7 @@ * connection. **/ -G_DEFINE_TYPE_WITH_CODE (NMSettingIP4Config, nm_setting_ip4_config, NM_TYPE_SETTING_IP_CONFIG, - _nm_register_setting (IP4_CONFIG, NM_SETTING_PRIORITY_IP)) +G_DEFINE_TYPE (NMSettingIP4Config, nm_setting_ip4_config, NM_TYPE_SETTING_IP_CONFIG) #define NM_SETTING_IP4_CONFIG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_IP4_CONFIG, NMSettingIP4ConfigPrivate)) @@ -535,7 +534,8 @@ nm_setting_ip4_config_class_init (NMSettingIP4ConfigClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; - setting_class->verify = verify; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_IP4_CONFIG]; + setting_class->verify = verify; /* ---ifcfg-rh--- * property: method diff --git a/libnm-core/nm-setting-ip6-config.c b/libnm-core/nm-setting-ip6-config.c index 3f49fc976e..3f7dd00ce0 100644 --- a/libnm-core/nm-setting-ip6-config.c +++ b/libnm-core/nm-setting-ip6-config.c @@ -52,8 +52,7 @@ * supported. **/ -G_DEFINE_TYPE_WITH_CODE (NMSettingIP6Config, nm_setting_ip6_config, NM_TYPE_SETTING_IP_CONFIG, - _nm_register_setting (IP6_CONFIG, NM_SETTING_PRIORITY_IP)) +G_DEFINE_TYPE (NMSettingIP6Config, nm_setting_ip6_config, NM_TYPE_SETTING_IP_CONFIG) #define NM_SETTING_IP6_CONFIG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_IP6_CONFIG, NMSettingIP6ConfigPrivate)) @@ -559,7 +558,8 @@ nm_setting_ip6_config_class_init (NMSettingIP6ConfigClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; - setting_class->verify = verify; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_IP6_CONFIG]; + setting_class->verify = verify; /* ---ifcfg-rh--- * property: method diff --git a/libnm-core/nm-setting-macsec.c b/libnm-core/nm-setting-macsec.c index c8969f068a..9705a31040 100644 --- a/libnm-core/nm-setting-macsec.c +++ b/libnm-core/nm-setting-macsec.c @@ -40,8 +40,7 @@ * necessary for connection to MACsec (IEEE 802.1AE) interfaces. **/ -G_DEFINE_TYPE_WITH_CODE (NMSettingMacsec, nm_setting_macsec, NM_TYPE_SETTING, - _nm_register_setting (MACSEC, NM_SETTING_PRIORITY_HW_BASE)) +G_DEFINE_TYPE (NMSettingMacsec, nm_setting_macsec, NM_TYPE_SETTING) #define NM_SETTING_MACSEC_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_MACSEC, NMSettingMacsecPrivate)) @@ -484,6 +483,7 @@ nm_setting_macsec_class_init (NMSettingMacsecClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_MACSEC]; setting_class->verify = verify; setting_class->need_secrets = need_secrets; diff --git a/libnm-core/nm-setting-macvlan.c b/libnm-core/nm-setting-macvlan.c index 90934555fa..133131fa5d 100644 --- a/libnm-core/nm-setting-macvlan.c +++ b/libnm-core/nm-setting-macvlan.c @@ -39,8 +39,7 @@ * necessary for connection to macvlan interfaces. **/ -G_DEFINE_TYPE_WITH_CODE (NMSettingMacvlan, nm_setting_macvlan, NM_TYPE_SETTING, - _nm_register_setting (MACVLAN, NM_SETTING_PRIORITY_HW_BASE)) +G_DEFINE_TYPE (NMSettingMacvlan, nm_setting_macvlan, NM_TYPE_SETTING) #define NM_SETTING_MACVLAN_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_MACVLAN, NMSettingMacvlanPrivate)) @@ -270,7 +269,8 @@ nm_setting_macvlan_class_init (NMSettingMacvlanClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; - setting_class->verify = verify; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_MACVLAN]; + setting_class->verify = verify; /** * NMSettingMacvlan:parent: diff --git a/libnm-core/nm-setting-olpc-mesh.c b/libnm-core/nm-setting-olpc-mesh.c index 68e84db0dd..9e215dc60d 100644 --- a/libnm-core/nm-setting-olpc-mesh.c +++ b/libnm-core/nm-setting-olpc-mesh.c @@ -39,8 +39,7 @@ static void nm_setting_olpc_mesh_init (NMSettingOlpcMesh *setting); -G_DEFINE_TYPE_WITH_CODE (NMSettingOlpcMesh, nm_setting_olpc_mesh, NM_TYPE_SETTING, - _nm_register_setting (OLPC_MESH, NM_SETTING_PRIORITY_HW_BASE)) +G_DEFINE_TYPE (NMSettingOlpcMesh, nm_setting_olpc_mesh, NM_TYPE_SETTING) #define NM_SETTING_OLPC_MESH_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_OLPC_MESH, NMSettingOlpcMeshPrivate)) @@ -224,7 +223,8 @@ nm_setting_olpc_mesh_class_init (NMSettingOlpcMeshClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; - setting_class->verify = verify; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_OLPC_MESH]; + setting_class->verify = verify; /** * NMSettingOlpcMesh:ssid: diff --git a/libnm-core/nm-setting-ovs-bridge.c b/libnm-core/nm-setting-ovs-bridge.c index 1ec364b6df..669bae9631 100644 --- a/libnm-core/nm-setting-ovs-bridge.c +++ b/libnm-core/nm-setting-ovs-bridge.c @@ -61,8 +61,7 @@ struct _NMSettingOvsBridgeClass { NMSettingClass parent; }; -G_DEFINE_TYPE_WITH_CODE (NMSettingOvsBridge, nm_setting_ovs_bridge, NM_TYPE_SETTING, - _nm_register_setting (OVS_BRIDGE, NM_SETTING_PRIORITY_HW_BASE)) +G_DEFINE_TYPE (NMSettingOvsBridge, nm_setting_ovs_bridge, NM_TYPE_SETTING) /*****************************************************************************/ @@ -272,7 +271,8 @@ nm_setting_ovs_bridge_class_init (NMSettingOvsBridgeClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; - setting_class->verify = verify; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_OVS_BRIDGE]; + setting_class->verify = verify; /** * NMSettingOvsBridge:fail-mode: diff --git a/libnm-core/nm-setting-ovs-interface.c b/libnm-core/nm-setting-ovs-interface.c index 51e6e47bc7..23325eb957 100644 --- a/libnm-core/nm-setting-ovs-interface.c +++ b/libnm-core/nm-setting-ovs-interface.c @@ -54,8 +54,7 @@ struct _NMSettingOvsInterfaceClass { NMSettingClass parent; }; -G_DEFINE_TYPE_WITH_CODE (NMSettingOvsInterface, nm_setting_ovs_interface, NM_TYPE_SETTING, - _nm_register_setting (OVS_INTERFACE, NM_SETTING_PRIORITY_HW_BASE)) +G_DEFINE_TYPE (NMSettingOvsInterface, nm_setting_ovs_interface, NM_TYPE_SETTING) /*****************************************************************************/ @@ -371,7 +370,8 @@ nm_setting_ovs_interface_class_init (NMSettingOvsInterfaceClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; - setting_class->verify = verify; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_OVS_INTERFACE]; + setting_class->verify = verify; /** * NMSettingOvsInterface:type: diff --git a/libnm-core/nm-setting-ovs-patch.c b/libnm-core/nm-setting-ovs-patch.c index 0986af8f93..0acdcb9d03 100644 --- a/libnm-core/nm-setting-ovs-patch.c +++ b/libnm-core/nm-setting-ovs-patch.c @@ -55,8 +55,7 @@ struct _NMSettingOvsPatchClass { NMSettingClass parent; }; -G_DEFINE_TYPE_WITH_CODE (NMSettingOvsPatch, nm_setting_ovs_patch, NM_TYPE_SETTING, - _nm_register_setting (OVS_PATCH, NM_SETTING_PRIORITY_HW_BASE)) +G_DEFINE_TYPE (NMSettingOvsPatch, nm_setting_ovs_patch, NM_TYPE_SETTING) /*****************************************************************************/ @@ -190,7 +189,8 @@ nm_setting_ovs_patch_class_init (NMSettingOvsPatchClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; - setting_class->verify = verify; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_OVS_PATCH]; + setting_class->verify = verify; /** * NMSettingOvsPatch:peer: diff --git a/libnm-core/nm-setting-ovs-port.c b/libnm-core/nm-setting-ovs-port.c index eb593e8042..8fc19fc3c1 100644 --- a/libnm-core/nm-setting-ovs-port.c +++ b/libnm-core/nm-setting-ovs-port.c @@ -65,8 +65,7 @@ struct _NMSettingOvsPortClass { NMSettingClass parent; }; -G_DEFINE_TYPE_WITH_CODE (NMSettingOvsPort, nm_setting_ovs_port, NM_TYPE_SETTING, - _nm_register_setting (OVS_PORT, NM_SETTING_PRIORITY_HW_BASE)) +G_DEFINE_TYPE (NMSettingOvsPort, nm_setting_ovs_port, NM_TYPE_SETTING) /*****************************************************************************/ @@ -369,7 +368,8 @@ nm_setting_ovs_port_class_init (NMSettingOvsPortClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; - setting_class->verify = verify; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_OVS_PORT]; + setting_class->verify = verify; /** * NMSettingOvsPort:vlan-mode: diff --git a/libnm-core/nm-setting-ppp.c b/libnm-core/nm-setting-ppp.c index 0388884a5c..905ec146a7 100644 --- a/libnm-core/nm-setting-ppp.c +++ b/libnm-core/nm-setting-ppp.c @@ -35,8 +35,7 @@ * cable and DSL modems and some mobile broadband devices. **/ -G_DEFINE_TYPE_WITH_CODE (NMSettingPpp, nm_setting_ppp, NM_TYPE_SETTING, - _nm_register_setting (PPP, NM_SETTING_PRIORITY_AUX)) +G_DEFINE_TYPE (NMSettingPpp, nm_setting_ppp, NM_TYPE_SETTING) #define NM_SETTING_PPP_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_PPP, NMSettingPppPrivate)) @@ -534,6 +533,7 @@ nm_setting_ppp_class_init (NMSettingPppClass *klass) object_class->set_property = set_property; object_class->get_property = get_property; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_PPP]; setting_class->verify = verify; /** diff --git a/libnm-core/nm-setting-pppoe.c b/libnm-core/nm-setting-pppoe.c index e3c126a001..679a30cebb 100644 --- a/libnm-core/nm-setting-pppoe.c +++ b/libnm-core/nm-setting-pppoe.c @@ -38,8 +38,7 @@ * to provide IP transport, for example cable or DSL modems. **/ -G_DEFINE_TYPE_WITH_CODE (NMSettingPppoe, nm_setting_pppoe, NM_TYPE_SETTING, - _nm_register_setting (PPPOE, NM_SETTING_PRIORITY_AUX)) +G_DEFINE_TYPE (NMSettingPppoe, nm_setting_pppoe, NM_TYPE_SETTING) #define NM_SETTING_PPPOE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_PPPOE, NMSettingPppoePrivate)) @@ -298,6 +297,7 @@ nm_setting_pppoe_class_init (NMSettingPppoeClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_PPPOE]; setting_class->verify = verify; setting_class->need_secrets = need_secrets; diff --git a/libnm-core/nm-setting-private.h b/libnm-core/nm-setting-private.h index 043836a0f0..4a92264b7c 100644 --- a/libnm-core/nm-setting-private.h +++ b/libnm-core/nm-setting-private.h @@ -31,19 +31,14 @@ #include "nm-core-internal.h" -void _nm_register_setting_impl (const char *name, - GType type, - NMSettingPriority priority); - -#define _nm_register_setting(name, priority) \ - G_STMT_START { \ - _nm_register_setting_impl ("" NM_SETTING_ ## name ## _SETTING_NAME "", g_define_type_id, priority); \ - } G_STMT_END +/*****************************************************************************/ NMSettingPriority _nm_setting_get_base_type_priority (NMSetting *setting); NMSettingPriority _nm_setting_type_get_base_type_priority (GType type); int _nm_setting_compare_priority (gconstpointer a, gconstpointer b); +/*****************************************************************************/ + typedef enum NMSettingUpdateSecretResult { NM_SETTING_UPDATE_SECRET_ERROR = FALSE, NM_SETTING_UPDATE_SECRET_SUCCESS_MODIFIED = TRUE, diff --git a/libnm-core/nm-setting-proxy.c b/libnm-core/nm-setting-proxy.c index 6a30ffd9e2..8faf9ba4e7 100644 --- a/libnm-core/nm-setting-proxy.c +++ b/libnm-core/nm-setting-proxy.c @@ -39,8 +39,7 @@ * to fulfill client queries. **/ -G_DEFINE_TYPE_WITH_CODE (NMSettingProxy, nm_setting_proxy, NM_TYPE_SETTING, - _nm_register_setting (PROXY, NM_SETTING_PRIORITY_IP)) +G_DEFINE_TYPE (NMSettingProxy, nm_setting_proxy, NM_TYPE_SETTING) #define NM_SETTING_PROXY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_PROXY, NMSettingProxyPrivate)) @@ -295,7 +294,8 @@ nm_setting_proxy_class_init (NMSettingProxyClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; - setting_class->verify = verify; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_PROXY]; + setting_class->verify = verify; /** * NMSettingProxy:method: diff --git a/libnm-core/nm-setting-serial.c b/libnm-core/nm-setting-serial.c index 33414430f9..26baf95011 100644 --- a/libnm-core/nm-setting-serial.c +++ b/libnm-core/nm-setting-serial.c @@ -37,8 +37,7 @@ * such as mobile broadband or analog telephone connections. **/ -G_DEFINE_TYPE_WITH_CODE (NMSettingSerial, nm_setting_serial, NM_TYPE_SETTING, - _nm_register_setting (SERIAL, NM_SETTING_PRIORITY_HW_AUX)) +G_DEFINE_TYPE (NMSettingSerial, nm_setting_serial, NM_TYPE_SETTING) #define NM_SETTING_SERIAL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_SERIAL, NMSettingSerialPrivate)) @@ -247,6 +246,8 @@ nm_setting_serial_class_init (NMSettingSerialClass *klass) object_class->set_property = set_property; object_class->get_property = get_property; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_SERIAL]; + /** * NMSettingSerial:baud: * diff --git a/libnm-core/nm-setting-sriov.c b/libnm-core/nm-setting-sriov.c index 4947ede4e3..90108ca721 100644 --- a/libnm-core/nm-setting-sriov.c +++ b/libnm-core/nm-setting-sriov.c @@ -42,8 +42,7 @@ struct _NMSettingSriovClass { NMSettingClass parent; }; -G_DEFINE_TYPE_WITH_CODE (NMSettingSriov, nm_setting_sriov, NM_TYPE_SETTING, - _nm_register_setting (SRIOV, NM_SETTING_PRIORITY_HW_AUX)) +G_DEFINE_TYPE (NMSettingSriov, nm_setting_sriov, NM_TYPE_SETTING) enum { PROP_0, @@ -1240,6 +1239,7 @@ nm_setting_sriov_class_init (NMSettingSriovClass *klass) object_class->set_property = set_property; object_class->finalize = finalize; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_SRIOV]; setting_class->compare_property = compare_property; setting_class->verify = verify; diff --git a/libnm-core/nm-setting-tc-config.c b/libnm-core/nm-setting-tc-config.c index 619881ab0a..01e2e34fb9 100644 --- a/libnm-core/nm-setting-tc-config.c +++ b/libnm-core/nm-setting-tc-config.c @@ -834,8 +834,7 @@ struct _NMSettingTCConfigClass { NMSettingClass parent; }; -G_DEFINE_TYPE_WITH_CODE (NMSettingTCConfig, nm_setting_tc_config, NM_TYPE_SETTING, - _nm_register_setting (TC_CONFIG, NM_SETTING_PRIORITY_IP)) +G_DEFINE_TYPE (NMSettingTCConfig, nm_setting_tc_config, NM_TYPE_SETTING) /** * nm_setting_tc_config_new: @@ -1597,6 +1596,7 @@ nm_setting_tc_config_class_init (NMSettingTCConfigClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_TC_CONFIG]; setting_class->compare_property = compare_property; setting_class->verify = verify; diff --git a/libnm-core/nm-setting-team-port.c b/libnm-core/nm-setting-team-port.c index 343f1e727b..4eb33050ee 100644 --- a/libnm-core/nm-setting-team-port.c +++ b/libnm-core/nm-setting-team-port.c @@ -39,8 +39,7 @@ * optional properties that apply to team ports. **/ -G_DEFINE_TYPE_WITH_CODE (NMSettingTeamPort, nm_setting_team_port, NM_TYPE_SETTING, - _nm_register_setting (TEAM_PORT, NM_SETTING_PRIORITY_AUX)) +G_DEFINE_TYPE (NMSettingTeamPort, nm_setting_team_port, NM_TYPE_SETTING) #define NM_SETTING_TEAM_PORT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_TEAM_PORT, NMSettingTeamPortPrivate)) @@ -597,6 +596,7 @@ nm_setting_team_port_class_init (NMSettingTeamPortClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_TEAM_PORT]; setting_class->compare_property = compare_property; setting_class->verify = verify; diff --git a/libnm-core/nm-setting-team.c b/libnm-core/nm-setting-team.c index fce3c42d51..f0120ff114 100644 --- a/libnm-core/nm-setting-team.c +++ b/libnm-core/nm-setting-team.c @@ -557,8 +557,7 @@ nm_team_link_watcher_get_flags (NMTeamLinkWatcher *watcher) /*****************************************************************************/ -G_DEFINE_TYPE_WITH_CODE (NMSettingTeam, nm_setting_team, NM_TYPE_SETTING, - _nm_register_setting (TEAM, NM_SETTING_PRIORITY_HW_BASE)) +G_DEFINE_TYPE (NMSettingTeam, nm_setting_team, NM_TYPE_SETTING) #define NM_SETTING_TEAM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_TEAM, NMSettingTeamPrivate)) @@ -1568,6 +1567,7 @@ nm_setting_team_class_init (NMSettingTeamClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_TEAM]; setting_class->compare_property = compare_property; setting_class->verify = verify; diff --git a/libnm-core/nm-setting-tun.c b/libnm-core/nm-setting-tun.c index a723bf3eb5..0fbb6375e0 100644 --- a/libnm-core/nm-setting-tun.c +++ b/libnm-core/nm-setting-tun.c @@ -38,8 +38,7 @@ * necessary for connection to TUN/TAP interfaces. **/ -G_DEFINE_TYPE_WITH_CODE (NMSettingTun, nm_setting_tun, NM_TYPE_SETTING, - _nm_register_setting (TUN, NM_SETTING_PRIORITY_HW_BASE)) +G_DEFINE_TYPE (NMSettingTun, nm_setting_tun, NM_TYPE_SETTING) #define NM_SETTING_TUN_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_TUN, NMSettingTunPrivate)) @@ -302,7 +301,8 @@ nm_setting_tun_class_init (NMSettingTunClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; - setting_class->verify = verify; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_TUN]; + setting_class->verify = verify; /** * NMSettingTun:mode: diff --git a/libnm-core/nm-setting-user.c b/libnm-core/nm-setting-user.c index 1a6ddf220e..c5d763e77e 100644 --- a/libnm-core/nm-setting-user.c +++ b/libnm-core/nm-setting-user.c @@ -63,8 +63,7 @@ struct _NMSettingUserClass { NMSettingClass parent; }; -G_DEFINE_TYPE_WITH_CODE (NMSettingUser, nm_setting_user, NM_TYPE_SETTING, - _nm_register_setting (USER, NM_SETTING_PRIORITY_USER)) +G_DEFINE_TYPE (NMSettingUser, nm_setting_user, NM_TYPE_SETTING) #define NM_SETTING_USER_GET_PRIVATE(self) _NM_GET_PRIVATE(self, NMSettingUser, NM_IS_SETTING_USER) @@ -553,6 +552,7 @@ nm_setting_user_class_init (NMSettingUserClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_USER]; setting_class->compare_property = compare_property; setting_class->verify = verify; diff --git a/libnm-core/nm-setting-vlan.c b/libnm-core/nm-setting-vlan.c index 897a66b75a..54a3145ee9 100644 --- a/libnm-core/nm-setting-vlan.c +++ b/libnm-core/nm-setting-vlan.c @@ -41,8 +41,7 @@ * necessary for connection to VLAN interfaces. **/ -G_DEFINE_TYPE_WITH_CODE (NMSettingVlan, nm_setting_vlan, NM_TYPE_SETTING, - _nm_register_setting (VLAN, NM_SETTING_PRIORITY_HW_BASE)) +G_DEFINE_TYPE (NMSettingVlan, nm_setting_vlan, NM_TYPE_SETTING) #define NM_SETTING_VLAN_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_VLAN, NMSettingVlanPrivate)) @@ -841,7 +840,8 @@ nm_setting_vlan_class_init (NMSettingVlanClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; - setting_class->verify = verify; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_VLAN]; + setting_class->verify = verify; /** * NMSettingVlan:parent: diff --git a/libnm-core/nm-setting-vpn.c b/libnm-core/nm-setting-vpn.c index 0672a8101f..39126421ee 100644 --- a/libnm-core/nm-setting-vpn.c +++ b/libnm-core/nm-setting-vpn.c @@ -43,8 +43,7 @@ * properties. **/ -G_DEFINE_TYPE_WITH_CODE (NMSettingVpn, nm_setting_vpn, NM_TYPE_SETTING, - _nm_register_setting (VPN, NM_SETTING_PRIORITY_HW_BASE)) +G_DEFINE_TYPE (NMSettingVpn, nm_setting_vpn, NM_TYPE_SETTING) #define NM_SETTING_VPN_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_VPN, NMSettingVpnPrivate)) @@ -899,6 +898,7 @@ nm_setting_vpn_class_init (NMSettingVpnClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_VPN]; setting_class->verify = verify; setting_class->update_one_secret = update_one_secret; setting_class->get_secret_flags = get_secret_flags; diff --git a/libnm-core/nm-setting-vxlan.c b/libnm-core/nm-setting-vxlan.c index 443ebdafb8..2f906f8ac5 100644 --- a/libnm-core/nm-setting-vxlan.c +++ b/libnm-core/nm-setting-vxlan.c @@ -36,8 +36,7 @@ * necessary for connection to VXLAN interfaces. **/ -G_DEFINE_TYPE_WITH_CODE (NMSettingVxlan, nm_setting_vxlan, NM_TYPE_SETTING, - _nm_register_setting (VXLAN, NM_SETTING_PRIORITY_HW_BASE)) +G_DEFINE_TYPE (NMSettingVxlan, nm_setting_vxlan, NM_TYPE_SETTING) #define NM_SETTING_VXLAN_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_VXLAN, NMSettingVxlanPrivate)) @@ -575,7 +574,8 @@ nm_setting_vxlan_class_init (NMSettingVxlanClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; - setting_class->verify = verify; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_VXLAN]; + setting_class->verify = verify; /** * NMSettingVxlan:parent: diff --git a/libnm-core/nm-setting-wimax.c b/libnm-core/nm-setting-wimax.c index 852ba755ec..12ab0da374 100644 --- a/libnm-core/nm-setting-wimax.c +++ b/libnm-core/nm-setting-wimax.c @@ -42,8 +42,7 @@ * connections cannot be activated. **/ -G_DEFINE_TYPE_WITH_CODE (NMSettingWimax, nm_setting_wimax, NM_TYPE_SETTING, - _nm_register_setting (WIMAX, NM_SETTING_PRIORITY_HW_BASE)) +G_DEFINE_TYPE (NMSettingWimax, nm_setting_wimax, NM_TYPE_SETTING) #define NM_SETTING_WIMAX_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_WIMAX, NMSettingWimaxPrivate)) @@ -217,7 +216,8 @@ nm_setting_wimax_class_init (NMSettingWimaxClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; - setting_class->verify = verify; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_WIMAX]; + setting_class->verify = verify; /** * NMSettingWimax:network-name: diff --git a/libnm-core/nm-setting-wired.c b/libnm-core/nm-setting-wired.c index 0dcd1c25b4..212ddb6218 100644 --- a/libnm-core/nm-setting-wired.c +++ b/libnm-core/nm-setting-wired.c @@ -40,8 +40,7 @@ * necessary for connection to Ethernet networks. **/ -G_DEFINE_TYPE_WITH_CODE (NMSettingWired, nm_setting_wired, NM_TYPE_SETTING, - _nm_register_setting (WIRED, NM_SETTING_PRIORITY_HW_BASE)) +G_DEFINE_TYPE (NMSettingWired, nm_setting_wired, NM_TYPE_SETTING) #define NM_SETTING_WIRED_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_WIRED, NMSettingWiredPrivate)) @@ -988,6 +987,7 @@ nm_setting_wired_class_init (NMSettingWiredClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_WIRED]; setting_class->verify = verify; setting_class->compare_property = compare_property; diff --git a/libnm-core/nm-setting-wireless-security.c b/libnm-core/nm-setting-wireless-security.c index 22177c46b5..e4d3454107 100644 --- a/libnm-core/nm-setting-wireless-security.c +++ b/libnm-core/nm-setting-wireless-security.c @@ -53,8 +53,7 @@ * ISBN: 978-1587051548 **/ -G_DEFINE_TYPE_WITH_CODE (NMSettingWirelessSecurity, nm_setting_wireless_security, NM_TYPE_SETTING, - _nm_register_setting (WIRELESS_SECURITY, NM_SETTING_PRIORITY_HW_AUX)) +G_DEFINE_TYPE (NMSettingWirelessSecurity, nm_setting_wireless_security, NM_TYPE_SETTING) #define NM_SETTING_WIRELESS_SECURITY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_WIRELESS_SECURITY, NMSettingWirelessSecurityPrivate)) @@ -1441,6 +1440,7 @@ nm_setting_wireless_security_class_init (NMSettingWirelessSecurityClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_WIRELESS_SECURITY]; setting_class->verify = verify; setting_class->verify_secrets = verify_secrets; setting_class->need_secrets = need_secrets; diff --git a/libnm-core/nm-setting-wireless.c b/libnm-core/nm-setting-wireless.c index bebfade5c7..47e78d18e7 100644 --- a/libnm-core/nm-setting-wireless.c +++ b/libnm-core/nm-setting-wireless.c @@ -40,8 +40,7 @@ * necessary for connection to 802.11 Wi-Fi networks. **/ -G_DEFINE_TYPE_WITH_CODE (NMSettingWireless, nm_setting_wireless, NM_TYPE_SETTING, - _nm_register_setting (WIRELESS, NM_SETTING_PRIORITY_HW_BASE)) +G_DEFINE_TYPE (NMSettingWireless, nm_setting_wireless, NM_TYPE_SETTING) #define NM_SETTING_WIRELESS_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_WIRELESS, NMSettingWirelessPrivate)) @@ -1186,6 +1185,7 @@ nm_setting_wireless_class_init (NMSettingWirelessClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_WIRELESS]; setting_class->verify = verify; setting_class->compare_property = compare_property; diff --git a/libnm-core/nm-setting-wpan.c b/libnm-core/nm-setting-wpan.c index 4ba64158f8..462f054344 100644 --- a/libnm-core/nm-setting-wpan.c +++ b/libnm-core/nm-setting-wpan.c @@ -65,8 +65,7 @@ struct _NMSettingWpanClass { * necessary for configuring IEEE 802.15.4 (WPAN) MAC layer devices. **/ -G_DEFINE_TYPE_WITH_CODE (NMSettingWpan, nm_setting_wpan, NM_TYPE_SETTING, - _nm_register_setting (WPAN, NM_SETTING_PRIORITY_HW_BASE)) +G_DEFINE_TYPE (NMSettingWpan, nm_setting_wpan, NM_TYPE_SETTING) #define NM_SETTING_WPAN_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_WPAN, NMSettingWpanPrivate)) @@ -225,7 +224,8 @@ nm_setting_wpan_class_init (NMSettingWpanClass *klass) object_class->get_property = get_property; object_class->finalize = finalize; - setting_class->verify = verify; + setting_class->setting_info = &nm_meta_setting_infos[NM_META_SETTING_TYPE_WPAN]; + setting_class->verify = verify; /** * NMSettingWpan:mac-address: diff --git a/libnm-core/nm-setting.c b/libnm-core/nm-setting.c index 887e8aeb4f..86acc04e6b 100644 --- a/libnm-core/nm-setting.c +++ b/libnm-core/nm-setting.c @@ -69,7 +69,7 @@ enum { }; typedef struct { - const SettingInfo *info; + int dummy; } NMSettingPrivate; G_DEFINE_ABSTRACT_TYPE (NMSetting, nm_setting, G_TYPE_OBJECT) @@ -78,213 +78,52 @@ G_DEFINE_ABSTRACT_TYPE (NMSetting, nm_setting, G_TYPE_OBJECT) /*****************************************************************************/ -static GHashTable *registered_settings = NULL; -static GHashTable *registered_settings_by_type = NULL; - -static gboolean -_nm_gtype_equal (gconstpointer v1, gconstpointer v2) -{ - return *((const GType *) v1) == *((const GType *) v2); -} -static guint -_nm_gtype_hash (gconstpointer v) -{ - return *((const GType *) v); -} - -/*****************************************************************************/ - -static void -_register_settings_ensure_types (void) -{ -#define ENSURE_TYPE(get_type) \ - G_STMT_START { \ - GType get_type (void); \ - \ - get_type (); \ - } G_STMT_END - - ENSURE_TYPE (nm_setting_6lowpan_get_type); - ENSURE_TYPE (nm_setting_802_1x_get_type); - ENSURE_TYPE (nm_setting_adsl_get_type); - ENSURE_TYPE (nm_setting_bluetooth_get_type); - ENSURE_TYPE (nm_setting_bond_get_type); - ENSURE_TYPE (nm_setting_bridge_get_type); - ENSURE_TYPE (nm_setting_bridge_port_get_type); - ENSURE_TYPE (nm_setting_cdma_get_type); - ENSURE_TYPE (nm_setting_connection_get_type); - ENSURE_TYPE (nm_setting_dcb_get_type); - ENSURE_TYPE (nm_setting_dummy_get_type); - ENSURE_TYPE (nm_setting_generic_get_type); - ENSURE_TYPE (nm_setting_gsm_get_type); - ENSURE_TYPE (nm_setting_infiniband_get_type); - ENSURE_TYPE (nm_setting_ip4_config_get_type); - ENSURE_TYPE (nm_setting_ip6_config_get_type); - ENSURE_TYPE (nm_setting_ip_tunnel_get_type); - ENSURE_TYPE (nm_setting_macsec_get_type); - ENSURE_TYPE (nm_setting_macvlan_get_type); - ENSURE_TYPE (nm_setting_olpc_mesh_get_type); - ENSURE_TYPE (nm_setting_ovs_bridge_get_type); - ENSURE_TYPE (nm_setting_ovs_interface_get_type); - ENSURE_TYPE (nm_setting_ovs_patch_get_type); - ENSURE_TYPE (nm_setting_ovs_port_get_type); - ENSURE_TYPE (nm_setting_ppp_get_type); - ENSURE_TYPE (nm_setting_pppoe_get_type); - ENSURE_TYPE (nm_setting_proxy_get_type); - ENSURE_TYPE (nm_setting_serial_get_type); - ENSURE_TYPE (nm_setting_sriov_get_type); - ENSURE_TYPE (nm_setting_tc_config_get_type); - ENSURE_TYPE (nm_setting_team_get_type); - ENSURE_TYPE (nm_setting_team_port_get_type); - ENSURE_TYPE (nm_setting_tun_get_type); - ENSURE_TYPE (nm_setting_user_get_type); - ENSURE_TYPE (nm_setting_vlan_get_type); - ENSURE_TYPE (nm_setting_vpn_get_type); - ENSURE_TYPE (nm_setting_vxlan_get_type); - ENSURE_TYPE (nm_setting_wimax_get_type); - ENSURE_TYPE (nm_setting_wired_get_type); - ENSURE_TYPE (nm_setting_wireless_get_type); - ENSURE_TYPE (nm_setting_wireless_security_get_type); - ENSURE_TYPE (nm_setting_wpan_get_type); -} - -/*****************************************************************************/ - -static int volatile _register_settings_ensure_inited_val = 0; - -#define _register_settings_ensure_inited() \ - G_STMT_START { \ - if (G_UNLIKELY (_register_settings_ensure_inited_val == 0)) \ - _register_settings_ensure_inited_impl (); \ - } G_STMT_END - -static void -_register_settings_ensure_inited_impl (void) -{ - _register_settings_ensure_types (); - g_atomic_int_set (&_register_settings_ensure_inited_val, 1); -} - -/*****************************************************************************/ - -#define _ensure_setting_info(self, priv) \ - G_STMT_START { \ - NMSettingPrivate *_priv_esi = (priv); \ - if (G_UNLIKELY (!_priv_esi->info)) { \ - _priv_esi->info = _nm_setting_lookup_setting_by_type (G_OBJECT_TYPE (self)); \ - g_assert (_priv_esi->info); \ - } \ - } G_STMT_END - -/*****************************************************************************/ - -/* - * _nm_register_setting_impl: - * @name: the name of the #NMSetting object to register - * @type: the #GType of the #NMSetting - * @priority: the sort priority of the setting, see #NMSettingPriority - * - * INTERNAL ONLY: registers a setting's internal properties with libnm. - * - * This should be called from within G_DEFINE_TYPE_WITH_CODE() when initializing - * the setting type. - */ -void -_nm_register_setting_impl (const char *name, - GType type, - NMSettingPriority priority) -{ - static GMutex mutex; - SettingInfo *info; - - nm_assert (name && *name); - nm_assert (!NM_IN_SET (type, G_TYPE_INVALID, G_TYPE_NONE)); - nm_assert (priority != NM_SETTING_PRIORITY_INVALID); - - nm_assert ( priority != NM_SETTING_PRIORITY_CONNECTION - || nm_streq (name, NM_SETTING_CONNECTION_SETTING_NAME)); - - info = g_slice_new0 (SettingInfo); - info->type = type; - info->priority = priority; - info->name = name; - - g_mutex_lock (&mutex); - - if (!registered_settings) { - nm_assert (!registered_settings_by_type); - registered_settings = g_hash_table_new (nm_str_hash, g_str_equal); - registered_settings_by_type = g_hash_table_new (_nm_gtype_hash, _nm_gtype_equal); - } else { - nm_assert (!g_hash_table_contains (registered_settings, name)); - nm_assert (!g_hash_table_contains (registered_settings_by_type, &type)); - } - - g_hash_table_insert (registered_settings, (void *) info->name, info); - g_hash_table_insert (registered_settings_by_type, &info->type, info); - - g_mutex_unlock (&mutex); - - /* we cannot register types, after _register_settings_ensure_inited() is done. - * - * This means, you need to register the type in _register_settings_ensure_types() - * above. */ - nm_assert (g_atomic_int_get (&_register_settings_ensure_inited_val) == 0); -} - -static const SettingInfo * -_nm_setting_lookup_setting_by_type (GType type) -{ - _register_settings_ensure_inited (); - return g_hash_table_lookup (registered_settings_by_type, &type); -} - static NMSettingPriority -_get_setting_type_priority (GType type) +_get_base_type_priority (const NMMetaSettingInfo *setting_info, + GType gtype) { - const SettingInfo *info; - - g_return_val_if_fail (g_type_is_a (type, NM_TYPE_SETTING), G_MAXUINT32); - - info = _nm_setting_lookup_setting_by_type (type); - return info->priority; -} - -NMSettingPriority -_nm_setting_get_setting_priority (NMSetting *setting) -{ - NMSettingPrivate *priv; - - g_return_val_if_fail (NM_IS_SETTING (setting), G_MAXUINT32); - priv = NM_SETTING_GET_PRIVATE (setting); - _ensure_setting_info (setting, priv); - return priv->info->priority; -} - -NMSettingPriority -_nm_setting_type_get_base_type_priority (GType type) -{ - NMSettingPriority priority; - /* Historical oddity: PPPoE is a base-type even though it's not * priority 1. It needs to be sorted *after* lower-level stuff like * Wi-Fi security or 802.1x for secrets, but it's still allowed as a * base type. */ - priority = _get_setting_type_priority (type); - if ( NM_IN_SET (priority, - NM_SETTING_PRIORITY_HW_BASE, - NM_SETTING_PRIORITY_HW_NON_BASE) - || type == NM_TYPE_SETTING_PPPOE) - return priority; - else - return NM_SETTING_PRIORITY_INVALID; + + if (setting_info) { + if ( NM_IN_SET (setting_info->setting_priority, + NM_SETTING_PRIORITY_HW_BASE, + NM_SETTING_PRIORITY_HW_NON_BASE) + || gtype == NM_TYPE_SETTING_PPPOE) + return setting_info->setting_priority; + } + + return NM_SETTING_PRIORITY_INVALID; +} + +NMSettingPriority +_nm_setting_get_setting_priority (NMSetting *setting) +{ + const NMMetaSettingInfo *setting_info; + + g_return_val_if_fail (NM_IS_SETTING (setting), NM_SETTING_PRIORITY_INVALID); + + setting_info = NM_SETTING_GET_CLASS (setting)->setting_info; + return setting_info ? setting_info->setting_priority : NM_SETTING_PRIORITY_INVALID; +} + +NMSettingPriority +_nm_setting_type_get_base_type_priority (GType type) +{ + return _get_base_type_priority (nm_meta_setting_infos_by_gtype (type), + type); } NMSettingPriority _nm_setting_get_base_type_priority (NMSetting *setting) { - return _nm_setting_type_get_base_type_priority (G_OBJECT_TYPE (setting)); + g_return_val_if_fail (NM_IS_SETTING (setting), NM_SETTING_PRIORITY_INVALID); + + return _get_base_type_priority (NM_SETTING_GET_CLASS (setting)->setting_info, + G_OBJECT_TYPE (setting)); } /** @@ -299,14 +138,12 @@ _nm_setting_get_base_type_priority (NMSetting *setting) GType nm_setting_lookup_type (const char *name) { - const SettingInfo *info; + const NMMetaSettingInfo *setting_info; g_return_val_if_fail (name, G_TYPE_INVALID); - _register_settings_ensure_inited (); - - info = g_hash_table_lookup (registered_settings, name); - return info ? info->type : G_TYPE_INVALID; + setting_info = nm_meta_setting_infos_by_name (name); + return setting_info ? setting_info->get_setting_gtype () : G_TYPE_INVALID; } int @@ -1113,12 +950,12 @@ nm_setting_duplicate (NMSetting *setting) const char * nm_setting_get_name (NMSetting *setting) { - NMSettingPrivate *priv; + const NMMetaSettingInfo *setting_info; g_return_val_if_fail (NM_IS_SETTING (setting), NULL); - priv = NM_SETTING_GET_PRIVATE (setting); - _ensure_setting_info (setting, priv); - return priv->info->name; + + setting_info = NM_SETTING_GET_CLASS (setting)->setting_info; + return setting_info ? setting_info->setting_name : NULL; } /** @@ -2034,14 +1871,6 @@ nm_setting_init (NMSetting *setting) { } -static void -constructed (GObject *object) -{ - _ensure_setting_info (object, NM_SETTING_GET_PRIVATE (object)); - - G_OBJECT_CLASS (nm_setting_parent_class)->constructed (object); -} - static void get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) @@ -2080,8 +1909,6 @@ nm_setting_class_init (NMSettingClass *setting_class) g_type_class_add_private (setting_class, sizeof (NMSettingPrivate)); - /* virtual methods */ - object_class->constructed = constructed; object_class->get_property = get_property; setting_class->update_one_secret = update_one_secret; @@ -2090,8 +1917,6 @@ nm_setting_class_init (NMSettingClass *setting_class) setting_class->compare_property = compare_property; setting_class->clear_secrets_with_flags = clear_secrets_with_flags; - /* Properties */ - /** * NMSetting:name: * diff --git a/libnm-core/nm-setting.h b/libnm-core/nm-setting.h index 536aea709d..d06527cdd7 100644 --- a/libnm-core/nm-setting.h +++ b/libnm-core/nm-setting.h @@ -168,6 +168,8 @@ typedef gboolean (*NMSettingClearSecretsWithFlagsFn) (NMSetting *setting, NMSettingSecretFlags flags, gpointer user_data); +struct _NMMetaSettingInfo; + typedef struct { GObjectClass parent; @@ -211,7 +213,10 @@ typedef struct { NMSettingCompareFlags flags); /*< private >*/ - gpointer padding[7]; + const struct _NMMetaSettingInfo *setting_info; + + /*< private >*/ + gpointer padding[6]; } NMSettingClass; /** diff --git a/shared/nm-meta-setting.c b/shared/nm-meta-setting.c index 148f3753f9..00221dac6a 100644 --- a/shared/nm-meta-setting.c +++ b/shared/nm-meta-setting.c @@ -149,211 +149,253 @@ const NMSetting8021xSchemeVtable nm_setting_8021x_scheme_vtable[] = { const NMMetaSettingInfo nm_meta_setting_infos[] = { [NM_META_SETTING_TYPE_6LOWPAN] = { .meta_type = NM_META_SETTING_TYPE_6LOWPAN, + .setting_priority = NM_SETTING_PRIORITY_HW_BASE, .setting_name = NM_SETTING_6LOWPAN_SETTING_NAME, .get_setting_gtype = nm_setting_6lowpan_get_type, }, [NM_META_SETTING_TYPE_802_1X] = { .meta_type = NM_META_SETTING_TYPE_802_1X, + .setting_priority = NM_SETTING_PRIORITY_HW_AUX, .setting_name = NM_SETTING_802_1X_SETTING_NAME, .get_setting_gtype = nm_setting_802_1x_get_type, }, [NM_META_SETTING_TYPE_ADSL] = { .meta_type = NM_META_SETTING_TYPE_ADSL, + .setting_priority = NM_SETTING_PRIORITY_HW_BASE, .setting_name = NM_SETTING_ADSL_SETTING_NAME, .get_setting_gtype = nm_setting_adsl_get_type, }, [NM_META_SETTING_TYPE_BLUETOOTH] = { .meta_type = NM_META_SETTING_TYPE_BLUETOOTH, + .setting_priority = NM_SETTING_PRIORITY_HW_NON_BASE, .setting_name = NM_SETTING_BLUETOOTH_SETTING_NAME, .get_setting_gtype = nm_setting_bluetooth_get_type, }, [NM_META_SETTING_TYPE_BOND] = { .meta_type = NM_META_SETTING_TYPE_BOND, + .setting_priority = NM_SETTING_PRIORITY_HW_BASE, .setting_name = NM_SETTING_BOND_SETTING_NAME, .get_setting_gtype = nm_setting_bond_get_type, }, [NM_META_SETTING_TYPE_BRIDGE] = { .meta_type = NM_META_SETTING_TYPE_BRIDGE, + .setting_priority = NM_SETTING_PRIORITY_HW_BASE, .setting_name = NM_SETTING_BRIDGE_SETTING_NAME, .get_setting_gtype = nm_setting_bridge_get_type, }, [NM_META_SETTING_TYPE_BRIDGE_PORT] = { .meta_type = NM_META_SETTING_TYPE_BRIDGE_PORT, + .setting_priority = NM_SETTING_PRIORITY_AUX, .setting_name = NM_SETTING_BRIDGE_PORT_SETTING_NAME, .get_setting_gtype = nm_setting_bridge_port_get_type, }, [NM_META_SETTING_TYPE_CDMA] = { .meta_type = NM_META_SETTING_TYPE_CDMA, + .setting_priority = NM_SETTING_PRIORITY_HW_BASE, .setting_name = NM_SETTING_CDMA_SETTING_NAME, .get_setting_gtype = nm_setting_cdma_get_type, }, [NM_META_SETTING_TYPE_CONNECTION] = { .meta_type = NM_META_SETTING_TYPE_CONNECTION, + .setting_priority = NM_SETTING_PRIORITY_CONNECTION, .setting_name = NM_SETTING_CONNECTION_SETTING_NAME, .get_setting_gtype = nm_setting_connection_get_type, }, [NM_META_SETTING_TYPE_DCB] = { .meta_type = NM_META_SETTING_TYPE_DCB, + .setting_priority = NM_SETTING_PRIORITY_HW_AUX, .setting_name = NM_SETTING_DCB_SETTING_NAME, .get_setting_gtype = nm_setting_dcb_get_type, }, [NM_META_SETTING_TYPE_DUMMY] = { .meta_type = NM_META_SETTING_TYPE_DUMMY, + .setting_priority = NM_SETTING_PRIORITY_HW_BASE, .setting_name = NM_SETTING_DUMMY_SETTING_NAME, .get_setting_gtype = nm_setting_dummy_get_type, }, [NM_META_SETTING_TYPE_GENERIC] = { .meta_type = NM_META_SETTING_TYPE_GENERIC, + .setting_priority = NM_SETTING_PRIORITY_HW_BASE, .setting_name = NM_SETTING_GENERIC_SETTING_NAME, .get_setting_gtype = nm_setting_generic_get_type, }, [NM_META_SETTING_TYPE_GSM] = { .meta_type = NM_META_SETTING_TYPE_GSM, + .setting_priority = NM_SETTING_PRIORITY_HW_BASE, .setting_name = NM_SETTING_GSM_SETTING_NAME, .get_setting_gtype = nm_setting_gsm_get_type, }, [NM_META_SETTING_TYPE_INFINIBAND] = { .meta_type = NM_META_SETTING_TYPE_INFINIBAND, + .setting_priority = NM_SETTING_PRIORITY_HW_BASE, .setting_name = NM_SETTING_INFINIBAND_SETTING_NAME, .get_setting_gtype = nm_setting_infiniband_get_type, }, [NM_META_SETTING_TYPE_IP4_CONFIG] = { .meta_type = NM_META_SETTING_TYPE_IP4_CONFIG, + .setting_priority = NM_SETTING_PRIORITY_IP, .setting_name = NM_SETTING_IP4_CONFIG_SETTING_NAME, .get_setting_gtype = nm_setting_ip4_config_get_type, }, [NM_META_SETTING_TYPE_IP6_CONFIG] = { .meta_type = NM_META_SETTING_TYPE_IP6_CONFIG, + .setting_priority = NM_SETTING_PRIORITY_IP, .setting_name = NM_SETTING_IP6_CONFIG_SETTING_NAME, .get_setting_gtype = nm_setting_ip6_config_get_type, }, [NM_META_SETTING_TYPE_IP_TUNNEL] = { .meta_type = NM_META_SETTING_TYPE_IP_TUNNEL, + .setting_priority = NM_SETTING_PRIORITY_HW_BASE, .setting_name = NM_SETTING_IP_TUNNEL_SETTING_NAME, .get_setting_gtype = nm_setting_ip_tunnel_get_type, }, [NM_META_SETTING_TYPE_MACSEC] = { .meta_type = NM_META_SETTING_TYPE_MACSEC, + .setting_priority = NM_SETTING_PRIORITY_HW_BASE, .setting_name = NM_SETTING_MACSEC_SETTING_NAME, .get_setting_gtype = nm_setting_macsec_get_type, }, [NM_META_SETTING_TYPE_MACVLAN] = { .meta_type = NM_META_SETTING_TYPE_MACVLAN, + .setting_priority = NM_SETTING_PRIORITY_HW_BASE, .setting_name = NM_SETTING_MACVLAN_SETTING_NAME, .get_setting_gtype = nm_setting_macvlan_get_type, }, [NM_META_SETTING_TYPE_OLPC_MESH] = { .meta_type = NM_META_SETTING_TYPE_OLPC_MESH, + .setting_priority = NM_SETTING_PRIORITY_HW_BASE, .setting_name = NM_SETTING_OLPC_MESH_SETTING_NAME, .get_setting_gtype = nm_setting_olpc_mesh_get_type, }, [NM_META_SETTING_TYPE_OVS_BRIDGE] = { .meta_type = NM_META_SETTING_TYPE_OVS_BRIDGE, + .setting_priority = NM_SETTING_PRIORITY_HW_BASE, .setting_name = NM_SETTING_OVS_BRIDGE_SETTING_NAME, .get_setting_gtype = nm_setting_ovs_bridge_get_type, }, [NM_META_SETTING_TYPE_OVS_INTERFACE] = { .meta_type = NM_META_SETTING_TYPE_OVS_INTERFACE, + .setting_priority = NM_SETTING_PRIORITY_HW_BASE, .setting_name = NM_SETTING_OVS_INTERFACE_SETTING_NAME, .get_setting_gtype = nm_setting_ovs_interface_get_type, }, [NM_META_SETTING_TYPE_OVS_PATCH] = { .meta_type = NM_META_SETTING_TYPE_OVS_PATCH, + .setting_priority = NM_SETTING_PRIORITY_HW_BASE, .setting_name = NM_SETTING_OVS_PATCH_SETTING_NAME, .get_setting_gtype = nm_setting_ovs_patch_get_type, }, [NM_META_SETTING_TYPE_OVS_PORT] = { .meta_type = NM_META_SETTING_TYPE_OVS_PORT, + .setting_priority = NM_SETTING_PRIORITY_HW_BASE, .setting_name = NM_SETTING_OVS_PORT_SETTING_NAME, .get_setting_gtype = nm_setting_ovs_port_get_type, }, [NM_META_SETTING_TYPE_PPPOE] = { .meta_type = NM_META_SETTING_TYPE_PPPOE, + .setting_priority = NM_SETTING_PRIORITY_AUX, .setting_name = NM_SETTING_PPPOE_SETTING_NAME, .get_setting_gtype = nm_setting_pppoe_get_type, }, [NM_META_SETTING_TYPE_PPP] = { .meta_type = NM_META_SETTING_TYPE_PPP, + .setting_priority = NM_SETTING_PRIORITY_AUX, .setting_name = NM_SETTING_PPP_SETTING_NAME, .get_setting_gtype = nm_setting_ppp_get_type, }, [NM_META_SETTING_TYPE_PROXY] = { .meta_type = NM_META_SETTING_TYPE_PROXY, + .setting_priority = NM_SETTING_PRIORITY_IP, .setting_name = NM_SETTING_PROXY_SETTING_NAME, .get_setting_gtype = nm_setting_proxy_get_type, }, [NM_META_SETTING_TYPE_SERIAL] = { .meta_type = NM_META_SETTING_TYPE_SERIAL, + .setting_priority = NM_SETTING_PRIORITY_HW_AUX, .setting_name = NM_SETTING_SERIAL_SETTING_NAME, .get_setting_gtype = nm_setting_serial_get_type, }, [NM_META_SETTING_TYPE_SRIOV] = { .meta_type = NM_META_SETTING_TYPE_SRIOV, + .setting_priority = NM_SETTING_PRIORITY_HW_AUX, .setting_name = NM_SETTING_SRIOV_SETTING_NAME, .get_setting_gtype = nm_setting_sriov_get_type, }, [NM_META_SETTING_TYPE_TC_CONFIG] = { .meta_type = NM_META_SETTING_TYPE_TC_CONFIG, + .setting_priority = NM_SETTING_PRIORITY_IP, .setting_name = NM_SETTING_TC_CONFIG_SETTING_NAME, .get_setting_gtype = nm_setting_tc_config_get_type, }, [NM_META_SETTING_TYPE_TEAM] = { .meta_type = NM_META_SETTING_TYPE_TEAM, + .setting_priority = NM_SETTING_PRIORITY_HW_BASE, .setting_name = NM_SETTING_TEAM_SETTING_NAME, .get_setting_gtype = nm_setting_team_get_type, }, [NM_META_SETTING_TYPE_TEAM_PORT] = { .meta_type = NM_META_SETTING_TYPE_TEAM_PORT, + .setting_priority = NM_SETTING_PRIORITY_AUX, .setting_name = NM_SETTING_TEAM_PORT_SETTING_NAME, .get_setting_gtype = nm_setting_team_port_get_type, }, [NM_META_SETTING_TYPE_TUN] = { .meta_type = NM_META_SETTING_TYPE_TUN, + .setting_priority = NM_SETTING_PRIORITY_HW_BASE, .setting_name = NM_SETTING_TUN_SETTING_NAME, .get_setting_gtype = nm_setting_tun_get_type, }, [NM_META_SETTING_TYPE_USER] = { .meta_type = NM_META_SETTING_TYPE_USER, + .setting_priority = NM_SETTING_PRIORITY_USER, .setting_name = NM_SETTING_USER_SETTING_NAME, .get_setting_gtype = nm_setting_user_get_type, }, [NM_META_SETTING_TYPE_VLAN] = { .meta_type = NM_META_SETTING_TYPE_VLAN, + .setting_priority = NM_SETTING_PRIORITY_HW_BASE, .setting_name = NM_SETTING_VLAN_SETTING_NAME, .get_setting_gtype = nm_setting_vlan_get_type, }, [NM_META_SETTING_TYPE_VPN] = { .meta_type = NM_META_SETTING_TYPE_VPN, + .setting_priority = NM_SETTING_PRIORITY_HW_BASE, .setting_name = NM_SETTING_VPN_SETTING_NAME, .get_setting_gtype = nm_setting_vpn_get_type, }, [NM_META_SETTING_TYPE_VXLAN] = { .meta_type = NM_META_SETTING_TYPE_VXLAN, + .setting_priority = NM_SETTING_PRIORITY_HW_BASE, .setting_name = NM_SETTING_VXLAN_SETTING_NAME, .get_setting_gtype = nm_setting_vxlan_get_type, }, [NM_META_SETTING_TYPE_WIMAX] = { .meta_type = NM_META_SETTING_TYPE_WIMAX, + .setting_priority = NM_SETTING_PRIORITY_HW_BASE, .setting_name = NM_SETTING_WIMAX_SETTING_NAME, .get_setting_gtype = nm_setting_wimax_get_type, }, [NM_META_SETTING_TYPE_WIRED] = { .meta_type = NM_META_SETTING_TYPE_WIRED, + .setting_priority = NM_SETTING_PRIORITY_HW_BASE, .setting_name = NM_SETTING_WIRED_SETTING_NAME, .get_setting_gtype = nm_setting_wired_get_type, }, [NM_META_SETTING_TYPE_WIRELESS] = { .meta_type = NM_META_SETTING_TYPE_WIRELESS, + .setting_priority = NM_SETTING_PRIORITY_HW_BASE, .setting_name = NM_SETTING_WIRELESS_SETTING_NAME, .get_setting_gtype = nm_setting_wireless_get_type, }, [NM_META_SETTING_TYPE_WIRELESS_SECURITY] = { .meta_type = NM_META_SETTING_TYPE_WIRELESS_SECURITY, + .setting_priority = NM_SETTING_PRIORITY_HW_AUX, .setting_name = NM_SETTING_WIRELESS_SECURITY_SETTING_NAME, .get_setting_gtype = nm_setting_wireless_security_get_type, }, [NM_META_SETTING_TYPE_WPAN] = { .meta_type = NM_META_SETTING_TYPE_WPAN, + .setting_priority = NM_SETTING_PRIORITY_HW_BASE, .setting_name = NM_SETTING_WPAN_SETTING_NAME, .get_setting_gtype = nm_setting_wpan_get_type, }, @@ -380,13 +422,56 @@ nm_meta_setting_infos_by_name (const char *name) const NMMetaSettingInfo * nm_meta_setting_infos_by_gtype (GType gtype) { - int i; +#if ((NETWORKMANAGER_COMPILATION) & NM_NETWORKMANAGER_COMPILATION_WITH_LIBNM_CORE_INTERNAL) + nm_auto_unref_gtypeclass GTypeClass *gtypeclass_unref = NULL; + GTypeClass *gtypeclass; + NMSettingClass *klass; + + if (!g_type_is_a (gtype, NM_TYPE_SETTING)) + goto out_none; + + gtypeclass = g_type_class_peek (gtype); + if (!gtypeclass) + gtypeclass = gtypeclass_unref = g_type_class_ref (gtype); + + nm_assert (NM_IS_SETTING_CLASS (gtypeclass)); + + klass = (NMSettingClass *) gtypeclass; + + if (!klass->setting_info) + goto out_none; + + nm_assert (klass->setting_info->get_setting_gtype); + nm_assert (klass->setting_info->get_setting_gtype () == gtype); + + return klass->setting_info; + +out_none: + +#if NM_MORE_ASSERTS > 10 + { + int i; + + /* this might hint to a bug, but it would be expected for NM_TYPE_SETTING + * and NM_TYPE_SETTING_IP_CONFIG. + * + * Assert that we didn't lookup for a gtype, which we would expect to find. + * An assertion failure here, hints to a bug in nm_setting_*_class_init(). + */ + for (i = 0; i < _NM_META_SETTING_TYPE_NUM; i++) + nm_assert (nm_meta_setting_infos[i].get_setting_gtype () != gtype); + } +#endif + return NULL; +#else + guint i; for (i = 0; i < _NM_META_SETTING_TYPE_NUM; i++) { if (nm_meta_setting_infos[i].get_setting_gtype () == gtype) return &nm_meta_setting_infos[i]; } return NULL; +#endif } /*****************************************************************************/ diff --git a/shared/nm-meta-setting.h b/shared/nm-meta-setting.h index dd4780c5d9..28091ff98e 100644 --- a/shared/nm-meta-setting.h +++ b/shared/nm-meta-setting.h @@ -26,6 +26,47 @@ /*****************************************************************************/ +/* + * 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 invalid + * + * 1: reserved for the Connection setting + * + * 2,3: hardware-related settings like Ethernet, Wi-Fi, 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. + * + * 4: hardware-related auxiliary settings that require a base setting to be + * successful first, like Wi-Fi security, 802.1x, etc. + * + * 5: hardware-independent settings that are required before IP connectivity + * can be established, like PPP, PPPoE, etc. + * + * 6: IP-level stuff + * + * 10: NMSettingUser + */ +typedef enum { /*< skip >*/ + NM_SETTING_PRIORITY_INVALID = 0, + NM_SETTING_PRIORITY_CONNECTION = 1, + NM_SETTING_PRIORITY_HW_BASE = 2, + NM_SETTING_PRIORITY_HW_NON_BASE = 3, + NM_SETTING_PRIORITY_HW_AUX = 4, + NM_SETTING_PRIORITY_AUX = 5, + NM_SETTING_PRIORITY_IP = 6, + NM_SETTING_PRIORITY_USER = 10, +} NMSettingPriority; + +/*****************************************************************************/ + typedef enum { NM_SETTING_802_1X_SCHEME_TYPE_CA_CERT, NM_SETTING_802_1X_SCHEME_TYPE_PHASE2_CA_CERT, @@ -104,12 +145,50 @@ typedef enum { _NM_META_SETTING_TYPE_NUM = NM_META_SETTING_TYPE_UNKNOWN, } NMMetaSettingType; -typedef struct { +/* this header is statically linked with both libnm-core.la and libnmc.la. + * Though, there is no stable API/ABI, so whenever on of these components + * accesses NMMetaSettingInfo or NMMetaSettingType, it only has meaning + * inside the same component. + * + * Note how NMSettingClass has field of type "struct _NMMetaSettingInfo". + * It would be a serious bug, if libnmc tries to interpret this pointer + * with the meaning of NMMetaSettingInfo. They might be different, because + * libnm.so (libnm-core.la) might be a newer version than nmcli (libnmc.la). + * + * This define helps to ensure that we don't accidentally use the pointer + * in different contexts. */ +#if ((NETWORKMANAGER_COMPILATION) & NM_NETWORKMANAGER_COMPILATION_WITH_LIBNM_CORE_INTERNAL) +#define _NMMetaSettingInfoXX _NMMetaSettingInfo +#else +#define _NMMetaSettingInfoXX _NMMetaSettingInfoCli +#endif +struct _NMMetaSettingInfoXX { NMMetaSettingType meta_type; + NMSettingPriority setting_priority; const char *setting_name; GType (*get_setting_gtype) (void); -} NMMetaSettingInfo; +}; +typedef struct _NMMetaSettingInfoXX NMMetaSettingInfo; + +/* note that we statically link nm-meta-setting.h both to libnm-core.la and + * libnmc.la. That means, there are two versions of nm_meta_setting_infos + * in nmcli. That is not easily avoidable, because at this point, we don't + * want yet to making it public API. + * + * Eventually, this should become public API of libnm, and nmcli/libnmc.la + * should use that version. + * + * Downsides of the current solution: + * + * - duplication of the array in nmcli. + * + * - there is no stable API/ABI. That means, when you have a NMMetaSettingInfo + * pointer, or a NMMetaSettingType value, the value can only be used within + * the current context (libnm-core.la or libnmc.la). In other words, libnmc.la + * (and nmcli) must never access a NMMetaSettingInfo/NMMetaSettingType value, + * that comes from libnm-core.la. + */ extern const NMMetaSettingInfo nm_meta_setting_infos[_NM_META_SETTING_TYPE_NUM + 1]; const NMMetaSettingInfo *nm_meta_setting_infos_by_name (const char *name);