瀏覽代碼

Merge branch 'main' into issig-v2-filename

Martijn Laan 2 月之前
父節點
當前提交
e2a27d521c

+ 1 - 1
Examples/DownloadFiles.iss

@@ -44,7 +44,7 @@ Source: "https://jrsoftware.org/download.php/iscrypt.dll?dontcount=1"; DestName:
 ; This archive will be downloaded and verified at the start of the Preparing to Install Step
 ; It is then extracted normally during the actual installation process
 Source: "https://jrsoftware.org/download.php/myprog-extrareadmes.7z"; DestName: "MyProg.ExtraReadmes.7z"; DestDir: "{app}"; \
-  ExternalSize: 269; Flags: external download extractarchive recursesubdirs ignoreversion issigverify
+  ExternalSize: 275; Flags: external download extractarchive recursesubdirs ignoreversion issigverify
 ; This archive will be downloaded and extracted without verificaton
 Source: "https://github.com/jrsoftware/issrc/archive/refs/heads/main.zip"; DestName: "issrc-main.zip"; DestDir: "{app}"; \
   ExternalSize: 15_000_000; Flags: external download extractarchive recursesubdirs ignoreversion

+ 1 - 0
Files/Default.isl

@@ -280,6 +280,7 @@ AbortRetryIgnoreIgnore=&Ignore the error and continue
 AbortRetryIgnoreCancel=Cancel installation
 RetryCancelSelectAction=Select action
 RetryCancelRetry=&Try again
+RetryCancelCancel=Cancel
 
 ; *** Installation status messages
 StatusClosingApplications=Closing applications...

+ 9 - 5
Files/Languages/Corsican.isl

@@ -15,7 +15,7 @@
 ;	https://github.com/jrsoftware/issrc/blob/main/Files/Languages/Corsican.isl
 ;
 ; History of Corsican translation for InnoSetup:
-;	- Updated in 2025 by Patriccollu di Santa Maria è Sichè: June 6th (6.4.4), June 8th (6.5.0)
+;	- Updated in 2025 by Patriccollu di Santa Maria è Sichè: June 6th (6.4.4), June 8th (6.5.0), June 19th (6.5.0)
 ;	- Updated in 2024 by Patriccollu di Santa Maria è Sichè: February 11th (6.3.0), November 18th (6.4.0)
 ;	- Updated in 2020 by Patriccollu di Santa Maria è Sichè: July 1st (6.0.5+), July 25th (6.1.0), November 14th (6.1.2)
 ;	- Updated in 2019 by Patriccollu di Santa Maria è Sichè: January 20th (6.0.0), October 6th (6.0.3)
@@ -229,19 +229,17 @@ ReadyMemoGroup=Cartulare di u listinu « Démarrer » :
 ReadyMemoTasks=Trattamenti addizziunali :
 
 ; *** TDownloadWizardPage wizard page and DownloadTemporaryFile
-DownloadingLabel=Scaricamentu di i schedarii addiziunali…
+DownloadingLabel2=Scaricamentu di i schedarii…
 ButtonStopDownload=&Piantà u scaricamentu
 StopDownload=Da veru, vulete piantà u scaricamentu ?
 ErrorDownloadAborted=Scaricamentu interrottu
 ErrorDownloadFailed=Scaricamentu fiascu : %1 %2
 ErrorDownloadSizeFailed=Fiascu per ottene a dimensione : %1 %2
-ErrorFileHash1=Fiascu di u tazzeghju di u schedariu : %1
-ErrorFileHash2=Tazzeghju di u schedariu inaccettevule : aspettatu %1, trovu %2
 ErrorProgress=Prugressione inaccettevule : %1 di %2
 ErrorFileSize=Dimensione di u schedariu inaccettevule : aspettatu %1, trovu %2
 
 ; *** TExtractionWizardPage wizard page and ExtractArchive
-ExtractionLabel=Estrazzione di i schedarii addiziunali…
+ExtractingLabel=Estrazzione di i schedariii…
 ButtonStopExtraction=&Piantà l’estrazzione
 StopExtraction=Da veru, vulete piantà l’estrazzione ?
 ErrorExtractionAborted=Estrazzione interrotta
@@ -296,11 +294,14 @@ AbortRetryIgnoreSelectAction=Selezziunate un’azzione
 AbortRetryIgnoreRetry=&Pruvà torna
 AbortRetryIgnoreIgnore=&Ignurà u sbagliu è cuntinuà
 AbortRetryIgnoreCancel=Abbandunà l’installazione
+RetryCancelSelectAction=Selezziunà un’azzione
+RetryCancelRetry=&Pruvà torna
 
 ; *** Installation status messages
 StatusClosingApplications=Chjusura di l’appiecazioni…
 StatusCreateDirs=Creazione di i cartulari…
 StatusExtractFiles=Estrazzione di i schedarii…
+StatusDownloadFiles=Scaricamentu di i schedarii…
 StatusCreateIcons=Creazione di l’accurtatoghji…
 StatusCreateIniEntries=Creazione di l’elementi INI…
 StatusCreateRegistryEntries=Creazione di l’elementi di u registru…
@@ -334,6 +335,8 @@ SourceVerificationFailed=Fiascu di a verificazione di u schedariu d’origine :
 VerificationSignatureDoesntExist=U schedariu di segnatura « %1 » ùn esiste micca
 VerificationSignatureInvalid=U schedariu di segnatura « %1 » hè inaccettevule
 VerificationKeyNotFound=U schedariu di segnatura « %1 » impiegheghja una chjave scunnisciuta
+VerificationFileNameIncorrect=U nome di u schedariu hè incurrettu
+VerificationFileTagIncorrect=L’etichetta di u schedariu hè incurretta
 VerificationFileSizeIncorrect=A dimensione di u schedariu hè incurretta
 VerificationFileHashIncorrect=U tazzeghju di u schedariu hè incurrettu
 ExistingFileReadOnly2=U schedariu esistente hà un attributu di lettura-sola è ùn pò micca esse rimpiazzatu.
@@ -354,6 +357,7 @@ ErrorChangingAttr=Un sbagliu hè accadutu pruvendu di cambià l’attributi di u
 ErrorCreatingTemp=Un sbagliu hè accadutu pruvendu di creà un schedariu in u cartulare di destinazione :
 ErrorReadingSource=Un sbagliu hè accadutu pruvendu di leghje u schedariu d’origine :
 ErrorCopying=Un sbagliu hè accadutu pruvendu di cupià un schedariu :
