bonjour,

j'ai un soucis avec la classe updater du framework AIR. tout mon code se deroule sans soucis mais une fois que j'appel la fonction update de l'objet updater, l'installation se lance, mais il me dit que le fichier AIR est corrompu ...


Le principe de ma classe est de se connecter à un serveur distant, de verifier dans un fichier xml si une nouvelle version et disponible et le cas echeant de la telecharger la ou elle se trouve (indiqué dans le fichier xml) et mettre l'application à jour.

voici le code de ma classe si vous avez une idée :
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;

}
le telechargement se passe mal apparement, car sur le bureau ca fonctionne mais pas en download ... une idée ?

d'avance merci.