Gianfranco
Gianfranco

Reputation: 165

DBus Glib, send a signal with a struct nested

I'm developing an application on c++ language on linux. I want to send a signal as this:

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

The second parameter in type="(u(i)uussssu)" is an enum type.

I'm trying to register a struct

#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))

but I've some errors :

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

Can someone help me?

Thanks so much

Upvotes: 3

Views: 1521

Answers (2)

Gianfranco
Gianfranco

Reputation: 165

I resolved it: I changed G_TYPE_VALUE_ARRAY to dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_INVALID)

Then, this was:

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

Now, it is:

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

Probably, the G_TYPE_VALUE_ARRAY and the GValueArray struct aren't compatible.

Upvotes: 2

Gianfranco
Gianfranco

Reputation: 165

I resolved the first problem:

#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))

the signal interface is now correct, but when I call the 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

I initialize the second argument:

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);

Upvotes: 0

Related Questions