+ErrorDownloading=Un sbagliu hè accadutu pruvendu di scaricà un schedariu :
 ErrorExtracting=Un sbagliu hè accadutu pruvendu d’estrae un archiviu :
 ErrorReplacingExistingFile=Un sbagliu hè accadutu pruvendu di rimpiazzà u schedariu esistente :
 ErrorRestartReplace=Fiascu di Rimpiazzamentu di schedariu à u rilanciu di l’urdinatore :

+ 1 - 0
Files/Languages/Dutch.isl

@@ -258,6 +258,7 @@ AbortRetryIgnoreIgnore=&Negeer de fout en ga door
 AbortRetryIgnoreCancel=Breek installatie af
 RetryCancelSelectAction=Selecteer actie
 RetryCancelRetry=&Probeer opnieuw
+RetryCancelCancel=Annuleren
 
 ; *** Installation status messages
 StatusClosingApplications=Programma's afsluiten...

+ 5 - 3
Files/Languages/Italian.isl

@@ -9,7 +9,7 @@
 ; Setup adds the periods automatically (appending a period would result in
 ; two periods being displayed).
 ;
-; Italian.isl - Last Update: 18.06.2025  by bovirus ([email protected])
+; Italian.isl - Last Update: 19.06.2025  by bovirus ([email protected])
 ;
 ; Translator name:   bovirus
 ; Translator e-mail: [email protected]
@@ -220,7 +220,7 @@ ReadyMemoGroup=Cartella del menu Avvio/Start:
 ReadyMemoTasks=Processi aggiuntivi:
 
 ; *** TDownloadWizardPage wizard page and DownloadTemporaryFile
-DownloadingLabel=Download file aggiuntivi...
+DownloadingLabel2=Download file...
 ButtonStopDownload=&Stop download
 StopDownload=Sei sicuro di voler interrompere il download?
 ErrorDownloadAborted=Download annullato
@@ -230,7 +230,7 @@ ErrorProgress=Progresso non valido: %1 di %2
 ErrorFileSize=Dimensione file non valida: attesa %1, trovata %2
 
 ; *** TExtractionWizardPage wizard page and Extract7ZipArchive
-ExtractionLabel=Estrazione file aggiuntivi...
+ExtractingLabel=Estrazione file...
 ButtonStopExtraction=Interrompi e&strazione
 StopExtraction=Sei sicuro di voler interrompere l'estrazione?
 ErrorExtractionAborted=Estrazione interrotta
@@ -285,6 +285,8 @@ AbortRetryIgnoreSelectAction=Seleziona azione
 AbortRetryIgnoreRetry=&Riprova
 AbortRetryIgnoreIgnore=&Ignora questo errore e continua
 AbortRetryIgnoreCancel=Annulla installazione
+RetryCancelSelectAction=Seleziona azione
+RetryCancelRetry=&Riprova
 
 ; *** Installation status messages
 StatusClosingApplications=Chiusura applicazioni...

+ 8 - 4
Files/Languages/Ukrainian.isl

@@ -3,14 +3,14 @@
 ; E-Mail: [email protected]
 ; Please report all spelling/grammar errors, and observations.
 ; Version 2020.08.04
-; Updated and Reviewed on 13.06.2025 by Sergii Leonov ([email protected])
+; Updated and Reviewed on 20.06.2025 by Sergii Leonov ([email protected])
 
 ; *** Український переклад Inno Setup для версії 6.5.0 та вище***
 ; Автор перекладу: Дмитро Онищук
 ; E-Mail: [email protected]
 ; Будь ласка, повідомляйте про всі знайдені помилки та зауваження.
 ; Версія перекладу 2020.08.04
-; Оновлено та переглянуто 13.06.2025, Сергій Леонов ([email protected])
+; Оновлено та переглянуто 20.06.2025, Сергій Леонов ([email protected])
 
 [LangOptions]
 LanguageName=<0423><043A><0440><0430><0457><043D><0441><044C><043A><0430>
@@ -203,7 +203,7 @@ ReadyMemoGroup=Тека в меню «Пуск»:
 ReadyMemoTasks=Додаткові завдання:
 
 ; *** TDownloadWizardPage wizard page and DownloadTemporaryFile
-DownloadingLabel=Завантаження додаткових файлів...
+DownloadingLabel2=Завантаження файлів...
 ButtonStopDownload=&Перервати завантаження
 StopDownload=Ви дійсно бажаєте перервати завантаження?
 ErrorDownloadAborted=Завантаження перервано
@@ -213,7 +213,7 @@ ErrorProgress=Помилка виконання: %1 з %2
 ErrorFileSize=Невірний розмір файлу: очікувався %1, отриманий %2
 
 ; *** TExtractionWizardPage wizard page and ExtractArchive
-ExtractionLabel=Розпакування додаткових файлів...
+ExtractingLabel=Розпакування файлів...
 ButtonStopExtraction=&Перервати розпакування
 StopExtraction=Ви дійсно бажаєте перервати розпакування?
 ErrorExtractionAborted=Розпакування перервано
@@ -268,6 +268,8 @@ AbortRetryIgnoreSelectAction=Виберіть дію
 AbortRetryIgnoreRetry=&Спробувати знову
 AbortRetryIgnoreIgnore=&Ігнорувати помилку та продовжити
 AbortRetryIgnoreCancel=Відмінити встановлення
+RetryCancelSelectAction=Виберіть дію
+RetryCancelRetry=&Спробувати знову
 
 ; *** Installation status messages
 StatusClosingApplications=Закриття програм...
@@ -307,6 +309,8 @@ SourceVerificationFailed=Перевірка вихідного файлу не 
 VerificationSignatureDoesntExist=Файл підпису "%1" не існує
 VerificationSignatureInvalid=Файл підпису "%1" є недійсним
 VerificationKeyNotFound=Файл підпису "%1" "%1" використовує невідомий ключ
+VerificationFileNameIncorrect=Ім'я файлу невірне
+VerificationFileTagIncorrect=Тег файлу невірний
 VerificationFileSizeIncorrect=Розмір файлу невірний
 VerificationFileHashIncorrect=Хеш файлу невірний
 ExistingFileReadOnly2=Неможливо замінити існуючий файл, оскільки він позначений лише для читання.

二進制
Files/isscint.dll


+ 3 - 3
Files/isscint.dll.issig

@@ -1,6 +1,6 @@
 format issig-v1
 file-size 809616
