From 457c144720964a7f50b1d184e6b19faa930e970e Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Wed, 17 Jun 2020 12:10:28 -0700 Subject: Introduce Value attribute on MultiString/MultiStringValue elements --- src/WixToolset.Core/Compiler_2.cs | 43 ++++++++++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 5 deletions(-) (limited to 'src/WixToolset.Core') diff --git a/src/WixToolset.Core/Compiler_2.cs b/src/WixToolset.Core/Compiler_2.cs index 9e2ddb5b..84961f9b 100644 --- a/src/WixToolset.Core/Compiler_2.cs +++ b/src/WixToolset.Core/Compiler_2.cs @@ -1964,18 +1964,15 @@ namespace WixToolset.Core { switch (child.Name.LocalName) { + case "MultiString": case "MultiStringValue": if (RegistryValueType.MultiString != valueType && null != value) { this.Core.Write(ErrorMessages.RegistryMultipleValuesWithoutMultiString(sourceLineNumbers, node.Name.LocalName, "Value", child.Name.LocalName, "Type")); } - else if (null == value) - { - value = Common.GetInnerText(child); - } else { - value = String.Concat(value, "[~]", Common.GetInnerText(child)); + value = this.ParseRegistryMultiStringElement(child, value); } break; case "Permission": @@ -2069,6 +2066,42 @@ namespace WixToolset.Core return keyPath; } + private string ParseRegistryMultiStringElement(XElement node, string value) + { + var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); + string multiStringValue = null; + + foreach (var attrib in node.Attributes()) + { + if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || CompilerCore.WixNamespace == attrib.Name.Namespace) + { + switch (attrib.Name.LocalName) + { + case "Value": + multiStringValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib); + break; + default: + this.Core.UnexpectedAttribute(node, attrib); + break; + } + } + } + + if (multiStringValue == null) + { + multiStringValue = Common.GetInnerText(node); + } + + if (multiStringValue == null) + { + this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Value")); + } + + this.Core.ParseForExtensionElements(node); + + return (null == value) ? multiStringValue : String.Concat(value, "[~]", multiStringValue); + } + /// /// Parses a RemoveRegistryKey element. /// -- cgit v1.2.3-55-g6feb