{--------------------------------------------------------}
{      Discavox - Modulo de comunicacao com a rende
{--------------------------------------------------------}

unit disRende;

interface

uses
    dvWin, dvCrt,
    disvars, disutil, disprot,
    dismsg, disfala, disdos,
    disansi,
    disfolhe,
    disComm, xmodem,
    dvHora, videovox;

procedure falaComRende;

implementation

{--------------------------------------------------------}
{                  mini-emulador de terminal
{--------------------------------------------------------}

procedure miniTerm;
var
    c: char;
    emulando: boolean;
    nomeComputador: string;
    i: integer;

label fim;

begin
    mensagem ('DITELCOM', 1); {Informe o telefone do computador parceiro: }
    sintReadln (nomeComputador);
    if nomeComputador = '' then goto fim;

    for i := 1 to length (nomeComputador) do
        nomeComputador[i] := upcase (nomeComputador[i]);
    if nomeComputador[1] in ['A'..'Z'] then
         begin
             nomeComputador := pegaParam (nomeComputador);
             if nomeComputador = '' then nomeComputador := ' ';
         end;

    writeln;
    textBackground (BLUE);
    mensagem ('DIINSTRT', 0); {Tecle F4 para fala, F9 para sair do mini terminal}
    textBackGround (BLACK);
    writeln;

    if discaTelefone (nomeComputador) then;

    falando := 1;
    modoLynx := false;
    c := #0;
    emulando := true;
    inicAnsi;

    while emulando do
        begin
            if keypressed then
                begin
                    c := readkey;
                    if c <> #$0 then
                        esclink (c)
                    else
                        begin
                        c := readkey;
                            case c of
                                F4 : begin
                                     if falando = 0 then falando := 1
                                                    else falando := 0;
                                     if falando = 1 then sintSom ('DIFALLIG')
                                                    else sintSom ('DIFALDLG');
                                     end;

                                CTLF9:  leitorDeTela;
                                F9: goto fim;
                            end;
                        end;
                end;

            if chegouLink then
                begin
                    lelink (c);
                    if c = #$0c then 
                        clrscr
                    else
                        ansiwrite (c);
                end;
        end;

fim:
    falando := 1;
    mensagem ('DIFIMTRM', 1); {Mini terminal desativado}
end;

{--------------------------------------------------------}
{               manda pedidos para Rende
{--------------------------------------------------------}

procedure mandaParaRende;
var resp: char;
    salva: integer;
    salvaCor: word;
    numTel, conta, senha: string;
    ligacaoTelefonica: boolean;
    i: integer;
    c: char;

label confirma, liga, cancela, ligaDeNovo, direto, ramalDeNovo;

begin
    writeln;
    InicLink (porta, velocTerm, nbitsTerm, stopsTerm, paridTerm);

confirma:

{----------- escolhe ramal e opcao de mini-terminal ------------}

    if not empacotaPedidos then
        exit;

ramalDeNovo:
    textBackground (RED);
    mensagem ('DIRAMAL', 0); {Tecle o ramal (de 1 a 9), M para login manual ou ESC para desistir: }
    textBackground (BLACK);

    resp := letecla (1);
    if resp = ESC then
        begin
            mensagem ('DIDESIS', 1); {Desistiu...}
            goto cancela;
        end;

    if upcase(resp) = 'M' then
        begin
            miniTerm;

            writeln;
            textBackground (RED);
            mensagem ('DIISSO', 0); {Tecle ENTER para iniciar transmissão, ESC para cancelar}
            textBackground (BLACK);
            resp := letecla (1);
            if resp = ESC then
                begin
                    desligaTelefone (true);
                    mensagem ('DICONDES', 1); {Conexão desativada.}
                    goto confirma;
                end;

            goto direto;
        end;

    if resp = #$0d then
         resp := '1'
    else
        if not (resp in ['1'..'9']) then
            goto ramalDeNovo;

{---------- le conta e senha -----------}

    mensagem ('DICONTA', 0); {Qual a sua conta ? }
    sintReadln (conta);
    if conta = '' then goto confirma;

    mensagem ('DISENHA', 0); {Qual a sua senha ? }
    salvaCor := textAttr;
    textcolor (blue);
    textBackground (blue);
    salva := falando;
    falando := 0;
    sintReadln (senha);
    textAttr := salvacor;
    clreol;
    falando := salva;

    if senha = '' then goto confirma;

{------------- realiza discagem de conexao -------------}

    textBackground (RED);
    mensagem ('DIDISCAR', 1); {Ok, agora espere um pouco que eu vou discar.}
    textBackground (BLACK);
    clreol;

liga:
    numTel := pegaParam ('RENDE'+resp);
    ligacaoTelefonica := numTel [1] in ['0'..'9'];

    if ligacaoTelefonica and (not discaTelefone (numTel)) then
        begin
            while keypressed do resp := readkey;

            if ligacaoTelefonica then
                desligaTelefone (false);
            mensagem ('DINAOLIG', 1); {Não consegui me conectar.}

            while keypressed do resp := readkey;
            textBackground (RED);
            mensagem ('DITENTA', 0); {Tecle outro ramal ou ESC para cancelar...}
            textBackground (BLACK);
            clreol;

            for i := 1 to 20 do
                begin
                    if keypressed then
                        begin
                            c := readkey;
                            sintCarac (c);
                            if c = #$1b then goto confirma;
                            if c in ['1'..'9'] then resp := c;
                            goto ligaDeNovo;
                        end;
                    delay (500);
                end;
ligaDeNovo:
            mensagem ('DIDENOVO', 1); {Tentarei de novo...}
            goto liga;
        end;

    if not executaConexao (ord(resp) - ord ('0'), conta, senha) then
        begin
            writeln;
            mensagem ('DIERCONT', 1); {O computador não aceitou sua conta.}
            if ligacaoTelefonica then
                desligaTelefone (false);
            goto ramalDeNovo;
        end;

{------------ dialogo com o programa parceiro ------------}

direto:
    if not ativaProgRende then
        begin
            mensagem ('DINCOPRG', 1); {Conectou com o computador, mas não com o programa parceiro}
            goto confirma;
        end;

    if not enviaPedidos then
        begin
            executaDesconexao;
            if ligacaoTelefonica then
                desligaTelefone (false);
            goto confirma;
        end;

    if recebeRespostas then
        begin
            executaDesconexao;
            if ligacaoTelefonica then
                desligaTelefone (false);
            desempacotaResposta;

            textBackground (RED);
            mensagem ('DIOBRIG', 1); {A Rende agradece a você por sua companhia}
            textBackground (BLACK);
            clreol;
            writeln;
            exit;
        end
    else
        goto confirma;

cancela:
     mensagem ('DIDESCUL', 1); {Sinto muito amigo...}
     if ligacaoTelefonica then
         desligaTelefone (true);
     finalLink;
end;

{--------------------------------------------------------}
{                   fala com a Rende
{--------------------------------------------------------}

procedure falaComRende;
var
    rendando: boolean;
    c: char;

{--------------------------------------------------------}

     procedure recebeTexto;
     var
         c, opcao: char;
         codinome: string;
     begin
         textBackground (MAGENTA);
         mensagem ('DICODIN', 0); {Qual o codinome do texto ? }
         textBackground (BLACK);
         sintReadln (codinome);
         if codinome <> '' then
             begin
                 ntextos := ntextos + 1;
                 texto[ntextos] := codinome;
             end
         else
             mensagem ('DIPEDIR', 1); {Para pedir a lista de codinomes, selecione I}
     end;

{--------------------------------------------------------}

     procedure enviaCarta;
     var nomeArq, nomeDest, assunto: string;
     begin
         if nCartas >= 20 then
             begin
                 mensagem ('DI20CART', 1); {Só consigo mandar 20 cartas por vez.}
                 exit;
             end;

         mensagem ('DIENDER', 1); {Qual o endereço eletrônico do destinatário ? }
         sintReadln (nomeDest);
         if nomeDest = '' then exit;

         mensagem ('DINOMCAR', 1); {Qual o nome do arquivo da carta ? '}
         sintReadln (nomeArq);
         if not existeArq (nomeArq) then
             begin
                 mensagem ('DIARQNAO', 1); {Esse arquivo não existe.}
                 exit;
             end;

         mensagem ('DIASSUN', 1); {Qual o assunto da carta ? }
         sintReadln (assunto);

         nCartas := nCartas + 1;
         arqCarta [nCartas] := nomeArq;
         destCarta [nCartas] := nomeDest;
         assuntoCarta [nCartas] := assunto;

         mensagem ('DIENVIO', 1); {Carta preparada para envio}
     end;

{--------------------------------------------------------}

     procedure recebeCartas;
     begin
         pediuCartas := true;
         mensagem ('DIPEGO', 1); {Certo.  Quando completar a liga‡„o eu pego as cartas para você.}
     end;

{--------------------------------------------------------}

     procedure recebePrograma;
     var nome: string;
     begin
         if nProgs >= 5 then
             begin
                 mensagem ('DI5PROG', 1); {Só consigo atender a 5 programas por vez. Sinto muito.}
                 exit;
             end;

         mensagem ('DIPROREC', 1); {Informe o nome do programa a receber:}
         sintReadln (nome);
         if nome = '' then exit;

         nProgs := nProgs+ 1;
         nomeProg [nProgs] := nome;

         mensagem ('DICOMPL', 1); {Ok. Quando completar a ligação eu pego para você.}
     end;

{--------------------------------------------------------}

    procedure ajuda;
    begin
        while keypressed do c := readkey;

        mensagem ('DIAJUDR1', 1); {As opções da Rende são:}

        if not keypressed then
            mensagem ('DIAJUDR2', 1); {e - enviar uma carta}
        if not keypressed then
            mensagem ('DIAJUDR4', 1); {r - receber suas cartas}
        if not keypressed then
            mensagem ('DIAJUDR5', 1); {f - folhear cartas j  recebidas}
        if not keypressed then
            mensagem ('DIAJUDR6', 1); {i - receber o indice dos textos}
        if not keypressed then
            mensagem ('DIAJUDR7', 1); {t - receber um texto}
        if not keypressed then
            mensagem ('DIAJUDR8', 1); {p - receber programa distribuído pela RENDE}
        if not keypressed then
            mensagem ('DIAJUDR9', 1); {ESC - iniciar discagem de conexão}
    end;

begin
    writeln;
    mensagem ('DIRENDE', 1); {Servico RENDE - Projeto Intervox - NCE/UFRJ}
    writeln ('        com o apoio da Rede Nacional de Pesquisa do MCT');
    writeln ('        e do projeto RENDE/REINTEGRA da CECAE/USP');

    nCartas := 0;
    nProgs := 0;
    nTextos := 0;
    pediuCartas := false;

    rendando := true;
    while rendando do
        begin
            writeln;
            while keypressed do c := readkey;

            textBackground (RED);
            mensagem ('DIQUALOP', 0); {Rende - Qual opção ? }
            textBackground (BLACK);
            clreol;

            c := upcase (letecla (1));
            case c of
                'I': begin
                         ntextos := ntextos + 1;
                         texto[ntextos] := 'indice.txt';
                     end;
                'T': recebeTexto;
                'E': enviaCarta;
                'F': folheiaCartas;
                'R': recebeCartas;
                'P': recebePrograma;
                ESC: rendando := false;

                 #0:  begin
                          c := readkey;
                          case c of
                              GOTFOCUS: ;
                              NOFOCUS: sintClek;
                          else
                             ajuda;
                          end;
                      end;
            else
                ajuda;
            end;
        end;

    if (nCartas <> 0) or (pediuCartas)  or
       (nProgs <> 0)  or (ntextos <> 0) then
            mandaParaRende;
end;

end.