gpt4 book ai didi

c++ - 如何使用 dbus 接收作为信号发送的结构?

转载 作者:太空宇宙 更新时间:2023-11-04 01:31:24 29 4
gpt4 key购买 nike

我创建了一个可以发送信号(字符串)的程序和一个可以读取它的其他应用程序。我使用 dbus api。现在我需要发送一个结构(对象)作为信号。这是代码中最重要的部分(发送):

struct x
{
int a;
char *b;
int c;
} obj;


DBusMessageIter myMsgItrA, myMsgItrB;
dbus_message_iter_init_append(msg, &myMsgItrA);

dbus_message_iter_open_container(&myMsgItrA, DBUS_TYPE_STRUCT, NULL, &myMsgItrB);

dbus_message_append_basic(&myMsgItrB, DBUS_TYPE_INT32, &obj.a);
dbus_message_append_basic(&myMsgItrB, DBUS_TYPE_STRING, &obj.b);
dbus_message_append_basic(&myMsgItrB, DBUS_TYPE_INT32, &obj.c);

dbus_message_close_container(&myMsgItrA, &myMsgItrB);

如何接收该信号? (我对基本类型使用了 dbus_message_iter_get_basic)

最佳答案

将迭代器初始化为您的消息并使用它来解析 dbus 签名的各个元素。使用 dbus_message_iter_next 移动到 dbus 消息的下一个单独元素,使用 dbus_message_iter_recurse 进入复杂的单独元素。

例如:考虑一个签名 s(iua{is})。单个元素是 s 和 (iua{is})。使用 dbus_message_iter_init 初始化顶级迭代器。

使用 dbus_message_iter_next 从 s 移动到 (iua{is})。

将迭代器指向 (iua{is}) 后,使用 dbus_message_iter_recurse 初始化此元素的子迭代器,并使用子迭代器进一步解析。

对于签名(isi),解析如下所示

DBusMessageIter rootIter;
dbus_message_iter_init(msg, &rootIter);

if (DBUS_TYPE_STRUCT == dbus_message_iter_get_arg_type(&rootIter))//Get type of argument
{
//Initialize iterator for struct
DBusMessageIter structIter;
dbus_message_iter_recurse(&rootIter, &structIter);

//Argument 1 is int32
if (DBUS_TYPE_INT32 == dbus_message_iter_get_arg_type(&structIter))
{
int a;
dbus_message_iter_get_basic(&structIter, &a);//Read integer
dbus_message_iter_next(&structIter);//Go to next argument of structiter
//Arg 2 should be a string

if (DBUS_TYPE_STRING == dbus_message_iter_get_arg_type(&structIter))
{
char* str = NULL;
dbus_message_iter_get_basic(&structIter, &str);//this function is used to read basic dbus types like int, string etc.
dbus_message_iter_next(&structIter);//Go to next argument of root iter

//Argument 3 is int32
if (DBUS_TYPE_INT32 == dbus_message_iter_get_arg_type(&structIter))
{
int c;
dbus_message_iter_get_basic(&structIter, &c);//Read integer
//PARSING SHOULD END HERE ON SUCCESS
}
}
}
}

关于c++ - 如何使用 dbus 接收作为信号发送的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22009261/

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