Forums : Xul, Xbl, JS...

Aller à la discussion :  Plus récente Plus ancienne

# Problèmes de compatibilité Unix - Windows

Envoyé par : Vilya

Date : 14/05/2006 16:19

Bonjour,

J'ouvre ce fil avec en arrière pensée l'idée d'y recenser tous les problèmes liés à la plate-forme d'utilisation.

En parcourant le forum j'ai déjà pu lire les conseils relatifs à la gestion des chemins d'accès. Il est recommandé d'utiliser l'interface nsIFile pour obtenir des chemins vers des répertoires particuliers et l'interface nsILocalFile pour en construire.

J'ai pour ma part deux questions sur le même thème : l'initialisation d'une datasource et l'initialisation d'un container

1- Je cherche dans un premier temps à définir une datasource à partir d'un fichier rdf contenu dans le dossier de préférence de l'utilisateur

var dossierPref = Components
   .classes["@mozilla.org/file/directory_service;1"]
   .getService(Components.interfaces.nsIProperties)
   .get("ProfD", Components.interfaces.nsIFile);
var fileSearched = Components
   .classes["@mozilla.org/file/local;1"]
   .createInstance(Components.interfaces.nsILocalFile);
fileSearched.initWithPath(dossierPref.path);
fileSearched.appendRelativePath("nomDuFichier.rdf");
var rdfService = Components
   .classes["@mozilla.org/rdf/rdf-service;1"]
   .getService(Components.interfaces.nsIRDFService);
var ds = rdfService.GetDataSourceBlocking("file:///" + fileSearched.path);

Ma première question se situe ici. J'aimerais être certaine que l'écriture

GetDataSourceBlocking("file:///" + fileSearched.path)

est compatible sur toutes les plateformes. Ca marche sur Windows mais j'ai des doutes sur Unix par exemple et je n'ai malheureusement pas un environnement adapté sous la main pour tester.

2- Une fois la datasource chargée je vais chercher un container pour lui rajouter un élément

var container = Components
   .classes["@mozilla.org/rdf/container;1"]
   .createInstance(Components.interfaces.nsIRDFContainer);
var containerSeq = rdfService
   .GetResource("http://www.monsite.fr/all-data");
try {
   container.Init(ds, containerSeq);
   container.AppendElement(unElement);
}

Mais voilà, à la ligne "container.Init(ds, containerSeq);" j'obtiens la méchante erreur

[Exception... "Components returned failure code: 0x80004005 (NS_ERROR_FAILURE)
[nsIRDFContainer.Init]" nsresult:"0x80004005 (NS_ERROR_FAILURE)"
location:"JS frame :: chrome://[...]/content/[...].js :: nomDeLaFonction :: line 1069" data no]

Ici encore, c'est un code qui fonctionne très bien sous Windows mais plante sur Unix (merci à mes testeurs ^^) et n'ayant toujours pas d'environnement de test adapté sous la main je fais appel à vos lumières :)

Merci d'avance à ceux qui se pencheront sur le problème,

Bonne fin de week-end,

Vilya

# Re: Problèmes de compatibilité Unix - Windows

Envoyé par : laurentj

Date : 14/05/2006 18:01

J'aimerais être certaine que l'écriture est compatible sur toutes les plateformes. Ca marche sur Windows mais j'ai des doutes sur Unix par exemple

Il me semble qu'il y a ce qu'il faut pour récupère l'URL d'un fichier à partir du nsIFile.. Ce serait plus propre que de tenter de faire ça à la main comme tu le fais.

et je n'ai malheureusement pas un environnement adapté sous la main pour tester.

grave toi un live cd ;-)

# Re: Problèmes de compatibilité Unix - Windows

Envoyé par : Vilya

Date : 14/05/2006 18:30

Il me semble qu'il y a ce qu'il faut pour récupère
l'URL d'un fichier à partir du nsIFile.. Ce serait
plus propre que de tenter de faire ça à la main
comme tu le fais.

Je viens effectivement de voir que l'append est possible directement depuis nsIFile. Je vais fouiller de ce coté là.

Par contre, pour le GetDataSourceBlocking, est-il absolument nécessaire de former une URL en "file://" ? Et si oui, je n'ai pas vu comment c'était possible depuis l'interface :/

# Re: Problèmes de compatibilité Unix - Windows

Envoyé par : thefab

Date : 15/05/2006 07:32

Salut,

append est utilisé pour ajouter un sous-dossier au chemin existant, je ne suis pas sur qu'il te serve pour créer la racine file:///

Essaye de voir du côte de nsIFileURL que tu peux créer avec ioService.newFileURI(file);

Fabrice

# Re: Problèmes de compatibilité Unix - Windows

Envoyé par : Vilya

Date : 15/05/2006 22:40

Essaye de voir du côte de
[nsIFileURL|http://www.xulplanet.com/references/xp
comref/ifaces/nsIFileURL.html] que tu peux créer
avec ioService.newFileURI(file);

Un newFileURI semble s'approcher de la solution, mais un .path sur le résultat me renvoie une chaine commençant par "/c:/dir1/dir2/..." au lieu du "file:///c:/dir1/dir2/..." que je recherche. De même un .GetScheme me renverra un vilain "undefined".

Et pourtant, en lisant les docs c'est ce qui parait le plus adapté :s

Bien mal m'en a pris de lire trop rapidement les spec. un .prePath me donne bien le "file://" manquant et un .spec le chemin complet :-)

# Re: Problèmes de compatibilité Unix - Windows

Envoyé par : Vilya

Date : 16/05/2006 11:21

Après tests ça fonctionne bien comme il faut, le code au final est donc relativement simple et s'articule comme suit :

var dossierPref = Components
   .classes["@mozilla.org/file/directory_service;1"]
   .getService(Components.interfaces.nsIProperties)
   .get("ProfD", Components.interfaces.nsIFile);
var myFileInPrefDir = dossierPref.append("myFile.rdf");
var IOService = Components
   .classes['@mozilla.org/network/io-service;1']
   .getService(Components.interfaces.nsIIOService);
var UriPath = IOService.newFileURI(myFileInPrefDir);

A partir de là, on a bien une URI avec un scheme "file" de définie. Pour la récupérer pour charger un dataSource :

var rdfService = Components
   .classes["@mozilla.org/rdf/rdf-service;1"]
   .getService(Components.interfaces.nsIRDFService);
var ds = rdfService
   .GetDataSourceBlocking(UriPath.spec);

Après coup, tout est plutôt évident mais c'est un peu toujours comme ça ;-)

Encore merci à vous deux pour vos suggestions.

Vilya

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.