aboutsummaryrefslogtreecommitdiff
path: root/src/api/burn/WixToolset.Mba.Core
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2021-06-29 19:14:02 -0500
committerSean Hall <r.sean.hall@gmail.com>2021-07-02 12:50:09 -0500
commit8cbfc326cccf8d9b3b63cb6f752fc770f7dee0fc (patch)
tree639f70e7327cdfade62271da04aaaaae2e85cc05 /src/api/burn/WixToolset.Mba.Core
parente844f12f7d7247a1e9ba4eef2a388e614001bb24 (diff)
downloadwix-8cbfc326cccf8d9b3b63cb6f752fc770f7dee0fc.tar.gz
wix-8cbfc326cccf8d9b3b63cb6f752fc770f7dee0fc.tar.bz2
wix-8cbfc326cccf8d9b3b63cb6f752fc770f7dee0fc.zip
Expose overridable variable APIs in balutil and Mba.Core.
Fixes #4777
Diffstat (limited to 'src/api/burn/WixToolset.Mba.Core')
-rw-r--r--src/api/burn/WixToolset.Mba.Core/BootstrapperCommand.cs52
-rw-r--r--src/api/burn/WixToolset.Mba.Core/BundleInfo.cs5
-rw-r--r--src/api/burn/WixToolset.Mba.Core/IBootstrapperCommand.cs16
-rw-r--r--src/api/burn/WixToolset.Mba.Core/IBundleInfo.cs5
-rw-r--r--src/api/burn/WixToolset.Mba.Core/IMbaCommand.cs30
-rw-r--r--src/api/burn/WixToolset.Mba.Core/IOverridableVariableInfo.cs15
-rw-r--r--src/api/burn/WixToolset.Mba.Core/IOverridableVariables.cs17
-rw-r--r--src/api/burn/WixToolset.Mba.Core/MbaCommand.cs33
-rw-r--r--src/api/burn/WixToolset.Mba.Core/OverridableVariableInfo.cs15
-rw-r--r--src/api/burn/WixToolset.Mba.Core/OverridableVariables.cs51
10 files changed, 230 insertions, 9 deletions
diff --git a/src/api/burn/WixToolset.Mba.Core/BootstrapperCommand.cs b/src/api/burn/WixToolset.Mba.Core/BootstrapperCommand.cs
index 65dde0f4..345e0448 100644
--- a/src/api/burn/WixToolset.Mba.Core/BootstrapperCommand.cs
+++ b/src/api/burn/WixToolset.Mba.Core/BootstrapperCommand.cs
@@ -3,6 +3,7 @@
3namespace WixToolset.Mba.Core 3namespace WixToolset.Mba.Core
4{ 4{
5 using System; 5 using System;
6 using System.Collections.Generic;
6 using System.ComponentModel; 7 using System.ComponentModel;
7 using System.Runtime.InteropServices; 8 using System.Runtime.InteropServices;
8 9
@@ -11,8 +12,6 @@ namespace WixToolset.Mba.Core
11 /// </summary> 12 /// </summary>
12 public sealed class BootstrapperCommand : IBootstrapperCommand 13 public sealed class BootstrapperCommand : IBootstrapperCommand
13 { 14 {
14 private readonly string commandLine;
15
16 /// <summary> 15 /// <summary>
17 /// 16 ///
18 /// </summary> 17 /// </summary>
@@ -45,7 +44,7 @@ namespace WixToolset.Mba.Core
45 this.Action = action; 44 this.Action = action;
46 this.Display = display; 45 this.Display = display;
47 this.Restart = restart; 46 this.Restart = restart;
48 this.commandLine = commandLine; 47 this.CommandLine = commandLine;
49 this.CmdShow = cmdShow; 48 this.CmdShow = cmdShow;
50 this.Resume = resume; 49 this.Resume = resume;
51 this.SplashScreen = splashScreen; 50 this.SplashScreen = splashScreen;
@@ -66,7 +65,7 @@ namespace WixToolset.Mba.Core
66 public Restart Restart { get; } 65 public Restart Restart { get; }
67 66
68 /// <inheritdoc/> 67 /// <inheritdoc/>
69 public string[] CommandLineArgs => GetCommandLineArgs(this.commandLine); 68 public string CommandLine { get; }
70 69
71 /// <inheritdoc/> 70 /// <inheritdoc/>
72 public int CmdShow { get; } 71 public int CmdShow { get; }
@@ -92,6 +91,49 @@ namespace WixToolset.Mba.Core
92 /// <inheritdoc/> 91 /// <inheritdoc/>
93 public string BootstrapperApplicationDataPath { get; } 92 public string BootstrapperApplicationDataPath { get; }
94 93
94 /// <inheritdoc/>
95 public IMbaCommand ParseCommandLine()
96 {
97 var args = ParseCommandLineToArgs(this.CommandLine);
98 var unknownArgs = new List<string>();
99 var variables = new List<KeyValuePair<string, string>>();
100
101 foreach (var arg in args)
102 {
103 var unknownArg = false;
104
105 if (arg[0] == '-' || arg[0] == '/')
106 {
107 unknownArg = true;
108 }
109 else
110 {
111 var index = arg.IndexOf('=');
112 if (index == -1)
113 {
114 unknownArg = true;
115 }
116 else
117 {
118 var name = arg.Substring(0, index);
119 var value = arg.Substring(index + 1);
120 variables.Add(new KeyValuePair<string, string>(name, value));
121 }
122 }
123
124 if (unknownArg)
125 {
126 unknownArgs.Add(arg);
127 }
128 }
129
130 return new MbaCommand
131 {
132 UnknownCommandLineArgs = unknownArgs.ToArray(),
133 Variables = variables.ToArray(),
134 };
135 }
136
95 /// <summary> 137 /// <summary>
96 /// Gets the command line arguments as a string array. 138 /// Gets the command line arguments as a string array.
97 /// </summary> 139 /// </summary>
@@ -102,7 +144,7 @@ namespace WixToolset.Mba.Core
102 /// <remarks> 144 /// <remarks>
103 /// This method uses the same parsing as the operating system which handles quotes and spaces correctly. 145 /// This method uses the same parsing as the operating system which handles quotes and spaces correctly.
104 /// </remarks> 146 /// </remarks>
105 public static string[] GetCommandLineArgs(string commandLine) 147 public static string[] ParseCommandLineToArgs(string commandLine)
106 { 148 {
107 if (null == commandLine) 149 if (null == commandLine)
108 { 150 {
diff --git a/src/api/burn/WixToolset.Mba.Core/BundleInfo.cs b/src/api/burn/WixToolset.Mba.Core/BundleInfo.cs
index 3d5d535d..4a533bf9 100644
--- a/src/api/burn/WixToolset.Mba.Core/BundleInfo.cs
+++ b/src/api/burn/WixToolset.Mba.Core/BundleInfo.cs
@@ -23,6 +23,9 @@ namespace WixToolset.Mba.Core
23 public string LogVariable { get; internal set; } 23 public string LogVariable { get; internal set; }
24 24
25 /// <inheritdoc/> 25 /// <inheritdoc/>
26 public IOverridableVariables OverridableVariables { get; internal set; }
27
28 /// <inheritdoc/>
26 public IDictionary<string, IPackageInfo> Packages { get; internal set; } 29 public IDictionary<string, IPackageInfo> Packages { get; internal set; }
27 30
28 internal BundleInfo() 31 internal BundleInfo()
@@ -78,6 +81,8 @@ namespace WixToolset.Mba.Core
78 81
79 bundle.LogVariable = BootstrapperApplicationData.GetAttribute(bundleNode, "LogPathVariable"); 82 bundle.LogVariable = BootstrapperApplicationData.GetAttribute(bundleNode, "LogPathVariable");
80 83
84 bundle.OverridableVariables = OverridableVariablesInfo.ParseFromXml(root);
85
81 bundle.Packages = PackageInfo.ParsePackagesFromXml(root); 86 bundle.Packages = PackageInfo.ParsePackagesFromXml(root);
82 87
83 return bundle; 88 return bundle;
diff --git a/src/api/burn/WixToolset.Mba.Core/IBootstrapperCommand.cs b/src/api/burn/WixToolset.Mba.Core/IBootstrapperCommand.cs
index e861813f..b7baa55c 100644
--- a/src/api/burn/WixToolset.Mba.Core/IBootstrapperCommand.cs
+++ b/src/api/burn/WixToolset.Mba.Core/IBootstrapperCommand.cs
@@ -25,13 +25,12 @@ namespace WixToolset.Mba.Core
25 Restart Restart { get; } 25 Restart Restart { get; }
26 26
27 /// <summary> 27 /// <summary>
28 /// Gets the command line arguments as a string array. 28 /// Gets the command line arguments.
29 /// </summary> 29 /// </summary>
30 /// <returns> 30 /// <returns>
31 /// Array of command line arguments not handled by the engine. 31 /// Command line arguments not handled by the engine.
32 /// </returns> 32 /// </returns>
33 /// <exception type="Win32Exception">The command line could not be parsed into an array.</exception> 33 string CommandLine { get; }
34 string[] CommandLineArgs { get; }
35 34
36 /// <summary> 35 /// <summary>
37 /// Hint for the initial visibility of the window. 36 /// Hint for the initial visibility of the window.
@@ -72,5 +71,14 @@ namespace WixToolset.Mba.Core
72 /// Gets path to BootstrapperApplicationData.xml. 71 /// Gets path to BootstrapperApplicationData.xml.
73 /// </summary> 72 /// </summary>
74 string BootstrapperApplicationDataPath { get; } 73 string BootstrapperApplicationDataPath { get; }
74
75 /// <summary>
76 /// Parses the command line arguments into an <see cref="IMbaCommand"/>.
77 /// </summary>
78 /// <returns>
79 /// The parsed information.
80 /// </returns>
81 /// <exception type="Win32Exception">The command line could not be parsed.</exception>
82 IMbaCommand ParseCommandLine();
75 } 83 }
76} 84}
diff --git a/src/api/burn/WixToolset.Mba.Core/IBundleInfo.cs b/src/api/burn/WixToolset.Mba.Core/IBundleInfo.cs
index f4a82f36..35decc88 100644
--- a/src/api/burn/WixToolset.Mba.Core/IBundleInfo.cs
+++ b/src/api/burn/WixToolset.Mba.Core/IBundleInfo.cs
@@ -22,6 +22,11 @@ namespace WixToolset.Mba.Core
22 /// <summary> 22 /// <summary>
23 /// 23 ///
24 /// </summary> 24 /// </summary>
25 IOverridableVariables OverridableVariables { get; }
26
27 /// <summary>
28 ///
29 /// </summary>
25 IDictionary<string, IPackageInfo> Packages { get; } 30 IDictionary<string, IPackageInfo> Packages { get; }
26 31
27 /// <summary> 32 /// <summary>
diff --git a/src/api/burn/WixToolset.Mba.Core/IMbaCommand.cs b/src/api/burn/WixToolset.Mba.Core/IMbaCommand.cs
new file mode 100644
index 00000000..a3ad68d8
--- /dev/null
+++ b/src/api/burn/WixToolset.Mba.Core/IMbaCommand.cs
@@ -0,0 +1,30 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Mba.Core
4{
5 using System.Collections.Generic;
6
7 /// <summary>
8 /// Command information parsed from the command line.
9 /// </summary>
10 public interface IMbaCommand
11 {
12 /// <summary>
13 /// The command line arguments not parsed into <see cref="IBootstrapperCommand"/> or <see cref="IMbaCommand"/>.
14 /// </summary>
15 string[] UnknownCommandLineArgs { get; }
16
17 /// <summary>
18 /// The variables that were parsed from the command line.
19 /// Key = variable name, Value = variable value.
20 /// </summary>
21 KeyValuePair<string, string>[] Variables { get; }
22
23 /// <summary>
24 /// Sets overridable variables from the command line.
25 /// </summary>
26 /// <param name="overridableVariables">The overridable variable information from <see cref="IBootstrapperApplicationData"/>.</param>
27 /// <param name="engine">The engine.</param>
28 void SetOverridableVariables(IOverridableVariables overridableVariables, IEngine engine);
29 }
30}
diff --git a/src/api/burn/WixToolset.Mba.Core/IOverridableVariableInfo.cs b/src/api/burn/WixToolset.Mba.Core/IOverridableVariableInfo.cs
new file mode 100644
index 00000000..d01dead3
--- /dev/null
+++ b/src/api/burn/WixToolset.Mba.Core/IOverridableVariableInfo.cs
@@ -0,0 +1,15 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Mba.Core
4{
5 /// <summary>
6 /// Overridable variable from the BA manifest.
7 /// </summary>
8 public interface IOverridableVariableInfo
9 {
10 /// <summary>
11 /// The Variable name.
12 /// </summary>
13 string Name { get; }
14 }
15} \ No newline at end of file
diff --git a/src/api/burn/WixToolset.Mba.Core/IOverridableVariables.cs b/src/api/burn/WixToolset.Mba.Core/IOverridableVariables.cs
new file mode 100644
index 00000000..3944913b
--- /dev/null
+++ b/src/api/burn/WixToolset.Mba.Core/IOverridableVariables.cs
@@ -0,0 +1,17 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Mba.Core
4{
5 using System.Collections.Generic;
6
7 /// <summary>
8 /// Overridable variable information from the BA manifest.
9 /// </summary>
10 public interface IOverridableVariables
11 {
12 /// <summary>
13 /// Variable Dictionary of variable name to <see cref="IOverridableVariableInfo"/>.
14 /// </summary>
15 IDictionary<string, IOverridableVariableInfo> Variables { get; }
16 }
17} \ 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
new file mode 100644
index 00000000..e7e49607
--- /dev/null
+++ b/src/api/burn/WixToolset.Mba.Core/MbaCommand.cs
@@ -0,0 +1,33 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Mba.Core
4{
5 using System.Collections.Generic;
6
7 /// <summary>
8 /// Default implementation of <see cref="IMbaCommand"/>.
9 /// </summary>
10 internal sealed class MbaCommand : IMbaCommand
11 {
12 public string[] UnknownCommandLineArgs { get; internal set; }
13
14 public KeyValuePair<string, string>[] Variables { get; internal set; }
15
16 internal MbaCommand() { }
17
18 public void SetOverridableVariables(IOverridableVariables overridableVariables, IEngine engine)
19 {
20 foreach (var kvp in this.Variables)
21 {
22 if (!overridableVariables.Variables.TryGetValue(kvp.Key, out var overridableVariable))
23 {
24 engine.Log(LogLevel.Error, string.Format("Ignoring attempt to set non-overridable variable: '{0}'.", kvp.Key));
25 }
26 else
27 {
28 engine.SetVariableString(overridableVariable.Name, kvp.Value, false);
29 }
30 }
31 }
32 }
33}
diff --git a/src/api/burn/WixToolset.Mba.Core/OverridableVariableInfo.cs b/src/api/burn/WixToolset.Mba.Core/OverridableVariableInfo.cs
new file mode 100644
index 00000000..b8e85c34
--- /dev/null
+++ b/src/api/burn/WixToolset.Mba.Core/OverridableVariableInfo.cs
@@ -0,0 +1,15 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Mba.Core
4{
5 /// <summary>
6 /// Default implementation of <see cref="IOverridableVariableInfo"/>.
7 /// </summary>
8 internal class OverridableVariableInfo : IOverridableVariableInfo
9 {
10 /// <inheritdoc />
11 public string Name { get; internal set; }
12
13 internal OverridableVariableInfo() { }
14 }
15}
diff --git a/src/api/burn/WixToolset.Mba.Core/OverridableVariables.cs b/src/api/burn/WixToolset.Mba.Core/OverridableVariables.cs
new file mode 100644
index 00000000..855ce9a9
--- /dev/null
+++ b/src/api/burn/WixToolset.Mba.Core/OverridableVariables.cs
@@ -0,0 +1,51 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Mba.Core
4{
5 using System;
6 using System.Collections.Generic;
7 using System.Xml;
8 using System.Xml.XPath;
9
10 /// <summary>
11 /// Default implementation of <see cref="IOverridableVariables"/>.
12 /// </summary>
13 public class OverridableVariablesInfo : IOverridableVariables
14 {
15 /// <inheritdoc />
16 public IDictionary<string, IOverridableVariableInfo> Variables { get; internal set; }
17
18 internal OverridableVariablesInfo() { }
19
20 /// <summary>
21 /// Parses the overridable variable info from the BA manifest.
22 /// </summary>
23 /// <param name="root">XML root</param>
24 /// <returns>The parsed information.</returns>
25 public static IOverridableVariables ParseFromXml(XPathNavigator root)
26 {
27 XmlNamespaceManager namespaceManager = new XmlNamespaceManager(root.NameTable);
28 namespaceManager.AddNamespace("p", BootstrapperApplicationData.XMLNamespace);
29 XPathNodeIterator nodes = root.Select("/p:BootstrapperApplicationData/p:WixStdbaOverridableVariable", namespaceManager);
30
31 var overridableVariables = new OverridableVariablesInfo();
32 overridableVariables.Variables = new Dictionary<string, IOverridableVariableInfo>();
33
34 foreach (XPathNavigator node in nodes)
35 {
36 var variable = new OverridableVariableInfo();
37
38 string name = BootstrapperApplicationData.GetAttribute(node, "Name");
39 if (name == null)
40 {
41 throw new Exception("Failed to get name for overridable variable.");
42 }
43 variable.Name = name;
44
45 overridableVariables.Variables.Add(variable.Name, variable);
46 }
47
48 return overridableVariables;
49 }
50 }
51}