summaryrefslogtreecommitdiff
path: root/libnm-core/nm-setting-private.h
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2018-07-28 15:26:03 +0200
committerThomas Haller <thaller@redhat.com>2018-08-10 10:38:19 +0200
commit3793804314c32b7199311736a8b1638c8f28d9fc (patch)
tree9b7261dd787b611f3c181831eb106d287aafdd19 /libnm-core/nm-setting-private.h
parent2b43ce3a940664a063f49c167abb614c241940cf (diff)
downloadNetworkManager-3793804314c32b7199311736a8b1638c8f28d9fc.tar.gz
libnm: rework setting metadata for property handling
NMSetting internally already tracked a list of all proper GObject properties and D-Bus-only properties. Rework the tracking of the list, so that: - instead of attaching the data to the GType of the setting via g_type_set_qdata(), it is tracked in a static array indexed by NMMetaSettingType. This allows to find the setting-data by simple pointer arithmetic, instead of taking a look and iterating (like g_type_set_qdata() does). Note, that this is still thread safe, because the static table entry is initialized in the class-init function with _nm_setting_class_commit(). And it only accessed by following a NMSettingClass instance, thus the class constructor already ran (maybe not for all setting classes, but for the particular one that we look up). I think this makes initialization of the metadata simpler to understand. Previously, in a first phase each class would attach the metadata to the GType as setting_property_overrides_quark(). Then during nm_setting_class_ensure_properties() it would merge them and set as setting_properties_quark(). Now, during the first phase, we only incrementally build a properties_override GArray, which we finally hand over during nm_setting_class_commit(). - sort the property infos by name and do binary search. Also expose this meta data types as internal API in nm-setting-private.h. While not accessed yet, it can prove beneficial, to have direct (internal) access to these structures. Also, rename NMSettingProperty to NMSettInfoProperty to use a distinct naming scheme. We already have 40+ subclasses of NMSetting that are called NMSetting*. Likewise, NMMetaSetting* is heavily used already. So, choose a new, distinct name.
Diffstat (limited to 'libnm-core/nm-setting-private.h')
-rw-r--r--libnm-core/nm-setting-private.h103
1 files changed, 65 insertions, 38 deletions
diff --git a/libnm-core/nm-setting-private.h b/libnm-core/nm-setting-private.h
index 4a92264b7c..99c7b69ccd 100644
--- a/libnm-core/nm-setting-private.h
+++ b/libnm-core/nm-setting-private.h
@@ -105,44 +105,69 @@ NMSetting *_nm_setting_new_from_dbus (GType setting_type,
NMSettingParseFlags parse_flags,
GError **error);
-typedef GVariant * (*NMSettingPropertyGetFunc) (NMSetting *setting,
- const char *property);
-typedef GVariant * (*NMSettingPropertySynthFunc) (NMSetting *setting,
- NMConnection *connection,
- const char *property);
-typedef gboolean (*NMSettingPropertySetFunc) (NMSetting *setting,
- GVariant *connection_dict,
- const char *property,
- GVariant *value,
- NMSettingParseFlags parse_flags,
- GError **error);
-typedef gboolean (*NMSettingPropertyNotSetFunc) (NMSetting *setting,
- GVariant *connection_dict,
- const char *property,
- NMSettingParseFlags parse_flags,
- GError **error);
-
-void _nm_setting_class_add_dbus_only_property (NMSettingClass *setting_class,
- const char *property_name,
- const GVariantType *dbus_type,
- NMSettingPropertySynthFunc synth_func,
- NMSettingPropertySetFunc set_func);
-
-void _nm_setting_class_override_property (NMSettingClass *setting_class,
- const char *property_name,
- const GVariantType *dbus_type,
- NMSettingPropertyGetFunc get_func,
- NMSettingPropertySetFunc set_func,
- NMSettingPropertyNotSetFunc not_set_func);
-
-typedef GVariant * (*NMSettingPropertyTransformToFunc) (const GValue *from);
-typedef void (*NMSettingPropertyTransformFromFunc) (GVariant *from, GValue *to);
-
-void _nm_setting_class_transform_property (NMSettingClass *setting_class,
- const char *property_name,
- const GVariantType *dbus_type,
- NMSettingPropertyTransformToFunc to_dbus,
- NMSettingPropertyTransformFromFunc from_dbus);
+/*****************************************************************************/
+
+static inline GArray *
+_nm_sett_info_property_override_create_array (void)
+{
+ return g_array_new (FALSE, FALSE, sizeof (NMSettInfoProperty));
+}
+
+GArray *_nm_sett_info_property_override_create_array_ip_config (void);
+
+void _nm_setting_class_commit_full (NMSettingClass *setting_class,
+ NMMetaSettingType meta_type,
+ const NMSettInfoSettDetail *detail,
+ GArray *properties_override);
+
+static inline void
+_nm_setting_class_commit (NMSettingClass *setting_class,
+ NMMetaSettingType meta_type)
+{
+ _nm_setting_class_commit_full (setting_class, meta_type, NULL, NULL);
+}
+
+#define NM_SETT_INFO_SETT_DETAIL(...) \
+ (&((const NMSettInfoSettDetail) { \
+ __VA_ARGS__ \
+ }))
+
+#define NM_SETT_INFO_PROPERTY(...) \
+ (&((const NMSettInfoProperty) { \
+ __VA_ARGS__ \
+ }))
+
+void _properties_override_add_struct (GArray *properties_override,
+ const NMSettInfoProperty *prop_info);
+
+void _properties_override_add__helper (GArray *properties_override,
+ NMSettInfoProperty *prop_info);
+
+#define _properties_override_add(properties_override, \
+ ...) \
+ (_properties_override_add_struct (properties_override, \
+ NM_SETT_INFO_PROPERTY (__VA_ARGS__)))
+
+void _properties_override_add_dbus_only (GArray *properties_override,
+ const char *property_name,
+ const GVariantType *dbus_type,
+ NMSettingPropertySynthFunc synth_func,
+ NMSettingPropertySetFunc set_func);
+
+void _properties_override_add_override (GArray *properties_override,
+ GParamSpec *param_spec,
+ const GVariantType *dbus_type,
+ NMSettingPropertyGetFunc get_func,
+ NMSettingPropertySetFunc set_func,
+ NMSettingPropertyNotSetFunc not_set_func);
+
+void _properties_override_add_transform (GArray *properties_override,
+ GParamSpec *param_spec,
+ const GVariantType *dbus_type,
+ NMSettingPropertyTransformToFunc to_dbus,
+ NMSettingPropertyTransformFromFunc from_dbus);
+
+/*****************************************************************************/
gboolean _nm_setting_use_legacy_property (NMSetting *setting,
GVariant *connection_dict,
@@ -151,4 +176,6 @@ gboolean _nm_setting_use_legacy_property (NMSetting *setting,
GPtrArray *_nm_setting_need_secrets (NMSetting *setting);
+/*****************************************************************************/
+
#endif /* NM_SETTING_PRIVATE_H */