import flash.desktop.Updater;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.filesystem.File;
import flash.filesystem.FileMode;
import flash.filesystem.FileStream;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLStream;
import flash.utils.ByteArray;
import mx.controls.Alert;
import mx.core.Application;
public class PviUpdater
{
/*
** @param xmlServer : adresse du fichier xml distant. Exemple :
http://localhost/update.xml
** Le fichier xml doit respecter un format precis:
** <pviUpdate>
** <version>1.5</version>
** <downloadLocation>http://localhost/pvi/pvi.air</downloadLocation>
** <message>new features in client and bug fix</message>
** </pviUpdate>
*/
public function PviUpdater(xmlServer:String)
{
this.xmlServer = xmlServer;
remoteVersion = new String();
remoteMsg = new String();
remoteFile = new String();
urlStr = new URLStream();
fileData = new ByteArray();
}
/*
** @brief : Permet de verifier si une mise à jours est disponible
** et de l'appliquer si necessaire.
*/
public function checkUpdate():void
{
trace("checkupdate()");
parser = Application.application.nativeApplication.applicationDescriptor;
ns = parser.namespace();
trace(parser.namespace());
trace("local version: " + parser.ns::version);
trace(parser.toXMLString());
var remoteload:URLLoader = new URLLoader;
remoteload.addEventListener(Event.COMPLETE, readRemoteVersion);
remoteload.addEventListener(IOErrorEvent.IO_ERROR, remoteErrorXML);
var request:URLRequest = new URLRequest(xmlServer);
remoteload.load(request);
}
//recupere la version de l'application sur le serveur (via le fichier xml)
private function readRemoteVersion(event:Event):void
{
trace("readRemoteVersion()");
var remoteload:URLLoader = URLLoader(event.target);
var remoteParser:XML = XML(remoteload.data);
remoteVersion = remoteParser.version;
remoteFile = remoteParser.downloadLocation;
checkVersion();
}
//verifie si la version actuelle locale est identique à celle du serveur.
private function checkVersion():void
{
trace("checkVersion()");
trace(" locale version: " + parser.ns::version);
if (parser.ns::version != remoteVersion)
getUpdate();
}
//recupere le flux de donnees sur le fichier
private function getUpdate():void
{
trace("getupdate()");
var urlReq:URLRequest= new URLRequest(remoteFile);
urlStr.addEventListener(IOErrorEvent.IO_ERROR, remoteErrorFile);
urlStr.addEventListener(Event.COMPLETE, newVersionLoaded);
urlStr.load(urlReq);
}
//copie le fichier en binaire dans le tableau fileData
private function newVersionLoaded(event:Event):void
{
trace("newVersionLoaded");
urlStr.readBytes(fileData, 0, urlStr.bytesAvailable);
writeAirFile();
}
//copie le fichier dans le file system
private function writeAirFile():void
{
trace("writeAirFile()");
//file = File.desktopDirectory.resolvePath("Update.air");
file = File.createTempDirectory().resolvePath("Update.air");
var fileStream:FileStream = new FileStream();
fileStream.addEventListener(Event.CLOSE, fileClosed);
fileStream.openAsync(file, FileMode.WRITE);
fileStream.writeBytes(fileData, 0, fileData.length);
fileStream.close();
}
//une fois le fichier copié dans le file system, on lance l'update
private function fileClosed(event:Event):void
{
trace("fileClosed()");
trace(" remoteVersion:" + remoteVersion);
var updater:Updater = new Updater();
/* updater.update(file, remoteVersion); */
updater.update(File.desktopDirectory.resolvePath("checkversion.air"), remoteVersion);
}
// Error Handler
private function remoteErrorXML(event:Event):void
{
Alert.show("IO Error with the Remote file: " + xmlServer);
}
// Error Handler
private function remoteErrorFile(event:Event):void
{
Alert.show("IO Error with the Remote file: " + remoteFile);
}
//contient le numero de version locale
//private var currentVersion:String;
//parser du fichier xml local
private var parser:XML;
//contient le numero de version du serveur
private var remoteVersion:String;
//contient l'adresse du fichier Air sur le serveur
private var remoteFile:String;
//contient le message de mise à jours (facultatif)
private var remoteMsg:String;
//contient l'adresse du fichier xml sur le serveur
private var xmlServer:String;
//contient le fichier telechargé
private var file:File;
//flux de donnees vers l'url de remoteFile
private var urlStr:URLStream;
//tableau d'octet contenant le fichier telechargé
private var fileData:ByteArray;
private var ns:Namespace;
}
Partager