From a1307cd4e76a89598c53cb68309358a7012db553 Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Fri, 9 Sep 2022 16:03:29 -0500 Subject: Move `Bundle/@CommandLineVariables` into Bal.wixext. Implements 6858 --- .../WixToolset.Mba.Core/IOverridableVariables.cs | 10 ++--- src/api/burn/WixToolset.Mba.Core/MbaCommand.cs | 5 ++- .../WixToolset.Mba.Core/OverridableVariables.cs | 44 +++++++++++--------- src/api/burn/balutil/balinfo.cpp | 47 +++++++++++----------- src/api/burn/balutil/inc/balinfo.h | 2 +- .../wix/WixToolset.Data/Symbols/WixBundleSymbol.cs | 14 ------- 6 files changed, 57 insertions(+), 65 deletions(-) (limited to 'src/api') diff --git a/src/api/burn/WixToolset.Mba.Core/IOverridableVariables.cs b/src/api/burn/WixToolset.Mba.Core/IOverridableVariables.cs index 1ffe50e4..2b26d7b6 100644 --- a/src/api/burn/WixToolset.Mba.Core/IOverridableVariables.cs +++ b/src/api/burn/WixToolset.Mba.Core/IOverridableVariables.cs @@ -9,14 +9,14 @@ namespace WixToolset.Mba.Core /// public enum VariableCommandLineType { - /// - /// Similar to Windows Installer, all variable names specified on the command line are automatically converted to upper case. - /// - UpperCase, /// /// All variable names specified on the command line must match the case specified when building the bundle. /// CaseSensitive, + /// + /// Variable names specified on the command line do not have to match the case specified when building the bundle. + /// + CaseInsensitive, } /// @@ -34,4 +34,4 @@ namespace WixToolset.Mba.Core /// IDictionary Variables { get; } } -} \ No newline at end of file +} diff --git a/src/api/burn/WixToolset.Mba.Core/MbaCommand.cs b/src/api/burn/WixToolset.Mba.Core/MbaCommand.cs index 8917a334..bd93b7e7 100644 --- a/src/api/burn/WixToolset.Mba.Core/MbaCommand.cs +++ b/src/api/burn/WixToolset.Mba.Core/MbaCommand.cs @@ -2,6 +2,7 @@ namespace WixToolset.Mba.Core { + using System; using System.Collections.Generic; /// @@ -21,11 +22,11 @@ namespace WixToolset.Mba.Core { foreach (var kvp in this.Variables) { - var key = overridableVariables.CommandLineType == VariableCommandLineType.UpperCase ? kvp.Key.ToUpperInvariant() : kvp.Key; + var key = kvp.Key; if (!overridableVariables.Variables.TryGetValue(key, out var overridableVariable)) { - engine.Log(LogLevel.Error, string.Format("Ignoring attempt to set non-overridable variable: '{0}'.", key)); + engine.Log(LogLevel.Error, String.Format("Ignoring attempt to set non-overridable variable: '{0}'.", key)); } else { diff --git a/src/api/burn/WixToolset.Mba.Core/OverridableVariables.cs b/src/api/burn/WixToolset.Mba.Core/OverridableVariables.cs index 148acb34..121c6aee 100644 --- a/src/api/burn/WixToolset.Mba.Core/OverridableVariables.cs +++ b/src/api/burn/WixToolset.Mba.Core/OverridableVariables.cs @@ -29,37 +29,43 @@ namespace WixToolset.Mba.Core { XmlNamespaceManager namespaceManager = new XmlNamespaceManager(root.NameTable); namespaceManager.AddNamespace("p", BootstrapperApplicationData.XMLNamespace); - XPathNavigator commandLineNode = root.SelectSingleNode("/p:BootstrapperApplicationData/p:CommandLine", namespaceManager); + XPathNavigator commandLineNode = root.SelectSingleNode("/p:BootstrapperApplicationData/p:WixStdbaCommandLine", namespaceManager); XPathNodeIterator nodes = root.Select("/p:BootstrapperApplicationData/p:WixStdbaOverridableVariable", namespaceManager); var overridableVariables = new OverridableVariablesInfo(); + IEqualityComparer variableNameComparer; if (commandLineNode == null) - { - throw new Exception("Failed to select command line information."); - } - - string variablesValue = BootstrapperApplicationData.GetAttribute(commandLineNode, "Variables"); - - if (variablesValue == null) - { - throw new Exception("Failed to get command line variable type."); - } - - if (variablesValue.Equals("upperCase", StringComparison.InvariantCulture)) - { - overridableVariables.CommandLineType = VariableCommandLineType.UpperCase; - } - else if (variablesValue.Equals("caseSensitive", StringComparison.InvariantCulture)) { overridableVariables.CommandLineType = VariableCommandLineType.CaseSensitive; + variableNameComparer = StringComparer.InvariantCulture; } else { - throw new Exception(string.Format("Unknown command line variable type: '{0}'", variablesValue)); + string variablesValue = BootstrapperApplicationData.GetAttribute(commandLineNode, "Variables"); + + if (variablesValue == null) + { + throw new Exception("Failed to get command line variable type."); + } + + if (variablesValue.Equals("caseInsensitive", StringComparison.InvariantCulture)) + { + overridableVariables.CommandLineType = VariableCommandLineType.CaseInsensitive; + variableNameComparer = StringComparer.InvariantCultureIgnoreCase; + } + else if (variablesValue.Equals("caseSensitive", StringComparison.InvariantCulture)) + { + overridableVariables.CommandLineType = VariableCommandLineType.CaseSensitive; + variableNameComparer = StringComparer.InvariantCulture; + } + else + { + throw new Exception(String.Format("Unknown command line variable type: '{0}'", variablesValue)); + } } - overridableVariables.Variables = new Dictionary(); + overridableVariables.Variables = new Dictionary(variableNameComparer); foreach (XPathNavigator node in nodes) { diff --git a/src/api/burn/balutil/balinfo.cpp b/src/api/burn/balutil/balinfo.cpp index 52a7f911..751ba4f1 100644 --- a/src/api/burn/balutil/balinfo.cpp +++ b/src/api/burn/balutil/balinfo.cpp @@ -348,7 +348,6 @@ DAPI_(HRESULT) BalSetOverridableVariablesFromEngine( ) { HRESULT hr = S_OK; - LPWSTR sczKey = NULL; BAL_INFO_OVERRIDABLE_VARIABLE* pOverridableVariable = NULL; for (DWORD i = 0; i < pCommand->cVariables; ++i) @@ -356,14 +355,6 @@ DAPI_(HRESULT) BalSetOverridableVariablesFromEngine( LPCWSTR wzVariableName = pCommand->rgVariableNames[i]; LPCWSTR wzVariableValue = pCommand->rgVariableValues[i]; - if (BAL_INFO_VARIABLE_COMMAND_LINE_TYPE_UPPER_CASE == pOverridableVariables->commandLineType) - { - hr = StrAllocStringToUpperInvariant(&sczKey, wzVariableName, 0); - ExitOnFailure(hr, "Failed to upper case variable name."); - - wzVariableName = sczKey; - } - hr = DictGetValue(pOverridableVariables->sdVariables, wzVariableName, reinterpret_cast(&pOverridableVariable)); if (E_NOTFOUND == hr) { @@ -378,8 +369,6 @@ DAPI_(HRESULT) BalSetOverridableVariablesFromEngine( } LExit: - ReleaseStr(sczKey); - return hr; } @@ -604,29 +593,37 @@ static HRESULT ParseOverridableVariablesFromXml( { HRESULT hr = S_OK; IXMLDOMNode* pCommandLineNode = NULL; + BOOL fXmlFound = FALSE; LPWSTR scz = NULL; IXMLDOMNode* pNode = NULL; IXMLDOMNodeList* pNodes = NULL; BAL_INFO_OVERRIDABLE_VARIABLE* pOverridableVariable = NULL; - hr = XmlSelectSingleNode(pixdManifest, L"/BootstrapperApplicationData/CommandLine", &pCommandLineNode); - ExitOnRequiredXmlQueryFailure(hr, "Failed to select command line information."); - - // @Variables - hr = XmlGetAttributeEx(pCommandLineNode, L"Variables", &scz); - ExitOnRequiredXmlQueryFailure(hr, "Failed to get command line variable type."); + hr = XmlSelectSingleNode(pixdManifest, L"/BootstrapperApplicationData/WixStdbaCommandLine", &pCommandLineNode); + ExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed to select command line information."); - if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"upperCase", -1)) - { - pOverridableVariables->commandLineType = BAL_INFO_VARIABLE_COMMAND_LINE_TYPE_UPPER_CASE; - } - else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"caseSensitive", -1)) + if (!fXmlFound) { pOverridableVariables->commandLineType = BAL_INFO_VARIABLE_COMMAND_LINE_TYPE_CASE_SENSITIVE; } else { - ExitWithRootFailure(hr, E_INVALIDARG, "Invalid value for CommandLine/@Variables: %ls", scz); + // @Variables + hr = XmlGetAttributeEx(pCommandLineNode, L"VariableType", &scz); + ExitOnRequiredXmlQueryFailure(hr, "Failed to get command line variable type."); + + if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"caseInsensitive", -1)) + { + pOverridableVariables->commandLineType = BAL_INFO_VARIABLE_COMMAND_LINE_TYPE_CASE_INSENSITIVE; + } + else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"caseSensitive", -1)) + { + pOverridableVariables->commandLineType = BAL_INFO_VARIABLE_COMMAND_LINE_TYPE_CASE_SENSITIVE; + } + else + { + ExitWithRootFailure(hr, E_INVALIDARG, "Invalid value for CommandLine/@Variables: %ls", scz); + } } // Get the list of variables users can override on the command line. @@ -638,7 +635,9 @@ static HRESULT ParseOverridableVariablesFromXml( if (pOverridableVariables->cVariables) { - hr = DictCreateWithEmbeddedKey(&pOverridableVariables->sdVariables, pOverridableVariables->cVariables, reinterpret_cast(&pOverridableVariables->rgVariables), offsetof(BAL_INFO_OVERRIDABLE_VARIABLE, sczName), DICT_FLAG_NONE); + DICT_FLAG dfFlags = BAL_INFO_VARIABLE_COMMAND_LINE_TYPE_CASE_INSENSITIVE == pOverridableVariables->commandLineType ? DICT_FLAG_CASEINSENSITIVE : DICT_FLAG_NONE; + + hr = DictCreateWithEmbeddedKey(&pOverridableVariables->sdVariables, pOverridableVariables->cVariables, reinterpret_cast(&pOverridableVariables->rgVariables), offsetof(BAL_INFO_OVERRIDABLE_VARIABLE, sczName), dfFlags); ExitOnFailure(hr, "Failed to create the overridable variables string dictionary."); hr = MemAllocArray(reinterpret_cast(&pOverridableVariables->rgVariables), sizeof(pOverridableVariable), pOverridableVariables->cVariables); diff --git a/src/api/burn/balutil/inc/balinfo.h b/src/api/burn/balutil/inc/balinfo.h index 818ff5ef..3ef3a61a 100644 --- a/src/api/burn/balutil/inc/balinfo.h +++ b/src/api/burn/balutil/inc/balinfo.h @@ -40,8 +40,8 @@ typedef enum _BAL_INFO_RESTART typedef enum _BAL_INFO_VARIABLE_COMMAND_LINE_TYPE { - BAL_INFO_VARIABLE_COMMAND_LINE_TYPE_UPPER_CASE, BAL_INFO_VARIABLE_COMMAND_LINE_TYPE_CASE_SENSITIVE, + BAL_INFO_VARIABLE_COMMAND_LINE_TYPE_CASE_INSENSITIVE, } BAL_INFO_VARIABLE_COMMAND_LINE_TYPE; diff --git a/src/api/wix/WixToolset.Data/Symbols/WixBundleSymbol.cs b/src/api/wix/WixToolset.Data/Symbols/WixBundleSymbol.cs index c4db0c21..ffeb5f3b 100644 --- a/src/api/wix/WixToolset.Data/Symbols/WixBundleSymbol.cs +++ b/src/api/wix/WixToolset.Data/Symbols/WixBundleSymbol.cs @@ -33,7 +33,6 @@ namespace WixToolset.Data new IntermediateFieldDefinition(nameof(WixBundleSymbolFields.BundleId), IntermediateFieldType.String), new IntermediateFieldDefinition(nameof(WixBundleSymbolFields.ProviderKey), IntermediateFieldType.String), new IntermediateFieldDefinition(nameof(WixBundleSymbolFields.InProgressName), IntermediateFieldType.String), - new IntermediateFieldDefinition(nameof(WixBundleSymbolFields.CommandLineVariables), IntermediateFieldType.String), new IntermediateFieldDefinition(nameof(WixBundleSymbolFields.DisableModify), IntermediateFieldType.String), }, typeof(WixBundleSymbol)); @@ -69,7 +68,6 @@ namespace WixToolset.Data.Symbols BundleId, ProviderKey, InProgressName, - CommandLineVariables, DisableModify, } @@ -81,12 +79,6 @@ namespace WixToolset.Data.Symbols PerMachine = 0x2, } - public enum WixBundleCommandLineVariables - { - UpperCase, - CaseSensitive, - } - public enum WixBundleModifyType { Allowed = 0, @@ -244,12 +236,6 @@ namespace WixToolset.Data.Symbols set => this.Set((int)WixBundleSymbolFields.InProgressName, value); } - public WixBundleCommandLineVariables CommandLineVariables - { - get => (WixBundleCommandLineVariables)this.Fields[(int)WixBundleSymbolFields.CommandLineVariables].AsNumber(); - set => this.Set((int)WixBundleSymbolFields.CommandLineVariables, (int)value); - } - public WixBundleModifyType DisableModify { get -- cgit v1.2.3-55-g6feb