core: port IP/DHCP config to gdbus
authorDan Winship <danw@redhat.com>
Wed, 15 Apr 2015 18:53:30 +0000 (14:53 -0400)
committerDan Winship <danw@redhat.com>
Mon, 10 Aug 2015 13:41:26 +0000 (09:41 -0400)
introspection/nm-ip6-config.xml
src/NetworkManagerUtils.c
src/NetworkManagerUtils.h
src/nm-dhcp4-config.c
src/nm-dhcp6-config.c
src/nm-ip4-config.c
src/nm-ip6-config.c

index f2ef386..1a107bf 100644 (file)
       </tp:docstring>
     </property>
     <property name="Nameservers" type="aay" access="read">
+      <!-- gdbus-codegen assumes that "aay" means "array of non-UTF-8
+          string" and so would make this a char **.
+      -->
+      <annotation name="org.gtk.GDBus.C.ForceGVariant" value="1"/>
       <tp:docstring>The nameservers in use.</tp:docstring>
     </property>
     <property name="Domains" type="as" access="read">
index 8f24ee0..bab2755 100644 (file)
@@ -2991,3 +2991,24 @@ nm_utils_g_value_set_object_path_array (GValue *value, GSList *objects)
        }
        g_value_take_boxed (value, paths);
 }
+
+/**
+ * nm_utils_g_value_set_strv:
+ * @value: a #GValue, initialized to store a #G_TYPE_STRV
+ * @strings: a #GPtrArray of strings
+ *
+ * Converts @strings to a #GStrv and stores it in @value.
+ */
+void
+nm_utils_g_value_set_strv (GValue *value, GPtrArray *strings)
+{
+       char **strv;
+       int i;
+
+       strv = g_new (char *, strings->len + 1);
+       for (i = 0; i < strings->len; i++)
+               strv[i] = g_strdup (strings->pdata[i]);
+       strv[i] = NULL;
+
+       g_value_take_boxed (value, strv);
+}
index 8eb4edf..a5a0563 100644 (file)
@@ -253,5 +253,6 @@ void _nm_utils_set_testing (NMUtilsTestFlags flags);
 
 void nm_utils_g_value_set_object_path (GValue *value, gpointer object);
 void nm_utils_g_value_set_object_path_array (GValue *value, GSList *objects);
+void nm_utils_g_value_set_strv (GValue *value, GPtrArray *strings);
 
 #endif /* __NETWORKMANAGER_UTILS_H__ */
index 5b1345c..1aed32d 100644 (file)
 #include "nm-default.h"
 #include "nm-dbus-interface.h"
 #include "nm-dhcp4-config.h"
-#include "nm-dhcp4-config-glue.h"
-#include "nm-dbus-glib-types.h"
 #include "nm-utils.h"
 
+#include "nmdbus-dhcp4-config.h"
+
 G_DEFINE_TYPE (NMDhcp4Config, nm_dhcp4_config, NM_TYPE_EXPORTED_OBJECT)
 
 #define NM_DHCP4_CONFIG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_DHCP4_CONFIG, NMDhcp4ConfigPrivate))
@@ -128,11 +128,7 @@ get_property (GObject *object, guint prop_id,
 
        switch (prop_id) {
        case PROP_OPTIONS:
-               /* dbus_g_value_parse_g_variant() will call g_value_init(), but
-                * @value is already inited.
-                */
-               g_value_unset (value);
-               dbus_g_value_parse_g_variant (priv->options, value);
+               g_value_set_variant (value, priv->options);
                break;
        default:
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -157,11 +153,13 @@ nm_dhcp4_config_class_init (NMDhcp4ConfigClass *config_class)
        /* properties */
        g_object_class_install_property
                (object_class, PROP_OPTIONS,
-                g_param_spec_boxed (NM_DHCP4_CONFIG_OPTIONS, "", "",
-                                    DBUS_TYPE_G_MAP_OF_VARIANT,
-                                    G_PARAM_READABLE |
-                                    G_PARAM_STATIC_STRINGS));
+                g_param_spec_variant (NM_DHCP4_CONFIG_OPTIONS, "", "",
+                                      G_VARIANT_TYPE ("a{sv}"),
+                                      NULL,
+                                      G_PARAM_READABLE |
+                                      G_PARAM_STATIC_STRINGS));
 
        nm_exported_object_class_add_interface (NM_EXPORTED_OBJECT_CLASS (config_class),
-                                               &dbus_glib_nm_dhcp4_config_object_info);
+                                               NMDBUS_TYPE_DHCP4_CONFIG_SKELETON,
+                                               NULL);
 }
index db7147a..4855839 100644 (file)
 #include "nm-default.h"
 #include "nm-dbus-interface.h"
 #include "nm-dhcp6-config.h"
-#include "nm-dhcp6-config-glue.h"
-#include "nm-dbus-glib-types.h"
 #include "nm-utils.h"
 
+#include "nmdbus-dhcp6-config.h"
+
 G_DEFINE_TYPE (NMDhcp6Config, nm_dhcp6_config, NM_TYPE_EXPORTED_OBJECT)
 
 #define NM_DHCP6_CONFIG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_DHCP6_CONFIG, NMDhcp6ConfigPrivate))
