unit FormUnit1;

interface

uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Vcl.AppEvnts, Vcl.StdCtrls, IdHTTPWebBrokerBridge, Web.HTTPApp, WinSvc,
  frxClass, frxExportPDF, frxFIBComponents, //frxBarcode,

  SBTypes, Utils, SBX509, SBEncoding, System.DateUtils; //frxExportBaseDialog;

type
  TfmPrincipal = class(TForm)
    ApplicationEvents1: TApplicationEvents;
    Memo1: TMemo;
    frxReport1: TfrxReport;
    ExportPDF: TfrxPDFExport;
    procedure FormCreate(Sender: TObject);
  private
    FServer: TIdHTTPWebBrokerBridge;
    procedure StartServer;
    { Private declarations }
  public
    { Public declarations }
    var Data: TextFile;
        NumPuerto:String;
        Puerto:Integer;
    Function ImportarArchivo():Boolean;
    function ServiceStop(Machine, Service: String) : Boolean;


  end;

var
  fmPrincipal: TfmPrincipal;

implementation

{$R *.dfm}

uses
  Winapi.ShellApi, Datasnap.DSService, uDataModule;
const
   Machine = '\\127.0.0.1';
   Service = 'API_Facturado_En_Linea_Exsim';

procedure TerminateThreads;
begin
  if TDSSessionManager.Instance <> nil then
    TDSSessionManager.Instance.TerminateAllSessions;
end;

procedure TfmPrincipal.FormCreate(Sender: TObject);
begin
  FServer := TIdHTTPWebBrokerBridge.Create(Self);
  StartServer;
end;

procedure TfmPrincipal.StartServer;
var Pathexe, PATH, PathLog, StrFechaHora:String;
SearchRec: TSearchRec;
FechaActual:TDateTime;
begin
  PathExe := ExtractFileDir(Application.ExeName);
  Puerto := 0;
  FechaActual := Now();

  //StrFechaHora := DateTimeToStr(FechaActual);
  StrFechaHora := 'Fecha_'+ FormatDateTime('dd_mm_yy',FechaActual) + '_Hora_' + FormatDateTime('hh_nn',FechaActual);
  PathLog := PathExe  + '/' + 'Log_' + StrFechaHora+'.txt';

  Memo1.Lines.Clear;
  Memo1.Lines.Add('Fecha y hora de proceso: ' + StrFechaHora);


  if FindFirst(PathExe + '/puerto.txt', faAnyFile and not
   (faVolumeID or faDirectory), SearchRec) = 0 then
    begin
    repeat
        // Aquí procesamos cada archivo encontrado
       // Sus datos se encuentran en SearchRec.
      // Memo1.Lines.Clear;
       PATH := PathExe + '/' + SearchRec.Name;
       TRY
       BEGIN
        Memo1.Lines.Add('Procesando puerto');
        AssignFile(Data, Path);
        {$I-} Reset(Data); {$I+}
        END
       EXCEPT
         Memo1.Lines.Add('Error al leer el archivo: ' + PATH);
       END;

       If IOResult = 0 Then
       Begin
          
          If ImportarArchivo() Then
          Begin
            Memo1.Lines.Add('Puerto a utilizar: '+NumPuerto);
          End Else
          Begin
              Memo1.Lines.Add('Error al leer puerto.');
              Memo1.Lines.SaveToFile(PATHLOG);
              Application.Terminate;
          End;
          Screen.Cursor := crDefault;


          Closefile(Data);
       End Else
           Memo1.Lines.Add('Verifique que el archivo exista o este disponible.');


       //Memo1.Lines.Add('Fecha y hora de proceso: ' + StrFechaHora);

       if FileExists(PATHLOG) then
         DeleteFile(PATHLOG);

       Memo1.Lines.SaveToFile(PathLog);
       until FindNext(SearchRec) <> 0;
       FindClose(SearchRec);
    end else //if FindFirst(PathExe + '\
    begin
      Memo1.Lines.Add('Error al iniciar el servidor.');
      Memo1.Lines.Add('El archivo puerto.txt no existe en el directorio: '+PathExe);

      Memo1.Lines.SaveToFile(PATHLOG);
      Application.Terminate;
    end;


  if not FServer.Active then
  begin
    if Puerto > 0 then
    begin
      FServer.Bindings.Clear;
      FServer.DefaultPort := Puerto;
      FServer.Active := True;
      Memo1.Lines.Add('El servidor se conectó correctamente.');
      Memo1.Lines.SaveToFile(PATHLOG);
    end;
  end;
end;

Function TfmPrincipal.ImportarArchivo():Boolean;
begin

  try
    begin
      while not EOF(Data) do
      begin
        NumPuerto := '';
        READLN(DATA,NumPuerto);
        Puerto := StrToInt(NumPuerto);
        Result := true;
      end;
    end;
  EXCEPT
    begin
      Memo1.Lines.Add('Error al iniciar el servidor.');
      Memo1.Lines.Add('El numero de puerto es incorrecto. ');
      Memo1.Lines.Add('Valor actual: '+NumPuerto);
      Memo1.Lines.Add('Verifique su información en el archivo puerto.txt ');
      Memo1.Lines.Add('Ejemplo de puerto: 8080 ');
      Result := false;
    end;
  end;

end;

function TfmPrincipal.ServiceStop(Machine, Service: String) : Boolean;
var
   schm,
   schs: SC_Handle;
   ss: TServiceStatus;
   dwChkP: DWord;

begin

   schm := OpenSCManager(PChar(Machine), nil, SC_MANAGER_CONNECT);

   if (schm>0) then
   begin

      schs := OpenService(schm, PChar(Service), SERVICE_STOP or
      SERVICE_QUERY_STATUS);

      if (schs>0) then
      begin
         if (ControlService(schs, SERVICE_CONTROL_STOP, ss)) then
            if (QueryServiceStatus(schs, ss)) then
               while (SERVICE_STOPPED<>ss.dwCurrentState) do
               begin
                  dwChkP := ss.dwCheckPoint;
                  Sleep(ss.dwWaitHint);
                  if (not QueryServiceStatus(schs, ss)) then
                     Break;
                  if (ss.dwCheckPoint < dwChkP) then
                     Break;
               end;
         CloseServiceHandle(schs);
      end;

      CloseServiceHandle(schm);

   end;

   Result := SERVICE_STOPPED=ss.dwCurrentState;

end;




end.