-file-hash 56582348091d238de6035c1a7c1bb479b5b442580736cd45d4eddd7cdd602656
+file-hash 1a837b73d60a4d98060e8129a8da0b27e25445a2ee8f03b0118b0ec6213172b5
 key-id def0147c3bbc17ab99bf7b7a9c2de1390283f38972152418d7c2a4a7d7131a38
-sig-r 39aad109b6fba383abe0833416f0b0d7f1f728a6ace65f87927e6e4110123c02
-sig-s 91263cd0eac9bd1a7a1a9225e3bd5052c12fd9021cd0b8608f8c44cbf9b75faa
+sig-r 0bf97beadb36dc0c2fe551da903aaa47a48ed6e45675561f9981494c7c12587f
+sig-s 9be02aeb41908ade412eab6a1770a3356d09c8fa43e0445dedc4493a0fde74bc

+ 11 - 6
ISHelp/isetup.xml

@@ -5844,10 +5844,10 @@ DiskSliceSize=1457664
 <keyword value="pbkdf2" />
 <setupvalid><tt>pbkdf2</tt><br/>
 <tt>pbkdf2/1</tt> through <tt>pbkdf2/2147483647</tt></setupvalid>
-<setupdefault><tt>pbkdf2/200000</tt></setupdefault>
+<setupdefault><tt>pbkdf2/220000</tt></setupdefault>
 <body>
 <p>This specifies the key derivation function to use to derive the encryption key from the value of <link topic="setup_password">Password</link>, and optionally its parameters.</p>
-<p><tt>pbkdf2</tt> is the PBKDF2-HMAC-SHA256 function with a 128-bit random salt, and optionally allows to increase its number of iterations for extra security. If the number of iterations isn't specified, it defaults to 200000.</p>
+<p><tt>pbkdf2</tt> is the PBKDF2-HMAC-SHA256 function with a 128-bit random salt, and optionally allows to increase its number of iterations for extra security. If the number of iterations isn't specified, it defaults to 220000.</p>
 <p><b>See also:</b><br/>
 <link topic="setup_encryption">Encryption</link>
 </p>
@@ -6048,11 +6048,16 @@ ArchitecturesInstallIn64BitMode=x64compatible
 <setupdefault><tt>yes</tt> if a <link topic="setup_signtool">SignTool</link> is set, <tt>no</tt> otherwise</setupdefault>
 <body>
 <p>Specifies whether the uninstaller program (unins???.exe) should be deployed with a digital signature attached. When the uninstaller has a valid digital signature, users will not see an "unknown publisher" warning when launching it.</p>