@@ -128,11 +128,7 @@ get_property (GObject *object, guint prop_id,
 
        switch (prop_id) {
        case PROP_OPTIONS:
-               /* dbus_g_value_parse_g_variant() will call g_value_init(), but
-                * @value is already inited.
-                */
-               g_value_unset (value);
-               dbus_g_value_parse_g_variant (priv->options, value);
+               g_value_set_variant (value, priv->options);
                break;
        default:
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -157,11 +153,13 @@ nm_dhcp6_config_class_init (NMDhcp6ConfigClass *config_class)
        /* properties */
        g_object_class_install_property
                (object_class, PROP_OPTIONS,
-                g_param_spec_boxed (NM_DHCP6_CONFIG_OPTIONS, "", "",
-                                    DBUS_TYPE_G_MAP_OF_VARIANT,
-                                    G_PARAM_READABLE |
-                                    G_PARAM_STATIC_STRINGS));
+                g_param_spec_variant (NM_DHCP6_CONFIG_OPTIONS, "", "",
+                                      G_VARIANT_TYPE ("a{sv}"),
+                                      NULL,
+                                      G_PARAM_READABLE |
+                                      G_PARAM_STATIC_STRINGS));
 
        nm_exported_object_class_add_interface (NM_EXPORTED_OBJECT_CLASS (config_class),
-                                               &dbus_glib_nm_dhcp6_config_object_info);
+                                               NMDBUS_TYPE_DHCP6_CONFIG_SKELETON,
+                                               NULL);
 }
index f660407..02257d8 100644 (file)
 #include "nm-default.h"
 #include "nm-utils.h"
 #include "nm-platform.h"
-#include "nm-dbus-glib-types.h"
-#include "nm-ip4-config-glue.h"
 #include "NetworkManagerUtils.h"
 #include "nm-core-internal.h"
 #include "nm-route-manager.h"
 #include "nm-core-internal.h"
 #include "nm-macros-internal.h"
 
+#include "nmdbus-ip4-config.h"
+
 G_DEFINE_TYPE (NMIP4Config, nm_ip4_config, NM_TYPE_EXPORTED_OBJECT)
 
 #define NM_IP4_CONFIG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_IP4_CONFIG, NMIP4ConfigPrivate))
@@ -2139,15 +2139,6 @@ finalize (GObject *object)
        G_OBJECT_CLASS (nm_ip4_config_parent_class)->finalize (object);
 }
 
-static void
-gvalue_destroy (gpointer data)
-{
-       GValue *value = (GValue *) data;
-
-       g_value_unset (value);
-       g_slice_free (GValue, value);
-}
-
 static void
 get_property (GObject *object, guint prop_id,
                          GValue *value, GParamSpec *pspec)
