next up previous contents index
Next: LineDceServerAux.C Up: Código Gerado Automaticamente Previous: Código Gerado Automaticamente

LineServer.[Ch]

 

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_quotdi_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_quotDYN_CAST" e não SPM_quotSPELLCAST". 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));
    }



next up previous contents index
Next: LineDceServerAux.C Up: Código Gerado Automaticamente Previous: Código Gerado Automaticamente



David M. M. de Matos
Thu Jun 29 14:58:09 MET DST 1995