XPCOM

Création de l'interface

Création de l'IDL

La première chose à faire lorsque l'on souhaite réaliser un composant est de décrire son fonctionnement dans une interface IDL.

Dans le cas de la création d'un composant destiné à être utilisé par d'autres composants, il faut prendre grand soin la définition de l'interface pour éviter de futures modifications.

Toutes les interfaces sont généralement préfixées par nsI (pour Netscape Interface) mais il est préférable d'utiliser un autre préfixe si les interfaces ne sont pas destinées à être intégrées à Mozilla. Par exemple, le nom de code des composants développés par IDM est SK, et les interfaces sont ainsi préfixées par skI.

Pour notre exemple, nous allons créer une interface nommée nsIPlop. Celle-ci étendra, comme requis, l'interface nsISupports. L'IID de l'interface sera généré avec uuidgen. Enfin, nous déclarerons une unique méthode nommée display qui prendra une chaîne de caractères en paramètre.

Voici le code de l'interface nsIPlop possédant l'IID a6a5b8e4-a392-42e1-b517-e44bc508449d :

#include "nsISupports.idl"

[scriptable, uuid(a6a5b8e4-a392-42e1-b517-e44bc508449d)]
interface nsIPlop : nsISupports
{
    void display(in string message);
};

Compilation de l'IDL

Pour pouvoir utiliser le composant, il faut que son interface ait été convertie en typelib, qui un fichier binaire représentant l'interface.

La compilation de l'IDL est réalisée avec xpidl (MOZILLA/dist/bin/xpidl, qui est un lien symbolique vers MOZILLA/xpcom/typelib/xpidl/xpidl). En fonction du paramètre -m passé à l'outil, ce dernier peut générer, outre le fichier typelib, un header C++ (fichier .h), une interface Java, ou la documentation de l'interface au format HTML.

Nous pouvons écrire un fichier Makefile compilant l'IDL de différentes manières :

xpidl: generated generated/plop.java generated/plop.xpt generated/plop.html generated/plop.h

generated:
	mkdir -p $@

generated/plop.java: generated plop.idl
	../dist/bin/xpidl -I ../xpcom/base -e $@ -m java    plop.idl

generated/plop.xpt:  generated plop.idl
	../dist/bin/xpidl -I ../xpcom/base -e $@ -m typelib plop.idl

generated/plop.html: generated plop.idl
	../dist/bin/xpidl -I ../xpcom/base -e $@ -m doc     plop.idl

generated/plop.h:    generated plop.idl
	../dist/bin/xpidl -I ../xpcom/base -e $@ -m header  plop.idl

Ici, tous les fichiers générés sont placés dans le répertoire generated. Les deux fichiers qui nous intéressent particulièrement sont le fichier typelib (generated/plop.xpt) et le header C++ (generated/plop.h). Le premier est utilisé à l'exécution, tandis que le second aide à l'implémentation du composant en C++.