@@ -2161,127 +2152,116 @@ get_property (GObject *object, guint prop_id,
                break;
        case PROP_ADDRESS_DATA:
                {
-                       GPtrArray *addresses = g_ptr_array_new ();
+                       GVariantBuilder array_builder, addr_builder;
                        int naddr = nm_ip4_config_get_num_addresses (config);
                        int i;
 
+                       g_variant_builder_init (&array_builder, G_VARIANT_TYPE ("aa{sv}"));
                        for (i = 0; i < naddr; i++) {
                                const NMPlatformIP4Address *address = nm_ip4_config_get_address (config, i);
-                               GHashTable *addr_hash;
-                               GValue *val;
-
-                               addr_hash = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, gvalue_destroy);
-
-                               val = g_slice_new0 (GValue);
-                               g_value_init (val, G_TYPE_STRING);
-                               g_value_set_string (val, nm_utils_inet4_ntop (address->address, NULL));
-                               g_hash_table_insert (addr_hash, "address", val);
 
-                               val = g_slice_new0 (GValue);
-                               g_value_init (val, G_TYPE_UINT);
-                               g_value_set_uint (val, address->plen);
-                               g_hash_table_insert (addr_hash, "prefix", val);
+                               g_variant_builder_init (&addr_builder, G_VARIANT_TYPE ("a{sv}"));
+                               g_variant_builder_add (&addr_builder, "{sv}",
+                                                      "address",
+                                                      g_variant_new_string (nm_utils_inet4_ntop (address->address, NULL)));
+                               g_variant_builder_add (&addr_builder, "{sv}",
+                                                      "prefix",
+                                                      g_variant_new_uint32 (address->plen));
 
                                if (*address->label) {
-                                       val = g_slice_new0 (GValue);
-                                       g_value_init (val, G_TYPE_STRING);
-                                       g_value_set_string (val, address->label);
-                                       g_hash_table_insert (addr_hash, "label", val);
+                                       g_variant_builder_add (&addr_builder, "{sv}",
+                                                              "label",
+                                                              g_variant_new_string (address->label));
                                }
 
-                               g_ptr_array_add (addresses, addr_hash);
+                               g_variant_builder_add (&array_builder, "a{sv}", &addr_builder);
                        }
 
-                       g_value_take_boxed (value, addresses);
+                       g_value_take_variant (value, g_variant_builder_end (&array_builder));
                }
                break;
        case PROP_ADDRESSES:
                {
-                       GPtrArray *addresses = g_ptr_array_new ();
+                       GVariantBuilder array_builder;
                        int naddr = nm_ip4_config_get_num_addresses (config);
                        int i;
 
+                       g_variant_builder_init (&array_builder, G_VARIANT_TYPE ("aau"));
                        for (i = 0; i < naddr; i++) {
                                const NMPlatformIP4Address *address = nm_ip4_config_get_address (config, i);
-                               GArray *array = g_array_sized_new (FALSE, TRUE, sizeof (guint32), 3);
-                               guint32 gateway = i == 0 ? priv->gateway : 0;
+                               guint32 dbus_addr[3];
 
-                               g_array_append_val (array, address->address);
-                               g_array_append_val (array, address->plen);
-                               g_array_append_val (array, gateway);
+                               dbus_addr[0] = address->address;
+                               dbus_addr[1] = address->plen;
+                               dbus_addr[2] = i == 0 ? priv->gateway : 0;
 
-                               g_ptr_array_add (addresses, array);
+                               g_variant_builder_add (&array_builder, "@au",
+                                                      g_variant_new_fixed_array (G_VARIANT_TYPE_UINT32,
+                                                                                 dbus_addr, 3, sizeof (guint32)));
                        }
 
-                       g_value_take_boxed (value, addresses);
+                       g_value_take_variant (value, g_variant_builder_end (&array_builder));
                }
                break;
        case PROP_ROUTE_DATA:
                {
-                       GPtrArray *routes = g_ptr_array_new ();
+                       GVariantBuilder array_builder, route_builder;
                        guint nroutes = nm_ip4_config_get_num_routes (config);
                        int i;
 
+                       g_variant_builder_init (&array_builder, G_VARIANT_TYPE ("aa{sv}"));
                        for (i = 0; i < nroutes; i++) {
                                const NMPlatformIP4Route *route = nm_ip4_config_get_route (config, i);
-                               GHashTable *route_hash;
-                               GValue *val;
-
-                               route_hash = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, gvalue_destroy);
-
-                               val = g_slice_new0 (GValue);
-                               g_value_init (val, G_TYPE_STRING);
-                               g_value_set_string (val, nm_utils_inet4_ntop (route->network, NULL));
-                               g_hash_table_insert (route_hash, "dest", val);
-
-                               val = g_slice_new0 (GValue);
-                               g_value_init (val, G_TYPE_UINT);
-                               g_value_set_uint (val, route->plen);
-                               g_hash_table_insert (route_hash, "prefix", val);
 
+                               g_variant_builder_init (&route_builder, G_VARIANT_TYPE ("a{sv}"));
+                               g_variant_builder_add (&route_builder, "{sv}",
+                                                      "dest",
+                                                      g_variant_new_string (nm_utils_inet4_ntop (route->network, NULL)));
+                               g_variant_builder_add (&route_builder, "{sv}",
+                                                      "prefix",
+                                                      g_variant_new_uint32 (route->plen));
                                if (route->gateway) {
-                                       val = g_slice_new0 (GValue);
-                                       g_value_init (val, G_TYPE_STRING);
-                                       g_value_set_string (val, nm_utils_inet4_ntop (route->gateway, NULL));
-                                       g_hash_table_insert (route_hash, "next-hop", val);
+                                       g_variant_builder_add (&route_builder, "{sv}",
+                                                              "next-hop",
+                                                              g_variant_new_string (nm_utils_inet4_ntop (route->gateway, NULL)));
                                }
+                               g_variant_builder_add (&route_builder, "{sv}",
+                                                      "metric",
+                                                      g_variant_new_uint32 (route->metric));
 
-                               val = g_slice_new0 (GValue);
-                               g_value_init (val, G_TYPE_UINT);
-                               g_value_set_uint (val, route->metric);
-                               g_hash_table_insert (route_hash, "metric", val);
-
-                               g_ptr_array_add (routes, route_hash);
+                               g_variant_builder_add (&array_builder, "a{sv}", &route_builder);
                        }
 
-                       g_value_take_boxed (value, routes);
+                       g_value_take_variant (value, g_variant_builder_end (&array_builder));
                }
                break;
        case PROP_ROUTES:
                {
-                       GPtrArray *routes = g_ptr_array_new ();
+                       GVariantBuilder array_builder;
                        guint nroutes = nm_ip4_config_get_num_routes (config);
                        int i;
 
+                       g_variant_builder_init (&array_builder, G_VARIANT_TYPE ("aau"));
                        for (i = 0; i < nroutes; i++) {
                                const NMPlatformIP4Route *route = nm_ip4_config_get_route (config, i);
-                               GArray *array;
+                               guint32 dbus_route[4];
 
                                /* legacy versions of nm_ip4_route_set_prefix() in libnm-util assert that the
                                 * plen is positive. Skip the default routes not to break older clients. */
                                if (NM_PLATFORM_IP_ROUTE_IS_DEFAULT (route))
                                        continue;
 
-                               array = g_array_sized_new (FALSE, TRUE, sizeof (guint32), 4);
-                               g_array_append_val (array, route->network);
-                               g_array_append_val (array, route->plen);
-                               g_array_append_val (array, route->gateway);
-                               g_array_append_val (array, route->metric);
+                               dbus_route[0] = route->network;
+                               dbus_route[1] = route->plen;
+                               dbus_route[2] = route->gateway;
+                               dbus_route[3] = route->metric;
 
-                               g_ptr_array_add (routes, array);
+                               g_variant_builder_add (&array_builder, "@au",
+                                                      g_variant_new_fixed_array (G_VARIANT_TYPE_UINT32,
+                                                                                 dbus_route, 4, sizeof (guint32)));
                        }
 
-                       g_value_take_boxed (value, routes);
+                       g_value_take_variant (value, g_variant_builder_end (&array_builder));
                }
                break;
        case PROP_GATEWAY:
