From 6f2511f58f60e63a15357a2fe37f83343dea3090 Mon Sep 17 00:00:00 2001 From: Bob Arnson Date: Fri, 10 Feb 2023 16:29:06 -0500 Subject: Elevate known cab failures to messages. Fixes https://github.com/wixtoolset/issues/issues/7169. --- src/api/wix/WixToolset.Data/ErrorMessages.cs | 4 +-- .../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 public static Message CreateCabAddFileFailed() { - 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."); + 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."); } public static Message CreateCabInsufficientDiskSpace() { - 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."); + 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."); } 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 { using System; using System.Collections.Generic; + using System.ComponentModel; using System.IO; using System.Linq; using System.Threading; @@ -122,9 +123,12 @@ namespace WixToolset.Core.WindowsInstaller.Bind var created = this.CreateCabinet(cabinetWorkItem); // Update the cabinet work item to report back what cabinets were created. - lock (this.completedCabinets) + if (created?.Any() == true) { - this.completedCabinets.Add(new CompletedCabinetWorkItem(cabinetWorkItem.DiskId, created)); + lock (this.completedCabinets) + { + this.completedCabinets.Add(new CompletedCabinetWorkItem(cabinetWorkItem.DiskId, created)); + } } } } @@ -186,22 +190,40 @@ namespace WixToolset.Core.WindowsInstaller.Bind // create the cabinet file var cabinetPath = Path.GetFullPath(cabinetWorkItem.CabinetFile); var cab = new Cabinet(cabinetPath); - var created = cab.Compress(compressFiles, cabinetWorkItem.CompressionLevel, maxCabinetSize, cabinetWorkItem.MaxThreshold); - // Best effort check to see if the cabinet is too large for the Windows Installer. try { - var fi = new FileInfo(cabinetPath); - if (fi.Length > Int32.MaxValue) + var created = cab.Compress(compressFiles, cabinetWorkItem.CompressionLevel, maxCabinetSize, cabinetWorkItem.MaxThreshold); + + // Best effort check to see if the cabinet is too large for the Windows Installer. + try { - this.Messaging.Write(WarningMessages.WindowsInstallerFileTooLarge(cabinetWorkItem.SourceLineNumber, cabinetPath, "cabinet")); + var fi = new FileInfo(cabinetPath); + if (fi.Length > Int32.MaxValue) + { + this.Messaging.Write(WarningMessages.WindowsInstallerFileTooLarge(cabinetWorkItem.SourceLineNumber, cabinetPath, "cabinet")); + } } + catch + { + } + + return created; } - catch + catch (Exception e) when (e.InnerException is Win32Exception win32Exception) { + switch (win32Exception.NativeErrorCode) + { + case 0x4005: + this.Messaging.Write(ErrorMessages.CreateCabAddFileFailed()); + return null; + case 0x0070: + this.Messaging.Write(ErrorMessages.CreateCabInsufficientDiskSpace()); + return null; + default: + throw; + } } - - return created; } } } -- cgit v1.2.3-55-g6feb