Forums : XPCom

Aller à la discussion :  Plus récente Plus ancienne

# Incomprehension

Envoyé par : guyzmo

Date : 30/07/2005 20:17

Bonjour, je voudrais savoir si les composants XPCOM sont des equivalents de classes de n'importe quel language objet. Je demande ca car, par exemple, le composant @mozilla.org/network/buffered-input-stream;1 comporte plusieurs interfaces dont entre autre nsISeekableStream avec la methode seek et nsIInputStream avec la methode read .

Lorsque l'on cree une instance a l'aide de la premiere interface nous n'avons pas acces aux methodes de la seconde (et vice versa).

J'ai reussi a faire ce que je voulais faire (lire lineairement un flux puis y acceder a des endroits particuliers, d'ou l'interet de seek) sans utiliser seek, en recommancant la lecture depuis le debut du flux. Mais vous comprendrais que cette methode est plutot sale et ne me convient pas du tout.

Ma question est donc comment faire pour creer une instance d'un objet qui comporte les methodes de plusieurs interfaces ? Est-ce que c'est possible d'ailleurs ?

En esperant avoir ete assez clair et que quelqu'un pourra m'aider. merci

# Re: Incomprehension

Envoyé par : thamoz

Date : 02/08/2005 11:10

Je pense que la réponse est dans ce lien http://books.mozdev.org/html/mozilla-chp-8.html

En fait toutes les instances d'objet comporte toutes les méthodes de toutes les interfaces qu'il publie, il suffit de lui demander de ce comporter suivant telle ou telle interface.

exemple : var clz = Components.classes'@mozilla.org/file/local;1'.createInstance(); // implémente trois interfaces : // * nsIFile // * nsILocalFile // * nsISupports // Demandons lui de ce comporter suivant nsILocalFile : clz.QueryInterface(Components.interfaces.nsILocalFile); // Puis de ne publier que les fonction de bases : clz.QueryInterface(Components.interfaces.nsISupport); ...

# Re: Incomprehension

Envoyé par : guyzmo

Date : 03/08/2005 18:22

Merci, j'avais justement ecris ce post parceque j'avais tente quelquechose du genre et que ca n'a pas fonctionne.

J'ai du faire faire des erreurs, je vais retester, si je ne reposte pas de message c'est que ca marche !

# Re: Incomprehension

Envoyé par : guyzmo

Date : 03/08/2005 19:04

Voici un extrait de code qui cree un objet XPCOM, lui dit d'utiliser une certaine interface, affiche la liste de ces methodes, change d'interface puis affiche une fois de plus les methodes :

var methodes1 = "";
var methodes2 = "";

stream = Cc["@mozilla.org/network/file-input-stream;1"];
stream = stream.createInstance(Ci.nsIFileInputStream);
stream.init(file, mode_bits, perm_bits, file_bits);

var bstream =  Components.classes["@mozilla.org/network/buffered-input-stream;1"].getService();

bstream.QueryInterface(Components.interfaces.nsIBufferedInputStream);
//init
for (var i in bstream)
	methodes1 += i +"\n";
bstream.init(stream,1000);

bstream.QueryInterface(Components.interfaces.nsIInputStream);
//available, close, isNonBloking, read et readSegments
for (var i in bstream)
	methodes2 += i +"\n";

dump("Premiere interface\n" + methodes1 + "\nSeconde interface\n" +   methodes2);

Et voici le resultat de son execution :

Premiere interface
QueryInterface
close
available
isNonBlocking
init

Seconde interface
QueryInterface
close
available
isNonBlocking
init

On voit clairement que meme avec deux interfaces differentes les methodes sont les memes. Le resultat attendu aurait plutot ete

Premiere interface
QueryInterface
init

Seconde interface
QueryInterface
close
available
isNonBlocking
read
readSegments

Qu'est ce que j'ai mal fait ? Pourquoi lors des deux affichages ont voit que les methodes implantee sont celle de nsIBufferedInputStream et certaines de nsIInputStream ? Et finallement est*ce qu'il est reellement possible de creer une instance d'un objet xpcom et de pouvoir lui appliquer toutes les methodes de toute ses interfaces ?

J'espere que mon programme est mauvais parceque sinon je trouve que XPCOM pert de son interet

# Re: Incomprehension

Envoyé par : laurentj

Date : 04/08/2005 16:40

malgré ce que montre les nombreux exemples sur xulplanet, j'aurais plutôt récupéré le résultat de QueryInterface (chez moi en tout cas, ça fonctionne) :

buffstr = bstream.QueryInterface(Components.interfaces.nsIBufferedInputStream);
...
inputstr = bstream.QueryInterface(Components.interfaces.nsIInputStream);

QueryInterface te renvoi un objet qui contient les méthodes correspondantes à ton interface. En général, c'est toujours lui même. Mais il est tout à fait possible qu'un composant soit fait de plusieurs objets distincts, implementant chacun une interface différente du composant. Aussi, le QueryInterface peut te renvoyer un objet different selon l'interface demandée.

# Re: Incomprehension

Envoyé par : guyzmo

Date : 04/08/2005 18:24

Soit il y a un truc que je n'ai pas compris dans la derniere explication, soit j'ai un firefox bizarre, toujours est-il que lorsque j'avais envoye mon dernier post j'avais egalement teste cette solution. Je me suis dit que je l'etais peut-etre trompe dans mon code, alors je l'ai refait et j'obtiens un resultat identique.

Est-ce que mon code est encore mauvais ? Est-ce que je n'ai pas compris des choses essentielles ? Est-ce que firefox a de gros problemes de compatibilite (j'utilise Linux) a ce niveau en plus de ceux de sa gestion des fenetres (retaillage,barre de titre,focus et surement d'autres)?

var bstream =   Components.classes["@mozilla.org/network/buffered-input-stream;1"]
	.getService();

var interface1 =  bstream.QueryInterface(Components.interfaces.nsIBufferedInputStream);
//init
for (var i in interface1)
	methodes1 += i +"\n";
interface1.init(stream,1000);

var interface2 =  bstream.QueryInterface(Components.interfaces.nsIInputStream);
//available, close, isNonBloking, read et readSegments
for (var i in interface2)
	methodes2 += i +"\n";

dump("Premiere interface\n" + methodes1 + "\nSeconde interface\n" +  methodes2);

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.