Forums : Xul, Xbl, JS...

Aller à la discussion :  Plus récente Plus ancienne

Aller à la page :  1 2

# [Résolu] Extraction ZIP ne marche pas avec XULRunner 1.9

Envoyé par : Raphael

Date : 08/04/2007 17:00

Bonjour, je voudrais pouvoir dézipper un fichier dans un répertoire donné mais je n'y parviens pas. J'ai adapté le Tutorial du site en vain. J'utilise XULRunner 1.9a3 sous Ubuntu.

Voici mon code :

function manualUpdateYCD()
{
var nsIFilePicker = Components.interfaces.nsIFilePicker;
var fp = Components.classes["@mozilla.org/filepicker;1"]
			.createInstance(nsIFilePicker);
fp.init(window, __("importycd.title"), nsIFilePicker.modeOpen);
fp.appendFilter(__("importycd.filter"), "*.zip");
if (fp.show() == nsIFilePicker.returnOK) {
	updateYCD(fp.file);
	alert('Ok');
}
}

function updateYCD(zipFile)
{
// Répertoire de destination pour la décompression du .zip
var folder_databases = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("CurProcD", Components.interfaces.nsILocalFile);
folder_databases.append("chrome");
folder_databases.append("content");
folder_databases.append("data");
folder_databases.append("databases");
       chemin = folder_databases.path;

// Ouverture du .zip
       var zip =  Components.classes["@mozilla.org/libjar/zip-reader;1"].createInstance(  Components.interfaces.nsIZipReader );
alert(zipFile.path);
       zip.init(zipFile);
alert('test');
       zip.open();
alert('test');
       var it = zip.findEntries("*"); //patern pour recuperer le contenu de notre zip
       while (it.hasMoreElements())
       {
               var entry = it.getNext();
               entry = entry.QueryInterface(Components.interfaces.nsIZipEntry);
               var folder_databases = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("CurProcD", Components.interfaces.nsILocalFile);
               folder_databases.initWithPath(chemin);
               entryChemin = entry.name.split('/');
alert('test');
               for(i in entryChemin){
                       if(i==entryChemin.length-1 && entryChemin[i].length != 0){
                                folder_databases.append(entryChemin[i]);
                               zip.extract ( entry.name , folder_databases );
                               break;
                       }
                       folder_databases.append(entryChemin[i]);
                               try{folder_databases.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, 0664);}
                       catch(e){}
               }
       }
       zip.close();
}

Vous remarquerez que j'ai placé quelques alert() pour voir où bloque mon programme. Il va jusqu'à m'afficher le chemin de mon fichier "zip" dans ma fonction updateYCD(zipFile), mais mon alert() suivante ne s'affiche pas. Il semblerait donc que ce soit la ligne zip.init(zipFile); qui pose problème.

Mais je ne vois pas pourquoi il y a un problème... Quelqu'un saurait-il quelque chose sur le sujet ?

Merci d'avance.

# Re: Extraction ZIP ne marche pas... Je ne comprends pas d'où vient le problème.

Envoyé par : Paul Rouget

Date : 09/04/2007 18:06

Catch l'exception de ton init.

try {
zip.init(zipFile);
} catch(e) {alert(e)};

# Re: Extraction ZIP ne marche pas... Je ne comprends pas d'où vient le problème.

Envoyé par : Raphael

Date : 09/04/2007 18:30

J'ai un :

TypeError : zip.init is not a function

Pourtant, d'après XULPlanet, et le Tuto sur XULfr, ça devrait marcher non ?

Est-ce que ça pourrait venir de Ubuntu ? de XR 1.9a3 ? Ou pas du tout... ?

# Re: Extraction ZIP ne marche pas... Je ne comprends pas d'où vient le problème.

Envoyé par : thefab

Date : 09/04/2007 23:27

Je crois qui ZIPReader se trouve uniquement dans XULRunnre 1.8 et pas dans la 1.9...

alert(Components.interfaces.nsIZipReader);

Devrait le confirmer...

# Re: Extraction ZIP ne marche pas... Je ne comprends pas d'où vient le problème.

Envoyé par : Raphael

Date : 10/04/2007 09:42

Ca m'affiche :

nsIZipReader

Et s'il n'est pas dans 1.9, y-a-t-il une solution ? Ou bien suis-je condamner à vraiment repasser en 1.8 ? ET laquelle ? 1.8.0.4 ou 1.8.1.3 sachant que j'utilise SQLite3 actuellement avec ma 1.9a3... ?

# Re: Extraction ZIP ne marche pas... Je ne comprends pas d'où vient le problème.

Envoyé par : thefab

Date : 10/04/2007 16:18

Si ça t'affiche nsIZipReader ça devrait être présent dans XULRunner 1.9 donc il doit s'agir d'une autre erreur ?

De toute façon si tu utilises SQLite3 tu doit rester avec la 1.9

