{-------------------------------------------------------------}
{
{    Programa de Transferência Remota de Arquivos
{
{    Autor: Jose' Antonio Borges
{
{    Em 21/04/98
{
{-------------------------------------------------------------}

{$M 32767, 8192}

{-------------------------------------------------------------}
{		arquivos de inclusao obrigatoria
{-------------------------------------------------------------}

uses dvCrt, dvWin, strings, winsock, winprocs,
     ftpVars, ftpMsg, ftpLogin, ftpDir, ftpDlg, ftpRede, ftpArq;

{-------------------------------------------------------------}
{		     rotina de inicializacao
{-------------------------------------------------------------}

function inicializa: boolean;

var s: string;
    erro: integer;
    tempFileName: array [0..144] of char;
    tituloJan: array [0..144] of char;

begin
    sintInic (0, sintAmbiente ('FTPVOX', 'DIRFTPVOX'));

    clrscr;
    setWindowText (crtWindow, 'FTPVOX');

    textBackground (BLUE);
    mensagem ('FTINIC', 0);  {'FTP VOX - NCE/UFRJ - v.'}
    sintWriteln (VERSAO);
    textBackground (BLACK);
    writeln;

    processando := true;
    fimProg := false;
    canalAberto := false;
    escutando := false;

    totalTransmitido := 0;
    verboso := false;
    pins := 0;
    pret := 0;
    linhaParcial := '';
    portaLocal := $400 + 20;

    getTempFileName(getTempDrive ('C'), 'dir', 0, tempFileName);
    nomeArqDir := strPas (tempFileName);

    mensagem ('FTCOMPUT', 0);  {'Nome do computador: '}
    sintReadln (nomeHost);

    strPCopy (tituloJan, 'FTPVOX ' + nomeHost);
    setWindowText (crtWindow, tituloJan);

    porta := 21;

    inicializa := nomeHost <> '';
end;

{-------------------------------------------------------------}
{                         ajuda
{-------------------------------------------------------------}

procedure ajuda;
begin
    mensagem ('FTAJUD00', 1);  {'As opçoes são'}
    mensagem ('FTAJUD01', 1);  {'  L  login conta e senha'}
    mensagem ('FTAJUD02', 1);  {'  D  diretorio remoto'}
    mensagem ('FTAJUD03', 1);  {'  R  receber arquivo remoto'}
    mensagem ('FTAJUD04', 1);  {'  T  transmitir'}
    mensagem ('FTAJUD05', 1);  {'  A  apagar'}
    mensagem ('FTAJUD06', 1);  {'  S  trocar subdiretorio'}
    mensagem ('FTAJUD07', 1);  {'  Q  Informa quantidade transmitida'}
    mensagem ('FTAJUD08', 1);  {'  V  modo verborágico'}
    mensagem ('FTAJUD09', 1);  {' F1  ajuda'}
    mensagem ('FTAJUD10', 1);  {'ESC  fim do programa'}
    while keypressed do readkey;
end;

{-------------------------------------------------------------}
{                     processa tecla
{-------------------------------------------------------------}

procedure processaTecla;
var c, resp: char;
    nome, s: string;
    codigo: integer;
    erroFatal: boolean;

begin
    fimProg := false;

    c := sintReadKey;
    writeln (c);
    c := upcase (c);

    case c of

    #$0:  begin
              readkey;
              ajuda;
          end;
    '?':  ajuda;

    'L':  pedeContaESenha;
    'R':  iniciaRecepcao ('');
    'T':  iniciaEnvio;
    'D':  processaDiretorio;
    'Q':  mostraTransmitidos;

    #$1b:
        begin
            fimProg := true;
            if enviaComando ('QUIT') then
                mostraRespostas (codigo);
            processando := false;
        end;

    'A':  apagaArquivo;
    'S':  trocaSubdiretorio;

    'V':
        begin
            verboso := not verboso;
            if verboso then
               mensagem ('FTVERBO', 1)  {'Modo verborragico ligado'}
            else
               mensagem ('FTNAOVRB', 1);  {'Modo verborragico desligado'}
        end;

    '/':
        begin
            mensagem ('FTCMDFTP', 1);  {'Entre o comando em codigo FTP'}
            sintReadln (s);
            if enviaComando (s) then
                mostraRespostas (codigo);
        end;
    else
        mensagem ('FTERRCMD', 1);  {'Comando inexistente'}
    end;

    { por garantia }

    if pins <> pret then
        mostraRespostas (codigo);
end;

{-------------------------------------------------------------}
{                      termina o programa
{-------------------------------------------------------------}

procedure terminaProg;
begin
    assign (arqLocal, nomeArqDir);
    {$I-}  erase (arqLocal);  {$I+}
    if ioresult <> 0 then;

    mensagem ('FTFIMPRG', 1);  {'Programa terminado'}
    delay (3000);

    sintFim;
    doneWinCrt;
end;

{-------------------------------------------------------------}
{                       programa principal
{-------------------------------------------------------------}

var ev: integer;
    cmd: string;
    s: string;
    codigo: integer;
    continua: boolean;
label fim;
begin
    if not inicializa then
        terminaProg;

    if abreConexao then
       begin
           repeat
               processaRede;
               while pins <> pret do
                   pegaResposta (s, codigo, continua);
               if (codigo <> 220) and (not continua) then
                   begin
                       mensagem ('FTERRSRV', 1);  {'Servidor não está disponível, codigo'}
                       sintWriteln (s);
                       goto fim;
                   end;
           until not continua;

           pedeContaeSenha;

           textBackground (BLUE);
           mensagem ('FTCMD', 0);  {'Comando ? '}
           textBackground (BLACK);

           while (processando)  do
               begin
                   if keypressed then
                      begin
                          processaTecla;

                          if (not fimProg) then
                              begin
                                  textBackground (BLUE);
                                  mensagem ('FTCMD', 0);  {'Comando ? '}
                                  textBackground (BLACK);
                              end;
                      end;

                   ev := checaEventoRede;

	           if ev = CHEGOU_REDE then
                       begin
                           processaRede;
                           while pins <> pret do
                               begin
                                   pegaResposta (s, codigo, continua);
                                   case codigo of
                                       221:  mensagem ('FTDESCON', 1);  {'Desconectando'}
                                       226:  mensagem ('FTFIMENV', 1);  {'Envio Completado'}
                                   else
                                      if not verboso then
                                          sintWriteln (s);
                                   end;

                               end;
                       end;
               end;
       end;

fim:
    fechaConexao;
    terminaProg;
end.
