ReLucBlog - SIG, MOZILLA & NTIC

Aller au contenu | Aller au menu | Aller à la recherche

jeudi 18 septembre 2008

Créer son nsIProtocolHandler pour afficher un buffer (char *)

Dans le cadre de la réalisation de mon premier composants XPCOM en C++, j'ai dû résoudre le problème suivant : Comment récupérer un buffer pour le manipuler en JavaScript et l'afficher via la définition d'un nouveau protocol ?

Voici mes découvertes :

nsIBinaryOutputStream

L'objet JavaScript suivant permet d'écriture dans un output stream :

Components.classes"@mozilla.org/binaryoutputstream;1"
  .createInstance(Components.interfaces.nsIBinaryOutputStream);

Un tel objet permet de récupérer le buffer générer au sein de mon composant C++ via la méthode writeByteArray qui prend en paramètre le buffer (char *) et la taille de celui-ci. J'ai donc créer une méthode saveToStream qui prend en paramètre un objet implémentant l'interface nsIBinaryOutputStream.
Par exemple pour écrire dans un fichier :

// création d'un fichier local
var aFile = Components.classes"@mozilla.org/file/local;1".createInstance(Components.interfaces.nsILocalFile);
aFile.initWithPath( "/tmp/buffer");
// création du OutputStream associé au fichier
var stream = Components.classes"@mozilla.org/network/file-output-stream;1".createInstance(Components.interfaces.nsIFileOutputStream);
stream.init(aFile, 0x04 | 0x08 | 0x20, 0600, 0);
// création du binary output stream
var bos = Components.classes"@mozilla.org/binaryoutputstream;1".createInstance(Components.interfaces.nsIBinaryOutputStream);
// cette étape va permettre d'écrire dans l'output stream du fichier
bos.setOutputStream(stream);
// écriture du buffer dans l'output stream du fichier
myComponent.saveToStream(bos);
// il n'y a plus qu'à fermer les flux pour finaliser l'écriture du buffer dans le fichier
bos.close();
stream.close();

Grâce au Binary Output Stream je suis capable d'écrire le buffer générer dans mon composant XPCOM dans un fichier.

nsIChannel et nsIPipe

Dans Mozilla, il est possible de définir son propre protocol. La principale étape est de définir la méthode newChannel qui prend en paramètre un objet implémentant l'interface nsIURI et doit retourner un objet implémentant l'interface nsIChannel. Dans mon cas c'est dans cette méthode que j'utilise mon composant et donc que je récupère un objet implémentant l'interface nsIOutputStream. Or un nsIChannel est basé sur un objet implémentant une interface nsIInputStream. Il fallait trouver le moyen d'obtenir le input stream associé à l'output stream.

L'objet JavaScript suivant permet de lié input stream et output stream :

Components.classes"@mozilla.org/pipe;1".createInstance(Components.interfaces.nsIPipe);

Enfin il fallait faire de l'input stream obtenu un objet implémentant l'interface nsIChannel, c'est ce que permet l'objet suivant :

Components.classes"@mozilla.org/network/input-stream-channel;1".createInstance(Components.interfaces.nsIInputStreamChannel);

La méthode newChannel s'implémente ainsi :

myProtocolHandler.prototype.newChannel = function(aURI) {
     // création du pipe
     var pipe = Components.classes"@mozilla.org/pipe;1".createInstance(Components.interfaces.nsIPipe);
     pipe.init(true,true, 0, 0, null);
     // création du binary output stream
     var bos = Components.classes"@mozilla.org/binaryoutputstream;1".createInstance(Components.interfaces.nsIBinaryOutputStream);
     // cette étape va permettre d'écrire dans l'output stream du pipe
     bos.setOutputSTream(pipe.outputStream);
     // écriture du buffer dans l'output stream du pipe
     myComponent.saveToStream(bos);
     // fermeture des output stream
     bos.close();
     pipe.outputStream.close();
     // il reste plus qu'à créer le channel
     var channel = Components.classes"@mozilla.org/network/input-stream-channel;1".createInstance(Components.interfaces.nsIInputStreamChannel);
     channel.setURI(aURI);
     channel.contentStream = pipe.inputStream;
     channel.QueryInterface(Components.interfaces.nsIChannel);
     return channel;
}

