Как получить структуру, которая была отправлена ​​как сигнал с использованием dbus?

Я создал программу, которая может отправить сигнал (строку) и другое приложение, которое может прочитать это. Я использую API-интерфейс dbus. Теперь мне нужно отправить структуру (объект) в качестве сигнала. Вот самая важная часть кода (отправка):

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

Решение

Внедрить итератор в ваше сообщение & используйте его для анализа отдельных элементов подписи 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
}
}
}
}
4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector