uCacicVersionsAndHashes.pas 12.2 KB
unit uCacicVersionsAndHashes;

interface

uses
  Windows,
  SysUtils,
  Classes,
  Graphics,
  Controls,
  Forms,
  StdCtrls,
  StrUtils,
  ExtCtrls,
  ImgList,
  ComCtrls,
  inifiles,
  dialogs,
  CACIC_Library;

type
  TfrmCacicVersionsAndHashes = class(TForm)
    ItemsList           : TListView;
    Label1              : TLabel;
    Label2              : TLabel;
    ImageList1          : TImageList;
    pnVersion: TPanel;
    pnComandos          : TPanel;
    btRenew: TButton;
    Bt_Fechar           : TButton;
    Panel2              : TPanel;
    lbMensagens         : TLabel;
    procedure           FormCreate(Sender: TObject);
    procedure           Bt_FecharClick(Sender: TObject);
    procedure           RefreshList;
    procedure           btRenewClick(Sender: TObject);
    procedure           ItemsListAdvancedCustomDrawSubItem(Sender: TCustomListView;Item: TListItem; SubItem: Integer; State: TCustomDrawState;Stage:  TCustomDrawStage; var DefaultDraw: Boolean);
    procedure           RemontaVersoesINI(pStrSectionsIdentsAndValues : String);
    function            InsertItemLISTA(pStrName , pStrVerINI , pStrVerEXE , pStrSize , pStrDate , pStrHashINI , pStrHashEXE : string; pBoolEqualsVersions : boolean) : boolean;
    function            getLinuxItemData(pStrLinuxItemName:String) : TStrings;
    function            getOnlyFileName(pStrFileNameWithSlashs : String) : String;
  private
    { Private declarations }
  public
  end;

var
  frmCacicVersionsAndHashes: TfrmCacicVersionsAndHashes;
  g_oCacic                 : TCACIC;
  arrItemData,
  arrItemDefinitions       : TStrings;
  strVersionsIniFileName   : String;
  boolIsLinuxItem          : boolean;

implementation

{$R *.DFM}
function  TfrmCacicVersionsAndHashes.getOnlyFileName(pStrFileNameWithSlashs : String) : String;
var tstrGOFN : TStrings;
    strGOFN  : String;
