next up previous
Next: Àpropos de ce document... Up: Enoncés des travaux pratiques Previous: Exercice 2

Exercice 3

Les sources de cet exercice se trouvent dans le répertoire "./TP-CORBA/EXO3".




Ce dernier exercice montre comment on peut manipuler une interface IDL comme n'importe quel type. En effet, une interface IDL est un type qui peut être utilisé comme paramètre d'une méthode IDL. L'objectif de cet exercice est donc de construire une troisième interface permettant de créer et de détruire dynamiquement des objets flottant et conversion. Cette troisième interface (appelée une ``usine à objets'', voir la partie cycle de vie du cours) est la seule qui soit exportée par le serveur de nom (voir serveur.cc). Le client commence donc par obtenir une référence d'objet sur l'usine, puis, demande à l'usine d'instancier un objet flottant ou conversion. En retour, l'usine à objet renvoie une référence sur l'objet qu'elle a instancié. Cette référence est alors exploitée par le client pour effectuer les invocations sur la calculatrice.


 
Figure 1:   Implantation de la BOA dans omniORB2
\begin{figure}
\textit{class} BOA $\{$\space \\ \hspace*{0.5cm}\textit{public}: ...
 ...eady(Object\verb*+_+ptr, ImplementationDef\verb*+_+ptr p=0);\\ $\}$;\end{figure}




Regardons maintenant les interactions que l'usine à objets devra avoir avec la BOA pour créer et détruire dynamiquement les objets CORBA. Rappelons d'abord le mapping C++ de la BOA (l'entité dans CORBA qui permet de manipuler des implantations d'objets). La figure 1 donne la définition de la BOA implantée par omniORB2. Nous avons déjà utilisé obj_is_ready() pour avertir la BOA qu'un nouvel objet était prêt à être invoqué. Cette méthode devra de nouveau être utilisée lors de la création dynamique d'un objet. La méthode dispose() quant à elle, permet de détruire un objet. Cette méthode est la seule qui permette de détruire convenablement un objet. En effet, l'utilisation de l'instruction C++ delete n'est pas suffisante car elle ne permet pas de désallouer certaines données manipulées par la BOA. Attention car dispose prend en paramètre une référence d'objet, et non un pointeur sur l'implémentation de l'objet! De même, lors de la création d'un objet, prenez garde au fait que c'est une référence d'objet qui doit être renvoyée au client, et non un pointeur sur l'implémentation de l'objet. Vous pourrez à cet effet vous servir de la méthode _this() qui, invoquée sur une implémentation, permet d'obtenir une référence d'objet sur celle-ci (voir serveur.cc).




Dans cet exercice, il vous est demandé de :

1.
Modifier le fichier polonaise.idl en rédigeant dans l'interface usine quatre méthodes (deux pour l'interface flottant et deux pour l'interface conversion), qui permettent la création et la suppression d'un objet. Les méthodes de suppression doivent prendre un paramètre en in qui est une référence sur l'objet à détruire. Les méthodes de création prennent un paramètre en out qui est une référence sur l'objet créée par le serveur. Lorsque vous créez un nouvel objet chez le serveur, il ne faut pas oublier de l'enregistrer auprès de la BOA. Nous vous invitons à regarder le fichier client.cc pour un exemple d'une invocation d'usine à objet.

2.
Puis, complétez les fichiers usine_impl.hh et usine_impl.cc.

3.
Enfin, vous testerez votre usine à objets avec client.cc.

next up previous
Next: Àpropos de ce document... Up: Enoncés des travaux pratiques Previous: Exercice 2
Frank Singhoff
3/24/1998