@@ -2291,19 +2271,27 @@ get_property (GObject *object, guint prop_id,
                        g_value_set_string (value, NULL);
                break;
        case PROP_NAMESERVERS:
-               g_value_set_boxed (value, priv->nameservers);
+               g_value_take_variant (value,
+                                     g_variant_new_fixed_array (G_VARIANT_TYPE_UINT32,
+                                                                priv->nameservers->data,
+                                                                priv->nameservers->len,
+                                                                sizeof (guint32)));
                break;
        case PROP_DOMAINS:
-               g_value_set_boxed (value, priv->domains);
+               nm_utils_g_value_set_strv (value, priv->domains);
                break;
        case PROP_SEARCHES:
-               g_value_set_boxed (value, priv->searches);
+               nm_utils_g_value_set_strv (value, priv->searches);
                break;
        case PROP_DNS_OPTIONS:
-               g_value_set_boxed (value, priv->dns_options);
+               nm_utils_g_value_set_strv (value, priv->dns_options);
                break;
        case PROP_WINS_SERVERS:
-               g_value_set_boxed (value, priv->wins);
+               g_value_take_variant (value,
+                                     g_variant_new_fixed_array (G_VARIANT_TYPE_UINT32,
+                                                                priv->wins->data,
+                                                                priv->wins->len,
+                                                                sizeof (guint32)));
                break;
        default:
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -2344,65 +2332,72 @@ nm_ip4_config_class_init (NMIP4ConfigClass *config_class)
        object_class->finalize = finalize;
 
        obj_properties[PROP_IFINDEX] =
-                g_param_spec_int (NM_IP4_CONFIG_IFINDEX, "", "",
-                                  -1, G_MAXINT, -1,
-                                  G_PARAM_READWRITE |
-                                  G_PARAM_CONSTRUCT_ONLY |
-                                  G_PARAM_STATIC_STRINGS);
+               g_param_spec_int (NM_IP4_CONFIG_IFINDEX, "", "",
+                                 -1, G_MAXINT, -1,
+                                 G_PARAM_READWRITE |
+                                 G_PARAM_CONSTRUCT_ONLY |
+                                 G_PARAM_STATIC_STRINGS);
        obj_properties[PROP_ADDRESS_DATA] =
-                g_param_spec_boxed (NM_IP4_CONFIG_ADDRESS_DATA, "", "",
-                                    DBUS_TYPE_NM_IP_ADDRESSES,
-                                    G_PARAM_READABLE |
-                                    G_PARAM_STATIC_STRINGS);
+               g_param_spec_variant (NM_IP4_CONFIG_ADDRESS_DATA, "", "",
+                                     G_VARIANT_TYPE ("aa{sv}"),
+                                     NULL,
+                                     G_PARAM_READABLE |
+                                     G_PARAM_STATIC_STRINGS);
        obj_properties[PROP_ADDRESSES] =
-               g_param_spec_boxed (NM_IP4_CONFIG_ADDRESSES, "", "",
-                                   DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UINT,
-                                   G_PARAM_READABLE |
-                                   G_PARAM_STATIC_STRINGS);
+               g_param_spec_variant (NM_IP4_CONFIG_ADDRESSES, "", "",
+                                     G_VARIANT_TYPE ("aau"),
+                                     NULL,
+                                     G_PARAM_READABLE |
+                                     G_PARAM_STATIC_STRINGS);
        obj_properties[PROP_ROUTE_DATA] =
-                g_param_spec_boxed (NM_IP4_CONFIG_ROUTE_DATA, "", "",
-                                    DBUS_TYPE_NM_IP_ROUTES,
-                                    G_PARAM_READABLE |
-                                    G_PARAM_STATIC_STRINGS);
+               g_param_spec_variant (NM_IP4_CONFIG_ROUTE_DATA, "", "",
+                                     G_VARIANT_TYPE ("aa{sv}"),
+                                     NULL,
+                                     G_PARAM_READABLE |
+                                     G_PARAM_STATIC_STRINGS);
        obj_properties[PROP_ROUTES] =
-               g_param_spec_boxed (NM_IP4_CONFIG_ROUTES, "", "",
-                                   DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UINT,
-                                   G_PARAM_READABLE |
-                                   G_PARAM_STATIC_STRINGS);
+               g_param_spec_variant (NM_IP4_CONFIG_ROUTES, "", "",
+                                     G_VARIANT_TYPE ("aau"),
+                                     NULL,
+                                     G_PARAM_READABLE |
+                                     G_PARAM_STATIC_STRINGS);
        obj_properties[PROP_GATEWAY] =
                g_param_spec_string (NM_IP4_CONFIG_GATEWAY, "", "",
                                     NULL,
                                     G_PARAM_READABLE |
                                     G_PARAM_STATIC_STRINGS);
        obj_properties[PROP_NAMESERVERS] =
-                g_param_spec_boxed (NM_IP4_CONFIG_NAMESERVERS, "", "",
-                                    DBUS_TYPE_G_UINT_ARRAY,
-                                    G_PARAM_READABLE |
-                                    G_PARAM_STATIC_STRINGS);
+               g_param_spec_variant (NM_IP4_CONFIG_NAMESERVERS, "", "",
+                                     G_VARIANT_TYPE ("au"),
+                                     NULL,
+                                     G_PARAM_READABLE |
+                                     G_PARAM_STATIC_STRINGS);
        obj_properties[PROP_DOMAINS] =
-                g_param_spec_boxed (NM_IP4_CONFIG_DOMAINS, "", "",
-                                    DBUS_TYPE_G_ARRAY_OF_STRING,
-                                    G_PARAM_READABLE |
-                                    G_PARAM_STATIC_STRINGS);
+               g_param_spec_boxed (NM_IP4_CONFIG_DOMAINS, "", "",
+                                   G_TYPE_STRV,
+                                   G_PARAM_READABLE |
+                                   G_PARAM_STATIC_STRINGS);
        obj_properties[PROP_SEARCHES] =
-                g_param_spec_boxed (NM_IP4_CONFIG_SEARCHES, "", "",
-                                    DBUS_TYPE_G_ARRAY_OF_STRING,
-                                    G_PARAM_READABLE |
-                                    G_PARAM_STATIC_STRINGS);
+               g_param_spec_boxed (NM_IP4_CONFIG_SEARCHES, "", "",
+                                   G_TYPE_STRV,
+                                   G_PARAM_READABLE |
+                                   G_PARAM_STATIC_STRINGS);
        obj_properties[PROP_DNS_OPTIONS] =
                 g_param_spec_boxed (NM_IP4_CONFIG_DNS_OPTIONS, "", "",
-                                    DBUS_TYPE_G_ARRAY_OF_STRING,
+                                    G_TYPE_STRV,
                                     G_PARAM_READABLE |
                                     G_PARAM_STATIC_STRINGS);
 
        obj_properties[PROP_WINS_SERVERS] =
-                g_param_spec_boxed (NM_IP4_CONFIG_WINS_SERVERS, "", "",
-                                    DBUS_TYPE_G_UINT_ARRAY,
-                                    G_PARAM_READABLE |
-                                    G_PARAM_STATIC_STRINGS);
+               g_param_spec_variant (NM_IP4_CONFIG_WINS_SERVERS, "", "",
+                                     G_VARIANT_TYPE ("au"),
+                                     NULL,
+                                     G_PARAM_READABLE |
+                                     G_PARAM_STATIC_STRINGS);
 
        g_object_class_install_properties (object_class, LAST_PROP, obj_properties);
 
        nm_exported_object_class_add_interface (NM_EXPORTED_OBJECT_CLASS (config_class),
-                                               &dbus_glib_nm_ip4_config_object_info);
+                                               NMDBUS_TYPE_IP4_CONFIG_SKELETON,
+                                               NULL);
 }
