如何通过gdbus发送二维数组?
问题描述:
我试图通过dbus发送两个字符串数组(我正在使用gdbus API,使用gdbus-codegen)。
我已经定义了dbus接口,如下所示。如何通过gdbus发送二维数组?
<method name="foo">
<arg name="count" direction="out" type="i" />
<arg name="array" direction="out" type="a(ia(s))" />
</method>
我想通过以下方式来创建GVariant:
GVariantBuilder *builder;
GVariant *variant;
builder = g_variant_builder_new(G_VARIANT_TYPE("a(ia(s))"));
for (int i = 0; i < count; i++)
{
g_variant_builder_add(builder, "(ia(s))",
options[i].num_supported,
pack_string_array(options[i].num_supported, options[i].supported_values));
}
variant = g_variant_new("a(a(s))", builder);
my_interface_complete_foo(interface, invocation, count, variant);
其中pack_string_array组C风格的字符串数组到gvariant。
GVariant* pack_string_array(int num_val, char **val)
{
GVariantBuilder *builder;
GVariant *values;
builder = g_variant_builder_new(G_VARIANT_TYPE("a(s)"));
for (int i = 0; i < num_val; i++)
{
g_message("%s", val[i]);
g_variant_builder_add(builder, "(s)", val[i]);
}
if (num_val == 0)
g_variant_builder_add(builder, "(s)", "NA");
values = g_variant_new("a(s)", builder);
return values;
}
然而,当我测试了一下,程序崩溃与以下错误:
GLib-CRITICAL **: g_variant_builder_end: assertion 'ensure_valid_builder (builder)' failed
g_variant_get_type: assertion 'value != NULL' failed
我怎么能发送字符串数组的数组在DBUS?
答
用于建设者和变异的签名不匹配:
builder = g_variant_builder_new(G_VARIANT_TYPE("a(ia(s))"));
...
variant = g_variant_new("a(a(s))", builder);
答
GVariantBuilder* builder = g_variant_builder_new(G_VARIANT_TYPE("a(ia(s))"));
for (int i = 0; i < count; i++) {
GVariantBuilder* builderStr = g_variant_builder_new(G_VARIANT_TYPE("a(s)"));
for (int j = 0; j < nr_of_string; j++) {
g_variant_builder_add(builderStr, "(s)", "Test");
}
g_variant_builder_add(builder, "(ia(s))", 32, **builderStr**);
}
GVariant* retVariant = g_variant_builder_end(builder);