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

时间:2014-02-25 09:04:34

标签: c++ c ubuntu-12.04 dbus

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

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 作为基本类型)

1 个答案:

答案 0 :(得分:4)

将迭代器初始化为您的信息&用它来解析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
         }
        }
    }
}