# Re: Extraction ZIP ne marche pas... Je ne comprends pas d'où vient le problème.

Envoyé par : Paul Rouget

Date : 10/04/2007 16:19

Tu avais:

      zip.init(zipFile);
      zip.open();

Fais plutôt:

      zip.open(zipFile);

Changement 1.8/1.9

# Re: Extraction ZIP ne marche pas... Je ne comprends pas d'où vient le problème.

Envoyé par : Raphael

Date : 10/04/2007 17:35

Ok, faut donc que je reste avec XR 1.9 (en plus j'ai essayé de revenir à 1.8.1.3 mais impossible de faire fonctionner la connexion SQLite3)

Bon, j'ai modifié et mis zip.open(zipFile) comme suggéré, et apparemment, il n'y a plus d'erreur, le script continue... mais pas longtemps. Effectivement, il semblerait que je n'entre même pas dans la boucle. Voici mon code actuel :

// Répertoire de destination pour la décompression du .zip
var folder_databases = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("CurProcD", Components.interfaces.nsILocalFile);
folder_databases.append("chrome");
folder_databases.append("content");
folder_databases.append("data");
       chemin = folder_databases.path;

// Ouverture du .zip
       var zip =  Components.classes["@mozilla.org/libjar/zip-reader;1"].createInstance(  Components.interfaces.nsIZipReader );
zip.open(zipFile);
       var it = zip.findEntries("*"); //patern pour recuperer le contenu de notre zip
       while (it.hasMoreElements())
       {
               var entry = it.getNext();
               entry = entry.QueryInterface(Components.interfaces.nsIZipEntry);
               var folder_databases = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("CurProcD", Components.interfaces.nsILocalFile);
               folder_databases.initWithPath(chemin);
               entryChemin = entry.name.split('/');

               for(i in entryChemin){
                       if(i==entryChemin.length-1 && entryChemin[i].length != 0){
                               folder_databases.append(entryChemin[i]);
                               zip.extract ( entry.name , folder_databases );
                               break;
                       }
                       folder_databases.append(entryChemin[i]);
                               try{folder_databases.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, 0664);}
                       catch(e){}
               }
       }
       zip.close();

Pourtant selon XULPlanet : http://www.xulplanet.com/references/xpco(..), il semblerait que ce soit juste.

Mais si init() et open() ont évolué dans 1.9, il y a des chances que les autres propriétés aient aussi changé non ?

Comment savoir ce qui a changé de la 1.8 à 1.9 ? Y-a-t-il une endroit où l'on peut se tenir au courant de ce genre d'évolutions ?

Ou bien le problème vient-il d'autre part ?

# Re: Extraction ZIP ne marche pas... Je ne comprends pas d'où vient le problème.

Envoyé par : Paul Rouget

Date : 10/04/2007 18:37

Catch tes exceptions. On ne peut rien te dire sans l'exception.

Sinon, l'interface est là: nsIZipReader

# Re: Extraction ZIP ne marche pas... Je ne comprends pas d'où vient le problème.

Envoyé par : Raphael

Date : 10/04/2007 19:05

Apparemment, hormis la fonction open(), le reste n'a pas changé à première vue.

Sinon, pour catcher mes exceptions, je n'ai pas l'habitude, mais j'essaie de m'y mettre. Cependant ici, je ne vois pas quoi catcher car en fait, le script fonctionne a priori, sauf que je ne rentre pas dans la boucle.

En fait, ça fait :

zip.open(zipFile);
var it = zip.findEntries("*");

Ca ne provoque pas d'erreur, donc même en catchant la 2° ligne, je n'ai pas plus d'infos. Ensuite, j'ai :

while (it.hasMoreElements())
       {
              alert('test');
              ...
       }

Mais là, rien ne se passe... il faut donc croire que je ne rentre même pas dans la boucle non ?

Je ne vois donc pas comment je peux en savoir plus... y a un moyen ?

# Re: Extraction ZIP ne marche pas... Je ne comprends pas d'où vient le problème.

Envoyé par : Paul Rouget

Date : 11/04/2007 00:44

Entoure tout ton code dans un try{...} catch(e){alert(e);}

Si tu ne catches pas tes exceptions, regarde au moins dans la console JS, et assure toi d'etre en mode strict. Tu ne pourras jamais debugger sinon.

try {
// Ouverture du .zip
var zip =  Components.classes["@mozilla.org/libjar/zip-reader;1"].
  createInstance(  Components.interfaces.nsIZipReader );
zip.open(zipFile);
var it = zip.findEntries("*");
      while (it.hasMoreElements())
      {
              var entry = it.getNext();
              entry = entry.QueryInterface(Components.interfaces.nsIZipEntry);
              var folder_databases = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("CurProcD", Components.interfaces.nsILocalFile);
              folder_databases.initWithPath(chemin);
              entryChemin = entry.name.split('/');
              for(i in entryChemin){
                      if(i==entryChemin.length-1 && entryChemin[i].length != 0){
                              folder_databases.append(entryChemin[i]);
                              zip.extract ( entry.name , folder_databases );
                              break;
                      }
                      folder_databases.append(entryChemin[i]);
                              try{folder_databases.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, 0664);}
                      catch(e){}
              }
  }
 zip.close();

} catch(e) {alert(e);}

