Estes dois ficheiros contêm a definição da classe do SIF
correspondente à interface Line. O código gerado consiste num
construtor que invoca o objecto SPM_quot
di_llscontroller", com o fim de
registar a interface. No registo da interface é-lhe associado um
identificador único. Esta operação só pode ser feita uma vez. Esta
garantia é dada indirectamente impedindo a criação de mais de um SIF
por cada interface existente.
Nesta classe vai existir um método por cada um existente na classe dos envelopes correspondentes a este tipo. A interface dos métodos é semelhante à das classes dos envelopes, excepto no facto de, na classe do SIF, a descrição do envelope aparecer em primeiro lugar. Outras diferenças podem ocorrer devido a problemas de conversão de CIDL para C++. Estes problemas foram abordados em pormenor na secção 6.3.3, onde se descreveu o gerador de CIDL e os problemas subjacentes à sua existência.
O envelope é, como já se disse, localizado dinamicamente na tabela de servidores conhecidos e comporta-se, em relação ao SIF, como a carta se comporta em relação ao envelope, i.e., o envelope invoca operações sobre a carta fazendo conversões automáticas de tipos, o mesmo sendo feito pelo SIF, mas utilizando envelopes.
Apresenta-se de seguida um método de LineServer.
void LineServer::Insert(Line_desc_ me, char c) { // A estrutura de descrição de cartas é usada para // recuperar o envelope a partir da sua existência sob a // máscara de "void*". LL_Letter __me; Translate(me, __me); SPELLCAST(Line,__me)::Insert(c); }
Translate encontra um envelope local, processo que pode
envolver a sua criação, correspondente à identificação em me,
colocando o resultado em SPM_quot
__me". No caso particular do primeiro
argumento da chamada remota nunca há criação nem importação no
processo de tradução, pois o descritor designa um envelope local ao
contexto (aquele que foi invocado remotamente), que é simplesmente
retornado.
SPELLCAST é a macro que é utilizada nos casos de invocações de cartas por parte de envelopes. O que foi descrito para as cartas e representantes, na secção 6.2.4, deve ser agora repetido para os envelopes. O mecanismo é em tudo idêntico, inclusivé a forma de representar o envelope antes da recuperação do tipo.
Se ocorrerem declarações de envelopes nos argumentos de algum método,
a coversão é semelhante à do objecto invocado, mas a macro utilizada é
SPM_quot
DYN_CAST" e não SPM_quot
SPELLCAST". Considere-se o exemplo
hipotético apresentado de seguida. Note-se a utilização dos tipos dos
descritores como forma de auxílio à determinação dos tipos de
conversão a utilizar.
void AServer::DoIt(A_desc_ me, B_desc_ x) { LL_Letter __me, __x; Translate(me, __me); Translate(x, __x); SPELLCAST(A,__me)::DoSomething((B *)DYN_CAST(B,__x)); }