|
@@ -156,7 +156,9 @@ type
|
|
ssSignedUninstaller,
|
|
ssSignedUninstaller,
|
|
ssSignedUninstallerDir,
|
|
ssSignedUninstallerDir,
|
|
ssSignTool,
|
|
ssSignTool,
|
|
|
|
+ ssSignToolMinimumTimeBetween,
|
|
ssSignToolRetryCount,
|
|
ssSignToolRetryCount,
|
|
|
|
+ ssSignToolRetryDelay,
|
|
ssSlicesPerDisk,
|
|
ssSlicesPerDisk,
|
|
ssSolidCompression,
|
|
ssSolidCompression,
|
|
ssSourceDir,
|
|
ssSourceDir,
|
|
@@ -346,7 +348,8 @@ type
|
|
{$IFDEF UNICODE} PreLangDataList, {$ENDIF} LangDataList: TList;
|
|
{$IFDEF UNICODE} PreLangDataList, {$ENDIF} LangDataList: TList;
|
|
SignToolList: TList;
|
|
SignToolList: TList;
|
|
SignTools, SignToolsParams: TStringList;
|
|
SignTools, SignToolsParams: TStringList;
|
|
- SignToolRetryCount: Integer;
|
|
|
|
|
|
+ SignToolRetryCount, SignToolRetryDelay, SignToolMinimumTimeBetween: Integer;
|
|
|
|
+ LastSignCommandStartTick: DWORD;
|
|
|
|
|
|
OutputDir, OutputBaseFilename, OutputManifestFile, SignedUninstallerDir,
|
|
OutputDir, OutputBaseFilename, OutputManifestFile, SignedUninstallerDir,
|
|
ExeFilename: String;
|
|
ExeFilename: String;
|
|
@@ -497,7 +500,7 @@ type
|
|
procedure SeparateDirective(const Line: PChar; var Key, Value: String);
|
|
procedure SeparateDirective(const Line: PChar; var Key, Value: String);
|
|
procedure ShiftDebugEntryIndexes(AKind: TDebugEntryKind);
|
|
procedure ShiftDebugEntryIndexes(AKind: TDebugEntryKind);
|
|
procedure Sign(AExeFilename: String);
|
|
procedure Sign(AExeFilename: String);
|
|
- procedure SignCommand(const ACommand, AParams, AExeFilename: String; const RetryCount: Integer);
|
|
|
|
|
|
+ procedure SignCommand(const ACommand, AParams, AExeFilename: String; const RetryCount, RetryDelay, MinimumTimeBetween: Integer);
|
|
procedure WriteDebugEntry(Kind: TDebugEntryKind; Index: Integer);
|
|
procedure WriteDebugEntry(Kind: TDebugEntryKind; Index: Integer);
|
|
procedure WriteCompiledCodeText(const CompiledCodeText: Ansistring);
|
|
procedure WriteCompiledCodeText(const CompiledCodeText: Ansistring);
|
|
procedure WriteCompiledCodeDebugInfo(const CompiledCodeDebugInfo: AnsiString);
|
|
procedure WriteCompiledCodeDebugInfo(const CompiledCodeDebugInfo: AnsiString);
|
|
@@ -4121,12 +4124,24 @@ begin
|
|
SignTools.Add(SignTool);
|
|
SignTools.Add(SignTool);
|
|
SignToolsParams.Add(SignToolParams);
|
|
SignToolsParams.Add(SignToolParams);
|
|
end;
|
|
end;
|
|
|
|
+ ssSignToolMinimumTimeBetween: begin
|
|
|
|
+ I := StrToIntDef(Value, -1);
|
|
|
|
+ if I < 0 then
|
|
|
|
+ Invalid;
|
|
|
|
+ SignToolMinimumTimeBetween := I;
|
|
|
|
+ end;
|
|
ssSignToolRetryCount: begin
|
|
ssSignToolRetryCount: begin
|
|
I := StrToIntDef(Value, -1);
|
|
I := StrToIntDef(Value, -1);
|
|
if I < 0 then
|
|
if I < 0 then
|
|
Invalid;
|
|
Invalid;
|
|
SignToolRetryCount := I;
|
|
SignToolRetryCount := I;
|
|
end;
|
|
end;
|
|
|
|
+ ssSignToolRetryDelay: begin
|
|
|
|
+ I := StrToIntDef(Value, -1);
|
|
|
|
+ if I < 0 then
|
|
|
|
+ Invalid;
|
|
|
|
+ SignToolRetryDelay := I;
|
|
|
|
+ end;
|
|
ssSlicesPerDisk: begin
|
|
ssSlicesPerDisk: begin
|
|
I := StrToIntDef(Value, -1);
|
|
I := StrToIntDef(Value, -1);
|
|
if (I < 1) or (I > 26) then
|
|
if (I < 1) or (I > 26) then
|
|
@@ -7443,11 +7458,11 @@ var
|
|
begin
|
|
begin
|
|
for I := 0 to SignTools.Count - 1 do begin
|
|
for I := 0 to SignTools.Count - 1 do begin
|
|
SignToolIndex := FindSignToolIndexByName(SignTools[I]); //can't fail, already checked
|
|
SignToolIndex := FindSignToolIndexByName(SignTools[I]); //can't fail, already checked
|
|
- SignCommand(TSignTool(SignToolList[SignToolIndex]).Command, SignToolsParams[I], AExeFilename, SignToolRetryCount);
|
|
|
|
|
|
+ SignCommand(TSignTool(SignToolList[SignToolIndex]).Command, SignToolsParams[I], AExeFilename, SignToolRetryCount, SignToolRetryDelay, SignToolMinimumTimeBetween);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
-procedure TSetupCompiler.SignCommand(const ACommand, AParams, AExeFilename: String; const RetryCount: Integer);
|
|
|
|
|
|
+procedure TSetupCompiler.SignCommand(const ACommand, AParams, AExeFilename: String; const RetryCount, RetryDelay, MinimumTimeBetween: Integer);
|
|
|
|
|
|
function FmtCommand(S: PChar; const AParams, AExeFileName: String): String;
|
|
function FmtCommand(S: PChar; const AParams, AExeFileName: String): String;
|
|
var
|
|
var
|
|
@@ -7489,13 +7504,20 @@ procedure TSetupCompiler.SignCommand(const ACommand, AParams, AExeFilename: Stri
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
- procedure InternalSignCommand(const AFormattedCommand: String);
|
|
|
|
|
|
+ procedure InternalSignCommand(const AFormattedCommand: String;
|
|
|
|
+ const Delay: Cardinal);
|
|
var
|
|
var
|
|
StartupInfo: TStartupInfo;
|
|
StartupInfo: TStartupInfo;
|
|
ProcessInfo: TProcessInformation;
|
|
ProcessInfo: TProcessInformation;
|
|
LastError, ExitCode: DWORD;
|
|
LastError, ExitCode: DWORD;
|
|
begin
|
|
begin
|
|
- AddStatus(Format(SCompilerStatusSigning, [AFormattedCommand]));
|
|
|
|
|
|
+ if Delay <> 0 then begin
|
|
|
|
+ AddStatus(Format(SCompilerStatusSigningWithDelay, [Delay, AFormattedCommand]));
|
|
|
|
+ Sleep(Delay);
|
|
|
|
+ end else
|
|
|
|
+ AddStatus(Format(SCompilerStatusSigning, [AFormattedCommand]));
|
|
|
|
+
|
|
|
|
+ LastSignCommandStartTick := GetTickCount;
|
|
|
|
|
|
FillChar(StartupInfo, SizeOf(StartupInfo), 0);
|
|
FillChar(StartupInfo, SizeOf(StartupInfo), 0);
|
|
StartupInfo.cb := SizeOf(StartupInfo);
|
|
StartupInfo.cb := SizeOf(StartupInfo);
|
|
@@ -7529,6 +7551,7 @@ procedure TSetupCompiler.SignCommand(const ACommand, AParams, AExeFilename: Stri
|
|
|
|
|
|
var
|
|
var
|
|
Params, Command: String;
|
|
Params, Command: String;
|
|
|
|
+ MinimumTimeBetweenDelay: Cardinal;
|
|
I: Integer;
|
|
I: Integer;
|
|
begin
|
|
begin
|
|
Params := FmtCommand(PChar(AParams), '', AExeFileName);
|
|
Params := FmtCommand(PChar(AParams), '', AExeFileName);
|
|
@@ -7536,12 +7559,18 @@ begin
|
|
|
|
|
|
for I := 0 to RetryCount do begin
|
|
for I := 0 to RetryCount do begin
|
|
try
|
|
try
|
|
- InternalSignCommand(Command);
|
|
|
|
|
|
+ if (MinimumTimeBetween <> 0) and (LastSignCommandStartTick <> 0) then begin
|
|
|
|
+ MinimumTimeBetweenDelay := MinimumTimeBetween - (GetTickCount - LastSignCommandStartTick);
|
|
|
|
+ if MinimumTimeBetweenDelay < 0 then
|
|
|
|
+ MinimumTimeBetweenDelay := 0;
|
|
|
|
+ end else
|
|
|
|
+ MinimumTimeBetweenDelay := 0;
|
|
|
|
+ InternalSignCommand(Command, MinimumTimeBetweenDelay);
|
|
Break;
|
|
Break;
|
|
except on E: Exception do
|
|
except on E: Exception do
|
|
if I < RetryCount then begin
|
|
if I < RetryCount then begin
|
|
AddStatus(Format(SCompilerStatusWillRetrySigning, [E.Message, RetryCount-I]));
|
|
AddStatus(Format(SCompilerStatusWillRetrySigning, [E.Message, RetryCount-I]));
|
|
- Sleep(500); //wait a little bit before retrying
|
|
|
|
|
|
+ Sleep(RetryDelay);
|
|
end else
|
|
end else
|
|
raise;
|
|
raise;
|
|
end;
|
|
end;
|
|
@@ -8459,6 +8488,7 @@ begin
|
|
WizardSmallImageFile := 'compiler:WIZMODERNSMALLIMAGE.BMP';
|
|
WizardSmallImageFile := 'compiler:WIZMODERNSMALLIMAGE.BMP';
|
|
DefaultDialogFontName := 'Tahoma';
|
|
DefaultDialogFontName := 'Tahoma';
|
|
SignToolRetryCount := 2;
|
|
SignToolRetryCount := 2;
|
|
|
|
+ SignToolRetryDelay := 500;
|
|
SetupHeader.CloseApplicationsFilter := '*.exe,*.dll,*.chm';
|
|
SetupHeader.CloseApplicationsFilter := '*.exe,*.dll,*.chm';
|
|
SetupHeader.WizardImageAlphaFormat := afIgnored;
|
|
SetupHeader.WizardImageAlphaFormat := afIgnored;
|
|
|
|
|