send a very complex stuct by dbus with dbus-glib
ivan fernandez calvo
ivan.fernandez at sacnet.es
Tue Apr 1 07:31:29 PDT 2008
I am trying to send a messge with this struct
<method name="cambioElemento">
<!--
uint32 nData; id del data
string sElemento; nombre del elemento
string sDescripcion; descripcion del elemento
string sDescripcionRE; descripcion del elemento
string sDescripcionREAC; descripcion del elemento
array struct{
string sAcronimosTexto; acronimo del estado
variant vValor; valor del estado
boolean bAlarma; valor que generan alarma
boolean bEvento; valor que generan evento
boolean bPanelDeAlarmas; valor que se muestran en el panel de alarmas
boolean bPanelDeEstados; valor que se muestran en el panel de estados
boolean bPanelDeProtecciones; valor que se muestran en el panel de protecciones
}
boolean bParpadeo; indica si la senyal parapadea
struct {
string acronimos de orden ejecutada
string acronimo de fallo de orden
string acronimo de la orden de abrir
string acronimo de la orden de cerrar
boolean indica si el origen genera evento
boolean indica si el origen genera alarma
boolean indica si la ejecucion de orden correcta genera evento
boolean indica si la ejecucion de orden correcta genera alarma
boolean indica si el fallor de orden genera evento
boolean indica si el fallor de orden genera alarma
}
-->
<arg type="(ussssa(svbbbb)b(ssssbbbbbb))" name="stcElemento" direction="in" />
</method>
but i have problems with a(svbbbb) struct . I try several GValue types (G_TYPE_VALUE_ARRAY,G_TYPE_VALUE,G_TYPE_POINTER)
but no one works.
This is the code that i use:
GValueArray* IN_stcElemento= g_value_array_new(8);
GValue *pnData = g_try_new0(GValue,1);
GValue *psElemento = g_try_new0(GValue,1);
GValue *psDescripcion = g_try_new0(GValue,1);
GValue *psDescripcionRE = g_try_new0(GValue,1);
GValue *psDescripcionREAC = g_try_new0(GValue,1);
g_value_init (pnData,G_TYPE_UINT);
g_value_init (psElemento,G_TYPE_STRING);
g_value_init (psDescripcion,G_TYPE_STRING);
g_value_init (psDescripcionRE,G_TYPE_STRING);
g_value_init (psDescripcionREAC,G_TYPE_STRING);
g_value_set_uint (pnData,1);
g_value_set_string (psElemento,"Elemento");
g_value_set_string (psDescripcion,"Descripcion");
g_value_set_string (psDescripcionRE,"Desc");
g_value_set_string (psDescripcionREAC,"Desc_AC");
/*BEGIN of the problem */
GPtrArray *pstcAcronimos = g_ptr_array_new();//struct array
GValueArray *pstcAcronimosItem= g_value_array_new(7);//struct
GValue *psAcronimosTexto = g_try_new0(GValue,1);
GValue *pvValor = g_try_new0(GValue,1);
GValue *pbAlarma = g_try_new0(GValue,1);
GValue *pbEvento = g_try_new0(GValue,1);
GValue *pbPanelDeAlarmas = g_try_new0(GValue,1);
GValue *pbPanelDeEstados = g_try_new0(GValue,1);
GValue *pbPanelDeProtecciones = g_try_new0(GValue,1);
g_value_init (psAcronimosTexto,G_TYPE_STRING);
g_value_init (pvValor,G_TYPE_VALUE);//variant type
GValue *pvValorReal = g_try_new0(GValue,1);
g_value_init (pvValorReal,G_TYPE_UINT);
g_value_set_uint (pvValorReal,1);
g_value_set_boxed (pvValor,pvValorReal);
g_value_init (pbAlarma,G_TYPE_BOOLEAN);
g_value_init (pbEvento,G_TYPE_BOOLEAN);
g_value_init (pbPanelDeAlarmas,G_TYPE_BOOLEAN);
g_value_init (pbPanelDeEstados,G_TYPE_BOOLEAN);
g_value_init (pbPanelDeProtecciones,G_TYPE_BOOLEAN);
g_value_set_string (psAcronimosTexto,"Abierto");
g_value_set_boolean (pbAlarma,TRUE);
g_value_set_boolean (pbEvento,TRUE);
g_value_set_boolean (pbPanelDeAlarmas,TRUE);
g_value_set_boolean (pbPanelDeEstados,FALSE);
g_value_set_boolean (pbPanelDeProtecciones,TRUE);
g_value_array_append (pstcAcronimosItem,psAcronimosTexto);
g_value_array_append (pstcAcronimosItem,pvValor);
g_value_array_append (pstcAcronimosItem,pbAlarma);
g_value_array_append (pstcAcronimosItem,pbEvento);
g_value_array_append (pstcAcronimosItem,pbPanelDeAlarmas);
g_value_array_append (pstcAcronimosItem,pbPanelDeEstados);
g_value_array_append (pstcAcronimosItem,pbPanelDeProtecciones);
g_ptr_array_add(pstcAcronimos,pstcAcronimosItem);
GValue *pContenedorAcronimos = g_try_new0(GValue,1);
g_value_init (pContenedorAcronimos,G_TYPE_POINTER);
g_value_set_boxed (pContenedorAcronimos,pstcAcronimos);
/*END of the problem */
GValue *pbParpadeo = g_try_new0(GValue,1);
g_value_init (pbParpadeo,G_TYPE_BOOLEAN);
g_value_set_boolean (pbParpadeo,FALSE);
GValueArray *pstcAcronimosControlableItem= g_value_array_new(10);
GValue *psAcronimoOrdenEjecurada = g_try_new0(GValue,1);
GValue *psAcronimoFalloOrden = g_try_new0(GValue,1);
GValue *psAcronimoOrdenAbrir = g_try_new0(GValue,1);
GValue *psAcronimoOrdenCerrar = g_try_new0(GValue,1);
GValue *pbEventoOrigen = g_try_new0(GValue,1);
GValue *pbAlarmaOrigen = g_try_new0(GValue,1);
GValue *pbEventoOrdenOK = g_try_new0(GValue,1);
GValue *pbAlarmaOrdenOK = g_try_new0(GValue,1);
GValue *pbEventoOrdenFallo = g_try_new0(GValue,1);
GValue *pbAlarmaOrdenFallo = g_try_new0(GValue,1);
g_value_init (psAcronimoOrdenEjecurada,G_TYPE_STRING);
g_value_init (psAcronimoFalloOrden,G_TYPE_STRING);
g_value_init (psAcronimoOrdenAbrir,G_TYPE_STRING);
g_value_init (psAcronimoOrdenCerrar,G_TYPE_STRING);
g_value_init (pbEventoOrigen,G_TYPE_BOOLEAN);
g_value_init (pbAlarmaOrigen,G_TYPE_BOOLEAN);
g_value_init (pbEventoOrdenOK,G_TYPE_BOOLEAN);
g_value_init (pbAlarmaOrdenOK,G_TYPE_BOOLEAN);
g_value_init (pbEventoOrdenFallo,G_TYPE_BOOLEAN);
g_value_init (pbAlarmaOrdenFallo,G_TYPE_BOOLEAN);
g_value_set_string (psAcronimoOrdenEjecurada,"Ejecutada");
g_value_set_string (psAcronimoFalloOrden,"Fallo orden");
g_value_set_string (psAcronimoOrdenAbrir,"Abrir");
g_value_set_string (psAcronimoOrdenCerrar,"Cerrar");
g_value_set_boolean (pbEventoOrigen,TRUE);
g_value_set_boolean (pbAlarmaOrigen,TRUE);
g_value_set_boolean (pbEventoOrdenOK,TRUE);
g_value_set_boolean (pbAlarmaOrdenOK,TRUE);
g_value_set_boolean (pbEventoOrdenFallo,TRUE);
g_value_set_boolean (pbAlarmaOrdenFallo,TRUE);
g_value_array_append (pstcAcronimosControlableItem,psAcronimoOrdenEjecurada);
g_value_array_append (pstcAcronimosControlableItem,psAcronimoFalloOrden);
g_value_array_append (pstcAcronimosControlableItem,psAcronimoFalloOrden);
g_value_array_append (pstcAcronimosControlableItem,psAcronimoOrdenAbrir);
g_value_array_append (pstcAcronimosControlableItem,psAcronimoOrdenCerrar);
g_value_array_append (pstcAcronimosControlableItem,pbEventoOrigen);
g_value_array_append (pstcAcronimosControlableItem,pbAlarmaOrigen);
g_value_array_append (pstcAcronimosControlableItem,pbEventoOrdenOK);
g_value_array_append (pstcAcronimosControlableItem,pbAlarmaOrdenOK);
g_value_array_append (pstcAcronimosControlableItem,pbEventoOrdenFallo);
g_value_array_append (pstcAcronimosControlableItem,pbAlarmaOrdenFallo);
GValue *pContenedorAcronimosControlable = g_try_new0(GValue,1);
g_value_init (pContenedorAcronimosControlable,G_TYPE_VALUE_ARRAY);
g_value_set_boxed (pContenedorAcronimosControlable,pstcAcronimosControlableItem);
//final struct
g_value_array_append (IN_stcElemento,pnData);
g_value_array_append (IN_stcElemento,psElemento);
g_value_array_append (IN_stcElemento,psDescripcion);
g_value_array_append (IN_stcElemento,psDescripcionRE);
g_value_array_append (IN_stcElemento,psDescripcionREAC);
g_value_array_append (IN_stcElemento,pContenedorAcronimos);
g_value_array_append (IN_stcElemento,pbParpadeo);
g_value_array_append (IN_stcElemento,pContenedorAcronimosControlable);
bRet = com_sac_messageDBus_Configuracion_cambio_elemento (oCliente->m_Driver_proxy, IN_stcElemento, &error);
/*
*********************END*********************
*/
and this are the glue method to the client (generated with dbus-binding-tool)
gboolean
com_sac_messageDBus_Configuracion_cambio_elemento (DBusGProxy *proxy, const GValueArray* IN_stcElemento, GError **error)
{
return dbus_g_proxy_call (proxy, "cambioElemento", error,
dbus_g_type_get_struct ("GValueArray",
G_TYPE_UINT,
G_TYPE_STRING,
G_TYPE_STRING,
G_TYPE_STRING,
G_TYPE_STRING,
dbus_g_type_get_collection ("GPtrArray",
dbus_g_type_get_struct ("GValueArray",
G_TYPE_STRING,
G_TYPE_VALUE,
G_TYPE_BOOLEAN,
G_TYPE_BOOLEAN,
G_TYPE_BOOLEAN,
G_TYPE_BOOLEAN,
G_TYPE_INVALID)),
G_TYPE_BOOLEAN,
dbus_g_type_get_struct ("GValueArray",
G_TYPE_STRING,
G_TYPE_STRING,
G_TYPE_STRING,
G_TYPE_STRING,
G_TYPE_BOOLEAN,
G_TYPE_BOOLEAN,
G_TYPE_BOOLEAN,
G_TYPE_BOOLEAN,
G_TYPE_BOOLEAN,
G_TYPE_BOOLEAN,
G_TYPE_INVALID),
G_TYPE_INVALID),
IN_stcElemento,
G_TYPE_INVALID,
G_TYPE_INVALID);
}
Someone know who to pass this struct to dbus function without error
with G_TYPE_POINTER return a warning
(process:11515): GLib-GObject-CRITICAL **: g_value_set_boxed: assertion `G_VALUE_HOLDS_BOXED (value)' failed
with G_TYPE_VALUE_ARRAY return an assert
GLib-ERROR **: /tmp/buildd/glib2.0-2.16.1/glib/gmem.c:175: failed to allocate 2691164960 bytes
with G_TYPE_VALUE return an assert
(process:14048): GLib-GObject-WARNING **: can't peek value table for type `(null)' which is not currently referenced
(process:14048): GLib-GObject-WARNING **: /tmp/buildd/glib2.0-2.16.1/gobject/gvalue.c:96: cannot initialize GValue with type `(null)', this type has no GTypeValueTable implementation
(process:14048): GLib-GObject-CRITICAL **: g_value_copy: assertion `G_IS_VALUE (src_value)' failed
--
Un Saludo
Ivan Fernandez Calvo
--
SISTEMAS AVANZADOS DE CONTROL, S.A.
Iván Fernández Calvo
Departamento de Ingeniería
Edificio Prisma
C/ Colquide 6, planta baja
28230 Las Rozas, MADRID
Teléfono 91 636 35 40 Ext.: 208
Fax: 91 637 83 72
e-mail: ivan.fernandez at sacnet.es
web: www.sacnet.es
--
La presente comunicación tiene carácter confidencial y es para el
exclusivo uso del destinatario indicado en la misma. Si Ud. no es
el destinatario indicado, le informamos que cualquier forma de
distribución, reproducción o uso de esta comunicación y/o de la
información contenida en la misma están estrictamente prohibidos
por la ley. Si Ud. ha recibido esta comunicación por error, por
favor, notifíquelo inmediatamente al remitente contestando a este
mensaje y proceda a continuación a destruirlo. Gracias por su colaboración.
This communication contains confidential information. It is for the
exclusive use of the intended addressee. If you are not the intended
addressee, please note that any form of distribution, copying or use of
this communication or the information in it is strictly prohibited by
law. If you have received this communication in error, please
immediately notify the sender by reply e-mail and destroy this message.
Thank you for your cooperation.
More information about the dbus
mailing list