diff options
author | Bob Arnson <bob@firegiant.com> | 2023-02-10 16:29:06 -0500 |
---|---|---|
committer | Bob Arnson <github@bobs.org> | 2023-02-10 18:02:24 -0500 |
commit | 6f2511f58f60e63a15357a2fe37f83343dea3090 (patch) | |
tree | e9735af3c69531d45e80f9e2a3a90f5d85505d85 | |
parent | b500f7ae7113039c878555ec622d551854f891e2 (diff) | |
download | wix-6f2511f58f60e63a15357a2fe37f83343dea3090.tar.gz wix-6f2511f58f60e63a15357a2fe37f83343dea3090.tar.bz2 wix-6f2511f58f60e63a15357a2fe37f83343dea3090.zip |
Elevate known cab failures to messages.
Fixes https://github.com/wixtoolset/issues/issues/7169.
-rw-r--r-- | src/api/wix/WixToolset.Data/ErrorMessages.cs | 4 | ||||
-rw-r--r-- | src/wix/WixToolset.Core.WindowsInstaller/Bind/CabinetBuilder.cs | 42 |
2 files changed, 34 insertions, 12 deletions
diff --git a/src/api/wix/WixToolset.Data/ErrorMessages.cs b/src/api/wix/WixToolset.Data/ErrorMessages.cs index aa9750a8..35bd23c5 100644 --- a/src/api/wix/WixToolset.Data/ErrorMessages.cs +++ b/src/api/wix/WixToolset.Data/ErrorMessages.cs | |||
@@ -180,12 +180,12 @@ namespace WixToolset.Data | |||
180 | 180 | ||
181 | public static Message CreateCabAddFileFailed() | 181 | public static Message CreateCabAddFileFailed() |
182 | { | 182 | { |
183 | return Message(null, Ids.CreateCabAddFileFailed, "An error (E_FAIL) was returned while adding files to a CAB file. This most commonly happens when creating a CAB file 2 GB or larger. Either reduce the size of your installation package, raise Media/@CompressionLevel to a higher compression level, or split your installation package's files into more than one CAB file."); | 183 | return Message(null, Ids.CreateCabAddFileFailed, "An error (E_FAIL) was returned while creating a CAB file. The most common cause of this error is attempting to create a CAB file larger than 2GB. You can reduce the size of your installation package, use a higher compression level, or split your files into more than one CAB file."); |
184 | } | 184 | } |
185 | 185 | ||
186 | public static Message CreateCabInsufficientDiskSpace() | 186 | public static Message CreateCabInsufficientDiskSpace() |
187 | { | 187 | { |
188 | return Message(null, Ids.CreateCabInsufficientDiskSpace, "An error (ERROR_DISK_FULL) was returned while creating a CAB file. This means you have insufficient disk space - please clear more disk space and try this operation again."); | 188 | return Message(null, Ids.CreateCabInsufficientDiskSpace, "An error (ERROR_DISK_FULL) was returned while creating a CAB file. This means you have insufficient disk space. Clear disk space and try again."); |
189 | } | 189 | } |
190 | 190 | ||
191 | public static Message CubeFileNotFound(string cubeFile) | 191 | public static Message CubeFileNotFound(string cubeFile) |
diff --git a/src/wix/WixToolset.Core.WindowsInstaller/Bind/CabinetBuilder.cs b/src/wix/WixToolset.Core.WindowsInstaller/Bind/CabinetBuilder.cs index 93aad0a6..cc052510 100644 --- a/src/wix/WixToolset.Core.WindowsInstaller/Bind/CabinetBuilder.cs +++ b/src/wix/WixToolset.Core.WindowsInstaller/Bind/CabinetBuilder.cs | |||
@@ -4,6 +4,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
4 | { | 4 | { |
5 | using System; | 5 | using System; |
6 | using System.Collections.Generic; | 6 | using System.Collections.Generic; |
7 | using System.ComponentModel; | ||
7 | using System.IO; | 8 | using System.IO; |
8 | using System.Linq; | 9 | using System.Linq; |
9 | using System.Threading; | 10 | using System.Threading; |
@@ -122,9 +123,12 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
122 | var created = this.CreateCabinet(cabinetWorkItem); | 123 | var created = this.CreateCabinet(cabinetWorkItem); |
123 | 124 | ||
124 | // Update the cabinet work item to report back what cabinets were created. | 125 | // Update the cabinet work item to report back what cabinets were created. |
125 | lock (this.completedCabinets) | 126 | if (created?.Any() == true) |
126 | { | 127 | { |
127 | this.completedCabinets.Add(new CompletedCabinetWorkItem(cabinetWorkItem.DiskId, created)); | 128 | lock (this.completedCabinets) |
129 | { | ||
130 | this.completedCabinets.Add(new CompletedCabinetWorkItem(cabinetWorkItem.DiskId, created)); | ||
131 | } | ||
128 | } | 132 | } |
129 | } | 133 | } |
130 | } | 134 | } |
@@ -186,22 +190,40 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
186 | // create the cabinet file | 190 | // create the cabinet file |
187 | var cabinetPath = Path.GetFullPath(cabinetWorkItem.CabinetFile); | 191 | var cabinetPath = Path.GetFullPath(cabinetWorkItem.CabinetFile); |
188 | var cab = new Cabinet(cabinetPath); | 192 | var cab = new Cabinet(cabinetPath); |
189 | var created = cab.Compress(compressFiles, cabinetWorkItem.CompressionLevel, maxCabinetSize, cabinetWorkItem.MaxThreshold); | ||
190 | 193 | ||
191 | // Best effort check to see if the cabinet is too large for the Windows Installer. | ||
192 | try | 194 | try |
193 | { | 195 | { |
194 | var fi = new FileInfo(cabinetPath); | 196 | var created = cab.Compress(compressFiles, cabinetWorkItem.CompressionLevel, maxCabinetSize, cabinetWorkItem.MaxThreshold); |
195 | if (fi.Length > Int32.MaxValue) | 197 | |
198 | // Best effort check to see if the cabinet is too large for the Windows Installer. | ||
199 | try | ||
196 | { | 200 | { |
197 | this.Messaging.Write(WarningMessages.WindowsInstallerFileTooLarge(cabinetWorkItem.SourceLineNumber, cabinetPath, "cabinet")); | 201 | var fi = new FileInfo(cabinetPath); |
202 | if (fi.Length > Int32.MaxValue) | ||
203 | { | ||
204 | this.Messaging.Write(WarningMessages.WindowsInstallerFileTooLarge(cabinetWorkItem.SourceLineNumber, cabinetPath, "cabinet")); | ||
205 | } | ||
198 | } | 206 | } |
207 | catch | ||
208 | { | ||
209 | } | ||
210 | |||
211 | return created; | ||
199 | } | 212 | } |
200 | catch | 213 | catch (Exception e) when (e.InnerException is Win32Exception win32Exception) |
201 | { | 214 | { |
215 | switch (win32Exception.NativeErrorCode) | ||
216 | { | ||
217 | case 0x4005: | ||
218 | this.Messaging.Write(ErrorMessages.CreateCabAddFileFailed()); | ||
219 | return null; | ||
220 | case 0x0070: | ||
221 | this.Messaging.Write(ErrorMessages.CreateCabInsufficientDiskSpace()); | ||
222 | return null; | ||
223 | default: | ||
224 | throw; | ||
225 | } | ||
202 | } | 226 | } |
203 | |||
204 | return created; | ||
205 | } | 227 | } |
206 | } | 228 | } |
207 | } | 229 | } |