Aunque AIR ofrece la posibilidad de comprobar si existe conexión o no, para este tutorial hemos preferido comprobar directamente si la fuente de datos XML remota está accesible o no.

El motivo para ello es asegurarnos de que aunque haya conexión, el XML remoto está disponible (el sitio podría estar caído). Al mismo tiempo tiempo queríamos evitar una doble conexión (una para comprobar el estado y otra para leerlo). Para ello partimos de un xml local. El código realiza estos pasos:

  1. Crea un dataset de Spry vacio
  2. Se intenta conectar con el xml remoto: Si lo encuentra, actualiza el xml local. En caso contrario, el xml local permanece sin alterar
  3. Hacemos que Spry cargue el xml local (que ya estará actualizado si el remoto estaba disponible)

El primer paso es cargar los archivo js necesarios de AIR y Spry:

[php]<script type="text/javascript" src="js/AIRAliases.js"></script>
<script src="SpryAssets/xpath.js" type="text/javascript"></script>
<script src="SpryAssets/SpryData.js" type="text/javascript"></script>
[/php]

A continuación comienza el bloque de script: Las primeras seis lineas crean el dataset, la conexión y definen 2 listeners para gestionar la lectura o el error en su caso; finalmente, leemos el contenido de la url:

//Creamos un dataset vacio, que cargaremos más adelante llamando a loadDataset()
var ds1 = new Spry.Data.XMLDataSet(null, "events/event",{useCache:false});
//llamamos al archivo externo
//añadimos 2 listeners para gestionar la lectura del archivo o el error de lectura
var urlRemota = new air.URLRequest("http://www.dwug.es/spry/3/events.xml");
var loader = new air.URLLoader();
loader.addEventListener(air.Event.COMPLETE, lecturaCompleta);
loader.addEventListener(air.IOErrorEvent.IO_ERROR, errorIO);
loader.load(urlRemota);

La función loadDataSet se encarga de cargar el archivo xml local:

function loadDataset(){
ds1.setURL("data/eventos.xml");
ds1.loadData();
}

La función errorIO se encarga de cambiar el texto de un div del documento a ‘offline’ y carga el dataset local (que no se ha modificado, ya que ha habido un error):

function errorIO(event){
document.getElementById('estado').innerHTML="Offline";
loadDataset();
}

La función lecturaCompleta (invocada si se ha relizado la conexión y se ha leido el xml remoto) se encarga de sobreescribir el xml local y cargar el dataset (que ahora ya estará actualizado):

function lecturaCompleta(event){
document.getElementById('estado').innerHTML="Online";
//obtenemos el contenido del xml remoto
var dataXML = event.target.data;
//buscamos el archivo local: primero su carpeta y luego el archivo
var carpetaDestino=air.File.applicationResourceDirectory.resolve("data");
var archivoDestino = carpetaDestino.resolve("eventos.xml");
//Abrimos el fileStream para poder acceder al archivo
var destinoStream = new air.FileStream();
//listener para avisar de que se ha escrito
destinoStream.addEventListener(air.Event.CLOSE, escrituraCompleta);
//Abrimos de forma asíncrona, para que lance el evento al terminar
destinoStream.openAsync(archivoDestino, air.FileMode.WRITE);
//sobreescribimos el archivo local
destinoStream.writeUTFBytes(dataXML);
//cerramos el fileStream
destinoStream.close();
}

Finalmente, la función escrituraCompleta se invoca cuando se ha terminado de sobreescribir el xml local con los datos remotos. se limita a cargar el dataset:

function escrituraCompleta(event){
loadDataset();
}

El código completo del documento puede verse en la siguiente URL:
http://www.dwug.es/spry/spry_air_online_offline.txt