unit uDataModuleServer;

interface

uses
  SysUtils, Classes, uDAEngine, uDAIBXDriver, uDAClasses, uDADriverManager,
  uROClient, uROBinMessage, uROServer, uROIndyTCPServer, uROIndyHTTPServer,
  uROSessions, uDADataTable, uDABINAdapter, IBSQLMonitor, JvComponent,
  JvAppStorage, JvAppRegistryStorage, uDAInterfaces, 
  JvComponentBase, uDAADODriver, uDADBXDriver, uROEventRepository;

const
  SERVER_PORT = '8099';

type
  TdmServer = class(TDataModule)
    HTTPServer: TROIndyHTTPServer;
    BINMessage: TROBinMessage;
    IBXDriver: TDAIBXDriver;
    DriverManager: TDADriverManager;
    DADiagrams: TDADiagrams;
    JvAppRegistryStorage: TJvAppRegistryStorage;
    DADBXDriver: TDADBXDriver;
    DAADODriver: TDAADODriver;
    SessionManager: TROInMemorySessionManager;
    ConnectionManager: TDAConnectionManager;
    DataDictionary: TDADataDictionary;
    procedure DataModuleCreate(Sender: TObject);
    procedure DataModuleDestroy(Sender: TObject);
    procedure HTTPServerBeforeServerActivate(Sender: TObject);
  private
    FConnectionName : string;
    function GetConnectionString: string;
    procedure FindFiles(StartDir: string; var FilesList: TStringList);
  public
    FDBServer : string;
    FDBName : string;
    FDBUser : string;
    FDBPass : string;
    FInicioWindows : Boolean;
    FServerPort : string;
    FDirEntrada : String;
    FDirAlmacen : String;
    FDias : Integer;
    procedure LeerConfiguracion;
    procedure SalvarConfiguracion;
    procedure RefrescarConexion;
    procedure BorrarFicherosDeCargaAntiguos;
    property ConnectionName : string read FConnectionName write FConnectionName;
  end;


function DarRutaInformes : String;
function Encrypt (const Source : string) : String;
function Decrypt (const Source : string) : String;
function GetNextAutoinc(AConnection : IDAConnection; const GeneratorName: string): integer;
function GetTempDirectory(ABasePath : string) : string ;


var
  dmServer: TdmServer;

implementation

{$R *.dfm}

uses
  DateUtils, JclFileUtils, ActiveX, Forms, fServerForm, Registry, Windows, Dialogs,
  ADODB;


function GetTempDirectory(ABasePath : string) : string ;
var
   fTime : TDateTime;
   sFile : String;
Begin
   Result := '' ;

   fTime := Frac(Now) ;
   sFile := 'TMP' + Copy(FormatFloat('#.########', fTime), 5, 5);

   while FileExists(ABasePath + PathDelim + sFile) do
   begin
      fTime := Frac(Now);
      sFile := 'TMP'+Copy(FormatFloat('#.########', fTime), 5, 5);
   end;
   Result := sFile ;
end;

Function AddBS(s:String): String;
Begin
   If Copy(s,Length(s),1)<>'\' Then
      s := s + '\' ;
   Result := s ;
End;

function DarRutaInformes : String;
begin
  Result := ExtractFilePath(Application.ExeName) + 'Informes' + PathDelim;
end;

function GetNextAutoinc(AConnection : IDAConnection; const GeneratorName: string): integer;
var
  ds: IDADataset;
begin
  ds := AConnection.NewDataset(Format('SELECT Gen_id(%s,1) FROM RDB$Database', [GeneratorName]));
  ds.Open;
  result := ds.Fields[0].Value;
  ds.Close;
end;

procedure WriteAutoRun(Name, Value : String);
var
  reg: TRegistry;
begin
  reg := TRegistry.Create;
  try
    reg.RootKey := HKEY_LOCAL_MACHINE;
    reg.LazyWrite := False;
    reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', False);
    reg.WriteString(Name, Value);
    reg.CloseKey;
  finally
    reg.free;
  end;
end;

procedure DeleteAutoRun(Name : String);
var
  reg: TRegistry;
begin
  reg := TRegistry.Create;
  try
    reg.RootKey := HKEY_LOCAL_MACHINE;
    reg.LazyWrite := False;
    reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', False);
    if reg.ValueExists(Name) then
      reg.DeleteValue(Name);
    reg.CloseKey;
  finally
    reg.free;
  end;
end;


function Encrypt (const Source : string) : String;
var
  i:integer;
begin
  Randseed := 28;
  Result := '';
  for i:=1 to length(Source) do
    Result := Result + chr(ord(Source[i]) + Random(10) + 1);