C'est bien mais c'est synchone...

nsIPipe et nsIThreadManager

La dernière étape consiste à faire en sorte que la création du buffer et l'écriture soit asynchrone. Ce qu'il faut savoir c'est que le pipe permet d'écrire dans un thread et de lire le résultat dans un autre, de plus tant que rien n'est écrit dans l'output stream du pipe rein n'est lu, enfin lorsque l'output stream est clos le channel et donc la requête qui a été créer à partir de l'input stream du pipe est considéré comme fini.

Il faut d'abord définir un thread d'exécution :

var workingThread = function(pipe, myComponent) {
   this.pipe = pipe;
   this.component = myComponent;
};
workingThread.prototype = {
  run: function() {
    try {
      var bos = Cc"@mozilla.org/binaryoutputstream;1".createInstance(Ci.nsIBinaryOutputStream);
      bos.setOutputStream(this.pipe.outputStream);
      this.component.saveToStream(bos);
      bos.close();
      this.pipe.outputStream.close();
    } catch(err) {
      Components.utils.reportError(err);
    }
  },
  
  QueryInterface: function(iid) {
    if (iid.equals(Ci.nsIRunnable) ||
        iid.equals(Ci.nsISupports)) {
            return this;
    }
    throw Components.results.NS_ERROR_NO_INTERFACE;
  }
};

Ensuite il suffit de déclarer un objet global permettant l'exécution en fond de tâche :

background = Components.classes"@mozilla.org/thread-manager;1".getService().newThread(0);

Il ne reste plus qu'à réécrire la méthode newChannel du protocol handler :

myProtocolHandler.prototype.newChannel = function(aURI) {
     // création du pipe
     var pipe = Components.classes"@mozilla.org/pipe;1".createInstance(Components.interfaces.nsIPipe);
     pipe.init(true,true, 0, 0, null);
     // appel en fond de tâche de la création du buffer et de l'écriture
     background.dispatch(new workingThread(pipe, myComponent), background.DISPATCH_NORMAL);
     // il reste plus qu'à créer le channel
     var channel = Components.classes"@mozilla.org/network/input-stream-channel;1".createInstance(Components.interfaces.nsIInputStreamChannel);
     channel.setURI(aURI);
     channel.contentStream = pipe.inputStream;
     channel.QueryInterface(Components.interfaces.nsIChannel);
     return channel;
}

En espérant que ça puisses vous servir ;-)

mardi 16 septembre 2008

Effets SVG sur du HTML

Après l'intégration des tranformations CSS3, Robert O'Callahan annonce la possibilité d'utiliser les effets SVG sur du contenu HTML. Le Web Ouvert va vraiment devenir sympa ;-)

mardi 17 juin 2008

Firefox 3 Download Day

Firefox 3 Download Day

C'est pour aujourd'hui, à partir de 19H dixit Tristan Nitot

jeudi 12 juin 2008

Firefox 3 RC3 et Final

Depuis ce matin une troisième version Release Candidate de Firefox 3 est disponible en téléchargement :

Dans le même temps, Mozilla a annonce une date officiel pour la sortie final de Firefox 3 :

  • le 17 juin 2008, la semaine prochaine!

Firefox 3 Victory

Victoire !

Pour mémoire Mozilla souhaite établir un record de téléchargement!

mercredi 21 mai 2008

Screaming Monkey: faites crier Internet Explorer

Screaming Monkey est l'intégration de Tamarin comme interpréteur de <script> dans d'autre navigateur Web, à commencer par Internet Explorer.