# Re: Extraction ZIP ne marche pas... Je ne comprends pas d'où vient le problème.

Envoyé par : Raphael

Date : 11/04/2007 11:35

Ah, en fait je pensais pas qu'on pouvait catcher le contenu d'une condition de boucle, en fait si, voici l'erreur retournée :

TypeError : it.hasMoreElements() is not a function

Faut-t-il en déduire que hasMoreElements() a évolué dans la 1.9 ?

Sinon, concernant la technique de débuggage, il est vrai que je débute vraiment, généralement tous mes scripts fonctionnent à peu près une fois pensés, mais c'est vrai que jusqu'alors je n'utilisais pas de fonctions très avancées du framework Mozilla.

Comment faire pour regarder dans la console JS ? et s'assurer d'être en mode strict ? Peut-on le faire avec XULRunner ? Aurais-je râté une page intéressante du Wiki qui parlerait de ces choses ?

En tous cas, merci beaucoup, je vais faire des recherches du côté de hasMoreElements()

EDIT : Ah, j'ai peut-être trouvé un début de réponse grâce au lien que tu m'as donné, dis-moi si mon raisonnement est juste :

  • Selon XULPlanet, findEntries de nsIZipReader retourne un nsISimpleEnumerator
  • hasMoreElements de nsISimpleEnumerator n'a apparemment pas changé selon MXR
  • MAIS, il semblerait selon MXR, que maintenant findEntries retourne un nsIUTF8StringEnumerator

Serait-ce le problème ? Il faut donc modifier le script pour se baser alors sur nsIUTF8StringEnumerator et non plus sur nsISimpleEnumerator ? Je pense que la problème doit venir de là... Je me penche sur cette piste dès ce soir.

# Re: Extraction ZIP ne marche pas... Je ne comprends pas d'où vient le problème.

Envoyé par : Paul Rouget

Date : 11/04/2007 14:09

while (it.hasMore()) {
var entryName = it.getNext();
}

Sinon, lis ça: ConfigurerMozillaPourDevelopper

# Re: Extraction ZIP ne marche pas... Je ne comprends pas d'où vient le problème.

Envoyé par : Raphael

Date : 12/04/2007 08:39

Effectivement, j'étais donc sur la bonne voie puisque hasmore() est bien une méthode de nsIUTF8StringEnumerator

J'arrive maintenant à dézipper un fichier correctement et sur un plan personnel ça fait plaisir d'avoir compris pourquoi ça marche et comment tu en arrivais à cette conclusion là. Je ne connaissais pas MXR, apparemment, c'est la source originelle sur quoi se base XULPlanet, lui-même source d'une bonne partie du wiki de XUlfr, petit à petit je remonte le torrent ^_^"

Il ne me reste plus qu'à modifier encore un petit peu le script pour arriver à dézipper de manière récursive, car la suite du script s'appuie encore sur un nsISimpleEnumerator qui n'a donc plus lieu d'être et ça coince. Mais bon, les changements devraient être mineurs et je pense pouvoir y arriver tout seul.

Si j'y parviens, je pense que je pourrais enfin apporter un réel intérêt à une page du Wiki en précisant le nouveau script pour XULRunner 1.9

Merci beaucoup en tous cas.

# Re: Extraction ZIP ne marche pas... Je ne comprends pas d'où vient le problème.

Envoyé par : Raphael

Date : 13/04/2007 15:22

Bonne nouvelle : J'ai réussi !

Il m'a tout d'abord fallu comprendre que le QueryInterface était devenu obsolète du fait qu'on avait déjà une chaine de caractères dû à la migration "nsISimpleEnumerator > nsIUTF8StringEnumerator" dans nsIZipReader.

Ensuite, il m'a fallu créer des dossiers avec une permission 0777 plutôt que 0664 sous peine de ne pouvoir y décompresser des fichiers sous Ubuntu. J'ai pris large, ne sachant pas vraiment quelle permission était vraiment nécessaire.

J'ai donc maintenant un parfait dezipper qui fonctionne très bien avec XULRunner 1.9.

Merci beaucoup Paul.

Il ne me manque plus qu'à maitriser le téléchargement de fichiers, et ainsi, couplé à un peu de xmlhttprequest, j'aurai un système de mises à jour automatiques pour mes données ! Xmlhttprequest + Téléchargement fichier + Dezip = Un bon Update-manager pour mes données...

EDIT : Voilà, j'ai apporté ma contribution au Wiki =)

Aller à la page :  1 2

Il n'est plus possible de poster des messages dans ce forum.


Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.

Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™ sont des marques de la fondation Mozilla.