Forums : Xul, Xbl, JS...

Aller à la discussion :  Plus récente Plus ancienne

# [debut de résolution/problème autre] sauvegarder/visualiser un "in-memory-datasource"

Envoyé par : mat

Date : 27/07/2006 12:12

Pardonnez moi si quelquechose m'a échappé dans le tutoriel , ou dans le reste de site et du forum, mais je n'ai pas encore trouvé de moyen d'enregistrer mon in-memory-datasource sur le disque. En effet, un :

expDS.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);
expDS.FlushTo("file:///monfichier.rdf");

me répond :

Erreur : uncaught exception: [Exception... "Component returned failure code: 0x80004002 (NS_NOINTERFACE) [nsISupports.QueryInterface]"  nsresult: "0x80004002 (NS_NOINTERFACE)"  location: "JS frame :: chrome://monExtension/content/mesScripts.js :: test :: line 69"  data: no]

Et pour cause, cette interface est implémentée par "plein de composants" , mais absolument pas par ["@mozilla.org/rdf/datasource;1?name=in-memory-datasource"\]. J'ai bien vu par ci et par la quelquechose comme quoi il faudrait l'envoyer en tant que flux, et le sérialiser (ce qui semble cohérent, puisqu'il n'est probablement pas sous la forme XML/RDF), mais les sources de cette page (Ranger en une chaîne de caractères) mais le résultat est le même :

ds.QueryInterface(Components.interfaces.nsIRDFXMLSource);

il ne trouve encore une fois pas cette interface (pour les mêmes raisons que précedemment...)

Si quelqu'un peut m'expliquer ce qui ne va pas, cela m'aiderait bien...

PS: Si d'avantage de code vous est nécessaire, demandez: j'ai préféré éviter de surcharger le message

PPS: et si, par la même occasion, on pouvait faire un alert du rdf généré, pour le débogage, ce serait chouette ;-)

# Re: sauvegarder/visualiser un "in-memory-datasource"

Envoyé par : mat

Date : 28/07/2006 15:33

Alors je me réponds moi meme pour donner les éléments de réponse que j'ai : En furetant ici et , j'ai produit ce code, qui semble convenir à une exception près :

var resultdata = "";
serialize(expDS);
sauver(resultdata,'datas.rdf');

avec :

function serialize(ds)
{
var s = Components.classes["@mozilla.org/rdf/xml-serializer;1"].createInstance(Components.interfaces.nsIRDFXMLSerializer);
s.init(ds);
//la, pour la petite histoire, je crée mes namespaces
s.addNameSpace(prefix,"urn:softlab-ns/types/");
var outputStream =
{
	data: "",
	close : function(){ alert('close');},
	flush : function(){ alert('flush');},
	write : function (buffer,count)
	{
		this.data += buffer;
		//var tb= document.getElementById("data");
		//tb.setAttribute("value", this.data);
		resultdata = this.data;
		return count;
	},
	writeFrom : function (stream,count){ alert('wf');},
	isNonBlocking: false
}
s = s.QueryInterface(Components.interfaces.nsIRDFXMLSource);
s.Serialize(outputStream);
}

et :

function sauver(string,name)
{
	// Have an RDF parser ready...
	var RDFparser = Components.classes["@mozilla.org/rdf/xml-parser;1"].createInstance(Components.interfaces.nsIRDFXMLParser);
	// Have a filedatasource ready
	var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
	var filePath = workdirPath + '\\' + name;
	file.initWithPath(filePath);
	file.create(Components.interfaces.nsIFile.NORMAL_FILE_TYPE,777);
	var DS = Components.classes["@mozilla.org/rdf/datasource;1?name=xml-datasource"].createInstance(Components.interfaces.nsIRDFRemoteDataSource)
	// UTF-8 converter, used to ensure strings are utf-8 when used for RDF data; I don't use this normally as the output is already in utf-8
	var uConv = Components.classes['@mozilla.org/intl/scriptableunicodeconverter'].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
	uConv.charset = "utf-8";
	// Create standard URI using IO service   
	var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService)
	var BaseUri = ios.newURI("urn:baseURI/","UTF-8",null)
	//On parse et on envoie dans DS
	RDFparser.parseString(DS,BaseUri,string);
	DS.FlushTo(filePath);
}

ce qui convient, à celà près que le isNonBlocking: false n'a pas l'ai d'etre d'un grand effet, puisque je suis obligé de mettre des alert au milieu du write dans le outputstream pour que cela fonctionne...

PS: désolé pour la longueur du code fourni, mais je ne vois pas comment faire moins, et que d'autres puissent le réutiliser...

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.