Tamarin est un projet Open Source d'implementation du langage de la 4e édition de la spécification ECMAScript (ES4). Tamarin sera utilisé en tant que machine virtuelle au sein de SpiderMonkey, le moteur JavaScript de base du navigateur Firefox®, et les autres produits basés sur els technologies Mozilla. Le code continuera à être utiliser par Adobe dans sa machine virtuelle ActionScript a sein du Adobe® Flash® Player.

Screaming Monkey est disponible en version Alpha. Il est dès à présent possible de tester ES4 au sein d'Internet Explorer sans attendre que Microsoft daigne réaliser cette implémentation.

A terme nous nous retrouverons peut être avec 3 façons de faire des applications Web riches pour Internet Explorer :

  • Flash
  • Silverlight
  • Screaming Monkey

Pour des informations techniques :

Via Bluish Coder

samedi 19 avril 2008

SMIL dans Firefox (en développement)

Chris Double vient de publier un patch permettant de faire tourner du SMIL dans Firefox (Firefox SVG Animation Patch et SVG Animation Update).

Synchronized Multimedia Integration Language (SMIL) est une norme du W3C permettant de réaliser des présentations animées. SMIL peut être utilisé avec SVG et HTML dans un élément ForeignObject pour réaliser des animations riches ouvertes.

Mozilla continue de proposer des solutions ouvertes pour une Web riche et innovant ;-)

mercredi 2 avril 2008

XulRunner est Mobile!

Mark Finkle et Christopher Blizzard ont tous les deux publiés un article sur les améliorations de la plateforme Mozilla sur Mobile. Et bien les résultats sont très intéressant. Le travail réalisé sur la réduction de l'empreinte mémoire de Firefox rende la prochaine version de XulRunner Mobile!

Tristan Nitot avait déjà évoqué le futur de Mozilla et de XulRunner sur Mobile ici.

Installer une application Web comme une application de bureau

Avec la prochaine version de Ubuntu 8.04, Hardy Heron, il sera possible d'installer une Application Web exactement comme une Application de Bureau grace à Prism! Plus d'infos ici ou .

Comme le disait Guillaume Ploin (SQLI) à propos de Silverlight et Flash :

Je pense que le développement d'interface s'oriente vers l'approche suivante : développer une interface de manière agnostique, et décider au dernier moment si elle sera utilisée en RIA, en RDA ou les 2.

Avec Prism c'est la même chose pour les développement AJAX !

Autre news Prism : sa localisation via babelzilla.

Firefox 3 Beta 5 publié!

Je vais faire court : Firefox 3 Beta 5 est disponible au téléchargement en 45 langues différentes... Le dernier virage est passé, Mozilla est dans la dernière ligne droite! Mozilla Developer News

Autres articles :

vendredi 7 mars 2008

Mise à jour majeur de Prism et intègration à Firefox

Mozilla Labs, via Mark Finkle, vient d'annoncer une mise à jour majeur de Prism ainsi qu'une première version d'une extension pour Firefox 3 permettant de convertir un site Web en application : Prism 0.9

Prism est un logiciel prototype Open Source multiplate-forme prototype permettant aux utilisateurs de séparer les applications web du navigateur et de les lancez directement du bureau. Prism fait partie d'une série d'expériences menées par le Mozilla Labs pour combler le fossé existant entre l'expérience de l'utilisateur sur le Web et celle des applications de bureau, et explorer de nouveaux modèles de convivialité estompant la frontière entre ces types d'applications.

Philosophie

