diff options
author | Dan Winship <danw@gnome.org> | 2014-11-16 16:13:06 -0500 |
---|---|---|
committer | Dan Winship <danw@redhat.com> | 2014-11-19 09:24:10 -0500 |
commit | 780d8bf2fe5ce6c2d391a87f99691e4d7db03104 (patch) | |
tree | 9054bde5f30374d94b1357541aed00c0c53f197f | |
parent | 2f81a8bcbe968381e66abf4758cc3e12ac8cb5a7 (diff) | |
download | NetworkManager-780d8bf2fe5ce6c2d391a87f99691e4d7db03104.tar.gz |
libnm: fix nm-setting-docs.xml property types
Add nm_setting_get_dbus_property_type(), and use this to get the
correct type for properties in nm-seting-docs.xml, in situations where
the D-Bus and GObject property types don't match.
In the case of enum/flags-valued properties, give both the enum name
and the underlying D-Bus type.
-rw-r--r-- | libnm-core/nm-setting.c | 34 | ||||
-rw-r--r-- | libnm-core/nm-setting.h | 4 | ||||
-rwxr-xr-x | libnm/generate-setting-docs.py | 43 | ||||
-rw-r--r-- | libnm/libnm.ver | 1 |
4 files changed, 62 insertions, 20 deletions
diff --git a/libnm-core/nm-setting.c b/libnm-core/nm-setting.c index 50dab89d80..037baa6b58 100644 --- a/libnm-core/nm-setting.c +++ b/libnm-core/nm-setting.c @@ -612,6 +612,12 @@ variant_type_for_gtype (GType type) return G_VARIANT_TYPE_DOUBLE; else if (type == G_TYPE_STRV) return G_VARIANT_TYPE_STRING_ARRAY; + else if (type == G_TYPE_BYTES) + return G_VARIANT_TYPE_BYTESTRING; + else if (g_type_is_a (type, G_TYPE_ENUM)) + return G_VARIANT_TYPE_INT32; + else if (g_type_is_a (type, G_TYPE_FLAGS)) + return G_VARIANT_TYPE_UINT32; else g_assert_not_reached (); } @@ -822,6 +828,34 @@ _nm_setting_new_from_dbus (GType setting_type, return setting; } +/** + * nm_setting_get_dbus_property_type: + * @setting: an #NMSetting + * @property_name: the property of @setting to get the type of + * + * Gets the D-Bus marshalling type of a property. @property_name is a D-Bus + * property name, which may not necessarily be a #GObject property. + * + * Returns: the D-Bus marshalling type of @property on @setting. + */ +const GVariantType * +nm_setting_get_dbus_property_type (NMSetting *setting, + const char *property_name) +{ + const NMSettingProperty *property; + + g_return_val_if_fail (NM_IS_SETTING (setting), NULL); + g_return_val_if_fail (property_name != NULL, NULL); + + property = nm_setting_class_find_property (NM_SETTING_GET_CLASS (setting), property_name); + g_return_val_if_fail (property != NULL, NULL); + + if (property->dbus_type) + return property->dbus_type; + else + return variant_type_for_gtype (property->param_spec->value_type); +} + gboolean _nm_setting_get_property (NMSetting *setting, const char *property_name, GValue *value) { diff --git a/libnm-core/nm-setting.h b/libnm-core/nm-setting.h index 887aef4a6b..3601fce30b 100644 --- a/libnm-core/nm-setting.h +++ b/libnm-core/nm-setting.h @@ -273,6 +273,10 @@ gboolean nm_setting_set_secret_flags (NMSetting *setting, NMSettingSecretFlags flags, GError **error); +/* Properties */ +const GVariantType *nm_setting_get_dbus_property_type (NMSetting *setting, + const char *property_name); + G_END_DECLS #endif /* __NM_SETTING_H__ */ diff --git a/libnm/generate-setting-docs.py b/libnm/generate-setting-docs.py index ef2918ec55..1d7aaea665 100755 --- a/libnm/generate-setting-docs.py +++ b/libnm/generate-setting-docs.py @@ -22,21 +22,23 @@ from gi.repository import NM, GObject import argparse, datetime, re, sys import xml.etree.ElementTree as ET -type_name_map = { - 'gchararray': 'string', - 'GSList_gchararray_': 'array of string', - 'GArray_guchar_': 'byte array', - 'gboolean': 'boolean', - 'guint64': 'uint64', - 'gint': 'int32', - 'guint': 'uint32', - 'GArray_guint_': 'array of uint32', - 'GPtrArray_GArray_guint__': 'array of array of uint32', - 'GPtrArray_GArray_guchar__': 'array of byte array', - 'GPtrArray_gchararray_': 'array of string', - 'GHashTable_gchararray+gchararray_': 'dict of (string::string)', - 'GPtrArray_GValueArray_GArray_guchar_+guint+GArray_guchar___': 'array of (byte array, uint32, byte array)', - 'GPtrArray_GValueArray_GArray_guchar_+guint+GArray_guchar_+guint__': 'array of (byte array, uint32, byte array, uint32)' +dbus_type_name_map = { + 'b': 'boolean', + 's': 'string', + 'i': 'int32', + 'u': 'uint32', + 't': 'uint64', + 'x': 'int64', + 'y': 'byte', + 'as': 'array of string', + 'au': 'array of uint32', + 'ay': 'byte array', + 'a{ss}': 'dict of string to string', + 'a{sv}': 'vardict', + 'aau': 'array of array of uint32', + 'aay': 'array of byte array', + 'a(ayuay)': 'array of legacy IPv6 address struct', + 'a(ayuayu)': 'array of legacy IPv6 route struct', } ns_map = { @@ -83,11 +85,12 @@ def init_constants(girxml, settings): setting_names[setting_type_name] = setting_name def get_prop_type(setting, pspec, propxml): - prop_type = pspec.value_type.name - if prop_type in type_name_map: - prop_type = type_name_map[prop_type] - if prop_type is None: - prop_type = '' + dbus_type = setting.get_dbus_property_type(pspec.name).dup_string() + prop_type = dbus_type_name_map[dbus_type] + + if GObject.type_is_a(pspec.value_type, GObject.TYPE_ENUM) or GObject.type_is_a(pspec.value_type, GObject.TYPE_FLAGS): + prop_type = "%s (%s)" % (pspec.value_type.name, prop_type) + return prop_type def get_docs(setting, pspec, propxml): diff --git a/libnm/libnm.ver b/libnm/libnm.ver index d1957ececc..ae28e58e3e 100644 --- a/libnm/libnm.ver +++ b/libnm/libnm.ver @@ -519,6 +519,7 @@ global: nm_setting_enumerate_values; nm_setting_generic_get_type; nm_setting_generic_new; + nm_setting_get_dbus_property_type; nm_setting_get_name; nm_setting_get_secret_flags; nm_setting_get_type; |