-<p>The first time you compile a script with this directive set to <tt>yes</tt>, a uniquely-named copy of the uninstaller EXE file will be created in the directory specified by the <link topic="setup_signeduninstallerdir">SignedUninstallerDir</link> directive (which defaults to the <link topic="setup_outputdir">output directory</link>). Depending on the <link topic="setup_signtool">SignTool</link> setting, you will either then be prompted to attach a digital signature to this file using an external code-signing tool (such as Microsoft's <tt>signtool.exe</tt>) or the file will be automatically signed on the fly. On subsequent compiles, the signature from the file will be embedded into the compiled installations' uninstallers.</p>
-<p>Upgrading to a newer version of Inno Setup, or changing certain [Setup] section directives that affect the contents of the uninstaller EXE file (such as <link topic="setup_setupiconfile">SetupIconFile</link> and VersionInfo directives), will cause a new file to be created under a different name.</p>
-<p>If a file generated by this directive is deleted, it will be recreated automatically if necessary on the next compile.</p>
-<p>When the uninstaller has a digital signature, Setup will write the messages from the active language into a separate file (unins???.msg). It cannot embed the messages into the EXE file because doing so would invalidate the digital signature.</p>
 <p>When set to <tt>yes</tt>, any temporary self-copies used by Setup are digitally signed too.</p>
+<p>If the <link topic="setup_signtool">SignTool</link> directive is set, the file will be signed automatically on the fly. Otherwise:</p>
+<ul>
+  <li>The first time you compile a script with <tt>SignedUninstaller</tt> set to <tt>yes</tt>, a uniquely-named non-temporary copy of the uninstaller EXE file will be created in the directory specified by the <link topic="setup_signeduninstallerdir">SignedUninstallerDir</link> directive (which defaults to the <link topic="setup_outputdir">output directory</link>).</li>
+  <li>You will then be prompted to attach a digital signature to this file using an external code-signing tool (such as Microsoft's <tt>signtool.exe</tt>).</li>
+  <li>On subsequent compiles, the signature from the file will be embedded into the compiled installations' uninstallers, without prompting you.</li>
+  <li>If you delete the file, you will be prompted again if necessary on the next compile.</li>
+  <li>Upgrading to a newer version of Inno Setup, or changing certain [Setup] section directives that affect the contents of the uninstaller EXE file (such as <link topic="setup_setupiconfile">SetupIconFile</link> and VersionInfo directives), will cause a new file to be created under a different name.</li>
+</ul>
+<p>When the uninstaller has a digital signature, Setup will write the messages from the active language into a separate file (unins???.msg). It cannot embed the messages into the EXE file because doing so would invalidate the digital signature.</p>
 <p>Details on obtaining signing certificates and using code-signing tools are beyond the scope of this documentation.</p>
 </body>
 </setuptopic>

+ 2 - 2
ISHelp/isxfunc.xml

@@ -2888,12 +2888,12 @@ end;</pre></example>
 <tt>Text</tt> specifies the message to display.<br />
 <tt>Typ</tt> specifies which icon to display in the task dialog. If set to <tt>mbConfirmation</tt>, no icon will be displayed.<br />
 <tt>Buttons</tt> specifies which buttons to include in the task dialog.<br />
-<tt>ButtonLabels</tt> specifies which custom button labels to use. If set to an empty array, the system's default button labels will be used. If a label consists of two strings separated by a newline, then the first string specifies the button label and the second string specifies the button note.<br />
+<tt>ButtonLabels</tt> specifies which custom button labels to use. If set to an empty array, the system's default button labels will be used. If a label consists of two strings separated by a newline, then the first string specifies the button label and the second string specifies the button note. If <tt>Buttons</tt> is set to <tt>MB_OKCANCEL</tt>, <tt>MB_YESNOCANCEL</tt>, or <tt>MB_RETRYCANCEL</tt>, specifying a label for the Cancel button as the last element in the array is optional.<br />
 <tt>ShieldButton</tt> specifies which button to display a shield icon on. If set to 0, no shield icon will be displayed.</p>
 <p>Returns an ID* constant indicating the button the user clicked, or 0 if the function fails (which shouldn't happen unless an invalid parameter is specified or system resources are exhausted).</p></description>
         <remarks><p>TMsgBoxType is defined as:</p>
 <p><tt>TMsgBoxType = (mbInformation, mbConfirmation, mbError, mbCriticalError);</tt></p>
-<p>Supported flags for <tt>Buttons</tt> are:</p>
+<p>Supported values for <tt>Buttons</tt> are:</p>
 <p><tt>MB_OK, MB_OKCANCEL, MB_YESNOCANCEL, MB_YESNO, MB_RETRYCANCEL, MB_ABORTRETRYIGNORE</tt></p>
 <p>If <tt>MB_ABORTRETRYIGNORE</tt> is used, <tt>ButtonLabels</tt> may not be an empty array and the button labels must be specified in the following special order: Retry, Ignore, Abort.</p>
 <p>Supported values for <tt>ShieldButton</tt> and possible return values are:</p>

+ 1 - 1
Projects/Src/Compiler.SetupCompiler.pas

@@ -7715,7 +7715,7 @@ begin
     NotRecognizedMessagesWarning := True;
     UsedUserAreasWarning := True;
     SetupHeader.WizardStyle := wsClassic;
-    SetupHeader.EncryptionKDFIterations := 200000;
+    SetupHeader.EncryptionKDFIterations := 220000;
 
     { Read [Setup] section }
     EnumIniSection(EnumSetupProc, 'Setup', 0, True, True, '', False, False);

+ 34 - 18
Projects/Src/IDE.MsgBoxDesignerForm.dfm

@@ -25,7 +25,7 @@ object MsgBoxDesignerForm: TMsgBoxDesignerForm
     Width = 50
     Height = 14
     Caption = 'Instruction'
-    TabOrder = 11
+    TabOrder = 12
   end
   object TaskInstructionText: TEdit
     Left = 89
@@ -41,7 +41,7 @@ object MsgBoxDesignerForm: TMsgBoxDesignerForm
     Width = 49
     Height = 14
     Caption = 'Message'
-    TabOrder = 12
+    TabOrder = 13
   end
   object TaskMessageText: TEdit
     Left = 89
@@ -57,31 +57,47 @@ object MsgBoxDesignerForm: TMsgBoxDesignerForm
     Width = 62
     Height = 14
     Caption = 'Text Button1'
-    TabOrder = 13
+    TabOrder = 14
   end
   object Button1Text: TEdit
     Left = 89
     Top = 62
-    Width = 159
+    Width = 112
     Height = 21
     TabOrder = 3
   end
   object Button2Label: TNewStaticText
-    Left = 258
-    Top = 67
-    Width = 62
+    Left = 212
+    Top = 66
+    Width = 38
     Height = 14
-    Caption = 'Text Button2'
-    TabOrder = 14
+    Caption = 'Button2'
+    TabOrder = 15
   end
   object Button2Text: TEdit
-    Left = 334
-    Top = 62
-    Width = 204
+    Left = 259
+    Top = 63
+    Width = 112
     Height = 21
     Anchors = [akLeft, akTop, akRight]
     TabOrder = 4
   end
+  object Button3Label: TNewStaticText
+    Left = 379
+    Top = 66
+    Width = 38
+    Height = 14
+    Caption = 'Button3'
+    TabOrder = 16
+  end
+  object Button3Text: TEdit
+    Left = 426
+    Top = 63
+    Width = 112
+    Height = 21
+    Anchors = [akLeft, akTop, akRight]
+    TabOrder = 5
+  end
   object GroupBox1: TGroupBox
     Left = 8
     Top = 8
@@ -110,7 +126,7 @@ object MsgBoxDesignerForm: TMsgBoxDesignerForm
     Width = 240
     Height = 60
     Caption = ' Type'
-    TabOrder = 5
+    TabOrder = 6
     object cb_Suppressible: TCheckBox
       Left = 14
       Top = 24
@@ -149,7 +165,7 @@ object MsgBoxDesignerForm: TMsgBoxDesignerForm
     Height = 60
     Anchors = [akLeft, akTop, akRight]
     Caption = ' Flags '
-    TabOrder = 6
+    TabOrder = 7
     object NewStaticText1: TNewStaticText
       Left = 14
       Top = 26
@@ -197,7 +213,7 @@ object MsgBoxDesignerForm: TMsgBoxDesignerForm
     Height = 174
     Anchors = [akLeft, akTop, akBottom]
     Caption = ' Icon '
-    TabOrder = 7
+    TabOrder = 8
     DesignSize = (
       160
       174)
@@ -404,7 +420,7 @@ object MsgBoxDesignerForm: TMsgBoxDesignerForm
     Height = 174
     Anchors = [akLeft, akTop, akBottom]
     Caption = ' Buttons '
-    TabOrder = 8
+    TabOrder = 9
     DesignSize = (
       169
       174)
@@ -483,7 +499,7 @@ object MsgBoxDesignerForm: TMsgBoxDesignerForm
     Height = 174
     Anchors = [akLeft, akTop, akBottom]
     Caption = ' Return values '
-    TabOrder = 9
+    TabOrder = 10
     object cb_IDOK: TCheckBox
       Left = 16
       Top = 23
@@ -674,7 +690,7 @@ object MsgBoxDesignerForm: TMsgBoxDesignerForm
     Height = 42
     Align = alBottom
     BevelOuter = bvNone
-    TabOrder = 10
+    TabOrder = 11
     DesignSize = (
       548
       42)

+ 79 - 30
Projects/Src/IDE.MsgBoxDesignerForm.pas

@@ -71,8 +71,10 @@ type
     TaskMessageText: TEdit;
     Button1Text: TEdit;
     Button2Text: TEdit;
+    Button3Text: TEdit;
     Button1Label: TNewStaticText;
     Button2Label: TNewStaticText;
+    Button3Label: TNewStaticText;
     cb_Suppressible: TCheckBox;
     cb_DefIDOK: TRadioButton;
     cb_DefIDCANCEL: TRadioButton;
@@ -135,8 +137,10 @@ begin
   TaskMessageText.Visible := False;
   Button1Text.Visible := False;
   Button2Text.Visible := False;
+  Button3Text.Visible := False;
   Button1Label.Visible := False;
   Button2Label.Visible := False;
+  Button3Label.Visible := False;
 end;
 
 procedure TMsgBoxDesignerForm.rbMB_OKClick(Sender: TObject);
@@ -174,12 +178,15 @@ begin
      rb_IDIGNORE.Checked := False;
      rb_IDYES.Checked := False;
      rb_IDNO.Checked := False;
+     Button3Text.Enabled := False;
+     Button3Label.Enabled := False;
      Button2Text.Enabled := False;
      Button2Label.Enabled := False;
      Button1Text.Enabled := True;
      Button1Label.Enabled := True;
      Button1Text.Text := 'OK';
      Button2Text.Text := '';
+     Button3Text.Text := '';
   end;
   if cb_Suppressible.Checked then begin
      cb_DefIDOK.Checked := True;
@@ -237,12 +244,15 @@ begin
      rb_IDIGNORE.Checked := False;
      rb_IDYES.Checked := False;
      rb_IDNO.Checked := False;
+     Button3Text.Enabled := False;
+     Button3Label.Enabled := False;
      Button2Text.Enabled := True;
      Button2Label.Enabled := True;
      Button1Text.Enabled := True;
      Button1Label.Enabled := True;
      Button1Text.Text := 'Yes';
      Button2Text.Text := 'No';
+     Button3Text.Text := '';
   end;
   if cb_Suppressible.Checked then begin
      cb_DefIDOK.Checked := False;
@@ -300,12 +310,15 @@ begin
      rb_IDIGNORE.Checked := False;
      rb_IDYES.Checked := False;
      rb_IDNO.Checked := False;
-     Button2Text.Enabled := False;
-     Button2Label.Enabled := False;
+     Button3Text.Enabled := False;
+     Button3Label.Enabled := False;
+     Button2Text.Enabled := True;
+     Button2Label.Enabled := True;
      Button1Text.Enabled := True;
      Button1Label.Enabled := True;
      Button1Text.Text := 'OK';
-     Button2Text.Text := '';
+     Button2Text.Text := 'Cancel';
+     Button3Text.Text := '';
   end;
   if cb_Suppressible.Checked then begin
      cb_DefIDOK.Checked := True;
@@ -363,12 +376,15 @@ begin
      rb_IDIGNORE.Checked := False;
      rb_IDYES.Checked := False;
      rb_IDNO.Checked := False;
-     Button2Text.Enabled := False;
-     Button2Label.Enabled := False;
+     Button3Text.Enabled := False;
+     Button3Label.Enabled := False;
+     Button2Text.Enabled := True;
+     Button2Label.Enabled := True;
      Button1Text.Enabled := True;
      Button1Label.Enabled := True;
      Button1Text.Text := 'Retry';
-     Button2Text.Text := '';
+     Button2Text.Text := 'Cancel';
+     Button3Text.Text := '';
   end;
   if cb_Suppressible.Checked then begin
      cb_DefIDOK.Checked := False;
@@ -426,12 +442,15 @@ begin
      rb_IDIGNORE.Checked := False;
      rb_IDYES.Checked := False;
      rb_IDNO.Checked := False;
+     Button3Text.Enabled := True;
+     Button3Label.Enabled := True;
      Button2Text.Enabled := True;
      Button2Label.Enabled := True;
      Button1Text.Enabled := True;
      Button1Label.Enabled := True;
      Button1Text.Text := 'Yes';
      Button2Text.Text := 'No';
+     Button3Text.Text := 'Cancel';
   end;
   if cb_Suppressible.Checked then begin
      cb_DefIDOK.Checked := False;
@@ -489,12 +508,15 @@ begin
      rb_IDIGNORE.Checked := False;
      rb_IDYES.Checked := False;
      rb_IDNO.Checked := False;
-     Button2Text.Enabled := False;
-     Button2Label.Enabled := False;
-     Button1Text.Enabled := False;
-     Button1Label.Enabled := False;
-     Button1Text.Text := '';
-     Button2Text.Text := '';
+     Button3Text.Enabled := True;
+     Button3Label.Enabled := True;
+     Button2Text.Enabled := True;
+     Button2Label.Enabled := True;
+     Button1Text.Enabled := True;
+     Button1Label.Enabled := True;
+     Button1Text.Text := 'Retry';  //this order is not a mistake
+     Button2Text.Text := 'Ignore'; //
+     Button3Text.Text := 'Abort';  //
   end;
   if cb_Suppressible.Checked then begin
      cb_DefIDOK.Checked := False;
@@ -564,10 +586,12 @@ begin
    TaskMessageLabel.Visible := False;
    TaskInstructionText.Visible := False;
    TaskMessageText.Visible := False;
-   Button1Text.Visible := False;
-   Button2Text.Visible := False;
-   Button1Label.Visible := False;
-   Button2Label.Visible := False;
+    Button1Text.Visible := False;
+    Button2Text.Visible := False;
+    Button3Text.Visible := False;
+    Button1Label.Visible := False;
+    Button2Label.Visible := False;
+    Button3Label.Visible := False;
    rbMB_OK.Checked := True;
    rbMB_OKClick(Self);
 end;
@@ -667,10 +691,12 @@ begin
    TaskMessageLabel.Visible := True;
    TaskInstructionText.Visible := True;
    TaskMessageText.Visible := True;
-   Button1Text.Visible := True;
-   Button2Text.Visible := True;
-   Button1Label.Visible := True;
-   Button2Label.Visible := True;
+    Button1Text.Visible := True;
+    Button2Text.Visible := True;
+    Button3Text.Visible := True;
+    Button1Label.Visible := True;
+    Button2Label.Visible := True;
+    Button3Label.Visible := True;
    TaskInstructionText.Text := 'Instruction Text';
    TaskMessageText.Text := 'Message Text';
    rbMB_OK.Checked := True;
@@ -785,14 +811,21 @@ begin
     if (NewEdit1.Text = '3') and (cb_MB_SETFOREGROUND.Checked) then
        MsgBox(MSGText.Lines.GetText, Caption, Typ, Buttons or MB_DEFBUTTON3 or MB_SETFOREGROUND);
   end else if cb_TaskDialogMsgBox.Checked then begin
-     { create ButtonLabels array }
+     { create ButtonLabels array - also see GetText}
      var ButtonLabels: TArray<string>;
-     if rbMB_YESNO.Checked or rbMB_YESNOCANCEL.Checked then
+     if Button3Text.Enabled then
+        ButtonLabels := TArray<string>.Create(Button1Text.Text, Button2Text.Text, Button3Text.Text)
+     else if Button2Text.Enabled then
         ButtonLabels := TArray<string>.Create(Button1Text.Text, Button2Text.Text)
-     else if rbMB_ABORTRETRYIGNORE.Checked then
-        ButtonLabels := TArray<string>.Create('Retry', 'Ignore', 'Abort')
      else
         ButtonLabels := TArray<string>.Create(Button1Text.Text);
+     if rbMB_OKCANCEL.Checked or rbMB_YESNOCANCEL.Checked or rbMB_RETRYCANCEL.Checked then begin
+      { Specifying a cancel label is optional: if it's missing TaskDialogMsgBox will use a button
+        at the bottom instead }
+      const NLabels = Length(ButtonLabels);
+      if ButtonLabels[NLabels-1] = '' then
+        SetLength(ButtonLabels, NLabels-1);
+     end;
 
      { get Shield Flag value }
      var ShieldButton := 0;
@@ -1004,13 +1037,29 @@ begin
      { TaskDialogMsgBox(TaskInstructionText.Text, TaskMessageText.Text, Typ, Buttons, ButtonLabels, ShieldButton) }
      ModeMsg := 1;
 
-     { create ButtonLabels array }
-     if rbMB_YESNO.Checked or rbMB_YESNOCANCEL.Checked then
-        ButtonLabels :=  Button1Text.Text + ''', ''' + Button2Text.Text
-     else if rbMB_ABORTRETRYIGNORE.Checked then
-        ButtonLabels := 'Retry'', ''Ignore'', ''Abort'
+     { create ButtonLabels array - also see MBDButtonPreviewClick }
+     var ButtonLabelsArray: TArray<string>;
+     if Button3Text.Enabled then
+        ButtonLabelsArray := TArray<string>.Create(Button1Text.Text, Button2Text.Text, Button3Text.Text)
+     else if Button2Text.Enabled then
+        ButtonLabelsArray := TArray<string>.Create(Button1Text.Text, Button2Text.Text)
      else
-        ButtonLabels := Button1Text.Text;
+        ButtonLabelsArray := TArray<string>.Create(Button1Text.Text);
+     var NLabels := Length(ButtonLabelsArray);
+     if rbMB_OKCANCEL.Checked or rbMB_YESNOCANCEL.Checked or rbMB_RETRYCANCEL.Checked then begin
+      { Specifying a cancel label is optional: if it's missing TaskDialogMsgBox will use a button
+        at the bottom instead }
+      if ButtonLabelsArray[NLabels-1] = '' then begin
+        Dec(NLabels);
+        SetLength(ButtonLabelsArray, NLabels);
+      end;
+     end;
+     for var I := 0 to NLabels-1 do begin { NLabels is always > 0 }
+      if I = 0 then
+        ButtonLabels := ButtonLabelsArray[I]
+      else
+        ButtonLabels := ButtonLabels + ''', ''' + ButtonLabelsArray[I];
+     end;
 
      { get Shield Flag value }
      if rbMB_OK.Checked and rb_IDOK.Checked then ShieldButton := 'IDOK';

+ 2 - 1
Projects/Src/Setup.Install.pas

@@ -3250,7 +3250,8 @@ var
         ['MoveFileEx', IntToStr(LastError), Win32ErrorString(LastError)]));
       const Text = UninstallExeFilename + SNewLine2 + LastOperation + SNewLine + Failed;
       case LoggedTaskDialogMsgBox('',  SetupMessages[msgRetryCancelSelectAction], Text, '',
-         mbError, MB_RETRYCANCEL, [SetupMessages[msgRetryCancelRetry]], 0, True, IDCANCEL) of
+         mbError, MB_RETRYCANCEL, [SetupMessages[msgRetryCancelRetry], SetupMessages[msgRetryCancelCancel]],
+         0, True, IDCANCEL) of
         IDRETRY: ;
         IDCANCEL: Abort;
       else

