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

unit ftpDlg;
interface

uses dvCrt, dvWin, strings, winsock, winprocs,
     ftpVars, ftpMsg, ftpRede;

function enviaComando (msg: string): boolean;
procedure pegaResposta (var s: string; var codigo: integer; var continua: boolean);
procedure mostraRespostas (var cod: integer);

implementation

{-------------------------------------------------------------}
{         envia uma mensagem, interpretando resposta
{-------------------------------------------------------------}

function enviaComando (msg: string): boolean;
label erro;
begin
    if debug then
        begin
            textColor (yellow);
            writeln (msg);
            textColor (white);
        end;

    msg := msg + #$0d + #$0a;
    enviaComando := true;

    if send (sock, @msg[1], length (msg), 0) <= 0 then
        goto erro;

    processaRede;
    exit;

erro:
    mensagem ('FTCOMINT', 1);  {'Comunicação foi interrompida'}
    enviaComando := false;
end;

{-------------------------------------------------------------}
{         pega uma linha recebida, interpretando codigo
{-------------------------------------------------------------}

procedure pegaResposta (var s: string; var codigo: integer; var continua: boolean);
var cod: string;
    i, erro: integer;
begin
    codigo := 0;
    s := '';
    if pins = pret then
        exit;

    s := bufLinhas [pret]^;
    dispose (bufLinhas [pret]);

    textColor (yellow);
    if verboso then
        sintWriteln (s)
    else
        writeln (s);
    textColor (white);

    pret := (pret + 1) mod MAXLINHAS;

    cod := '';
    i := 1;
    while s[i] = ' ' do i := i + 1;
    while s[i] in ['0'..'9'] do
        begin
            cod := cod + s[i];
            i := i + 1;
        end;

    codigo := 0;
    val (cod, codigo, erro);
    continua := (s[i] = '-') or (codigo = 0);
end;

{-------------------------------------------------------------}
{                  mostra as respostas do servidor
{-------------------------------------------------------------}

procedure mostraRespostas (var cod: integer);
var s: string;
    continua: boolean;
begin
    repeat
        while pins <> pret do
            begin
                pegaResposta (s, cod, continua);
                if (not verboso) and debug then
                    begin
                        textColor (blue);
                        writeln (s);
                        textColor (white);
                    end;
            end;

        if continua then processaRede;
    until not continua;
end;

end.