next up previous
Next: 5 Conclusion Up: 4 Composition - Structure Previous: 4.3 Relation entre ControlLayer

4.4 Couches de contrôle et d'adaptation: détail

Nous avons vu que certains call-backs de ControlLayer appelaient à leur tour des méthodes de FileList. C'est notamment le cas de la méthode controlLayer.sendAction() qui appelle la méthode fileList.sendItem(), déclenchant l'envoi sur le réseau d'une page Html.

public class ControlLayer implements Runnable {
  public FileList fileList;
  // Implements the call-back of the SenderGUI's sendButton
  public void sendAction () {
    fileList.sendItem ();
  }
}

public class FileList extends List {
  public void sendItem () {
    int fileListIndex = getSelectedIndex ();
    send (fileListIndex);
  }

  public int send (int i) {
    AMPThreadCarrier ampThreadCarrier = new AMPThreadCarrier (dbg);
    // Kill all previously running AMP process (stop the previous transmission)
    Executer.exec (AMPKillerCmd, dbg);
    // Create the Unix tar file to store all the inlined files contained
    // by the Html page
    String tarFilename = tarBuilder (directory, filename);
    // Send the Html page alltogether with its inlined files (images, etc.)
    ampThreadCarrier.cmdExec = "AMP " + filename;
    ampThreadCarrier.start ();
    return displayTime;
  }
}

Comme on le voit ci-dessus, la méthode sendItem() appelle à son tour la méthode send(), cette dernière implémentant effectivement l'envoi de la page Html sur le réseau. Pour cela, plusieurs étapes sont nécessaires, le but étant de regrouper dans un seul fichier .tar Unix le fichier .html lui-même, ainsi que tous les fichiers inclus (images, sons, films et autres appelettes).

Le programme tar Unix respecte la hiérarchie des répertoires, et le récepteur pourra donc retrouver la même structure que celle de l'émetteur. Cependant, comme le fichier .tar est stocké sur le répertoire /tmp, tous les noms de fichiers inclus commençant par ../ (chemin relatif du répertoire parent) ne pourront être incorporés tel quels dans le .tar. Il faut donc trouver leur répertoire, et les copier, au sein de /tmp, dans un autre répertoire (intitulé subDir dans notre cas). Dans le .html que reçoit le récepteur, il faut donc que les noms de fichiers inclus correspondants soient modifiés pour commencer par quelque chose comme /tmp/subDir.

* Arrêt de l'éventuelle transmission en cours:
on invoque pour cela un script Unix (killer), écrit pour l'occasion (voir Annexe B), qui tue le processus Unix répondant au nom d'AMP. Cette méthode est brutale, mais l'interface d'AMP ne permet pas d'être plus fin.
* Extraction des noms des fichiers inclus:
on utilise une méthode de la classe Adapter, qui extrait les noms de fichiers inclus dans le .html original, et réécrit un autre .html avec les éventuels nouveaux noms (ceux commençant par /tmp/subDir).
* Exécution de la commande Unix tar:
cette commande regroupe sous un même fichier tous les fichiers nécessaires à l'interprétation de la page Html.
* Compression du fichier .tar:
on utilise la commande Unix gzip.
* Nettoyage:
il faut effacer tous les sous-répertoires et fichiers qui ont servi à la construction du .tar.

Enfin, après avoir créé le .tar, il faut envoyer ce fichier sur le réseau en utilisant le protocole AMP. Or, l'appel au serveur AMP est bloquant, et l'on veut pouvoir stopper la transmission à tout moment: bref, l'on veut garder la main pendant la transmission. Aussi, il est nécessaire de lancer un Thread, qui va implémenter l'appel au serveur AMP.

Pour des raisons de clarté, ce Thread est implémenté dans la classe AMPThreadCarrier, ce qui présente l'avantage de fournir des moyens de communication entre le Thread et le processus appelant (par l'intermédiaire d'attributs static). Cela permet par exemple de faire exécuter plusieurs fois le serveur AMP sur des noms de fichier différents, sans détruire le Thread, mais simplement en le stoppant. Ici, donc, l'AMPThreadCarrier lance sous forme de commande Unix le serveur AMP. Pour stopper le Thread, il faudra tuer le processus AMP, ce qui permettra à AMPThreadCarrier de finir sa tâche.

Pour finir, il est à noter que c'est la méthode send() de FileList qui lance AMPThreadCarrier: à chaque fois que l'on demandera d'envoyer un fichier sur le réseau, la méthode run() d'AMPThreadCarrier sera invoquée avec le nom de fichier à transmettre correspondant. AMPThreadCarrier est différent du Thread lancé par ControlLayer pour gérer le mode automatique. Dans le mode automatique, la méthode fileList.send() est invoquée sur chacun des fichiers à transmettre, et cette dernière lance à son tour un AMPThreadCarrier. Le mode automatique est géré sous forme de Thread afin de pouvoir garder la main et, notamment, stopper ce mode.


next up previous
Next: 5 Conclusion Up: 4 Composition - Structure Previous: 4.3 Relation entre ControlLayer
Denis Arnaud
12/19/1997