【问题标题】:How to send a two dimensional array over gdbus?如何通过 gdbus 发送二维数组?
【发布时间】:2017-07-07 15:27:43
【问题描述】:

我正在尝试通过 dbus 发送一个二维字符串数组。(我使用的是 gdbus api,带有 gdbus-codegen)。
我已经定义了dbus接口如下。

<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 发送字符串数组?

【问题讨论】:

    标签: arrays glib dbus gdbus gvariant


    【解决方案1】:

    用于构建器和变体的签名不匹配:

    builder = g_variant_builder_new(G_VARIANT_TYPE("a(ia(s))"));
    ...
    variant = g_variant_new("a(a(s))", builder);
    

    【讨论】:

      【解决方案2】:
      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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-19
        • 2016-07-25
        • 1970-01-01
        • 2014-05-21
        • 1970-01-01
        相关资源
        最近更新 更多