{Unidad que implementa la ejecución de comandos de tipo: %EDIT, %EXPLORER, ...}
unit Comandos;
{$mode objfpc}{$H+}
interface
uses
  Classes, SysUtils, MisUtils, FrameTabSession, Globales, FrameTabSessions,
  process, Parser;

const INI_COMM = '%';  //Initial character for commands

  function ExecSFTP(usr, pwd, ip, cmds: string): boolean;
  function ProcessCommand(lin: string; ses: TfraTabSession; tabSessions: TfraTabSessions): boolean;

implementation
function ExecSFTP(usr, pwd, ip, cmds: string): boolean;
//Ejecuta el cliente SFTP. Devuelve FALSE si hubo error
var
  p : TProcess;   //el proceso a manejar
begin
  Result := true;
  StringToFile(cmds,  'killme.tmp');  //Ceea archivo en blanco.
  p := TProcess.Create(nil); //Crea proceso
  p.Options:= p.Options + [poNoConsole, poWaitOnExit];
  p.Executable:='psftp.exe';
  p.Parameters.Clear;
  p.Parameters.Add(usr+ '@' + ip);
  p.Parameters.Add('-pw');
  p.Parameters.Add(pwd);
  p.Parameters.Add('-b');
  p.Parameters.Add('killme.tmp');
  try
    p.Execute;
  except
    Result := false;
    MsgBox('Fallo al iniciar aplicativo: '+ p.Executable);;
  end;
  p.Free;
  DeleteFile('killme.tmp');  //Limpia la casa
end;

function ProcessCommand(lin: string; ses: TfraTabSession; tabSessions: TfraTabSessions): boolean;
{Procesa una línea que debe contener un comando. Si no encuentra un comando, devuelve
FALSE.}
var
  linCommand: TStringList;
begin
  if copy(lin, 1, 1) = INI_COMM then begin    //Es un comando.
    //Comando equivalente al lenguaje de macros
    linCommand := TStringList.Create;
    linCommand.Text := copy(lin, 2, length(lin));
    cxp.Compilar('current file', linCommand);
    if cxp.HayError then begin
      cxp.ShowError;
    end;
    linCommand.Destroy;
    exit(true);
  end else begin   //No se reconoce como comando.
    exit(false);
  end;
end;


end.