end;

function Decrypt (const Source : string) : String;
var
  i : integer;
begin
  Randseed:= 28;
  Result := '';
  for i := 1 to length(Source) do
    Result := Result + chr(ord(Source[i]) - Random(10) - 1);
end;

procedure TdmServer.DataModuleCreate(Sender: TObject);
begin
  LeerConfiguracion;
  RefrescarConexion;
end;

function TdmServer.GetConnectionString: string;
begin
{  Result := 'SDAC?Server=' + FDBServer
    + ';Database=' + FDBName
    + ';UserID=' + FDBUser
    + ';Password=' + Decrypt(FDBPass);}

  Result := 'ADO?AuxDriver=SQLOLEDB.1;Server=' + FDBServer
    + ';Database=' + FDBName
    + ';UserID=' + FDBUser
    + ';Password=' + Decrypt(FDBPass);
end;

procedure TdmServer.LeerConfiguracion;
begin
  with JvAppRegistryStorage do
  begin
    FDBServer := ReadString('ServerDB');
    FDBName := ReadString('DBName');
    FDBUser := ReadString('UserDB');
    FDBPass := ReadString('PassDB');

    FServerPort := ReadString('ServerPort', SERVER_PORT);
    FInicioWindows := ReadBoolean('InicioWindows');

    FDirEntrada := ReadString('DirEntradaEDI');
    FDirAlmacen := ReadString('DirAlmacenEDI');
    FDias := ReadInteger('DiasAlmacenEDI', 1);
  end;
end;

procedure TdmServer.SalvarConfiguracion;
begin
  with JvAppRegistryStorage do
  begin
    BeginUpdate;
    try
      WriteString('ServerDB', FDBServer);
      WriteString('DBName', FDBName);
      WriteString('UserDB', FDBUser);
      WriteString('PassDB', FDBPass);
      WriteString('ServerPort', FServerPort);

      WriteString('DirEntradaEDI', FDirEntrada);
      WriteString('DirAlmacenEDI', FDirAlmacen);
      WriteInteger('DiasAlmacenEDI', FDias);

      WriteBoolean('InicioWindows', FInicioWindows);
      if FInicioWindows then
        WriteAutoRun('AdminPV_Server', Application.ExeName)
      else
        DeleteAutoRun('AdminPV_Server');
    finally
      EndUpdate
    end;
  end;
end;

procedure TdmServer.DataModuleDestroy(Sender: TObject);
begin
  HTTPServer.Active := False;
end;

procedure TdmServer.RefrescarConexion;
begin
  HTTPServer.Active := False;
  ConnectionManager.Connections.GetDefaultConnection.ConnectionString := '';

  ConnectionName := ConnectionManager.GetDefaultConnectionName;
  ConnectionManager.Connections.GetDefaultConnection.ConnectionString := GetConnectionString;
  CoInitialize(nil);
  HTTPServer.Active := TRUE;
end;

procedure TdmServer.HTTPServerBeforeServerActivate(Sender: TObject);
begin
  HTTPServer.Port := StrToInt(FServerPort);
end;

procedure TdmServer.BorrarFicherosDeCargaAntiguos;
var
  AAlmacen : String;
  ADate : TDateTime;
  FilesList: TStringList;
  i: integer;
begin
  ADate := Now;
  IncDay(ADate,((-1)*FDias)); //Establecemos fecha desde la que eliminaremos

  AAlmacen := PathAddSeparator(FDirAlmacen);
  FilesList := TStringList.Create;
  try
    FindFiles(AAlmacen, FilesList);
    for i:=0 to FilesList.Count-1 do
    begin
//    showmessage(FilesList.Strings[i]);
      DeleteDirectory(FilesList.Strings[i], false)
    end;
  finally
    FreeAndNil(FilesList);
  end
end;

procedure TdmServer.FindFiles(StartDir: string; var FilesList: TStringList);
const
  MASK_ALL_FILES = '*.*';
  CHAR_POINT = '.';
var
  SR: TSearchRec;
  IsFound: Boolean;
  ADateTime: TDateTime;
begin
  StartDir := PathAddSeparator(StartDir);

  IsFound := (FindFirst(StartDir + MASK_ALL_FILES, faAnyFile, SR) = 0);
  while IsFound do
  begin
    if (SR.Name[1] <> CHAR_POINT) then
    begin
       ADateTime := FileDateToDateTime(SR.Time);
       if (DaysBetween(ADateTime, Now) > FDias) then
          FilesList.Add(StartDir + SR.Name);
    end;
    IsFound := (FindNext(SR) = 0);
  end;
  SysUtils.FindClose(SR);
end;

end.