index 4e37a73..20bc3fe 100644 (file)
 
 #include "nm-utils.h"
 #include "nm-platform.h"
-#include "nm-dbus-glib-types.h"
-#include "nm-ip6-config-glue.h"
 #include "nm-route-manager.h"
 #include "nm-core-internal.h"
 #include "NetworkManagerUtils.h"
 #include "nm-macros-internal.h"
 
+#include "nmdbus-ip6-config.h"
+
 G_DEFINE_TYPE (NMIP6Config, nm_ip6_config, NM_TYPE_EXPORTED_OBJECT)
 
 #define NM_IP6_CONFIG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_IP6_CONFIG, NMIP6ConfigPrivate))
@@ -1891,31 +1891,21 @@ finalize (GObject *object)
 static void
 nameservers_to_gvalue (GArray *array, GValue *value)
 {
-       GPtrArray *dns;
+       GVariantBuilder builder;
        guint i = 0;
 
-       dns = g_ptr_array_new ();
+       g_variant_builder_init (&builder, G_VARIANT_TYPE ("aay"));
 
        while (array && (i < array->len)) {
                struct in6_addr *addr;
-               GByteArray *bytearray;
-               addr = &g_array_index (array, struct in6_addr, i++);
 
-               bytearray = g_byte_array_sized_new (16);
-               g_byte_array_append (bytearray, (guint8 *) addr->s6_addr, 16);
-               g_ptr_array_add (dns, bytearray);
+               addr = &g_array_index (array, struct in6_addr, i++);
+               g_variant_builder_add (&builder, "@ay",
+                                      g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE,
+                                                                 &addr, 16, 1));
        }
 
-       g_value_take_boxed (value, dns);
-}
-
-static void
-gvalue_destroy (gpointer data)
-{
-       GValue *value = (GValue *) data;
-
-       g_value_unset (value);
-       g_slice_free (GValue, value);
+       g_value_take_variant (value, g_variant_builder_end (&builder));
 }
 
 static void
