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.
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.