Begin
  if (pStrFileNameWithSlashs <> '') then
    Begin
      tstrGOFN := g_oCacic.explode(pStrFileNameWithSlashs,',');
      strGOFN  := StringReplace(tstrGOFN[0],'/','#SLASH#',[rfReplaceAll]);
      strGOFN  := StringReplace(strGOFN    ,'\','#SLASH#',[rfReplaceAll]);
      tstrGOFN := g_oCacic.explode(strGOFN,'#SLASH#');
      Result   := tstrGOFN[tstrGOFN.count - 1];
    End
  else
    Result     := '';
End;

procedure TfrmCacicVersionsAndHashes.FormCreate(Sender: TObject);
var strAux : String;
begin
  g_oCacic               := TCACIC.Create;
  pnVersion.Caption      := 'v: ' + g_oCacic.getVersionInfo(ParamStr(0));

  strVersionsIniFileName := ExtractFilePath(ParamStr(0)) + 'versions_and_hashes.ini';

  if not FileExists(strVersionsIniFileName) then
    Begin
      g_oCacic.setValueToFile('Importante'      ,'Atenção '     ,'> Os ítems devem se referir aos caminhos relativos à posição do CacicVersionsAndHashes.exe.' , strVersionsIniFileName);
      g_oCacic.setValueToFile('Importante'      ,'Informação 1:','Nome do ítem a ser identificado e listado;'                                                  , strVersionsIniFileName);
      g_oCacic.setValueToFile('Importante'      ,'Informação 2:','S/N -> Indica se o ítem deve ser mostrado na opção "Downloads" do Gerente WEB;'              , strVersionsIniFileName);
      g_oCacic.setValueToFile('Importante'      ,'Informação 3:','S/N -> Indica se o ítem refere-se ao S.O. GNU/Linux.'                                        , strVersionsIniFileName);
      g_oCacic.setValueToFile('ItemsDefinitions','Item_1'       ,'cacic280.exe      ,N,N'                                                                      , strVersionsIniFileName);
      g_oCacic.setValueToFile('ItemsDefinitions','Item_2'       ,'cacicservice.exe  ,N,N'                                                                      , strVersionsIniFileName);
      g_oCacic.setValueToFile('ItemsDefinitions','Item_3'       ,'chksis.exe        ,N,N'                                                                      , strVersionsIniFileName);
      g_oCacic.setValueToFile('ItemsDefinitions','Item_4'       ,'gercols.exe       ,N,N'                                                                      , strVersionsIniFileName);
      g_oCacic.setValueToFile('ItemsDefinitions','Item_5'       ,'installcacic.exe  ,S,N'                                                                      , strVersionsIniFileName);
      g_oCacic.setValueToFile('ItemsDefinitions','Item_6'       ,'mapacacic.exe     ,S,N'                                                                      , strVersionsIniFileName);
      g_oCacic.setValueToFile('ItemsDefinitions','Item_7'       ,'srcacicsrv.exe    ,N,N'                                                                      , strVersionsIniFileName);
      g_oCacic.setValueToFile('ItemsDefinitions','Item_8'       ,'srcaciccli.exe    ,S,N'                                                                      , strVersionsIniFileName);
      g_oCacic.setValueToFile('ItemsDefinitions','Item_9'      ,'pyCACIC           ,S,S'                                                                      , strVersionsIniFileName);
    End;

  arrItemDefinitions := g_oCacic.explode(g_oCacic.getValueFromFile('ItemsDefinitions' , 'Item_1', strVersionsIniFileName),',');
  if not FileExists(trim(arrItemDefinitions[0])) then
    btRenewClick(nil)
  else
    RefreshList;
end;

procedure TfrmCacicVersionsAndHashes.RemontaVersoesINI(pStrSectionsIdentsAndValues : String);
var iniFile                     : TIniFile;
    intLoopItemsRemontaINI      : integer;
    arrSectionsIdentsAndValues,
    arrItemsRemontaINI          : TStrings;
begin
  arrItemsRemontaINI  := g_oCacic.explode(pStrSectionsIdentsAndValues,'#');
  iniFile             := TIniFile.Create(strVersionsIniFileName);

  if (FileGetAttr(strVersionsIniFileName) and faReadOnly) > 0 then
     FileSetAttr(strVersionsIniFileName, FileGetAttr(strVersionsIniFileName) xor faReadOnly);

  for intLoopItemsRemontaINI := 0 to (arrItemsRemontaINI.Count -1) do
    Begin
      arrSectionsIdentsAndValues := g_oCacic.explode(arrItemsRemontaINI[intLoopItemsRemontaINI],',');
      iniFile.WriteString(arrSectionsIdentsAndValues[0], arrSectionsIdentsAndValues[1],arrSectionsIdentsAndValues[2]);
    End;

  iniFile.Free;
End;

function TfrmCacicVersionsAndHashes.InsertItemLISTA(pStrName , pStrVerINI , pStrVerEXE , pStrSize , pStrDate , pStrHashINI , pStrHashEXE : string; pBoolEqualsVersions : boolean) : boolean;
var intLoopInserItemLISTA : integer;
Begin
  if (pStrHashEXE <> '0') then
    Begin
      intLoopInserItemLISTA := frmCacicVersionsAndHashes.ItemsList.Items.Count;

      frmCacicVersionsAndHashes.ItemsList.Items.Add;
      frmCacicVersionsAndHashes.ItemsList.Items[intLoopInserItemLISTA].Caption := '';
      frmCacicVersionsAndHashes.ItemsList.Items[intLoopInserItemLISTA].SubItems.Add(pStrName);
      frmCacicVersionsAndHashes.ItemsList.Items[intLoopInserItemLISTA].SubItems.Add(pStrVerINI);
      frmCacicVersionsAndHashes.ItemsList.Items[intLoopInserItemLISTA].SubItems.Add(pStrVerEXE);
      frmCacicVersionsAndHashes.ItemsList.Items[intLoopInserItemLISTA].SubItems.Add(pStrSize);
      frmCacicVersionsAndHashes.ItemsList.Items[intLoopInserItemLISTA].SubItems.Add(pStrDate);
      frmCacicVersionsAndHashes.ItemsList.Items[intLoopInserItemLISTA].SubItems.Add(pStrHashINI);
      frmCacicVersionsAndHashes.ItemsList.Items[intLoopInserItemLISTA].SubItems.Add(pStrHashEXE);

      if pBoolEqualsVersions then
        frmCacicVersionsAndHashes.ItemsList.Items[intLoopInserItemLISTA].ImageIndex := 1
      else
        frmCacicVersionsAndHashes.ItemsList.Items[intLoopInserItemLISTA].ImageIndex := 0;
    End;
End;

procedure TfrmCacicVersionsAndHashes.RefreshList;
var strThinNameItemToRefresh      : string;
    boolActivateRenew,
    boolEqualsVersions            : boolean;
    intLoopItemsRefresh           : integer;
begin
  Screen.Cursor := crHourglass;
  ItemsList.Clear;

  boolActivateRenew           := false;

  intLoopItemsRefresh         := 0;
  strThinNameItemToRefresh    := '.';

  Try
    While (strThinNameItemToRefresh <> '') do
      Begin
        inc(intLoopItemsRefresh);
        boolEqualsVersions       := true;
        strThinNameItemToRefresh := '';
        arrItemDefinitions       := g_oCacic.explode(g_oCacic.getValueFromFile('ItemsDefinitions' , 'Item_' + IntToStr(intLoopItemsRefresh) , strVersionsIniFileName),',');

        if FileExists(Trim(arrItemDefinitions[0])) then
          Begin
            strThinNameItemToRefresh := getOnlyFileName(Trim(arrItemDefinitions[0]));
            boolIsLinuxItem := ((arrItemDefinitions.Count > 2) and (Trim(arrItemDefinitions[2]) = 'S'));
            if boolIsLinuxItem then
              arrItemData := getLinuxItemData(Trim(arrItemDefinitions[0]))
            else
              arrItemData := g_oCacic.explode(Trim(arrItemDefinitions[0])                                         + ',' +
                                              g_oCacic.getVersionInfo(Trim(arrItemDefinitions[0]))                + ',' +
                                              g_oCacic.getFileHash(Trim(arrItemDefinitions[0]))                   + ',' +
                                              DateToStr(FileDateToDateTime(FileAge(Trim(arrItemDefinitions[0])))) + ',' +
                                              g_oCacic.getFileSize(Trim(arrItemDefinitions[0]),true),',');

            if (g_oCacic.getValueFromFile('ItemsValues' , strThinNameItemToRefresh + '_VER' , strVersionsIniFileName) = '') then
              Begin
                g_oCacic.setValueToFile('ItemsValues' , strThinNameItemToRefresh + '_PATH' , arrItemData[0], strVersionsIniFileName);
                g_oCacic.setValueToFile('ItemsValues' , strThinNameItemToRefresh + '_VER'  , arrItemData[1], strVersionsIniFileName);
                g_oCacic.setValueToFile('ItemsValues' , strThinNameItemToRefresh + '_HASH' , arrItemData[2], strVersionsIniFileName);
                g_oCacic.setValueToFile('ItemsValues' , strThinNameItemToRefresh + '_DATE' , arrItemData[3], strVersionsIniFileName);
                g_oCacic.setValueToFile('ItemsValues' , strThinNameItemToRefresh + '_SIZE' , arrItemData[4], strVersionsIniFileName);
              End
            else if (g_oCacic.getValueFromFile('ItemsValues' , strThinNameItemToRefresh + '_HASH' , strVersionsIniFileName) <> arrItemData[2]) then
              Begin
                boolEqualsVersions := false;
                boolActivateRenew  := true;
              End;

            InsertItemLISTA(strThinNameItemToRefresh,
                            g_oCacic.getValueFromFile('ItemsValues' , strThinNameItemToRefresh + '_VER' , strVersionsIniFileName),
                            arrItemData[1],
                            g_oCacic.getFileSize(Trim(arrItemDefinitions[0]),true),
                            arrItemData[3],
                            g_oCacic.getValueFromFile('ItemsValues' ,strThinNameItemToRefresh + '_HASH' , strVersionsIniFileName),
                            arrItemData[2],
                            boolEqualsVersions);
          End; //      if ( strNameItemToRefresh <> '') then
      End;
  finally
    ItemsList.Show;
    Screen.Cursor   := crDefault;
    btRenew.Enabled := boolActivateRenew;
  end;
end;

function TfrmCacicVersionsAndHashes.getLinuxItemData(pStrLinuxItemName:String) : TStrings;
Begin
  Result := g_oCacic.Explode(StringReplace(pStrLinuxItemName,'.tgz','',[rfReplaceAll]),'_');
End;

procedure TfrmCacicVersionsAndHashes.Bt_FecharClick(Sender: TObject);
begin
  Close;
end;

procedure TfrmCacicVersionsAndHashes.btRenewClick(Sender: TObject);
var iniFile : TIniFile;
begin
  iniFile := TIniFile.Create(strVersionsIniFileName);
  iniFile.EraseSection('ItemsValues');
  iniFile.Free;

  RefreshList;
end;

procedure TfrmCacicVersionsAndHashes.ItemsListAdvancedCustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  Stage: TCustomDrawStage; var DefaultDraw: Boolean);
begin
  // Verifico se a imagem para o ítem é 0(zero) => DIFERENTE ou 1(um) IGUAL
  // Coloco em vermelho quando for DIFERENTE...
  if (item.ImageIndex = 0) then
    Begin
      Sender.Canvas.Font.Color := clRed;
      if (SubItem = 2) or (SubItem = 3) then Sender.Canvas.Font.Style := Sender.Canvas.Font.Style + [fsBold];
    End;
end;
end.