@@ -1931,163 +1921,109 @@ get_property (GObject *object, guint prop_id,
                break;
        case PROP_ADDRESS_DATA:
                {
-                       GPtrArray *addresses = g_ptr_array_new ();
+                       GVariantBuilder array_builder, addr_builder;
                        int naddr = nm_ip6_config_get_num_addresses (config);
                        int i;
 
+                       g_variant_builder_init (&array_builder, G_VARIANT_TYPE ("aa{sv}"));
                        for (i = 0; i < naddr; i++) {
                                const NMPlatformIP6Address *address = nm_ip6_config_get_address (config, i);
-                               GHashTable *addr_hash;
-                               GValue *val;
-
-                               addr_hash = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, gvalue_destroy);
 
-                               val = g_slice_new0 (GValue);
-                               g_value_init (val, G_TYPE_STRING);
-                               g_value_set_string (val, nm_utils_inet6_ntop (&address->address, NULL));
-                               g_hash_table_insert (addr_hash, "address", val);
+                               g_variant_builder_init (&addr_builder, G_VARIANT_TYPE ("a{sv}"));
+                               g_variant_builder_add (&addr_builder, "{sv}",
+                                                      "address",
+                                                      g_variant_new_string (nm_utils_inet6_ntop (&address->address, NULL)));
+                               g_variant_builder_add (&addr_builder, "{sv}",
+                                                      "prefix",
+                                                      g_variant_new_uint32 (address->plen));
 
-                               val = g_slice_new0 (GValue);
-                               g_value_init (val, G_TYPE_UINT);
-                               g_value_set_uint (val, address->plen);
-                               g_hash_table_insert (addr_hash, "prefix", val);
-
-                               g_ptr_array_add (addresses, addr_hash);
+                               g_variant_builder_add (&array_builder, "a{sv}", &addr_builder);
                        }
 
-                       g_value_take_boxed (value, addresses);
+                       g_value_take_variant (value, g_variant_builder_end (&array_builder));
                }
                break;
        case PROP_ADDRESSES:
                {
-                       GPtrArray *addresses = g_ptr_array_new ();
+                       GVariantBuilder array_builder;
                        const struct in6_addr *gateway = nm_ip6_config_get_gateway (config);
                        int naddr = nm_ip6_config_get_num_addresses (config);
                        int i;
 
+                       g_variant_builder_init (&array_builder, G_VARIANT_TYPE ("a(ayuay)"));
                        for (i = 0; i < naddr; i++) {
                                const NMPlatformIP6Address *address = nm_ip6_config_get_address (config, i);
 
-                               GValueArray *array = g_value_array_new (3);
-                               GValue element = G_VALUE_INIT;
-                               GByteArray *ba;
-
-                               /* IP address */
-                               g_value_init (&element, DBUS_TYPE_G_UCHAR_ARRAY);
-                               ba = g_byte_array_new ();
-                               g_byte_array_append (ba, (guint8 *) &address->address, 16);
-                               g_value_take_boxed (&element, ba);
-                               g_value_array_append (array, &element);
-                               g_value_unset (&element);
-
-                               /* Prefix */
-                               g_value_init (&element, G_TYPE_UINT);
-                               g_value_set_uint (&element, address->plen);
-                               g_value_array_append (array, &element);
-                               g_value_unset (&element);
-
-                               /* Gateway */
-                               g_value_init (&element, DBUS_TYPE_G_UCHAR_ARRAY);
-                               ba = g_byte_array_new ();
-                               g_byte_array_append (ba, (guint8 *) (i == 0 && gateway ? gateway : &in6addr_any), sizeof (*gateway));
-                               g_value_take_boxed (&element, ba);
-                               g_value_array_append (array, &element);
-                               g_value_unset (&element);
-
-                               g_ptr_array_add (addresses, array);
+                               g_variant_builder_add (&array_builder, "(@ayu@ay)",
+                                                      g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE,
+                                                                                 &address->address, 16, 1),
+                                                      address->plen,
+                                                      g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE,
+                                                                                 (i == 0 && gateway ? gateway : &in6addr_any),
+                                                                                 16, 1));
                        }
 
-                       g_value_take_boxed (value, addresses);
+                       g_value_take_variant (value, g_variant_builder_end (&array_builder));
                }
                break;
        case PROP_ROUTE_DATA:
                {
-                       GPtrArray *routes = g_ptr_array_new ();
+                       GVariantBuilder array_builder, route_builder;
                        guint nroutes = nm_ip6_config_get_num_routes (config);
                        int i;
 
+                       g_variant_builder_init (&array_builder, G_VARIANT_TYPE ("aa{sv}"));
                        for (i = 0; i < nroutes; i++) {
                                const NMPlatformIP6Route *route = nm_ip6_config_get_route (config, i);
-                               GHashTable *route_hash;
-                               GValue *val;
-
-                               route_hash = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, gvalue_destroy);
-
-                               val = g_slice_new0 (GValue);
-                               g_value_init (val, G_TYPE_STRING);
-                               g_value_set_string (val, nm_utils_inet6_ntop (&route->network, NULL));
-                               g_hash_table_insert (route_hash, "dest", val);
-
-                               val = g_slice_new0 (GValue);
-                               g_value_init (val, G_TYPE_UINT);
-                               g_value_set_uint (val, route->plen);
-                               g_hash_table_insert (route_hash, "prefix", val);
 
+                               g_variant_builder_init (&route_builder, G_VARIANT_TYPE ("a{sv}"));
+                               g_variant_builder_add (&route_builder, "{sv}",
+                                                      "dest",
+                                                      g_variant_new_string (nm_utils_inet6_ntop (&route->network, NULL)));
+                               g_variant_builder_add (&route_builder, "{sv}",
+                                                      "prefix",
+                                                      g_variant_new_uint32 (route->plen));
                                if (!IN6_IS_ADDR_UNSPECIFIED (&route->gateway)) {
-                                       val = g_slice_new0 (GValue);
-                                       g_value_init (val, G_TYPE_STRING);
-                                       g_value_set_string (val, nm_utils_inet6_ntop (&route->gateway, NULL));
-                                       g_hash_table_insert (route_hash, "next-hop", val);
+                                       g_variant_builder_add (&route_builder, "{sv}",
+                                                              "next-hop",
+                                                              g_variant_new_string (nm_utils_inet6_ntop (&route->gateway, NULL)));
                                }
 
-                               val = g_slice_new0 (GValue);
-                               g_value_init (val, G_TYPE_UINT);
-                               g_value_set_uint (val, route->metric);
-                               g_hash_table_insert (route_hash, "metric", val);
+                               g_variant_builder_add (&route_builder, "{sv}",
+                                                      "metric",
+                                                      g_variant_new_uint32 (route->metric));
 
-                               g_ptr_array_add (routes, route_hash);
+                               g_variant_builder_add (&array_builder, "a{sv}", &route_builder);
                        }
 