+ 20 - 9
Projects/Src/Setup.WizardForm.pas

@@ -1849,7 +1849,8 @@ function TWizardForm.PrepareToInstall(const WizardComponents, WizardTasks: TStri
     const LastOperation = SetupMessages[msgErrorDownloading];
     const Text = LastBaseNameOrUrl + SNewLine2 + LastOperation + SNewLine + Failed;
     Result := LoggedTaskDialogMsgBox('',  SetupMessages[msgRetryCancelSelectAction], Text, '',
-      mbError, MB_RETRYCANCEL, [SetupMessages[msgRetryCancelRetry]], 0, True, IDCANCEL);
+      mbError, MB_RETRYCANCEL, [SetupMessages[msgRetryCancelRetry], SetupMessages[msgRetryCancelCancel]],
+      0, True, IDCANCEL);
     if (Result <> IDRETRY) and (Result <> IDCANCEL) then begin
       Log('LoggedTaskDialogMsgBox returned an unexpected value. Assuming Cancel.');
       Result := IDCANCEL;
@@ -1931,6 +1932,17 @@ function TWizardForm.PrepareToInstall(const WizardComponents, WizardTasks: TStri
     end;
   end;
 
+  procedure ShowPreparing;
+  begin
+    SetCurPage(wpPreparing);
+    BackButton.Visible := False;
+    NextButton.Visible := False;
+    CancelButton.Enabled := False;
+    if InstallMode = imSilent then
+      WizardForm.Visible := True;
+    WizardForm.Update;
+  end;
+
 var
   CodeNeedsRestart: Boolean;
   Y: Integer;
@@ -1944,7 +1956,12 @@ begin
   PreparingMemo.Visible := False;
 
   try
-    DownloadArchivesToExtract(WizardComponents, WizardTasks);
+    ShowPreparing;
+    try
+      DownloadArchivesToExtract(WizardComponents, WizardTasks);
+    finally
+      UpdateCurPageButtonState;
+    end;
   except
     Result := GetExceptMessage;
   end;
@@ -1954,13 +1971,7 @@ begin
       Result := ExpandSetupMessage(msgPreviousInstallNotCompleted);
       PrepareToInstallNeedsRestart := True;
     end else if (CodeRunner <> nil) and CodeRunner.FunctionExists('PrepareToInstall', True) then begin
-      SetCurPage(wpPreparing);
-      BackButton.Visible := False;
-      NextButton.Visible := False;
-      CancelButton.Enabled := False;
-      if InstallMode = imSilent then
-        WizardForm.Visible := True;
-      WizardForm.Update;
+      ShowPreparing;
       try
         DownloadTemporaryFileOrExtractArchiveProcessMessages := True;
         CodeNeedsRestart := False;

+ 1 - 0
Projects/Src/Shared.SetupMessageIDs.pas

@@ -196,6 +196,7 @@ type
     msgReadyMemoTasks,
     msgReadyMemoType,
     msgReadyMemoUserInfo,
+    msgRetryCancelCancel,
     msgRetryCancelRetry,
     msgRetryCancelSelectAction,
     msgRunEntryExec,

+ 20 - 6
Projects/Src/Shared.TaskDialogFunc.pas

@@ -105,13 +105,11 @@ begin
 end;
 
 function TaskDialogMsgBox(const Icon, Instruction, Text, Caption: String; const Typ: TMsgBoxType; const Buttons: Cardinal; const ButtonLabels: array of String; const ShieldButton: Integer; const VerificationText: String = ''; const pfVerificationFlagChecked: PBOOL = nil): Integer;
-var
-  IconP: PChar;
-  TDCommonButtons: Cardinal;
-  NButtonLabelsAvailable: Integer;
-  ButtonIDs: array of Integer;
 begin
   Application.Restore; { See comments in AppMessageBox }
+
+  { Set icon }
+  var IconP: PChar;
   if Icon <> '' then
     IconP := PChar(Icon)
   else begin
@@ -123,7 +121,11 @@ begin
       IconP := nil; { No other TD_ constant available, MS recommends to use no icon for questions now and the old icon should only be used for help entries }
     end;
   end;
-  NButtonLabelsAvailable := Length(ButtonLabels);
+
+  { Set ButtonIDs and TDCommonButtons }
+  const NButtonLabelsAvailable = Length(ButtonLabels);
+  var ButtonIDs: array of Integer;
+  var TDCommonButtons: Cardinal;
   case Buttons of
     MB_OK, MB_OKCANCEL:
       begin
@@ -171,8 +173,20 @@ begin
         TDCommonButtons := 0; { Silence compiler }
       end;
   end;
+
+  { Allow extra label to replace TDCBF_CANCEL_BUTTON by an IDCANCEL button id }
+  if (TDCommonButtons or TDCBF_CANCEL_BUTTON <> 0) and
+     (NButtonLabelsAvailable-1 = Length(ButtonIDs)) then begin
+    TDCommonButtons := TDCommonButtons and not TDCBF_CANCEL_BUTTON;
+    SetLength(ButtonIDs, NButtonLabelsAvailable);
+    ButtonIDs[NButtonLabelsAvailable-1] := IDCANCEL;
+  end;
+
+  { Check }
   if Length(ButtonIDs) <> NButtonLabelsAvailable then
     DoInternalError('TaskDialogMsgBox: Invalid ButtonLabels');
+
+  { Go }
   if not DoTaskDialog(GetOwnerWndForMessageBox, PChar(Instruction), PChar(Text),
            GetMessageBoxCaption(PChar(Caption), Typ), IconP, TDCommonButtons, ButtonLabels, ButtonIDs, ShieldButton,
            GetMessageBoxRightToLeft, IfThen(Typ in [mbError, mbCriticalError], MB_ICONSTOP, 0), Result, PChar(VerificationText), pfVerificationFlagChecked) then //note that MB_ICONEXCLAMATION (used by mbError) includes MB_ICONSTOP (used by mbCriticalError)

+ 13 - 6
README.md

@@ -192,22 +192,22 @@ Source code tips
 Precompiled executables and libraries
 -------------------------------------
 
-The source code contains several precompiled and signed executables and libraries:
+The source code contains several precompiled and code-signed executables and libraries:
 
 **Files\is7z.dll**, **Files\is7zxa.dll**, **Files\is7zxr.dll** - Compiled by
-Visual Studio 2022 from 7-Zip source code in the is7z repository.
+Visual Studio 2022 from 7-Zip source code in the [is7z] repository.
 
 **Files\isbunzip.dll**, **Files\isbzip.dll** - Compiled by Visual Studio 2005
-from the bzlib directory in the iscompress repository.
+from the bzlib directory in the [iscompress] repository.
 
 **Files\isunzlib.dll**, **Files\iszlib.dll** - Compiled by Visual Studio 2005
-from the zlib-dll directory in the iscompress repository.
+from the zlib-dll directory in the [iscompress] repository.
 
 **Files\islzma.dll**, **Files\islzma32.exe**, **Files\islzma64.exe** - Compiled
 by Visual Studio 2022 from the [Projects\Src\Compression.LZMACompressor\islzma] directory.
 
 **Files\isscint.dll** - Compiled by Visual Studio 2022 from Scintilla source
-code in the isscint repository.
+code in the [isscint] repository.
 
 **Projects\Src\Setup.HelperEXEs\Helper\x64\Release\Helper.exe**, **Projects\Src\Setup.HelperEXEs.res** -
 Compiled by Visual Studio 2005 from the [Projects\Src\Setup.HelperEXEs\Helper] directory and then
@@ -225,6 +225,9 @@ Compiled by Visual Studio 2022 from the [Projects\Src\Compression.SevenZipDecode
 **Examples\MyProg.exe**, **Examples\MyProg-x64.exe**, **Examples\MyProg-Arm64.exe** -
 Compiled by Visual Studio 2022 from the [Examples\MyProg] directory.
 
+Each precompiled file is accompanied by an .issig signature file, and can be
+verified using Inno Setup Signature Tool and [this public key file].
+
 Inno Setup-specific editing guidelines for the help files
 ---------------------------------------------------------
 
@@ -239,7 +242,7 @@ Inno Setup's source code includes a GitHub workflow that performs unattended bui
 upon `push` events, it requires some setting up, though.
 
 Note: The following instructions assume that you have a correctly-licensed version
-of Delphi installed into `C:\Program Files (x86)\Embarcadero\Studio\20.0`. This may
+of Delphi installed into `C:\Program Files (x86)\Embarcadero\Studio\23.0`. This may
 not be a Community Edition because it does not support command line compilation.
 Also ensure your current Delphi license still allows you to copy a subset of the
 Delphi files to another machine for the specific purpose of supporting unattended
@@ -295,3 +298,7 @@ and will automatically run the aforementioned build workflow on changes, if it's
 [Projects\Src\Compression.SevenZipDecoder\7zDecode]: <Projects/Src/Compression.SevenZipDecoder/7zDecode>
 [7-Zip]: https://www.7-zip.org/
 [secret]: https://docs.github.com/en/actions/security-guides/encrypted-secrets
+[this public key file]: https://files.jrsoftware.org/is/misc/def01.ispublickey
+[is7z]: https://github.com/jrsoftware/is7z
+[iscompress]: https://github.com/jrsoftware/iscompress
+[isscint]: https://github.com/jrsoftware/isscint

+ 1 - 1
build-ce.bat

@@ -40,7 +40,7 @@ if not exist files\issigtool.exe (
 
 rem  Verify precompiled binaries which are used during compilation
 rem  Note: Other precompiled binaries are verified by Setup.iss
-call .\issig.bat verify --key-file=def01.ispublickey.txt ^
+call .\issig.bat verify --key-file=def01.ispublickey ^
   Projects\Src\Setup.HelperEXEs.res ^
   Projects\Src\Compression.LZMADecompressor\Lzma2Decode\ISLzmaDec.obj ^
   Projects\Src\Compression.LZMA1SmallDecompressor\LzmaDecode\LzmaDecodeInno.obj ^

+ 1 - 1
build.bat

@@ -57,7 +57,7 @@ if not exist files\issigtool.exe (
 
 rem  Verify precompiled binaries which are used during compilation
 rem  Note: Other precompiled binaries are verified by Setup.iss
-call .\issig.bat verify --key-file=def01.ispublickey.txt ^
+call .\issig.bat verify --key-file=def01.ispublickey ^
   Projects\Src\Setup.HelperEXEs.res ^
   Projects\Src\Compression.LZMADecompressor\Lzma2Decode\ISLzmaDec.obj ^
   Projects\Src\Compression.LZMA1SmallDecompressor\LzmaDecode\LzmaDecodeInno.obj ^

+ 0 - 0
def01.ispublickey.txt → def01.ispublickey


+ 0 - 0
def02.ispublickey.txt → def02.ispublickey


+ 1 - 1
issig.bat

@@ -48,7 +48,7 @@ if "%1"=="verify" goto signorverify
 if not "%1"=="" goto failed
 
 :embed
-set publickeyfile=def02.ispublickey.txt
+set publickeyfile=def02.ispublickey
 Files\ISSigTool.exe export-public-key "%publickeyfile%"
 if errorlevel 1 goto failed
 if not exist "%publickeyfile%" goto failed

+ 2 - 2
setup.allowedpublickeys.iss

@@ -3,5 +3,5 @@
 // build-ce.bat. To ignore this change consider using Git's assume-unchanged or skip-worktree functionality.
 //
 [ISSigKeys]
-Name: mykey1; KeyID: def0147c3bbc17ab99bf7b7a9c2de1390283f38972152418d7c2a4a7d7131a38; KeyFile: {#__DIR__}\def01.ispublickey.txt
-Name: mykey2; KeyFile: {#__DIR__}\def02.ispublickey.txt
+Name: mykey1; KeyID: def0147c3bbc17ab99bf7b7a9c2de1390283f38972152418d7c2a4a7d7131a38; KeyFile: {#__DIR__}\def01.ispublickey
+Name: mykey2; KeyFile: {#__DIR__}\def02.ispublickey

+ 4 - 4
whatsnew.htm

@@ -93,14 +93,14 @@ Source: "{tmp}\MyProg-ExtraReadmes.7z"; DestDir: "{app}"; \
         It can also be combined with the new <tt>issigverify</tt> flag (see below) for efficient and highly secure verification of the download file.<br/>
         It cannot be combined with the <tt>comparetimestamp</tt>, <tt>recursesubdirs</tt> and <tt>skipifsourcedoesntexist</tt> flags.</li>
     <li>File download otherwise behaves the same as external file copying. For example, it supports automatic uninstallation of downloaded files and can be combined with same other flags and parameters.</li>
-    <li>When combined with the new <tt>extractarchive</tt> flag (see above), the archive will be downloaded and, if the <tt>issigverify</tt> flag is also used, verified at the start of the <i>Preparing to Install</i> Step. The archive is then extracted normally during the actual installation process.<br/>
+    <li>When combined with the new <tt>extractarchive</tt> flag (see above), the archive will be downloaded and, if the <tt>issigverify</tt> flag is also used, verified at the start of the <i>Preparing to Install</i> step. The archive is then extracted normally during the actual installation process.<br/>
         In this case, the value of <tt>DestName</tt> is used to determine the archive format and for display and logging purposes.</li>
     <li>Example script:
       <pre>[Files]
 Source: "https://jrsoftware.org/download.php/is.exe?dontcount=1"; DestName: "innosetup-latest.exe"; DestDir: "{app}"; \
   ExternalSize: 7_000_000; Flags: external download ignoreversion
 Source: "https://jrsoftware.org/download.php/myprog-extrareadmes.7z"; DestName: "MyProg.ExtraReadmes.7z"; DestDir: "{app}"; \
-  ExternalSize: 269; Flags: external download extractarchive ignoreversion</pre>
+  ExternalSize: 275; Flags: external download extractarchive ignoreversion</pre>
     </li>
     <li>Added example script <i>DownloadFiles.iss</i> to demonstrate how to use a single <tt>[Files]</tt> entry to download a file, or to download and extract an archive, with verification.</li>
   </ul>
@@ -225,13 +225,13 @@ Source: "https://jrsoftware.org/download.php/iscrypt.dll?dontcount=1"; DestName:
   <li>Minor tweaks.</li>
 </ul>
 
-<p>Some messages have been removed and added in this version: (<a href="https://github.com/jrsoftware/issrc/commit/4193f69b">View differences in Default.isl</a>.)</p>
+<p>Some messages have been added and removed in this version: (<a href="https://github.com/jrsoftware/issrc/commit/a1d6aecc">View differences in Default.isl</a>.)</p>
 <ul>
   <li><b>New messages:</b>
   <ul>
     <li>DownloadingLabel2, ExtractingLabel.</li>
     <li>ArchiveIncorrectPassword, ArchiveIsCorrupted, ArchiveUnsupportedFormat.</li>
-    <li>RetryCancelSelectAction, RetryCancelRetry.</li>
+    <li>RetryCancelSelectAction, RetryCancelRetry, RetryCancelCancel.</li>
     <li>StatusDownloadFiles.</li>
     <li>SourceVerificationFailed, VerificationSignatureDoesntExist, VerificationSignatureInvalid, VerificationKeyNotFound, VerificationFileNameIncorrect, VerificationFileTagIncorrect, VerificationFileSizeIncorrect, VerificationFileHashIncorrect.</li>
     <li>ErrorDownloading, ErrorExtracting.</li>