Nous pensons que le Web est une plateforme puissante pour l'innovation, et notre but avec Prism est d'entrainer le développement d'amélioration de cette plateforme de façon à ajouter les avantages des applications du bureau au Web. Prism n'est pas une nouvelle plateforme ou un nouveau produit mais plutôt un moyen pour Mozilla Labs d'expérimenter de nouvelles technologies pour étendre les capacités de l'Open Web. Les développeurs Web ne doivent pas avoir à lever le petit doigt pour rendre leur application compatible avec le bureau, desktop-enable, (même si il est possible d'ajouter des spécifications afin d'améliorer l'expérience utilisateur), alors que les utilisateurs peuvent choisir d'utiliser leurs applications web préférés dans leur navigateur, sur leur ordinateur, ou aux deux endroits.

Principales évolutions et mise à jour

Aujourd'hui nous publions une mise à jour importante de Prism qui inclu de nouvelles capacités d'intégration au bureau et une installation plus simple. Avec cette mise à jour, vous pouvez maintenant obtenir Prism simplement en installant une petite extension pour Firefox 3. Avec l'extension Prism pour Firefox 3, les utilisateurs peuvent dès à présent séparé les applications Web du navigateur Firefox sans avoir à installer et gérer un application Prism tierce. Installer simlement l'extension, rendez-vous à votre application Web préférée, puis sélectionnez Tools > Convert Website to Application.

Maintenant Prism est une extension à Firefox 3 et exploite le fait que Firefox 3 peut servir de runtime pour lancer des applications XUL (Firefox 3 : le cheval de Troie). Prism est toujours disponible en version standalone pour le cas où vous ne puissiez utiliser Firefox et que vous souhaitiez tout de même expérimenté Prism : Windows (installeur et archive), Mac et Linux.

Pour toutes les informations concernant cette mise à jour :

lundi 25 février 2008

Le Rich Desktop Application sort du bois

Aujourd'hui, lundi 25 février 2008, Adobe anonce la sortie officiel de son Adobe Integrated Runtime de son petit nom AIR. Il y a un an Adobe anonçait l'avènement de ce projet mais sous un autre nom, Apollo. La sortie de AIR s'accompagne de la sortie de la nouvelle version du framework d'Adobe, FLEX 3, qui devrait passer en Open Source.

La sortie de AIR signifie qu'une force commerciale importante va devoir banaliser les notions de Rich Desktop Application qui peut s'interpréter en application de bureau connectée (Fred Cavazza). Cela signifie aussi que Microsoft va entrer dans la danse avec Silverlight 2. Nous allons donc assister a une guerre comerciale entre 2 poids lourds de l'industrie informatique pour imposer leur solution. Mais cette débauche d'énergie pourrait bien profiter à Mozilla, et ses technologies, qui se concentre actuellement sur Firefox 3.

Il y a un ans, lorsque Adobe a annoncé son projet Apollo, Paul et Laurent avait attiré l'attention sur le fait que XulRunner, le runtime de Mozilla, manquait de visibilité par rapport aux projets d'Adobe ou de Microsoft. Cela avait été suivi d'un débat au sein de la communauté Mozilla et d'une volonté de créer une communauté, MozPad, autour de XulRunner pour promouvoir les technologies Mozilla comme plateforme de développement, de proposer une alternative Open Source à celle d'Adobe et de Micorsoft. Cette alternative existe puisque de nombreux projets sont basés sur XulRunner dont le plus connu est le futur Firefox 3, mais elle manque peut être un peu de visibilité.

Maintenant que le projet Apollo est devenu AIR et qu'il est officiellement disponible, les directions des systèmes d'informations vont se pencher sur ce type de solutions, sur les avantages et inconvénients des applications de bureau connectées, et sur les technologies sous-jacentes nécessaires à la réalisation de telles solutions. Et les technologies Mozilla sont peut être les mieux placées :

  • un runtime multiplateforme éprouvé, Firefox 3 est basé sur XulRunner ;
  • un navigateur pouvant servir de runtime, le XulRunner intégré à Firefox 3 pourra être utilisé pour lancé des applications ;
  • un lanceur d'application Web sur le bureau intégrant la gestion du mode déconnecté standardisée : Prism.

Libre à chaque direction de faire son choix, Yahoo a choisi Mozilla pour Flickr Uploadr et Zimbra Desktop, et à nous sociétés de développement spécialisées dans les technologies Mozilla de nous faire entendre (DI, 3Liz, et autres).

A lire :

vendredi 22 février 2008

Jaxer officiellement disponible pour Linux

La page de téléchargement de Jaxer a été mis à jour et propose une version pour Linux.

Une page dédié à l'installation de Jaxer sur Linux a étté mis en ligne. Vous pouvez aussi consulter le billet que j'avais rédigé pour installer sur Ubuntu Jaxer sur votre serveur Apache.

Pour ceux qui ne le serait pas : Jaxer est le premier serveur full AJAX. Il est basé sur Mozilla, c'est comme un Firefox sans affichage qui tourne sur le serveur, et est édité par Aptana.

jeudi 14 février 2008

Flickr Uploadr : Powered by XulRunner

La prochaine version de Flickr Uploadr, logiciel de mise en ligne sur Flickr de photos, s'appuiera sur Mozilla, et plus précisement XulRunner, et non sur AIR d'Adobe.

Une interview du responsable du développement de Flickr Uploadr, Richard Crowley, réalisé par Jeremy Zawodny est disponible en vidéo. Richard y discute les raisons pour les quelles Yahoo! a choisi XulRunner de Mozilla par rapport à AIR d'Adobe. Cela inclut :

  • La possibilité de lier des bibliothèque externe via XPCOM (ce que ne permet pas AIR) ;
  • multi-threading (alors que AIR est mono-thread) ;
  • extensibilité (comme Firefox).

Si XUL ou XulRunner vous intéresse, Gen Kanai vous conseille de regarder cette interview intéressante, surtout le passage sur la possibilité de développer des extensions pour Flickr Uploadr.

Après TomTom, numéro 1 des constructeurs de GPS portables, pour TomTom Home, voici une nouvelle entreprise international qui fait le choix de XulRunner.

dimanche 10 février 2008

En vrac Mozilla...

Une petite liste de liens :

mercredi 6 février 2008

Installer Jaxer sur Ubuntu

Jaxer est un serveur AJAX publier par Aptana sous licence GPL. Jaxer est en fait un module pour Apache2 basé sur les technologies Mozilla.

Il est actuellement disponible officiellement en téléchargement pour Windows et Mac. Il est distribué avec son propre serveur Apache mais il est possible d'installer Jaxer sur son serveur.

La version pour Linux est en court de préparation mais une version beta est disponible :
http://s3.amazonaws.com/com.aptana.temporary.downloads/linux/Jaxer_package_withApache.zip
Vous pouvez installer cette version selon les modalités précisées dans le forum : Try out our early Linux builds. Normalement ça fonctionne pour Ubuntu et Fedora.

Mais je ne souhaitais pas installer un nouveau serveur Apache sur ma Ubuntu, j'ai donc décidé d'installer Jaxer comme module du serveur Apache présent par défaut sur Gutsy Gibbon. Pour ce faire c'est assez simple :

  • télécharger la version de Jaxer pour Linux et dézippé le paquet ou vous le souhaitez ;
  • modifier le fichier de configuration Apache de Jaxer, jaxer-linux.httpd.conf, présent dans AptanaJaxer/jaxer/confs, afin que tous les chemins pointent vers là où a été dézippé Jaxer ;
  • modifier le httpd.conf de votre serveur Apache, normalement il est là : /etc/apache2, en injoutant l'inclusion de la configuration de Jaxer ;

Une fois ces 3 étapes réalisées la configaration de votre serveur AJAX est prêt. Maintenant il faut pouvoir lancer Jaxer et l'arrêter. Pour cela on va modifier les scripts startJaxer.sh et stopJaxer.sh que l'on trouve dans AptanaJaxer/scripts.

  • dans le script startJaxer.sh ajouter au début export JAXERBASE= "le chemin vers Jaxer", comme dans start.sh, et à la fin sudo /etc/init.d/apache2 restart
  • dans le script stopJaxer.sh ajouter au début export JAXERBASE= "le chemin vers Jaxer", et un sudo avant kill.

Vous n'avez plus qu'à lancer Jaxer et vous rendre à l'url suivante : http://localhost/aptana pour constater que vous avez bien installer un serveur AJAX sur votre Ubuntu.