什么gdbus函数returns一个子对象节点的列表?
What gdbus function returns a list of child object nodes?
我能够内省一个 DBus 节点,并获得一些 XML,其中包括有关子节点的信息。但是,这需要我解析 XML,并且我正在努力使应用程序保持轻量级。我可以使用什么 gdbus 函数来简单地获取子节点对象名称的列表?
这是获取 XML 的代码。
#include <stdio.h>
#include <stdlib.h>
#include <gio/gio.h>
int main(int argc,char *argv[])
{
GError *err=NULL;
GVariant *result;
GDBusConnection *c;
const char *xml;
if ((c = g_bus_get_sync(G_BUS_TYPE_SYSTEM,NULL,&err)) == NULL) {
if (err) fprintf(stderr,"g_bus_get error: %s\n",err->message);
exit(1);
} /* if */
result = g_dbus_connection_call_sync(c,"org.bluez","/org/bluez",
"org.freedesktop.DBus.Introspectable",
"Introspect",NULL,G_VARIANT_TYPE("(s)"),
G_DBUS_CALL_FLAGS_NONE,3000,NULL,&err);
if (result==NULL) {
if (err) fprintf(stderr,"gbus_connection_call error: %s\n",
err->message);
exit(1);
} /* if */
g_variant_get(result,"(&s)",&xml);
printf("%s\n",xml);
exit(0);
}
所以上面的代码有效。在返回的 XML 深处,有一些元素描述了 org.bluez 对象节点的子节点。在我的例子中有这样一个元素:
<node name="hci0"></node>.
但是,我不想解析 XML 来找到它。还有什么其他 gdbus 函数可以用来简单地检索 org.bluez 的子项的名称,而不需要 XML 解析器?
我认为最好的办法是使用内置的 XML 解析器。这就是 gdbus introspect
命令行工具的实现方式。
调用 g_dbus_node_info_new_for_xml function to parse the XML. This give you back a GDBusNodeInfo
, which you must free with g_dbus_node_info_unref()
. The best example I can find of how to use it is here,它解析 XML,然后遍历返回的结构的 nodes
元素。
我能够内省一个 DBus 节点,并获得一些 XML,其中包括有关子节点的信息。但是,这需要我解析 XML,并且我正在努力使应用程序保持轻量级。我可以使用什么 gdbus 函数来简单地获取子节点对象名称的列表?
这是获取 XML 的代码。
#include <stdio.h>
#include <stdlib.h>
#include <gio/gio.h>
int main(int argc,char *argv[])
{
GError *err=NULL;
GVariant *result;
GDBusConnection *c;
const char *xml;
if ((c = g_bus_get_sync(G_BUS_TYPE_SYSTEM,NULL,&err)) == NULL) {
if (err) fprintf(stderr,"g_bus_get error: %s\n",err->message);
exit(1);
} /* if */
result = g_dbus_connection_call_sync(c,"org.bluez","/org/bluez",
"org.freedesktop.DBus.Introspectable",
"Introspect",NULL,G_VARIANT_TYPE("(s)"),
G_DBUS_CALL_FLAGS_NONE,3000,NULL,&err);
if (result==NULL) {
if (err) fprintf(stderr,"gbus_connection_call error: %s\n",
err->message);
exit(1);
} /* if */
g_variant_get(result,"(&s)",&xml);
printf("%s\n",xml);
exit(0);
}
所以上面的代码有效。在返回的 XML 深处,有一些元素描述了 org.bluez 对象节点的子节点。在我的例子中有这样一个元素:
<node name="hci0"></node>.
但是,我不想解析 XML 来找到它。还有什么其他 gdbus 函数可以用来简单地检索 org.bluez 的子项的名称,而不需要 XML 解析器?
我认为最好的办法是使用内置的 XML 解析器。这就是 gdbus introspect
命令行工具的实现方式。
调用 g_dbus_node_info_new_for_xml function to parse the XML. This give you back a GDBusNodeInfo
, which you must free with g_dbus_node_info_unref()
. The best example I can find of how to use it is here,它解析 XML,然后遍历返回的结构的 nodes
元素。