-                       g_value_take_boxed (value, routes);
+                       g_value_take_variant (value, g_variant_builder_end (&array_builder));
                }
                break;
        case PROP_ROUTES:
                {
-                       GPtrArray *routes = g_ptr_array_new ();
+                       GVariantBuilder array_builder;
                        int nroutes = nm_ip6_config_get_num_routes (config);
                        int i;
 
+                       g_variant_builder_init (&array_builder, G_VARIANT_TYPE ("a(ayuayu)"));
                        for (i = 0; i < nroutes; i++) {
-                               GValueArray *array;
                                const NMPlatformIP6Route *route = nm_ip6_config_get_route (config, i);
-                               GByteArray *ba;
-                               GValue element = G_VALUE_INIT;
 
                                /* legacy versions of nm_ip6_route_set_prefix() in libnm-util assert that the
                                 * plen is positive. Skip the default routes not to break older clients. */
                                if (NM_PLATFORM_IP_ROUTE_IS_DEFAULT (route))
                                        continue;
 
-                               array = g_value_array_new (4);
-
-                               g_value_init (&element, DBUS_TYPE_G_UCHAR_ARRAY);
-                               ba = g_byte_array_new ();
-                               g_byte_array_append (ba, (guint8 *) &route->network, sizeof (route->network));
-                               g_value_take_boxed (&element, ba);
-                               g_value_array_append (array, &element);
-                               g_value_unset (&element);
-
-                               g_value_init (&element, G_TYPE_UINT);
-                               g_value_set_uint (&element, route->plen);
-                               g_value_array_append (array, &element);
-                               g_value_unset (&element);
-
-                               g_value_init (&element, DBUS_TYPE_G_UCHAR_ARRAY);
-                               ba = g_byte_array_new ();
-                               g_byte_array_append (ba, (guint8 *) &route->gateway, sizeof (route->gateway));
-                               g_value_take_boxed (&element, ba);
-                               g_value_array_append (array, &element);
-                               g_value_unset (&element);
-
-                               g_value_init (&element, G_TYPE_UINT);
-                               g_value_set_uint (&element, route->metric);
-                               g_value_array_append (array, &element);
-                               g_value_unset (&element);
-
-                               g_ptr_array_add (routes, array);
+                               g_variant_builder_add (&array_builder, "(@ayu@ayu)",
+                                                      g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE,
+                                                                                 &route->network, 16, 1),
+                                                      g_variant_new_uint32 (route->plen),
+                                                      g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE,
+                                                                                 &route->gateway, 16, 1),
+                                                      g_variant_new_uint32 (route->metric));
                        }
 
-                       g_value_take_boxed (value, routes);
+                       g_value_take_variant (value, g_variant_builder_end (&array_builder));
                }
                break;
        case PROP_GATEWAY:
