summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Winship <danw@gnome.org>2014-11-16 16:13:06 -0500
committerDan Winship <danw@redhat.com>2014-11-19 09:24:10 -0500
commit780d8bf2fe5ce6c2d391a87f99691e4d7db03104 (patch)
tree9054bde5f30374d94b1357541aed00c0c53f197f
parent2f81a8bcbe968381e66abf4758cc3e12ac8cb5a7 (diff)
downloadNetworkManager-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.c34
-rw-r--r--libnm-core/nm-setting.h4
-rwxr-xr-xlibnm/generate-setting-docs.py43
-rw-r--r--libnm/libnm.ver1
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;