El nodo sys-message es un nodo especial de la colección “Empresas”, para recibir eventos de XOneLive.

Utilizado para realizar acciones cuando esté ocurriendo alguno de los eventos llevados a cabo por el XOneLive.

Estos eventos están codificados numéricamente, y a continuación se pone un ejemplo de cada uno de ellos donde mostramos un mensaje descriptivo de la acción a la que pertenece cada código de evento.

Actualmente no se pueden controlar únicamente uno ó dos casos aislados del XOneLive y no hacer nada en los otros, si se especifica el nodo <sys-message> para sacar un mensaje con el código 1002, el programador debe gestionar también el caso 1003 (Provisión segura), puesto que el framework encontrará el nodo <sys-message> y entenderá que es el programador el que se hará cargo de las acciones a realizar.

<sys-message>
	<action name="runscript">
		<param name="codigo" />
		<param name="message" />
		<param name="liveResponse" />
		<script language="javascript">
			sysMessage(codigo,message);
		</script>
	</action>
</sys-message>
function sysMessage(codigo,message) {
	var cadena="";
	switch(codigo) {
 
		case 1000:
			cadena=" Actualización descargándose (un mensaje por cada actualización).";
			break;
 
		case 1001:
			cadena=" Actualización aplicada (un mensaje por cada actualización).";
			break;
 
		case 1002:
			cadena=" Se han aplicado todas las actualizaciones (al comprobar las actualizaciones puede haber más de una, éste se invoca al aplicar todas).";
			appData.getCurrentEnterprise().setVariables("ACTUALIZACIONES",1);
 
			// Obtenemos un puntero al objeto del menú principal que está en una variable global (En el before-edit del entry-point se habrá inicializado esta variable con self)
			var objeto=appData.getCurrentEnterprise().getVariables("MENUPRINCIPALFASE1");
			var view=ui.getView(appData.getCurrentEnterprise().getVariables("MENUPRINCIPALFASE1"));
			if (view != undefined) {
				if (objeto != undefined) {
					objeto.executeNode("comprobarActualizaciones");
				}
			}
			break;
 
		case 1003:
 
			/* Provisionamiento seguro. */
			/* Declarar el nodo sys-message requiere que este caso lo controle el programador,
			/* es responsabilidad del programador limpiar la cola de réplica y cerrar la aplicación.
			/* ************************ */
 
			//ui.showToast("Live: " + liveResponse.liveReceiver);
			ui.msgBox("Advertencia, se ha programado una actualización de base de datos. Se van a replicar todos los datos y cerrar la aplicación.", "Mensaje", 0);
			var bResult = replica.processReplicatorQueue(liveResponse);
			if (bResult) {
				//ui.msgBox("Cola de salida del replicador procesada correctamente. Cerrando aplicación.", "Mensaje", 0);
				appData.failWithMessage(-11888, "##EXITAPP##");
			} else {
				ui.showToast("Error al procesar la cola de salida");
			}
			break;
	}
}

A continuación se desarrolla a modo de ejemplo un código para mostrar una ventana flotante cuando se recibe el código 1002 desde el XOneLive (Cuando se han aplicado todas las actualizaciones pendientes).

Colección entry-point

En la colección entry-point, hemos de definir un frame flotante que será el que mostremos al usuario cuando recibamos la notificación desde el XOneLive.

<!-- Código del frame flotante donde vamos a mostrar el mensaje informativo al usuario con una cuenta atrás para cerrar el framework y aplicar los cambios que hayan llegado a través del XOneLive -->
<frame name="frmActualizacion" width="930p" height="714p" floating="true" top="0p" left="175p" bgcolor="#FFFFFF" align="left" disablevisible="MAP_ACTUALIZACION=0" modal="true" framebox="true">
    <prop name="MAP_TXT_TITLE3" type="T" title=" " class="ppal_subtitulo" width="100%" height="20%" fontsize="20" text-bgcolor="#CCFF0000" />
    <prop name="MAP_TXT_TITLE4" type="T" title=" " class="ppal_subtitulo" height="40%" lmargin="2%" tmargin="2%" text-forecolor="#000000" text-bgcolor="#FFFFFF" />
    <prop name="MAP_ACEPTAR" type="B" title="ACEPTAR" class="btn_MsgActualizacion"  method="ExecuteNode(aceptaractualizacion)" />
    <prop name="MAP_CANCELAR" type="B" title="CANCELAR" class="btn_MsgActualizacion" method="ExecuteNode(cancelaractualizacion)" newline="false" />