@@ -2100,13 +2036,13 @@ get_property (GObject *object, guint prop_id,
                nameservers_to_gvalue (priv->nameservers, value);
                break;
        case PROP_DOMAINS:
-               g_value_set_boxed (value, priv->domains);
+               nm_utils_g_value_set_strv (value, priv->domains);
                break;
        case PROP_SEARCHES:
-               g_value_set_boxed (value, priv->searches);
+               nm_utils_g_value_set_strv (value, priv->searches);
                break;
        case PROP_DNS_OPTIONS:
-               g_value_set_boxed (value, priv->dns_options);
+               nm_utils_g_value_set_strv (value, priv->dns_options);
                break;
        default:
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -2149,59 +2085,65 @@ nm_ip6_config_class_init (NMIP6ConfigClass *config_class)
 
        /* properties */
        obj_properties[PROP_IFINDEX] =
-                g_param_spec_int (NM_IP6_CONFIG_IFINDEX, "", "",
-                                  -1, G_MAXINT, -1,
-                                  G_PARAM_READWRITE |
-                                  G_PARAM_CONSTRUCT_ONLY |
-                                  G_PARAM_STATIC_STRINGS);
+               g_param_spec_int (NM_IP6_CONFIG_IFINDEX, "", "",
+                                 -1, G_MAXINT, -1,
+                                 G_PARAM_READWRITE |
+                                 G_PARAM_CONSTRUCT_ONLY |
+                                 G_PARAM_STATIC_STRINGS);
        obj_properties[PROP_ADDRESS_DATA] =
-           g_param_spec_boxed (NM_IP6_CONFIG_ADDRESS_DATA, "", "",
-                               DBUS_TYPE_NM_IP_ADDRESSES,
-                               G_PARAM_READABLE |
-                               G_PARAM_STATIC_STRINGS);
+               g_param_spec_variant (NM_IP6_CONFIG_ADDRESS_DATA, "", "",
+                                     G_VARIANT_TYPE ("aa{sv}"),
+                                     NULL,
+                                     G_PARAM_READABLE |
+                                     G_PARAM_STATIC_STRINGS);
        obj_properties[PROP_ADDRESSES] =
-               g_param_spec_boxed (NM_IP6_CONFIG_ADDRESSES, "", "",
-                                   DBUS_TYPE_G_ARRAY_OF_IP6_ADDRESS,
-                                   G_PARAM_READABLE |
-                                   G_PARAM_STATIC_STRINGS);
+               g_param_spec_variant (NM_IP6_CONFIG_ADDRESSES, "", "",
+                                     G_VARIANT_TYPE ("a(ayuay)"),
+                                     NULL,
+                                     G_PARAM_READABLE |
+                                     G_PARAM_STATIC_STRINGS);
        obj_properties[PROP_ROUTE_DATA] =
-               g_param_spec_boxed (NM_IP6_CONFIG_ROUTE_DATA, "", "",
-                                   DBUS_TYPE_NM_IP_ROUTES,
-                                   G_PARAM_READABLE |
-                                   G_PARAM_STATIC_STRINGS);
+               g_param_spec_variant (NM_IP6_CONFIG_ROUTE_DATA, "", "",
+                                     G_VARIANT_TYPE ("aa{sv}"),
+                                     NULL,
+                                     G_PARAM_READABLE |
+                                     G_PARAM_STATIC_STRINGS);
        obj_properties[PROP_ROUTES] =
-           g_param_spec_boxed (NM_IP6_CONFIG_ROUTES, "", "",
-                               DBUS_TYPE_G_ARRAY_OF_IP6_ROUTE,
-                               G_PARAM_READABLE |
-                               G_PARAM_STATIC_STRINGS);
+               g_param_spec_variant (NM_IP6_CONFIG_ROUTES, "", "",
+                                     G_VARIANT_TYPE ("a(ayuayu)"),
+                                     NULL,
+                                     G_PARAM_READABLE |
+                                     G_PARAM_STATIC_STRINGS);
        obj_properties[PROP_GATEWAY] =
                g_param_spec_string (NM_IP6_CONFIG_GATEWAY, "", "",
                                     NULL,
                                     G_PARAM_READABLE |
                                     G_PARAM_STATIC_STRINGS);
        obj_properties[PROP_NAMESERVERS] =
-           g_param_spec_boxed (NM_IP6_CONFIG_NAMESERVERS, "", "",
-                               DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UCHAR,
-                               G_PARAM_READABLE |
-                               G_PARAM_STATIC_STRINGS);
+               g_param_spec_variant (NM_IP6_CONFIG_NAMESERVERS, "", "",
+                                     G_VARIANT_TYPE ("aay"),
+                                     NULL,
+                                     G_PARAM_READABLE |
+                                     G_PARAM_STATIC_STRINGS);
        obj_properties[PROP_DOMAINS] =
-           g_param_spec_boxed (NM_IP6_CONFIG_DOMAINS, "", "",
-                               DBUS_TYPE_G_ARRAY_OF_STRING,
-                               G_PARAM_READABLE |
-                               G_PARAM_STATIC_STRINGS);
+               g_param_spec_boxed (NM_IP6_CONFIG_DOMAINS, "", "",
+                                   G_TYPE_STRV,
+                                   G_PARAM_READABLE |
+                                   G_PARAM_STATIC_STRINGS);
        obj_properties[PROP_SEARCHES] =
-           g_param_spec_boxed (NM_IP6_CONFIG_SEARCHES, "", "",
-                               DBUS_TYPE_G_ARRAY_OF_STRING,
-                               G_PARAM_READABLE |
-                               G_PARAM_STATIC_STRINGS);
+               g_param_spec_boxed (NM_IP6_CONFIG_SEARCHES, "", "",
+                                   G_TYPE_STRV,
+                                   G_PARAM_READABLE |
+                                   G_PARAM_STATIC_STRINGS);
        obj_properties[PROP_DNS_OPTIONS] =
-           g_param_spec_boxed (NM_IP6_CONFIG_DNS_OPTIONS, "", "",
-                               DBUS_TYPE_G_ARRAY_OF_STRING,
-                               G_PARAM_READABLE |
-                               G_PARAM_STATIC_STRINGS);
+               g_param_spec_boxed (NM_IP6_CONFIG_DNS_OPTIONS, "", "",
+                                   G_TYPE_STRV,
+                                   G_PARAM_READABLE |
+                                   G_PARAM_STATIC_STRINGS);
 
        g_object_class_install_properties (object_class, LAST_PROP, obj_properties);
 
        nm_exported_object_class_add_interface (NM_EXPORTED_OBJECT_CLASS (config_class),
-                                               &dbus_glib_nm_ip6_config_object_info);
+                                               NMDBUS_TYPE_IP6_CONFIG_SKELETON,
+                                               NULL);
 }