2011-06-24 4 views
3

Je développe une application sur le langage C++ sous linux. Je veux envoyer un signal comme ceci:DBus Glib, envoie un signal avec une structure imbriquée

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

Le second paramètre dans type="(u(i)uussssu)" est un type ENUM.

Je suis en train d'enregistrer une 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)) 

mais j'ai quelques erreurs:

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

quelqu'un peut me aider?

Merci beaucoup

Répondre

1

Je résolus: je changé G_TYPE_VALUE_ARRAY-dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_INVALID)

Puis, ce fut:

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

Maintenant, il est:

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

Probablement, le G_TYPE_VALUE_ARRAY et la struct GValueArray ne sont pas compatible.

0

je résolu le premier problème:

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

l'interface de signal est maintenant correct, mais quand je l'appelle la 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 

J'initialiser le 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); 
Questions connexes