</frame>
 
<!-- Con el siguiente código en la colección entry-point, guardamos un puntero al objeto self en una variable global para poder referirnos a ella en cualquier momento. -->
<before-edit>
	<action name="runscript">
		<script language="javascript">
			appData.getCurrentEnterprise().setVariables("MENUPRINCIPALFASE1",self);		
		</script>
	</action>
</before-edit>
 
<!-- Este es el nodo que se ejecuta en el código de ejemplo anterior cuando se captura el código 1002. -->
<comprobarActualizaciones show-wait-dialog="false" refresh="false">
	<action name="runscript">
		<script language="javascript">
			comprobarActualizaciones();
		</script>
	</action>
</comprobarActualizaciones>
 
<aceptaractualizacion show-wait-dialog="false" refresh="false">
	<action name="runscript">
		<script language="javascript">
			appData.getCurrentEnterprise().setVariables("ACTUALIZACIONES",0);
			ui.restartApp();
		</script>
	</action>
</aceptaractualizacion>
 
<cancelaractualizacion show-wait-dialog="false" refresh="false">
	<action name="runscript">
		<script language="javascript">
			self.MAP_ACTUALIZACION=0;
			self.MAP_BANDERACANCELAR=1;
			ui.executeActionAfterDelay("comprobarActualizaciones",60);
			ui.getView(self).refreshAll("frmActualizacion");
		  </script>
	</action>
</cancelaractualizacion>


En el código siguiente, se pone visible el frame flotante “frmActualizacion” y se programa un contador con una cuenta atrás que se muestra en dicha ventana

function comprobarActualizaciones() {
	if (appData.getCurrentEnterprise().getVariables("ACTUALIZACIONES")==1) {
		self.MAP_ACTUALIZACION=1;
		ui.getView(self).refreshAll("frmActualizacion");
 
		appData.getCurrentEnterprise().setVariables("CONTADOR",10);
		//##XONE_TRANSLATE_NEXT_LINE##
		self.MAP_TXT_TITLE4="La aplicación se reseteará en " + appData.getCurrentEnterprise().getVariables("CONTADOR");
		ui.refresh("MAP_TXT_TITLE4");
 
		self.MAP_BANDERACANCELAR=0;
		ui.executeActionAfterDelay("contador",1);
	}
}
 
function contador() {
	if (self.MAP_BANDERACANCELAR==0) {
  		var contador=appData.getCurrentEnterprise().getVariables("CONTADOR")-1;
 
		appData.getCurrentEnterprise().setVariables("CONTADOR",contador);
		//##XONE_TRANSLATE_NEXT_LINE##
		self.MAP_TXT_TITLE4="La aplicación se reseteará en " + appData.getCurrentEnterprise().getVariables("CONTADOR");
		ui.refresh("MAP_TXT_TITLE4");
 
		if (appData.getCurrentEnterprise().getVariables("CONTADOR")==0) {
			appData.getCurrentEnterprise().setVariables("ACTUALIZACIONES",0);
			ui.restartApp();
		} else {
			ui.executeActionAfterDelay("contador",1);
		}
	}
}


Código CSS utilizado

.ppal_subtitulo {
	extends:prop;
	width:96%;
	fontsize:10;
	fontbold:true;
	labelwidth:0; 
	text-border:false; 
	locked:true; 
	text-forecolor:#FFFFFF; 
	align:center|center; 
	text-align:center|center; 
}
 
.btn_MsgActualizacion {
	bgcolor:#CCFF0000;
	forecolor:#FFFFFF;
	width:33%;
	lmargin:11%;
	height:60p;
	text-align:left|top;
	textfont-size:12;
	tmargin:3%;
 }