How to pass array argument (ia(sb)) to gdbus method call,

236 Views Asked by At

I am trying to use the systemd API (SetLinkDomain) with gdbus bindings, below is the example code,

GVariant *BuidArray()
  {
    GVariantBuilder *struc = g_variant_builder_new(G_VARIANT_TYPE("(sb)"));
    const char *name = "abc.net";

    g_variant_builder_add(struc, "s", name);
    g_variant_builder_add(struc, "b", TRUE);
    GVariant *ret = g_variant_builder_end(struc);
    g_variant_builder_unref(struc);
    return ret;
  }
    GVariantBuilder *array = g_variant_builder_new(G_VARIANT_TYPE("(a(sb))"));
    g_variant_builder_add_value(array, BuidArray());

    result = g_dbus_connection_call_sync (session,
                    "org.freedesktop.resolve1",
                    "/org/freedesktop/resolve1",
                    "org.freedesktop.resolve1.Manager",
                    "SetLinkDomains",
                    g_variant_new("(ia(sb))", 2, g_variant_builder_end(array)),
                    NULL,
                    G_DBUS_CALL_FLAGS_NONE,
                    -1,
                    NULL,
                    &error);
 if (result == nullptr)
 {
    std::cout << "Failed to call setLinkDomains " << error->message << std::endl;
 }

above code is not working and giving below error.

(process:19628): GLib-CRITICAL **: 10:29:01.904: g_variant_builder_add_value: assertion '!GVSB(builder)->expected_type || g_variant_is_of_type (value, GVSB(builder)->expected_type)' failed
(process:19628): GLib-CRITICAL **: 10:29:01.904: g_variant_builder_end: assertion 'GVSB(builder)->offset >= GVSB(builder)->min_items' failed

I think I am doing mistake in passing the parameter (ia(sb)) to GDBus API, Can any one help me here.

1

There are 1 best solutions below

0
Ali-Ibrahim On

GVariantBuilder *array = g_variant_builder_new(G_VARIANT_TYPE("(a(sb))")); must be GVariantBuilder *array = g_variant_builder_new(G_VARIANT_TYPE("a(sb)"));