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.
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 :
_
impl.hh
et usine_
impl.cc.