DBus Glib, отправь сигнал с вложенной структурой - PullRequest
3 голосов
/ 24 июня 2011

Я разрабатываю приложение на языке c ++ для Linux.Я хочу отправить сигнал следующим образом:

<signal name="EmitSignal">
    <arg type="(u(i)uussssu)" name="t_struct_of_signal" direction="out" />
</signal>

Второй параметр в type="(u(i)uussssu)" является типом enum.

Я пытаюсь зарегистрировать структуру

#define STRUCT_OF_SIGNAL (dbus_g_type_get_struct ("GValueArray", \
                         G_TYPE_UINT, \
                         G_TYPE_POINTER, \ 
                         G_TYPE_UINT, \
                         G_TYPE_UINT, \
                         G_TYPE_STRING, \
                         G_TYPE_STRING, \
                         G_TYPE_STRING, \
                         G_TYPE_STRING, \
                         G_TYPE_UINT, \
                         G_TYPE_INVALID))

, но у меня есть некоторые ошибки:

** (process:21792): WARNING **: No marshaller registered for type "gpointer"
** (process:21792): WARNING **: failed to marshal parameter 1 for signal EmitSignal

Может кто-нибудь мне помочь?

Большое спасибо

Ответы [ 2 ]

1 голос
/ 28 июня 2011

Я решил: я изменил G_TYPE_VALUE_ARRAY на dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_INVALID)

Тогда это было:

g_value_init(g_value_array_get_nth(ret, 0), G_TYPE_VALUE_ARRAY);

Теперь это:

g_value_init(g_value_array_get_nth(ret, 0), dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_INVALID));

Возможно, структура G_TYPE_VALUE_ARRAY и GValueArray несовместимы.

0 голосов
/ 27 июня 2011

Я решил первую проблему:

#define STRUCT_OF_SIGNAL (dbus_g_type_get_struct ("GValueArray", \
          G_TYPE_UINT,\
          dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_INVALID), \
          G_TYPE_UINT,\
          G_TYPE_UINT,\
          G_TYPE_STRING,\
          G_TYPE_STRING,\
          G_TYPE_STRING,\
          G_TYPE_STRING,\
          G_TYPE_UINT,\
          G_TYPE_INVALID))

интерфейс сигнала теперь правильный, но когда я вызываю g_signal_emit:

(process:11052): GLib-GObject-CRITICAL **: g_value_copy: assertion `g_value_type_compatible (G_VALUE_TYPE (src_value), G_VALUE_TYPE (dest_value))' failed

(process:11052): GLib-GObject-CRITICAL **: g_value_array_get_nth: assertion `value_array != NULL' failed

(process:11052): GLib-GObject-CRITICAL **: g_value_copy: assertion `G_IS_VALUE (src_value)' failed

Я инициализирую второй аргумент:

g_value_array_prepend(ret, NULL);
g_value_init(g_value_array_get_nth(ret, 0), G_TYPE_VALUE_ARRAY);

GValueArray *l_class = g_value_array_new(1);
g_value_array_prepend(l_class, NULL);
g_value_init(g_value_array_get_nth(l_class, 0), G_TYPE_UINT);
g_value_set_uint(g_value_array_get_nth(l_class, 0), obj->class_id);

g_value_set_boxed(g_value_array_get_nth(ret, 0), l_class);
...