From 13c4becf524dbd12b92f099320726aa0b59f3bbc Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Sun, 11 Apr 2021 12:22:57 -0700 Subject: Add Condition to RemoveFoldersEx --- src/wixext/Symbols/WixRemoveFolderExSymbol.cs | 21 +++++++++++++++++--- src/wixext/UtilCompiler.cs | 28 ++++++++++++--------------- src/wixext/UtilTableDefinitions.cs | 1 + 3 files changed, 31 insertions(+), 19 deletions(-) (limited to 'src/wixext') diff --git a/src/wixext/Symbols/WixRemoveFolderExSymbol.cs b/src/wixext/Symbols/WixRemoveFolderExSymbol.cs index 0c50ab8e..86352b6c 100644 --- a/src/wixext/Symbols/WixRemoveFolderExSymbol.cs +++ b/src/wixext/Symbols/WixRemoveFolderExSymbol.cs @@ -14,6 +14,7 @@ namespace WixToolset.Util new IntermediateFieldDefinition(nameof(WixRemoveFolderExSymbolFields.ComponentRef), IntermediateFieldType.String), new IntermediateFieldDefinition(nameof(WixRemoveFolderExSymbolFields.Property), IntermediateFieldType.String), new IntermediateFieldDefinition(nameof(WixRemoveFolderExSymbolFields.InstallMode), IntermediateFieldType.Number), + new IntermediateFieldDefinition(nameof(WixRemoveFolderExSymbolFields.Condition), IntermediateFieldType.String), }, typeof(WixRemoveFolderExSymbol)); } @@ -28,6 +29,14 @@ namespace WixToolset.Util.Symbols ComponentRef, Property, InstallMode, + Condition, + } + + public enum WixRemoveFolderExInstallMode + { + Install = 1, + Uninstall = 2, + Both = 3, } public class WixRemoveFolderExSymbol : IntermediateSymbol @@ -54,10 +63,16 @@ namespace WixToolset.Util.Symbols set => this.Set((int)WixRemoveFolderExSymbolFields.Property, value); } - public int InstallMode + public WixRemoveFolderExInstallMode InstallMode + { + get => (WixRemoveFolderExInstallMode)this.Fields[(int)WixRemoveFolderExSymbolFields.InstallMode].AsNumber(); + set => this.Set((int)WixRemoveFolderExSymbolFields.InstallMode, (int)value); + } + + public string Condition { - get => this.Fields[(int)WixRemoveFolderExSymbolFields.InstallMode].AsNumber(); - set => this.Set((int)WixRemoveFolderExSymbolFields.InstallMode, value); + get => this.Fields[(int)WixRemoveFolderExSymbolFields.Condition].AsString(); + set => this.Set((int)WixRemoveFolderExSymbolFields.Condition, value); } } } \ No newline at end of file diff --git a/src/wixext/UtilCompiler.cs b/src/wixext/UtilCompiler.cs index 12213e63..63f2b469 100644 --- a/src/wixext/UtilCompiler.cs +++ b/src/wixext/UtilCompiler.cs @@ -41,13 +41,6 @@ namespace WixToolset.Util Compatible, } - internal enum WixRemoveFolderExOn - { - Install = 1, - Uninstall = 2, - Both = 3, - } - private static readonly Regex FindPropertyBrackets = new Regex(@"\[(?!\\|\])|(? "http://wixtoolset.org/schemas/v4/wxs/util"; @@ -2812,8 +2805,9 @@ namespace WixToolset.Util { var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element); Identifier id = null; - var on = (int)WixRemoveFolderExOn.Uninstall; + var mode = WixRemoveFolderExInstallMode.Uninstall; string property = null; + string condition = null; foreach (var attrib in element.Attributes()) { @@ -2821,6 +2815,9 @@ namespace WixToolset.Util { switch (attrib.Name.LocalName) { + case "Condition": + condition = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); + break; case "Id": id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib); break; @@ -2828,24 +2825,22 @@ namespace WixToolset.Util var onValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); if (onValue.Length == 0) { - on = CompilerConstants.IllegalInteger; } else { switch (onValue) { case "install": - on = (int)WixRemoveFolderExOn.Install; + mode = WixRemoveFolderExInstallMode.Install; break; case "uninstall": - on = (int)WixRemoveFolderExOn.Uninstall; + mode = WixRemoveFolderExInstallMode.Uninstall; break; case "both": - on = (int)WixRemoveFolderExOn.Both; + mode = WixRemoveFolderExInstallMode.Both; break; default: this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "On", onValue, "install", "uninstall", "both")); - on = CompilerConstants.IllegalInteger; break; } } @@ -2869,9 +2864,9 @@ namespace WixToolset.Util this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Property")); } - if (null == id) + if (id == null) { - id = this.ParseHelper.CreateIdentifier("wrf", componentId, property, on.ToString(CultureInfo.InvariantCulture.NumberFormat)); + id = this.ParseHelper.CreateIdentifier("wrf", componentId, property, mode.ToString()); } this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); @@ -2884,7 +2879,8 @@ namespace WixToolset.Util { ComponentRef = componentId, Property = property, - InstallMode = on, + InstallMode = mode, + Condition = condition }); this.ParseHelper.EnsureTable(section, sourceLineNumbers, "RemoveFile"); diff --git a/src/wixext/UtilTableDefinitions.cs b/src/wixext/UtilTableDefinitions.cs index eff5aaf6..fd09367a 100644 --- a/src/wixext/UtilTableDefinitions.cs +++ b/src/wixext/UtilTableDefinitions.cs @@ -33,6 +33,7 @@ namespace WixToolset.Util new ColumnDefinition("Component_", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "Component", keyColumn: 1, description: "Foreign key into the Component table used to determine install state", modularizeType: ColumnModularizeType.Column), new ColumnDefinition("Property", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, description: "Name of Property that contains the root of the directory tree to remove.", modularizeType: ColumnModularizeType.Column), new ColumnDefinition("InstallMode", ColumnType.Number, 2, primaryKey: false, nullable: false, ColumnCategory.Unknown, minValue: 1, maxValue: 3, description: "1 == Remove only when the associated component is being installed (msiInstallStateLocal or msiInstallStateSource), 2 == Remove only when the associated component is being removed (msiInstallStateAbsent), 3 = Remove in either of the above cases."), + new ColumnDefinition("Condition", ColumnType.String, 0, primaryKey: false, nullable: true, ColumnCategory.Condition, description: "Optional expression which skips the removing of folders.", modularizeType: ColumnModularizeType.Condition, forceLocalizable: true), }, symbolIdIsPrimaryKey: true ); -- cgit v1.2.3-55-g6feb