gpt4 book ai didi

c - D-Bus如何创建和发送一个Dict?

转载 作者:太空狗 更新时间:2023-10-29 15:05:39 29 4
gpt4 key购买 nike

我有一个进程向 DBus 公开一个方法,其中一个参数采用以下类型签名 a{sv}:

Dict of {String, Variant}

The libDBus documentation dbus_message_append_args 未能为此提供足够的引用。一些信息出现在 specification under container-types 中,特别是:

A DICT_ENTRY works exactly like a struct, but rather than parentheses it uses curly braces, and it has more restrictions. The restrictions are: it occurs only as an array element type; it has exactly two single complete types inside the curly braces; the first single complete type (the "key") must be a basic type rather than a container type. Implementations must not accept dict entries outside of arrays, must not accept dict entries with zero, one, or more than two fields, and must not accept dict entries with non-basic-typed keys. A dict entry is always a key-value pair.


在尝试附加字典时,我收到以下错误消息:

type dict_entry isn't supported yet in dbus_message_append_args_valist

尽管我实际上使用的是 dbus_message_append_args(我猜错误消息有点不对劲)。

dbus_message_append_args() 还有另外两种选择:

dbus_message_iter_append_basic()dbus_message_iter_append_fixed_array()

虽然我可以使用以下内容创建一个空的 Dict 容器:

  const char * container_d_sig = "{sv}";
DBusMessageIter iter, sub;
dbus_message_iter_init_append(msg, &iter);
dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, container_d_sig, &sub);
dbus_message_iter_close_container(&iter, &sub);

这两种附加方法似乎都不支持添加结构。不确定在这里尝试什么...

最佳答案

首先,关于 D-Bus 库:您在几个地方谈到了 dbus-glib,但您提到的函数不是 dbus-glib 的一部分,而是 libdbus。如果您仍在尝试寻找使用 D-Bus 的最佳方式,我建议您忘记这两个:libdbus 是非常低级的(它的文档甚至以 开头“如果您直接使用这个低级 API,你正在注册一些痛苦”)并且 dbus-glib 已被弃用。目前最好的 D-Bus API 是 GDBus,它是 GLib GIO 的一部分:它是一个比其他两个 API 设计得更好的 API,经过了良好的测试和支持。

现在,至于实际问题,dbus_message_append_args() 的文档确实说得很清楚:

To append variable-length basic types, or any more complex value, you have to use an iterator rather than this function.

换句话说,您应该使用 dbus_message_iter_open_container() 来准备迭代器,直到它指向可以使用 dbus_message_iter_append_basic() 的地方。请注意,在您的示例中,字典是一个容器,字典条目是一个容器,变体是一个容器……换句话说,它变得非常复杂非常快。如果您真的想这样做,请查看例如Connman示例代码。

正如我所提到的,理智的路线是 GDBus。在那里创建更复杂的签名非常容易,因为您可以使用 GVariantBuilder API:

GVariantBuilder builder;
g_variant_builder_init (&builder, G_VARIANT_TYPE("a{sv}"));
g_variant_builder_add (&builder, "{sv}", "name1", my_variant);

/* Now use the builder results with g_dbus_connection_call()
or g_dbus_proxy_call() */

关于c - D-Bus如何创建和发送一个Dict?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29973486/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com