Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Introduce a way to specify a custom Execute method to be called when installing a dependency #80

Closed
wants to merge 1 commit into from

Conversation

obones
Copy link

@obones obones commented Mar 31, 2022

This allows for special cases not handled by this project, like decompressing archive files for instance. In our case, we call it like this:

#define Dependency_NoExampleSetup
#define Dependency_CustomExecute "CustomExecute"
#include <..\..\..\External\InnoDependencyInstaller\CodeDependencies.iss>

And we defined the following items that declares a CustomExecute procedure that in turn calls the command line version of 7-zip:

#define protected CurrentFilePath ExtractFilePath(__PATHFILENAME__)

[Files]
Source: "{#CurrentFilePath}\7za.exe"; Flags: dontcopy

[Code]
const
  ERROR_7_ZIP_NO_ERROR = 0;
  ERROR_7_ZIP_WARNING = 1;
  ERROR_7_ZIP_FATAL_ERROR = 2;
  ERROR_7_ZIP_CMD_LINE_ERROR = 7;
  ERROR_7_ZIP_NOT_ENOUGH_MEMORY = 8;
  ERROR_7_ZIP_USER_ABORT = 255;

function Decompress(const FileName, Parameters: string; var ResultCode: Integer): Boolean;
var
  StandardOutput, ErrorOutput: AnsiString;
begin
  Result := False;
  // extract the archiver tool into the temporary folder
  ExtractTemporaryFile('7za.exe');
  // and execute it via the shell, to allow piping two of them for tgz archives
  if ExecWithResult(ExpandConstant('{tmp}\7za.exe'), Format('x "%s" %s', [FileName, Parameters]), '', SW_HIDE, ewWaitUntilTerminated, ResultCode, StandardOutput, ErrorOutput) then
  begin
    // the execution of the tool succeeded, but it doesn't mean that
    // extraction was successful; now we need to determine what exit
    // code the tool returned (for more information follow this link
    // http://sevenzip.sourceforge.jp/chm/cmdline/exit_codes.htm)
    case ResultCode of
      ERROR_7_ZIP_NO_ERROR, // all the files were successfully extracted
      ERROR_7_ZIP_WARNING: 
        Result := True; 
      (*ERROR_7_ZIP_FATAL_ERROR,  // errors occured
      ERROR_7_ZIP_CMD_LINE_ERROR: ;
      ERROR_7_ZIP_NOT_ENOUGH_MEMORY: ;
      ERROR_7_ZIP_USER_ABORT: ;*)
      else
        MsgBox(
          'An error occured while decompressing:'#13#10 +
          ''#13#10 +
          'Filename = ' + filename + #13#10 +
          'parameters = ' + parameters + #13#10 + 
          'Error level = ' + IntToStr(ResultCode) + #13#10 + 
          'StandardOutput = '#13#10 + 
          StandardOutput + #13#10 +
          'ErrorOutput = '#13#10 + 
          ErrorOutput + #13#10,
          mbError, 0);
    end;
  end
  else
  begin
    // the execution of the archiver tool failed; from SysErrorMessage(ResultCode)
    // you can get the reason of the failure
    MsgBox(
      'An error occured while decompressing:'#13#10 +
      ''#13#10 +
      'Filename = ' + filename + #13#10 +
      'parameters = ' + parameters + #13#10 + 
      SysErrorMessage(ResultCode),
      mbError, 0);
  end;
end;

function CustomExecute(const filename, parameters: string; var resultcode : Integer; var Handled: Boolean): Boolean;
var
  Extension: string;
begin
  Extension := ExtractFileExt(filename);

  if (Extension = '.zip') or (Extension = '.7z') then 
  begin
    Handled := True;
    Result := Decompress(filename, '"-o' + Parameters + '"', resultcode);
  end
  else if (Extension = '.tgz') or (Extension = '.tar.gz') then  
  begin
    Handled := True;
    Result := Decompress(filename, ExpandConstant('-so | "{tmp}\7za.exe" x -aoa -si -ttar "-o' + Parameters + '"'), resultcode);
  end;
end;

Note: the ExecWithResult method is similar to Dependency_ExecWithResult introduced by PR #79

@DomGries DomGries closed this in 350142d Apr 14, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant