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