@joebigelow / wix / commits / 863c1b81

Create Harvested*PackageSymbols.

Sean Hall committed Apr 13, 2022 at 10:13 UTC 863c1b8180d802f98e37be876b0c27efce2e8ace
10 files changed +820 -236
src/api/wix/WixToolset.Data/Symbols/SymbolDefinitions.cs
+12
@@ -130,6 +130,9 @@ namespace WixToolset.Data
130 WixBundleExePackage,
131 WixBundleExePackagePayload,
132 WixBundleExtension,
133 + WixBundleHarvestedBundlePackage,
134 + WixBundleHarvestedMsiPackage,
135 + WixBundleHarvestedMspPackage,
136 WixBundleMsiFeature,
137 WixBundleMsiPackage,
138 WixBundleMsiPackagePayload,
@@ -583,6 +586,15 @@ namespace WixToolset.Data
586 case SymbolDefinitionType.WixBundleExePackagePayload:
587 return SymbolDefinitions.WixBundleExePackagePayload;
588
589 + case SymbolDefinitionType.WixBundleHarvestedBundlePackage:
590 + return SymbolDefinitions.WixBundleHarvestedBundlePackage;
591 +
592 + case SymbolDefinitionType.WixBundleHarvestedMsiPackage:
593 + return SymbolDefinitions.WixBundleHarvestedMsiPackage;
594 +
595 + case SymbolDefinitionType.WixBundleHarvestedMspPackage:
596 + return SymbolDefinitions.WixBundleHarvestedMspPackage;
597 +
598 case SymbolDefinitionType.WixBundleMsiFeature:
599 return SymbolDefinitions.WixBundleMsiFeature;
600
src/api/wix/WixToolset.Data/Symbols/WixBundleHarvestedBundlePackageSymbol.cs new
+134
@@ -0,0 +1,134 @@
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 +
3 +namespace WixToolset.Data
4 +{
5 + using WixToolset.Data.Symbols;
6 +
7 + public static partial class SymbolDefinitions
8 + {
9 + public static readonly IntermediateSymbolDefinition WixBundleHarvestedBundlePackage = new IntermediateSymbolDefinition(
10 + SymbolDefinitionType.WixBundleHarvestedBundlePackage,
11 + new[]
12 + {
13 + new IntermediateFieldDefinition(nameof(WixBundleHarvestedBundlePackageSymbolFields.Attributes), IntermediateFieldType.Number),
14 + new IntermediateFieldDefinition(nameof(WixBundleHarvestedBundlePackageSymbolFields.BundleId), IntermediateFieldType.String),
15 + new IntermediateFieldDefinition(nameof(WixBundleHarvestedBundlePackageSymbolFields.ManifestNamespace), IntermediateFieldType.String),
16 + new IntermediateFieldDefinition(nameof(WixBundleHarvestedBundlePackageSymbolFields.ProtocolVersion), IntermediateFieldType.Number),
17 + new IntermediateFieldDefinition(nameof(WixBundleHarvestedBundlePackageSymbolFields.Version), IntermediateFieldType.String),
18 + new IntermediateFieldDefinition(nameof(WixBundleHarvestedBundlePackageSymbolFields.DisplayName), IntermediateFieldType.String),
19 + new IntermediateFieldDefinition(nameof(WixBundleHarvestedBundlePackageSymbolFields.InstallSize), IntermediateFieldType.LargeNumber),
20 + },
21 + typeof(WixBundleHarvestedBundlePackageSymbol));
22 + }
23 +}
24 +
25 +namespace WixToolset.Data.Symbols
26 +{
27 + using System;
28 +
29 + public enum WixBundleHarvestedBundlePackageSymbolFields
30 + {
31 + Attributes,
32 + BundleId,
33 + ManifestNamespace,
34 + ProtocolVersion,
35 + Version,
36 + DisplayName,
37 + InstallSize,
38 + }
39 +
40 + [Flags]
41 + public enum WixBundleHarvestedBundlePackageAttributes
42 + {
43 + None = 0x0,
44 + PerMachine = 0x1,
45 + Win64 = 0x2,
46 + }
47 +
48 + public class WixBundleHarvestedBundlePackageSymbol : IntermediateSymbol
49 + {
50 + public WixBundleHarvestedBundlePackageSymbol() : base(SymbolDefinitions.WixBundleHarvestedBundlePackage, null, null)
51 + {
52 + }
53 +
54 + public WixBundleHarvestedBundlePackageSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(SymbolDefinitions.WixBundleHarvestedBundlePackage, sourceLineNumber, id)
55 + {
56 + }
57 +
58 + public IntermediateField this[WixBundleHarvestedBundlePackageSymbolFields index] => this.Fields[(int)index];
59 +
60 + public WixBundleHarvestedBundlePackageAttributes Attributes
61 + {
62 + get => (WixBundleHarvestedBundlePackageAttributes)this.Fields[(int)WixBundleHarvestedBundlePackageSymbolFields.Attributes].AsNumber();
63 + set => this.Set((int)WixBundleHarvestedBundlePackageSymbolFields.Attributes, (int)value);
64 + }
65 +
66 + public string BundleId
67 + {
68 + get => this.Fields[(int)WixBundleHarvestedBundlePackageSymbolFields.BundleId].AsString();
69 + set => this.Set((int)WixBundleHarvestedBundlePackageSymbolFields.BundleId, value);
70 + }
71 +
72 + public string ManifestNamespace
73 + {
74 + get => this.Fields[(int)WixBundleHarvestedBundlePackageSymbolFields.ManifestNamespace].AsString();
75 + set => this.Set((int)WixBundleHarvestedBundlePackageSymbolFields.ManifestNamespace, value);
76 + }
77 +
78 + public int ProtocolVersion
79 + {
80 + get => this.Fields[(int)WixBundleHarvestedBundlePackageSymbolFields.ProtocolVersion].AsNumber();
81 + set => this.Set((int)WixBundleHarvestedBundlePackageSymbolFields.ProtocolVersion, value);
82 + }
83 +
84 + public string Version
85 + {
86 + get => this.Fields[(int)WixBundleHarvestedBundlePackageSymbolFields.Version].AsString();
87 + set => this.Set((int)WixBundleHarvestedBundlePackageSymbolFields.Version, value);
88 + }
89 +
90 + public string DisplayName
91 + {
92 + get => this.Fields[(int)WixBundleHarvestedBundlePackageSymbolFields.DisplayName].AsString();
93 + set => this.Set((int)WixBundleHarvestedBundlePackageSymbolFields.DisplayName, value);
94 + }
95 +
96 + public long InstallSize
97 + {
98 + get => this.Fields[(int)WixBundleHarvestedBundlePackageSymbolFields.InstallSize].AsLargeNumber();
99 + set => this.Set((int)WixBundleHarvestedBundlePackageSymbolFields.InstallSize, value);
100 + }
101 +
102 + public bool PerMachine
103 + {
104 + get { return this.Attributes.HasFlag(WixBundleHarvestedBundlePackageAttributes.PerMachine); }
105 + set
106 + {
107 + if (value)
108 + {
109 + this.Attributes |= WixBundleHarvestedBundlePackageAttributes.PerMachine;
110 + }
111 + else
112 + {
113 + this.Attributes &= ~WixBundleHarvestedBundlePackageAttributes.PerMachine;
114 + }
115 + }
116 + }
117 +
118 + public bool Win64
119 + {
120 + get { return this.Attributes.HasFlag(WixBundleHarvestedBundlePackageAttributes.Win64); }
121 + set
122 + {
123 + if (value)
124 + {
125 + this.Attributes |= WixBundleHarvestedBundlePackageAttributes.Win64;
126 + }
127 + else
128 + {
129 + this.Attributes &= ~WixBundleHarvestedBundlePackageAttributes.Win64;
130 + }
131 + }
132 + }
133 + }
134 +}
src/api/wix/WixToolset.Data/Symbols/WixBundleHarvestedMsiPackageSymbol.cs new
+174
@@ -0,0 +1,174 @@
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 +
3 +namespace WixToolset.Data
4 +{
5 + using WixToolset.Data.Symbols;
6 +
7 + public static partial class SymbolDefinitions
8 + {
9 + public static readonly IntermediateSymbolDefinition WixBundleHarvestedMsiPackage = new IntermediateSymbolDefinition(
10 + SymbolDefinitionType.WixBundleHarvestedMsiPackage,
11 + new[]
12 + {
13 + new IntermediateFieldDefinition(nameof(WixBundleHarvestedMsiPackageSymbolFields.Attributes), IntermediateFieldType.Number),
14 + new IntermediateFieldDefinition(nameof(WixBundleHarvestedMsiPackageSymbolFields.ProductName), IntermediateFieldType.String),
15 + new IntermediateFieldDefinition(nameof(WixBundleHarvestedMsiPackageSymbolFields.ArpComments), IntermediateFieldType.String),
16 + new IntermediateFieldDefinition(nameof(WixBundleHarvestedMsiPackageSymbolFields.AllUsers), IntermediateFieldType.String),
17 + new IntermediateFieldDefinition(nameof(WixBundleHarvestedMsiPackageSymbolFields.MsiFastInstall), IntermediateFieldType.String),
18 + new IntermediateFieldDefinition(nameof(WixBundleHarvestedMsiPackageSymbolFields.ArpSystemComponent), IntermediateFieldType.String),
19 + new IntermediateFieldDefinition(nameof(WixBundleHarvestedMsiPackageSymbolFields.ProductCode), IntermediateFieldType.String),
20 + new IntermediateFieldDefinition(nameof(WixBundleHarvestedMsiPackageSymbolFields.UpgradeCode), IntermediateFieldType.String),
21 + new IntermediateFieldDefinition(nameof(WixBundleHarvestedMsiPackageSymbolFields.Manufacturer), IntermediateFieldType.String),
22 + new IntermediateFieldDefinition(nameof(WixBundleHarvestedMsiPackageSymbolFields.ProductLanguage), IntermediateFieldType.String),
23 + new IntermediateFieldDefinition(nameof(WixBundleHarvestedMsiPackageSymbolFields.ProductVersion), IntermediateFieldType.String),
24 + new IntermediateFieldDefinition(nameof(WixBundleHarvestedMsiPackageSymbolFields.InstallSize), IntermediateFieldType.LargeNumber),
25 + },
26 + typeof(WixBundleHarvestedMsiPackageSymbol));
27 + }
28 +}
29 +
30 +namespace WixToolset.Data.Symbols
31 +{
32 + using System;
33 +
34 + public enum WixBundleHarvestedMsiPackageSymbolFields
35 + {
36 + Attributes,
37 + ProductName,
38 + ArpComments,
39 + AllUsers,
40 + MsiFastInstall,
41 + ArpSystemComponent,
42 + ProductCode,
43 + UpgradeCode,
44 + Manufacturer,
45 + ProductLanguage,
46 + ProductVersion,
47 + InstallSize,
48 + }
49 +
50 + [Flags]
51 + public enum WixBundleHarvestedMsiPackageAttributes
52 + {
53 + None = 0x0,
54 + PerMachine = 0x01,
55 + Win64 = 0x2,
56 + }
57 +
58 + public class WixBundleHarvestedMsiPackageSymbol : IntermediateSymbol
59 + {
60 + public WixBundleHarvestedMsiPackageSymbol() : base(SymbolDefinitions.WixBundleHarvestedMsiPackage, null, null)
61 + {
62 + }
63 +
64 + public WixBundleHarvestedMsiPackageSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(SymbolDefinitions.WixBundleHarvestedMsiPackage, sourceLineNumber, id)
65 + {
66 + }
67 +
68 + public IntermediateField this[WixBundleHarvestedMsiPackageSymbolFields index] => this.Fields[(int)index];
69 +
70 + public WixBundleHarvestedMsiPackageAttributes Attributes
71 + {
72 + get => (WixBundleHarvestedMsiPackageAttributes)this.Fields[(int)WixBundleHarvestedMsiPackageSymbolFields.Attributes].AsNumber();
73 + set => this.Set((int)WixBundleHarvestedMsiPackageSymbolFields.Attributes, (int)value);
74 + }
75 +
76 + public string ProductName
77 + {
78 + get => this.Fields[(int)WixBundleHarvestedMsiPackageSymbolFields.ProductName].AsString();
79 + set => this.Set((int)WixBundleHarvestedMsiPackageSymbolFields.ProductName, value);
80 + }
81 +
82 + public string ArpComments
83 + {
84 + get => this.Fields[(int)WixBundleHarvestedMsiPackageSymbolFields.ArpComments].AsString();
85 + set => this.Set((int)WixBundleHarvestedMsiPackageSymbolFields.ArpComments, value);
86 + }
87 +
88 + public string AllUsers
89 + {
90 + get => this.Fields[(int)WixBundleHarvestedMsiPackageSymbolFields.AllUsers].AsString();
91 + set => this.Set((int)WixBundleHarvestedMsiPackageSymbolFields.AllUsers, value);
92 + }
93 +
94 + public string MsiFastInstall
95 + {
96 + get => this.Fields[(int)WixBundleHarvestedMsiPackageSymbolFields.MsiFastInstall].AsString();
97 + set => this.Set((int)WixBundleHarvestedMsiPackageSymbolFields.MsiFastInstall, value);
98 + }
99 +
100 + public string ArpSystemComponent
101 + {
102 + get => this.Fields[(int)WixBundleHarvestedMsiPackageSymbolFields.ArpSystemComponent].AsString();
103 + set => this.Set((int)WixBundleHarvestedMsiPackageSymbolFields.ArpSystemComponent, value);
104 + }
105 +
106 + public string ProductCode
107 + {
108 + get => this.Fields[(int)WixBundleHarvestedMsiPackageSymbolFields.ProductCode].AsString();
109 + set => this.Set((int)WixBundleHarvestedMsiPackageSymbolFields.ProductCode, value);
110 + }
111 +
112 + public string UpgradeCode
113 + {
114 + get => this.Fields[(int)WixBundleHarvestedMsiPackageSymbolFields.UpgradeCode].AsString();
115 + set => this.Set((int)WixBundleHarvestedMsiPackageSymbolFields.UpgradeCode, value);
116 + }
117 +
118 + public string Manufacturer
119 + {
120 + get => this.Fields[(int)WixBundleHarvestedMsiPackageSymbolFields.Manufacturer].AsString();
121 + set => this.Set((int)WixBundleHarvestedMsiPackageSymbolFields.Manufacturer, value);
122 + }
123 +
124 + public string ProductLanguage
125 + {
126 + get => this.Fields[(int)WixBundleHarvestedMsiPackageSymbolFields.ProductLanguage].AsString();
127 + set => this.Set((int)WixBundleHarvestedMsiPackageSymbolFields.ProductLanguage, value);
128 + }
129 +
130 + public string ProductVersion
131 + {
132 + get => this.Fields[(int)WixBundleHarvestedMsiPackageSymbolFields.ProductVersion].AsString();
133 + set => this.Set((int)WixBundleHarvestedMsiPackageSymbolFields.ProductVersion, value);
134 + }
135 +
136 + public long InstallSize
137 + {
138 + get => this.Fields[(int)WixBundleHarvestedMsiPackageSymbolFields.InstallSize].AsLargeNumber();
139 + set => this.Set((int)WixBundleHarvestedMsiPackageSymbolFields.InstallSize, value);
140 + }
141 +
142 + public bool PerMachine
143 + {
144 + get { return this.Attributes.HasFlag(WixBundleHarvestedMsiPackageAttributes.PerMachine); }
145 + set
146 + {
147 + if (value)
148 + {
149 + this.Attributes |= WixBundleHarvestedMsiPackageAttributes.PerMachine;
150 + }
151 + else
152 + {
153 + this.Attributes &= ~WixBundleHarvestedMsiPackageAttributes.PerMachine;
154 + }
155 + }
156 + }
157 +
158 + public bool Win64
159 + {
160 + get { return this.Attributes.HasFlag(WixBundleHarvestedMsiPackageAttributes.Win64); }
161 + set
162 + {
163 + if (value)
164 + {
165 + this.Attributes |= WixBundleHarvestedMsiPackageAttributes.Win64;
166 + }
167 + else
168 + {
169 + this.Attributes &= ~WixBundleHarvestedMsiPackageAttributes.Win64;
170 + }
171 + }
172 + }
173 + }
174 +}
src/api/wix/WixToolset.Data/Symbols/WixBundleHarvestedMspPackageSymbol.cs new
+92
@@ -0,0 +1,92 @@
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 +
3 +namespace WixToolset.Data
4 +{
5 + using WixToolset.Data.Symbols;
6 +
7 + public static partial class SymbolDefinitions
8 + {
9 + public static readonly IntermediateSymbolDefinition WixBundleHarvestedMspPackage = new IntermediateSymbolDefinition(
10 + SymbolDefinitionType.WixBundleHarvestedMspPackage,
11 + new[]
12 + {
13 + new IntermediateFieldDefinition(nameof(WixBundleHarvestedMspPackageSymbolFields.Attributes), IntermediateFieldType.Number),
14 + new IntermediateFieldDefinition(nameof(WixBundleHarvestedMspPackageSymbolFields.PatchCode), IntermediateFieldType.String),
15 + new IntermediateFieldDefinition(nameof(WixBundleHarvestedMspPackageSymbolFields.DisplayName), IntermediateFieldType.String),
16 + new IntermediateFieldDefinition(nameof(WixBundleHarvestedMspPackageSymbolFields.Description), IntermediateFieldType.String),
17 + new IntermediateFieldDefinition(nameof(WixBundleHarvestedMspPackageSymbolFields.ManufacturerName), IntermediateFieldType.String),
18 + new IntermediateFieldDefinition(nameof(WixBundleHarvestedMspPackageSymbolFields.PatchXml), IntermediateFieldType.String),
19 + },
20 + typeof(WixBundleHarvestedMspPackageSymbol));
21 + }
22 +}
23 +
24 +namespace WixToolset.Data.Symbols
25 +{
26 + using System;
27 +
28 + public enum WixBundleHarvestedMspPackageSymbolFields
29 + {
30 + Attributes,
31 + PatchCode,
32 + DisplayName,
33 + Description,
34 + ManufacturerName,
35 + PatchXml,
36 + }
37 +
38 + [Flags]
39 + public enum WixBundleHarvestedMspPackageAttributes
40 + {
41 + None = 0x0,
42 + }
43 +
44 + public class WixBundleHarvestedMspPackageSymbol : IntermediateSymbol
45 + {
46 + public WixBundleHarvestedMspPackageSymbol() : base(SymbolDefinitions.WixBundleHarvestedMspPackage, null, null)
47 + {
48 + }
49 +
50 + public WixBundleHarvestedMspPackageSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(SymbolDefinitions.WixBundleHarvestedMspPackage, sourceLineNumber, id)
51 + {
52 + }
53 +
54 + public IntermediateField this[WixBundleHarvestedMspPackageSymbolFields index] => this.Fields[(int)index];
55 +
56 + public WixBundleHarvestedMspPackageAttributes Attributes
57 + {
58 + get => (WixBundleHarvestedMspPackageAttributes)this.Fields[(int)WixBundleHarvestedMspPackageSymbolFields.Attributes].AsNumber();
59 + set => this.Set((int)WixBundleHarvestedMspPackageSymbolFields.Attributes, (int)value);
60 + }
61 +
62 + public string PatchCode
63 + {
64 + get => this.Fields[(int)WixBundleHarvestedMspPackageSymbolFields.PatchCode].AsString();
65 + set => this.Set((int)WixBundleHarvestedMspPackageSymbolFields.PatchCode, value);
66 + }
67 +
68 + public string DisplayName
69 + {
70 + get => this.Fields[(int)WixBundleHarvestedMspPackageSymbolFields.DisplayName].AsString();
71 + set => this.Set((int)WixBundleHarvestedMspPackageSymbolFields.DisplayName, value);
72 + }
73 +
74 + public string Description
75 + {
76 + get => this.Fields[(int)WixBundleHarvestedMspPackageSymbolFields.Description].AsString();
77 + set => this.Set((int)WixBundleHarvestedMspPackageSymbolFields.Description, value);
78 + }
79 +
80 + public string ManufacturerName
81 + {
82 + get => this.Fields[(int)WixBundleHarvestedMspPackageSymbolFields.ManufacturerName].AsString();
83 + set => this.Set((int)WixBundleHarvestedMspPackageSymbolFields.ManufacturerName, value);
84 + }
85 +
86 + public string PatchXml
87 + {
88 + get => this.Fields[(int)WixBundleHarvestedMspPackageSymbolFields.PatchXml].AsString();
89 + set => this.Set((int)WixBundleHarvestedMspPackageSymbolFields.PatchXml, value);
90 + }
91 + }
92 +}
src/wix/WixToolset.Core.Burn/Bind/GenerateManifestDataFromIRCommand.cs
+3
@@ -70,6 +70,9 @@ namespace WixToolset.Core.Burn.Bind
70 case SymbolDefinitionType.WixBundleExePackage:
71 case SymbolDefinitionType.WixBundleExePackagePayload:
72 case SymbolDefinitionType.WixBundleExtension:
73 + case SymbolDefinitionType.WixBundleHarvestedBundlePackage:
74 + case SymbolDefinitionType.WixBundleHarvestedMsiPackage:
75 + case SymbolDefinitionType.WixBundleHarvestedMspPackage:
76 case SymbolDefinitionType.WixBundleMsiFeature:
77 case SymbolDefinitionType.WixBundleMsiPackage:
78 case SymbolDefinitionType.WixBundleMsiPackagePayload:
src/wix/WixToolset.Core.Burn/Bundles/ProcessBundlePackageCommand.cs
+111 -47
@@ -6,6 +6,7 @@ namespace WixToolset.Core.Burn.Bundles
6 using System.Collections.Generic;
7 using System.Diagnostics;
8 using System.IO;
9 + using System.Linq;
10 using System.Xml;
11 using WixToolset.Data;
12 using WixToolset.Data.Symbols;
@@ -23,8 +24,11 @@ namespace WixToolset.Core.Burn.Bundles
24 this.BackendHelper = serviceProvider.GetService<IBackendHelper>();
25 this.PackagePayloads = packagePayloads;
26 this.Section = section;
26 - this.Facade = facade;
27 this.IntermediateFolder = intermediateFolder;
28 +
29 + this.ChainPackage = facade.PackageSymbol;
30 + this.BundlePackage = (WixBundleBundlePackageSymbol)facade.SpecificPackageSymbol;
31 + this.PackagePayload = packagePayloads[this.ChainPackage.PayloadRef];
32 }
33
34 private IMessaging Messaging { get; }
@@ -33,7 +37,13 @@ namespace WixToolset.Core.Burn.Bundles
37
38 private Dictionary<string, WixBundlePayloadSymbol> PackagePayloads { get; }
39
36 - private PackageFacade Facade { get; }
40 + private WixBundlePackageSymbol ChainPackage { get; }
41 +
42 + private WixBundleBundlePackageSymbol BundlePackage { get; }
43 +
44 + private string PackageId => this.ChainPackage.Id.Id;
45 +
46 + private WixBundlePayloadSymbol PackagePayload { get; }
47
48 private IntermediateSection Section { get; }
49
@@ -46,27 +56,81 @@ namespace WixToolset.Core.Burn.Bundles
56 /// </summary>
57 public void Execute()
58 {
49 - var bundlePackage = (WixBundleBundlePackageSymbol)this.Facade.SpecificPackageSymbol;
50 - var packagePayload = this.PackagePayloads[this.Facade.PackageSymbol.PayloadRef];
51 - var sourcePath = packagePayload.SourceFile.Path;
59 + var harvestedBundlePackage = this.Section.Symbols.OfType<WixBundleHarvestedBundlePackageSymbol>()
60 + .Where(h => h.Id == this.ChainPackage.Id)
61 + .SingleOrDefault();
62 +
63 + if (harvestedBundlePackage == null)
64 + {
65 + harvestedBundlePackage = this.HarvestPackage();
66 +
67 + if (harvestedBundlePackage == null)
68 + {
69 + return;
70 + }
71 + }
72 +
73 + this.ChainPackage.Win64 = harvestedBundlePackage.Win64;
74 + this.BundlePackage.BundleId = Guid.Parse(harvestedBundlePackage.BundleId).ToString("B").ToUpperInvariant();
75 + this.BundlePackage.SupportsBurnProtocol = harvestedBundlePackage.ProtocolVersion == 1; // Keep in sync with burn\engine\inc\engine.h
76 +
77 + var supportsArpSystemComponent = BurnCommon.BurnV3Namespace != harvestedBundlePackage.ManifestNamespace;
78 + if (!supportsArpSystemComponent && !this.ChainPackage.Visible)
79 + {
80 + this.Messaging.Write(BurnBackendWarnings.HiddenBundleNotSupported(this.PackagePayload.SourceLineNumbers, this.PackageId));
81 +
82 + this.ChainPackage.Visible = true;
83 + }
84 +
85 + this.ChainPackage.PerMachine = harvestedBundlePackage.PerMachine;
86 + this.PackagePayload.Version = harvestedBundlePackage.Version;
87 + this.BundlePackage.Version = harvestedBundlePackage.Version;
88 + this.ChainPackage.Version = harvestedBundlePackage.Version;
89 +
90 + if (String.IsNullOrEmpty(this.ChainPackage.CacheId))
91 + {
92 + this.ChainPackage.CacheId = String.Format("{0}v{1}", this.BundlePackage.BundleId, this.BundlePackage.Version);
93 + }
94 +
95 + if (String.IsNullOrEmpty(this.ChainPackage.DisplayName))
96 + {
97 + this.ChainPackage.DisplayName = harvestedBundlePackage.DisplayName;
98 + }
99 +
100 + this.ChainPackage.InstallSize = harvestedBundlePackage.InstallSize;
101 + }
102 +
103 + public WixBundleHarvestedBundlePackageSymbol HarvestPackage()
104 + {
105 + bool win64;
106 + string bundleId;
107 + int protocolVersion;
108 + string manifestNamespace;
109 + bool perMachine;
110 + string version;
111 + string displayName;
112 + long installSize;
113 +
114 + var sourcePath = this.PackagePayload.SourceFile.Path;
115 + var sourceLineNumbers = this.PackagePayload.SourceLineNumbers;
116
117 using (var burnReader = BurnReader.Open(this.Messaging, sourcePath))
118 {
119 if (burnReader.Invalid)
120 {
57 - return;
121 + return null;
122 }
123
124 var baFolderPath = Path.Combine(this.IntermediateFolder, burnReader.BundleId.ToString());
125
126 if (!burnReader.ExtractUXContainer(baFolderPath, baFolderPath))
127 {
64 - return;
128 + return null;
129 }
130
131 foreach (var filePath in Directory.EnumerateFiles(baFolderPath, "*.*", SearchOption.AllDirectories))
132 {
69 - this.TrackedFiles.Add(this.BackendHelper.TrackFile(filePath, TrackedFileType.Temporary, packagePayload.SourceLineNumbers));
133 + this.TrackedFiles.Add(this.BackendHelper.TrackFile(filePath, TrackedFileType.Temporary, sourceLineNumbers));
134 }
135
136 switch (burnReader.MachineType)
@@ -77,12 +141,13 @@ namespace WixToolset.Core.Burn.Bundles
141 case BurnCommon.IMAGE_FILE_MACHINE_I386:
142 case BurnCommon.IMAGE_FILE_MACHINE_LOONGARCH32:
143 case BurnCommon.IMAGE_FILE_MACHINE_M32R:
144 + win64 = false;
145 break;
146 case BurnCommon.IMAGE_FILE_MACHINE_AMD64:
147 case BurnCommon.IMAGE_FILE_MACHINE_ARM64:
148 case BurnCommon.IMAGE_FILE_MACHINE_IA64:
149 case BurnCommon.IMAGE_FILE_MACHINE_LOONGARCH64:
85 - this.Facade.PackageSymbol.Win64 = true;
150 + win64 = true;
151 break;
152 case BurnCommon.IMAGE_FILE_MACHINE_EBC:
153 case BurnCommon.IMAGE_FILE_MACHINE_MIPS16:
@@ -101,15 +166,16 @@ namespace WixToolset.Core.Burn.Bundles
166 case BurnCommon.IMAGE_FILE_MACHINE_THUMB:
167 case BurnCommon.IMAGE_FILE_MACHINE_WCEMIPSV2:
168 default:
104 - this.Messaging.Write(BurnBackendWarnings.UnknownCoffMachineType(packagePayload.SourceLineNumbers, sourcePath, burnReader.MachineType));
169 + win64 = false;
170 + this.Messaging.Write(BurnBackendWarnings.UnknownCoffMachineType(sourceLineNumbers, sourcePath, burnReader.MachineType));
171 break;
172 }
173
108 - bundlePackage.BundleId = burnReader.BundleId.ToString("B").ToUpperInvariant();
174 + bundleId = burnReader.BundleId.ToString("B").ToUpperInvariant();
175
176 // Assume that the .wixburn section version will change when the Burn protocol changes.
177 // This should be a safe assumption since we will need to add the protocol version to the section to support this harvesting.
112 - bundlePackage.SupportsBurnProtocol = burnReader.Version == 2;
178 + protocolVersion = burnReader.Version == 2 ? 1 : 0;
179
180 try
181 {
@@ -119,63 +185,59 @@ namespace WixToolset.Core.Burn.Bundles
185
186 if (document.DocumentElement.LocalName != "BurnManifest")
187 {
122 - this.Messaging.Write(BurnBackendErrors.InvalidBundleManifest(packagePayload.SourceLineNumbers, sourcePath, $"Expected root element to be 'Manifest' but was '{document.DocumentElement.LocalName}'."));
123 - return;
188 + this.Messaging.Write(BurnBackendErrors.InvalidBundleManifest(sourceLineNumbers, sourcePath, $"Expected root element to be 'BurnManifest' but was '{document.DocumentElement.LocalName}'."));
189 + return null;
190 }
191
126 - if (BurnCommon.BurnV3Namespace == document.DocumentElement.NamespaceURI && !this.Facade.PackageSymbol.Visible)
127 - {
128 - this.Messaging.Write(BurnBackendWarnings.HiddenBundleNotSupported(packagePayload.SourceLineNumbers, sourcePath));
129 -
130 - this.Facade.PackageSymbol.Visible = true;
131 - }
192 + manifestNamespace = document.DocumentElement.NamespaceURI;
193
194 namespaceManager.AddNamespace("burn", document.DocumentElement.NamespaceURI);
195 var registrationElement = document.SelectSingleNode("/burn:BurnManifest/burn:Registration", namespaceManager) as XmlElement;
196 var arpElement = document.SelectSingleNode("/burn:BurnManifest/burn:Registration/burn:Arp", namespaceManager) as XmlElement;
197
137 - var perMachine = registrationElement.GetAttribute("PerMachine") == "yes";
138 - this.Facade.PackageSymbol.PerMachine = perMachine;
139 -
140 - var version = registrationElement.GetAttribute("Version");
141 - packagePayload.Version = version;
142 - bundlePackage.Version = version;
143 - this.Facade.PackageSymbol.Version = version;
198 + perMachine = registrationElement.GetAttribute("PerMachine") == "yes";
199
145 - if (String.IsNullOrEmpty(this.Facade.PackageSymbol.CacheId))
146 - {
147 - this.Facade.PackageSymbol.CacheId = String.Format("{0}v{1}", bundlePackage.BundleId, version);
148 - }
200 + version = registrationElement.GetAttribute("Version");
201
202 var providerKey = registrationElement.GetAttribute("ProviderKey");
151 - var depId = new Identifier(AccessModifier.Section, this.BackendHelper.GenerateIdentifier("dep", bundlePackage.Id.Id, providerKey));
152 - this.Section.AddSymbol(new WixDependencyProviderSymbol(packagePayload.SourceLineNumbers, depId)
203 + var depId = new Identifier(AccessModifier.Section, this.BackendHelper.GenerateIdentifier("dep", this.PackageId, providerKey));
204 + this.Section.AddSymbol(new WixDependencyProviderSymbol(sourceLineNumbers, depId)
205 {
154 - ParentRef = bundlePackage.Id.Id,
206 + ParentRef = this.PackageId,
207 ProviderKey = providerKey,
208 Version = version,
209 Attributes = WixDependencyProviderAttributes.ProvidesAttributesImported,
210 });
211
160 - if (String.IsNullOrEmpty(this.Facade.PackageSymbol.DisplayName))
161 - {
162 - this.Facade.PackageSymbol.DisplayName = arpElement.GetAttribute("DisplayName");
163 - }
212 + displayName = arpElement.GetAttribute("DisplayName");
213
165 - this.ProcessPackages(document, namespaceManager);
214 + installSize = this.ProcessPackages(document, namespaceManager);
215
167 - this.ProcessRelatedBundles(document, namespaceManager, packagePayload, sourcePath);
216 + this.ProcessRelatedBundles(document, namespaceManager, sourcePath);
217
218 // TODO: Add payloads?
219 }
220 catch (Exception e)
221 {
173 - this.Messaging.Write(BurnBackendErrors.InvalidBundleManifest(packagePayload.SourceLineNumbers, sourcePath, e.ToString()));
222 + this.Messaging.Write(BurnBackendErrors.InvalidBundleManifest(sourceLineNumbers, sourcePath, e.ToString()));
223 + return null;
224 }
225 }
226 +
227 + return this.Section.AddSymbol(new WixBundleHarvestedBundlePackageSymbol(this.PackagePayload.SourceLineNumbers, this.ChainPackage.Id)
228 + {
229 + Win64 = win64,
230 + BundleId = bundleId,
231 + ManifestNamespace = manifestNamespace,
232 + ProtocolVersion = protocolVersion,
233 + PerMachine = perMachine,
234 + Version = version,
235 + DisplayName = displayName,
236 + InstallSize = installSize,
237 + });
238 }
239
178 - private void ProcessPackages(XmlDocument document, XmlNamespaceManager namespaceManager)
240 + private long ProcessPackages(XmlDocument document, XmlNamespaceManager namespaceManager)
241 {
242 long packageInstallSize = 0;
243
@@ -192,11 +254,13 @@ namespace WixToolset.Core.Burn.Bundles
254 }
255 }
256
195 - this.Facade.PackageSymbol.InstallSize = packageInstallSize;
257 + return packageInstallSize;
258 }
259
198 - private void ProcessRelatedBundles(XmlDocument document, XmlNamespaceManager namespaceManager, WixBundlePayloadSymbol packagePayload, string sourcePath)
260 + private void ProcessRelatedBundles(XmlDocument document, XmlNamespaceManager namespaceManager, string sourcePath)
261 {
262 + var sourceLineNumbers = this.PackagePayload.SourceLineNumbers;
263 +
264 foreach (XmlElement relatedBundleElement in document.SelectNodes("/burn:BurnManifest/burn:RelatedBundle", namespaceManager))
265 {
266 var id = relatedBundleElement.GetAttribute("Id");
@@ -204,13 +268,13 @@ namespace WixToolset.Core.Burn.Bundles
268
269 if (!Enum.TryParse(actionValue, out RelatedBundleActionType action))
270 {
207 - this.Messaging.Write(BurnBackendWarnings.UnknownBundleRelationAction(packagePayload.SourceLineNumbers, sourcePath, actionValue));
271 + this.Messaging.Write(BurnBackendWarnings.UnknownBundleRelationAction(sourceLineNumbers, sourcePath, actionValue));
272 continue;
273 }
274
211 - this.Section.AddSymbol(new WixBundlePackageRelatedBundleSymbol
275 + this.Section.AddSymbol(new WixBundlePackageRelatedBundleSymbol(sourceLineNumbers)
276 {
213 - PackageRef = this.Facade.PackageId,
277 + PackageRef = this.PackageId,
278 BundleId = id,
279 Action = action,
280 });
src/wix/WixToolset.Core.Burn/Bundles/ProcessMsiPackageCommand.cs
+216 -153
@@ -33,7 +33,10 @@ namespace WixToolset.Core.Burn.Bundles
33
34 this.PackagePayloads = packagePayloads;
35 this.Section = section;
36 - this.Facade = facade;
36 +
37 + this.ChainPackage = facade.PackageSymbol;
38 + this.MsiPackage = (WixBundleMsiPackageSymbol)facade.SpecificPackageSymbol;
39 + this.PackagePayload = packagePayloads[this.ChainPackage.PayloadRef];
40 }
41
42 private IMessaging Messaging { get; }
@@ -46,7 +49,13 @@ namespace WixToolset.Core.Burn.Bundles
49
50 private Dictionary<string, WixBundlePayloadSymbol> PackagePayloads { get; }
51
49 - private PackageFacade Facade { get; }
52 + private WixBundlePackageSymbol ChainPackage { get; }
53 +
54 + private WixBundleMsiPackageSymbol MsiPackage { get; }
55 +
56 + private string PackageId => this.ChainPackage.Id.Id;
57 +
58 + private WixBundlePayloadSymbol PackagePayload { get; }
59
60 private IntermediateSection Section { get; }
61
@@ -55,16 +64,115 @@ namespace WixToolset.Core.Burn.Bundles
64 /// </summary>
65 public void Execute()
66 {
58 - var packagePayload = this.PackagePayloads[this.Facade.PackageSymbol.PayloadRef];
67 + var harvestedMsiPackage = this.Section.Symbols.OfType<WixBundleHarvestedMsiPackageSymbol>()
68 + .Where(h => h.Id == this.ChainPackage.Id)
69 + .SingleOrDefault();
70 +
71 + if (harvestedMsiPackage == null)
72 + {
73 + harvestedMsiPackage = this.HarvestPackage();
74 +
75 + if (harvestedMsiPackage == null)
76 + {
77 + return;
78 + }
79 + }
80 +
81 + this.ChainPackage.PerMachine = harvestedMsiPackage.PerMachine;
82 + this.ChainPackage.Win64 = harvestedMsiPackage.Win64;
83 +
84 + this.MsiPackage.ProductCode = harvestedMsiPackage.ProductCode;
85 + this.MsiPackage.UpgradeCode = harvestedMsiPackage.UpgradeCode;
86 + this.MsiPackage.Manufacturer = harvestedMsiPackage.Manufacturer;
87 + this.MsiPackage.ProductLanguage = Convert.ToInt32(harvestedMsiPackage.ProductLanguage, CultureInfo.InvariantCulture);
88 + this.MsiPackage.ProductVersion = harvestedMsiPackage.ProductVersion;
89 +
90 + if (String.IsNullOrEmpty(this.ChainPackage.CacheId))
91 + {
92 + this.ChainPackage.CacheId = String.Format("{0}v{1}", this.MsiPackage.ProductCode, this.MsiPackage.ProductVersion);
93 + }
94 +
95 + if (String.IsNullOrEmpty(this.ChainPackage.DisplayName))
96 + {
97 + this.ChainPackage.DisplayName = harvestedMsiPackage.ProductName;
98 + }
99 +
100 + if (String.IsNullOrEmpty(this.ChainPackage.Description))
101 + {
102 + this.ChainPackage.Description = harvestedMsiPackage.ArpComments;
103 + }
104 +
105 + if (String.IsNullOrEmpty(this.ChainPackage.Version))
106 + {
107 + this.ChainPackage.Version = this.MsiPackage.ProductVersion;
108 + }
109 +
110 + if (!this.BackendHelper.IsValidFourPartVersion(this.MsiPackage.ProductVersion))
111 + {
112 + // not a proper .NET version (e.g., five fields); can we get a valid four-part version number?
113 + string version = null;
114 + var versionParts = this.MsiPackage.ProductVersion.Split('.');
115 + var count = versionParts.Length;
116 + if (0 < count)
117 + {
118 + version = versionParts[0];
119 + for (var i = 1; i < 4 && i < count; ++i)
120 + {
121 + version = String.Concat(version, ".", versionParts[i]);
122 + }
123 + }
124 +
125 + if (!String.IsNullOrEmpty(version) && this.BackendHelper.IsValidFourPartVersion(version))
126 + {
127 + this.Messaging.Write(WarningMessages.VersionTruncated(this.PackagePayload.SourceLineNumbers, this.MsiPackage.ProductVersion, this.PackageId, version));
128 + this.MsiPackage.ProductVersion = version;
129 + }
130 + else
131 + {
132 + this.Messaging.Write(ErrorMessages.InvalidProductVersion(this.PackagePayload.SourceLineNumbers, this.MsiPackage.ProductVersion, this.PackageId));
133 + }
134 + }
135 +
136 + this.SetPerMachineAppropriately(harvestedMsiPackage.AllUsers);
137 +
138 + var msiPropertyNames = this.GetMsiPropertyNames();
139 +
140 + // Ensure the MSI package is appropriately marked visible or not.
141 + this.SetPackageVisibility(harvestedMsiPackage.ArpSystemComponent, msiPropertyNames);
142 +
143 + // Unless the MSI or setup code overrides the default, set MSIFASTINSTALL for best performance.
144 + if (String.IsNullOrEmpty(harvestedMsiPackage.MsiFastInstall) && !msiPropertyNames.Contains("MSIFASTINSTALL"))
145 + {
146 + this.AddMsiProperty("MSIFASTINSTALL", "7");
147 + }
148 +
149 + this.ChainPackage.InstallSize = harvestedMsiPackage.InstallSize;
150 + }
151
60 - var msiPackage = (WixBundleMsiPackageSymbol)this.Facade.SpecificPackageSymbol;
152 + public WixBundleHarvestedMsiPackageSymbol HarvestPackage()
153 + {
154 + bool perMachine;
155 + bool win64;
156 + string productName;
157 + string arpComments;
158 + string allUsers;
159 + string msiFastInstall;
160 + string arpSystemComponent;
161 + string productCode;
162 + string upgradeCode;
163 + string manufacturer;
164 + string productLanguage;
165 + string productVersion;
166 + long installSize;
167 +
168 + var sourcePath = this.PackagePayload.SourceFile.Path;
169
62 - var sourcePath = packagePayload.SourceFile.Path;
63 - var longNamesInImage = false;
64 - var compressed = false;
170 try
171 {
67 - this.CheckIfWindowsInstallerFileTooLarge(packagePayload.SourceLineNumbers, sourcePath, "MSI");
172 + var longNamesInImage = false;
173 + var compressed = false;
174 +
175 + this.CheckIfWindowsInstallerFileTooLarge(this.PackagePayload.SourceLineNumbers, sourcePath, "MSI");
176
177 using (var db = new Database(sourcePath, OpenDatabase.ReadOnly))
178 {
@@ -87,117 +195,68 @@ namespace WixToolset.Core.Burn.Bundles
195 // 8 is the Word Count summary information stream bit that means
196 // "Elevated privileges are not required to install this package."
197 // in MSI 4.5 and below, if this bit is 0, elevation is required.
90 - var perMachine = (0 == (fileAndElevateFlags & 8));
91 -
92 - this.Facade.PackageSymbol.PerMachine = perMachine;
93 - this.Facade.PackageSymbol.Win64 = this.IsWin64(packagePayload.SourceLineNumbers, sourcePath, platformsAndLanguages);
198 + perMachine = (0 == (fileAndElevateFlags & 8));
199 + win64 = this.IsWin64(sourcePath, platformsAndLanguages);
200 }
201
96 - string packageName = null;
97 - string packageDescription = null;
98 - string allusers = null;
99 - string fastInstall = null;
100 - string systemComponent = null;
101 -
202 using (var view = db.OpenView(PropertySqlQuery))
203 {
104 - packageName = ProcessMsiPackageCommand.GetProperty(view, "ProductName");
105 - packageDescription = ProcessMsiPackageCommand.GetProperty(view, "ARPCOMMENTS");
106 - allusers = ProcessMsiPackageCommand.GetProperty(view, "ALLUSERS");
107 - fastInstall = ProcessMsiPackageCommand.GetProperty(view, "MSIFASTINSTALL");
108 - systemComponent = ProcessMsiPackageCommand.GetProperty(view, "ARPSYSTEMCOMPONENT");
109 -
110 - msiPackage.ProductCode = ProcessMsiPackageCommand.GetProperty(view, "ProductCode");
111 - msiPackage.UpgradeCode = ProcessMsiPackageCommand.GetProperty(view, "UpgradeCode");
112 - msiPackage.Manufacturer = ProcessMsiPackageCommand.GetProperty(view, "Manufacturer");
113 - msiPackage.ProductLanguage = Convert.ToInt32(ProcessMsiPackageCommand.GetProperty(view, "ProductLanguage"), CultureInfo.InvariantCulture);
114 - msiPackage.ProductVersion = ProcessMsiPackageCommand.GetProperty(view, "ProductVersion");
115 - }
116 -
117 - if (!this.BackendHelper.IsValidFourPartVersion(msiPackage.ProductVersion))
118 - {
119 - // not a proper .NET version (e.g., five fields); can we get a valid four-part version number?
120 - string version = null;
121 - var versionParts = msiPackage.ProductVersion.Split('.');
122 - var count = versionParts.Length;
123 - if (0 < count)
124 - {
125 - version = versionParts[0];
126 - for (var i = 1; i < 4 && i < count; ++i)
127 - {
128 - version = String.Concat(version, ".", versionParts[i]);
129 - }
130 - }
131 -
132 - if (!String.IsNullOrEmpty(version) && this.BackendHelper.IsValidFourPartVersion(version))
133 - {
134 - this.Messaging.Write(WarningMessages.VersionTruncated(this.Facade.PackageSymbol.SourceLineNumbers, msiPackage.ProductVersion, sourcePath, version));
135 - msiPackage.ProductVersion = version;
136 - }
137 - else
138 - {
139 - this.Messaging.Write(ErrorMessages.InvalidProductVersion(this.Facade.PackageSymbol.SourceLineNumbers, msiPackage.ProductVersion, sourcePath));
140 - }
141 - }
142 -
143 - if (String.IsNullOrEmpty(this.Facade.PackageSymbol.CacheId))
144 - {
145 - this.Facade.PackageSymbol.CacheId = String.Format("{0}v{1}", msiPackage.ProductCode, msiPackage.ProductVersion);
146 - }
147 -
148 - if (String.IsNullOrEmpty(this.Facade.PackageSymbol.DisplayName))
149 - {
150 - this.Facade.PackageSymbol.DisplayName = packageName;
151 - }
152 -
153 - if (String.IsNullOrEmpty(this.Facade.PackageSymbol.Description))
154 - {
155 - this.Facade.PackageSymbol.Description = packageDescription;
156 - }
157 -
158 - if (String.IsNullOrEmpty(this.Facade.PackageSymbol.Version))
159 - {
160 - this.Facade.PackageSymbol.Version = msiPackage.ProductVersion;
204 + productName = ProcessMsiPackageCommand.GetProperty(view, "ProductName");
205 + arpComments = ProcessMsiPackageCommand.GetProperty(view, "ARPCOMMENTS");
206 + allUsers = ProcessMsiPackageCommand.GetProperty(view, "ALLUSERS");
207 + msiFastInstall = ProcessMsiPackageCommand.GetProperty(view, "MSIFASTINSTALL");
208 + arpSystemComponent = ProcessMsiPackageCommand.GetProperty(view, "ARPSYSTEMCOMPONENT");
209 +
210 + productCode = ProcessMsiPackageCommand.GetProperty(view, "ProductCode");
211 + upgradeCode = ProcessMsiPackageCommand.GetProperty(view, "UpgradeCode");
212 + manufacturer = ProcessMsiPackageCommand.GetProperty(view, "Manufacturer");
213 + productLanguage = ProcessMsiPackageCommand.GetProperty(view, "ProductLanguage");
214 + productVersion = ProcessMsiPackageCommand.GetProperty(view, "ProductVersion");
215 }
216
217 var payloadNames = this.GetPayloadTargetNames();
218
165 - var msiPropertyNames = this.GetMsiPropertyNames(packagePayload.Id.Id);
166 -
167 - this.SetPerMachineAppropriately(allusers, msiPackage, sourcePath);
168 -
169 - // Ensure the MSI package is appropriately marked visible or not.
170 - this.SetPackageVisibility(systemComponent, msiPackage, msiPropertyNames);
171 -
172 - // Unless the MSI or setup code overrides the default, set MSIFASTINSTALL for best performance.
173 - if (String.IsNullOrEmpty(fastInstall) && !msiPropertyNames.Contains("MSIFASTINSTALL"))
174 - {
175 - this.AddMsiProperty(msiPackage, "MSIFASTINSTALL", "7");
176 - }
177 -
219 this.CreateRelatedPackages(db);
220
221 // If feature selection is enabled, represent the Feature table in the manifest.
181 - if (msiPackage.EnableFeatureSelection)
222 + if (this.MsiPackage.EnableFeatureSelection)
223 {
224 this.CreateMsiFeatures(db);
225 }
226
227 // Add all external cabinets as package payloads.
187 - this.ImportExternalCabinetAsPayloads(db, packagePayload, payloadNames);
228 + this.ImportExternalCabinetAsPayloads(db, payloadNames);
229
230 // Add all external files as package payloads and calculate the total install size as the rollup of
231 // File table's sizes.
191 - this.Facade.PackageSymbol.InstallSize = this.ImportExternalFileAsPayloadsAndReturnInstallSize(db, packagePayload, longNamesInImage, compressed, payloadNames);
232 + installSize = this.ImportExternalFileAsPayloadsAndReturnInstallSize(db, longNamesInImage, compressed, payloadNames);
233
234 // Add all dependency providers from the MSI.
194 - this.ImportDependencyProviders(db, msiPackage);
235 + this.ImportDependencyProviders(db);
236 }
237 }
238 catch (MsiException e)
239 {
199 - this.Messaging.Write(ErrorMessages.UnableToReadPackageInformation(this.Facade.PackageSymbol.SourceLineNumbers, sourcePath, e.Message));
240 + this.Messaging.Write(ErrorMessages.UnableToReadPackageInformation(this.PackagePayload.SourceLineNumbers, sourcePath, e.Message));
241 + return null;
242 }
243 +
244 + return this.Section.AddSymbol(new WixBundleHarvestedMsiPackageSymbol(this.PackagePayload.SourceLineNumbers, this.ChainPackage.Id)
245 + {
246 + PerMachine = perMachine,
247 + Win64 = win64,
248 + ProductName = productName,
249 + ArpComments = arpComments,
250 + AllUsers = allUsers,
251 + MsiFastInstall = msiFastInstall,
252 + ArpSystemComponent = arpSystemComponent,
253 + ProductCode = productCode,
254 + UpgradeCode = upgradeCode,
255 + Manufacturer = manufacturer,
256 + ProductLanguage = productLanguage,
257 + ProductVersion = productVersion,
258 + InstallSize = installSize,
259 + });
260 }
261
262 private ISet<string> GetPayloadTargetNames()
@@ -207,17 +266,17 @@ namespace WixToolset.Core.Burn.Bundles
266 return new HashSet<string>(payloadNames, StringComparer.OrdinalIgnoreCase);
267 }
268
210 - private ISet<string> GetMsiPropertyNames(string packageId)
269 + private ISet<string> GetMsiPropertyNames()
270 {
271 var properties = this.Section.Symbols.OfType<WixBundleMsiPropertySymbol>()
213 - .Where(p => p.PackageRef == packageId)
272 + .Where(p => p.PackageRef == this.PackageId)
273 .Select(p => p.Name);
274
275 return new HashSet<string>(properties, StringComparer.Ordinal);
276 }
277
278 // https://docs.microsoft.com/en-us/windows/win32/msi/template-summary
220 - private bool IsWin64(SourceLineNumber sourceLineNumbers, string sourcePath, string platformsAndLanguages)
279 + private bool IsWin64(string sourcePath, string platformsAndLanguages)
280 {
281 var separatorIndex = platformsAndLanguages.IndexOf(';');
282 var platformValue = separatorIndex > 0 ? platformsAndLanguages.Substring(0, separatorIndex) : platformsAndLanguages;
@@ -234,27 +293,27 @@ namespace WixToolset.Core.Burn.Bundles
293 return false;
294
295 default:
237 - this.Messaging.Write(BurnBackendWarnings.UnknownMsiPackagePlatform(sourceLineNumbers, sourcePath, platformValue));
296 + this.Messaging.Write(BurnBackendWarnings.UnknownMsiPackagePlatform(this.PackagePayload.SourceLineNumbers, sourcePath, platformValue));
297 return true;
298 }
299 }
300
242 - private void SetPerMachineAppropriately(string allusers, WixBundleMsiPackageSymbol msiPackage, string sourcePath)
301 + private void SetPerMachineAppropriately(string allusers)
302 {
244 - Debug.Assert(this.Facade.PackageSymbol.PerMachine.HasValue);
245 - var perMachine = this.Facade.PackageSymbol.PerMachine.Value;
303 + Debug.Assert(this.ChainPackage.PerMachine.HasValue);
304 + var perMachine = this.ChainPackage.PerMachine.Value;
305
306 // Can ignore ALLUSERS from MsiProperties because it is not allowed there.
248 - if (msiPackage.ForcePerMachine)
307 + if (this.MsiPackage.ForcePerMachine)
308 {
309 if (!perMachine)
310 {
252 - this.Messaging.Write(WarningMessages.PerUserButForcingPerMachine(this.Facade.PackageSymbol.SourceLineNumbers, sourcePath));
253 - this.Facade.PackageSymbol.PerMachine = true; // ensure that we think the package is per-machine.
311 + this.Messaging.Write(WarningMessages.PerUserButForcingPerMachine(this.PackagePayload.SourceLineNumbers, this.PackageId));
312 + this.ChainPackage.PerMachine = true; // ensure that we think the package is per-machine.
313 }
314
315 // Force ALLUSERS=1 via the MSI command-line.
257 - this.AddMsiProperty(msiPackage, "ALLUSERS", "1");
316 + this.AddMsiProperty("ALLUSERS", "1");
317 }
318 else
319 {
@@ -263,40 +322,40 @@ namespace WixToolset.Core.Burn.Bundles
322 // Not forced per-machine and no ALLUSERS property, flip back to per-user.
323 if (perMachine)
324 {
266 - this.Messaging.Write(WarningMessages.ImplicitlyPerUser(this.Facade.PackageSymbol.SourceLineNumbers, sourcePath));
267 - this.Facade.PackageSymbol.PerMachine = false;
325 + this.Messaging.Write(WarningMessages.ImplicitlyPerUser(this.ChainPackage.SourceLineNumbers, this.PackageId));
326 + this.ChainPackage.PerMachine = false;
327 }
328 }
329 else if (allusers.Equals("1", StringComparison.Ordinal))
330 {
331 if (!perMachine)
332 {
274 - this.Messaging.Write(ErrorMessages.PerUserButAllUsersEquals1(this.Facade.PackageSymbol.SourceLineNumbers, sourcePath));
333 + this.Messaging.Write(ErrorMessages.PerUserButAllUsersEquals1(this.ChainPackage.SourceLineNumbers, this.PackageId));
334 }
335 }
336 else if (allusers.Equals("2", StringComparison.Ordinal))
337 {
279 - this.Messaging.Write(WarningMessages.DiscouragedAllUsersValue(this.Facade.PackageSymbol.SourceLineNumbers, sourcePath, perMachine ? "machine" : "user"));
338 + this.Messaging.Write(WarningMessages.DiscouragedAllUsersValue(this.ChainPackage.SourceLineNumbers, this.PackageId, perMachine ? "machine" : "user"));
339 }
340 else
341 {
283 - this.Messaging.Write(ErrorMessages.UnsupportedAllUsersValue(this.Facade.PackageSymbol.SourceLineNumbers, sourcePath, allusers));
342 + this.Messaging.Write(ErrorMessages.UnsupportedAllUsersValue(this.ChainPackage.SourceLineNumbers, this.PackageId, allusers));
343 }
344 }
345 }
346
288 - private void SetPackageVisibility(string systemComponent, WixBundleMsiPackageSymbol msiPackage, ISet<string> msiPropertyNames)
347 + private void SetPackageVisibility(string systemComponent, ISet<string> msiPropertyNames)
348 {
349 // If the authoring specifically added "ARPSYSTEMCOMPONENT", don't do it again.
350 if (!msiPropertyNames.Contains("ARPSYSTEMCOMPONENT"))
351 {
352 var alreadyVisible = String.IsNullOrEmpty(systemComponent);
294 - var visible = this.Facade.PackageSymbol.Visible;
353 + var visible = this.ChainPackage.Visible;
354
355 // If not already set to the correct visibility.
356 if (alreadyVisible != visible)
357 {
299 - this.AddMsiProperty(msiPackage, "ARPSYSTEMCOMPONENT", visible ? String.Empty : "1");
358 + this.AddMsiProperty("ARPSYSTEMCOMPONENT", visible ? String.Empty : "1");
359 }
360 }
361 }
@@ -318,9 +377,9 @@ namespace WixToolset.Core.Burn.Bundles
377 attributes |= (recordAttributes & WindowsInstallerConstants.MsidbUpgradeAttributesVersionMaxInclusive) == WindowsInstallerConstants.MsidbUpgradeAttributesVersionMaxInclusive ? WixBundleRelatedPackageAttributes.MaxInclusive : 0;
378 attributes |= (recordAttributes & WindowsInstallerConstants.MsidbUpgradeAttributesLanguagesExclusive) == WindowsInstallerConstants.MsidbUpgradeAttributesLanguagesExclusive ? 0 : WixBundleRelatedPackageAttributes.LangInclusive;
379
321 - this.Section.AddSymbol(new WixBundleRelatedPackageSymbol(this.Facade.PackageSymbol.SourceLineNumbers)
380 + this.Section.AddSymbol(new WixBundleRelatedPackageSymbol(this.PackagePayload.SourceLineNumbers)
381 {
323 - PackageRef = this.Facade.PackageId,
382 + PackageRef = this.PackageId,
383 RelatedId = record.GetString(1),
384 MinVersion = record.GetString(2),
385 MaxVersion = record.GetString(3),
@@ -366,9 +425,9 @@ namespace WixToolset.Core.Burn.Bundles
425 }
426 }
427
369 - this.Section.AddSymbol(new WixBundleMsiFeatureSymbol(this.Facade.PackageSymbol.SourceLineNumbers, new Identifier(AccessModifier.Section, this.Facade.PackageId, featureName))
428 + this.Section.AddSymbol(new WixBundleMsiFeatureSymbol(this.PackagePayload.SourceLineNumbers, new Identifier(AccessModifier.Section, this.PackageId, featureName))
429 {
371 - PackageRef = this.Facade.PackageId,
430 + PackageRef = this.PackageId,
431 Name = featureName,
432 Parent = allFeaturesResultRecord.GetString(2),
433 Title = allFeaturesResultRecord.GetString(3),
@@ -385,12 +444,14 @@ namespace WixToolset.Core.Burn.Bundles
444 }
445 }
446
388 - private void ImportExternalCabinetAsPayloads(Database db, WixBundlePayloadSymbol packagePayload, ISet<string> payloadNames)
447 + private void ImportExternalCabinetAsPayloads(Database db, ISet<string> payloadNames)
448 {
449 if (db.TableExists("Media"))
450 {
451 using (var view = db.OpenExecuteView("SELECT `Cabinet` FROM `Media`"))
452 {
453 + var sourceLineNumbers = this.PackagePayload.SourceLineNumbers;
454 +
455 foreach (var cabinetRecord in view.Records)
456 {
457 var cabinet = cabinetRecord.GetString(1);
@@ -400,34 +461,34 @@ namespace WixToolset.Core.Burn.Bundles
461 // If we didn't find the Payload as an existing child of the package, we need to
462 // add it. We expect the file to exist on-disk in the same relative location as
463 // the MSI expects to find it...
403 - var cabinetName = Path.Combine(Path.GetDirectoryName(packagePayload.Name), cabinet);
464 + var cabinetName = Path.Combine(Path.GetDirectoryName(this.PackagePayload.Name), cabinet);
465
466 if (!payloadNames.Contains(cabinetName))
467 {
407 - var generatedId = this.BackendHelper.GenerateIdentifier("cab", packagePayload.Id.Id, cabinet);
408 - var payloadSourceFile = this.ResolveRelatedFile(packagePayload.SourceFile.Path, packagePayload.UnresolvedSourceFile, cabinet, "Cabinet", this.Facade.PackageSymbol.SourceLineNumbers);
468 + var generatedId = this.BackendHelper.GenerateIdentifier("cab", this.PackagePayload.Id.Id, cabinet);
469 + var payloadSourceFile = this.ResolveRelatedFile(this.PackagePayload.SourceFile.Path, this.PackagePayload.UnresolvedSourceFile, cabinet, "Cabinet", sourceLineNumbers);
470
410 - this.Section.AddSymbol(new WixGroupSymbol(this.Facade.PackageSymbol.SourceLineNumbers)
471 + this.Section.AddSymbol(new WixGroupSymbol(sourceLineNumbers)
472 {
473 ParentType = ComplexReferenceParentType.Package,
413 - ParentId = this.Facade.PackageId,
474 + ParentId = this.PackageId,
475 ChildType = ComplexReferenceChildType.Payload,
476 ChildId = generatedId
477 });
478
418 - this.Section.AddSymbol(new WixBundlePayloadSymbol(this.Facade.PackageSymbol.SourceLineNumbers, new Identifier(AccessModifier.Section, generatedId))
479 + this.Section.AddSymbol(new WixBundlePayloadSymbol(sourceLineNumbers, new Identifier(AccessModifier.Section, generatedId))
480 {
481 Name = cabinetName,
482 SourceFile = new IntermediateFieldPathValue { Path = payloadSourceFile },
422 - Compressed = packagePayload.Compressed,
483 + Compressed = this.PackagePayload.Compressed,
484 UnresolvedSourceFile = cabinetName,
424 - ContainerRef = packagePayload.ContainerRef,
425 - DownloadUrl = packagePayload.DownloadUrl,
426 - Packaging = packagePayload.Packaging,
427 - ParentPackagePayloadRef = packagePayload.Id.Id,
485 + ContainerRef = this.PackagePayload.ContainerRef,
486 + DownloadUrl = this.PackagePayload.DownloadUrl,
487 + Packaging = this.PackagePayload.Packaging,
488 + ParentPackagePayloadRef = this.PackagePayload.Id.Id,
489 });
490
430 - this.CheckIfWindowsInstallerFileTooLarge(this.Facade.PackageSymbol.SourceLineNumbers, payloadSourceFile, "cabinet");
491 + this.CheckIfWindowsInstallerFileTooLarge(sourceLineNumbers, payloadSourceFile, "cabinet");
492 }
493 }
494 }
@@ -435,7 +496,7 @@ namespace WixToolset.Core.Burn.Bundles
496 }
497 }
498
438 - private long ImportExternalFileAsPayloadsAndReturnInstallSize(Database db, WixBundlePayloadSymbol packagePayload, bool longNamesInImage, bool compressed, ISet<string> payloadNames)
499 + private long ImportExternalFileAsPayloadsAndReturnInstallSize(Database db, bool longNamesInImage, bool compressed, ISet<string> payloadNames)
500 {
501 long size = 0;
502
@@ -461,6 +522,8 @@ namespace WixToolset.Core.Burn.Bundles
522 // install size of the package.
523 using (var view = db.OpenExecuteView("SELECT `Directory_`, `File`, `FileName`, `File`.`Attributes`, `FileSize` FROM `Component`, `File` WHERE `Component`.`Component`=`File`.`Component_`"))
524 {
525 + var sourceLineNumbers = this.PackagePayload.SourceLineNumbers;
526 +
527 foreach (var record in view.Records)
528 {
529 // If the file is explicitly uncompressed or the MSI is uncompressed and the file is not
@@ -470,31 +533,31 @@ namespace WixToolset.Core.Burn.Bundles
533 (!compressed && 0 == (compressionBit & WindowsInstallerConstants.MsidbFileAttributesCompressed)))
534 {
535 var fileSourcePath = this.PathResolver.GetFileSourcePath(directories, record.GetString(1), record.GetString(3), compressed, longNamesInImage);
473 - var name = Path.Combine(Path.GetDirectoryName(packagePayload.Name), fileSourcePath);
536 + var name = Path.Combine(Path.GetDirectoryName(this.PackagePayload.Name), fileSourcePath);
537
538 if (!payloadNames.Contains(name))
539 {
477 - var generatedId = this.BackendHelper.GenerateIdentifier("f", packagePayload.Id.Id, record.GetString(2));
478 - var payloadSourceFile = this.ResolveRelatedFile(packagePayload.SourceFile.Path, packagePayload.UnresolvedSourceFile, fileSourcePath, "File", this.Facade.PackageSymbol.SourceLineNumbers);
540 + var generatedId = this.BackendHelper.GenerateIdentifier("f", this.PackagePayload.Id.Id, record.GetString(2));
541 + var payloadSourceFile = this.ResolveRelatedFile(this.PackagePayload.SourceFile.Path, this.PackagePayload.UnresolvedSourceFile, fileSourcePath, "File", sourceLineNumbers);
542
480 - this.Section.AddSymbol(new WixGroupSymbol(this.Facade.PackageSymbol.SourceLineNumbers)
543 + this.Section.AddSymbol(new WixGroupSymbol(sourceLineNumbers)
544 {
545 ParentType = ComplexReferenceParentType.Package,
483 - ParentId = this.Facade.PackageId,
546 + ParentId = this.PackageId,
547 ChildType = ComplexReferenceChildType.Payload,
548 ChildId = generatedId
549 });
550
488 - this.Section.AddSymbol(new WixBundlePayloadSymbol(this.Facade.PackageSymbol.SourceLineNumbers, new Identifier(AccessModifier.Section, generatedId))
551 + this.Section.AddSymbol(new WixBundlePayloadSymbol(sourceLineNumbers, new Identifier(AccessModifier.Section, generatedId))
552 {
553 Name = name,
554 SourceFile = new IntermediateFieldPathValue { Path = payloadSourceFile },
492 - Compressed = packagePayload.Compressed,
555 + Compressed = this.PackagePayload.Compressed,
556 UnresolvedSourceFile = name,
494 - ContainerRef = packagePayload.ContainerRef,
495 - DownloadUrl = packagePayload.DownloadUrl,
496 - Packaging = packagePayload.Packaging,
497 - ParentPackagePayloadRef = packagePayload.Id.Id,
557 + ContainerRef = this.PackagePayload.ContainerRef,
558 + DownloadUrl = this.PackagePayload.DownloadUrl,
559 + Packaging = this.PackagePayload.Packaging,
560 + ParentPackagePayloadRef = this.PackagePayload.Id.Id,
561 });
562 }
563 }
@@ -507,23 +570,23 @@ namespace WixToolset.Core.Burn.Bundles
570 return size;
571 }
572
510 - private void AddMsiProperty(WixBundleMsiPackageSymbol msiPackage, string name, string value)
573 + private void AddMsiProperty(string name, string value)
574 {
512 - this.Section.AddSymbol(new WixBundleMsiPropertySymbol(msiPackage.SourceLineNumbers, new Identifier(AccessModifier.Section, msiPackage.Id.Id, name))
575 + this.Section.AddSymbol(new WixBundleMsiPropertySymbol(this.PackagePayload.SourceLineNumbers, new Identifier(AccessModifier.Section, this.PackageId, name))
576 {
514 - PackageRef = msiPackage.Id.Id,
577 + PackageRef = this.PackageId,
578 Name = name,
579 Value = value,
580 });
581 }
582
520 - private void ImportDependencyProviders(Database db, WixBundleMsiPackageSymbol msiPackage)
583 + private void ImportDependencyProviders(Database db)
584 {
522 - this.ImportDependencyProvidersFromTable(db, msiPackage, "WixDependencyProvider");
523 - this.ImportDependencyProvidersFromTable(db, msiPackage, "Wix4DependencyProvider");
585 + this.ImportDependencyProvidersFromTable(db, "WixDependencyProvider");
586 + this.ImportDependencyProvidersFromTable(db, "Wix4DependencyProvider");
587 }
588
526 - private void ImportDependencyProvidersFromTable(Database db, WixBundleMsiPackageSymbol msiPackage, string tableName)
589 + private void ImportDependencyProvidersFromTable(Database db, string tableName)
590 {
591 if (db.TableExists(tableName))
592 {
@@ -531,15 +594,15 @@ namespace WixToolset.Core.Burn.Bundles
594 {
595 foreach (var record in view.Records)
596 {
534 - var id = new Identifier(AccessModifier.Section, this.BackendHelper.GenerateIdentifier("dep", msiPackage.Id.Id, record.GetString(1)));
597 + var id = new Identifier(AccessModifier.Section, this.BackendHelper.GenerateIdentifier("dep", this.PackageId, record.GetString(1)));
598
599 // Import the provider key and attributes.
537 - this.Section.AddSymbol(new WixDependencyProviderSymbol(msiPackage.SourceLineNumbers, id)
600 + this.Section.AddSymbol(new WixDependencyProviderSymbol(this.PackagePayload.SourceLineNumbers, id)
601 {
539 - ParentRef = msiPackage.Id.Id,
602 + ParentRef = this.PackageId,
603 ProviderKey = record.GetString(2),
541 - Version = record.GetString(3) ?? msiPackage.ProductVersion,
542 - DisplayName = record.GetString(4) ?? this.Facade.PackageSymbol.DisplayName,
604 + Version = record.GetString(3) ?? this.MsiPackage.ProductVersion,
605 + DisplayName = record.GetString(4) ?? this.ChainPackage.DisplayName,
606 Attributes = WixDependencyProviderAttributes.ProvidesAttributesImported | (WixDependencyProviderAttributes)record.GetInteger(5),
607 });
608 }
src/wix/WixToolset.Core.Burn/Bundles/ProcessMspPackageCommand.cs
+75 -33
@@ -5,6 +5,7 @@ namespace WixToolset.Core.Burn.Bundles
5 using System;
6 using System.Collections.Generic;
7 using System.IO;
8 + using System.Linq;
9 using System.Text;
10 using System.Xml;
11 using WixToolset.Core.Native.Msi;
@@ -29,30 +30,71 @@ namespace WixToolset.Core.Burn.Bundles
30 public ProcessMspPackageCommand(IMessaging messaging, IntermediateSection section, PackageFacade facade, Dictionary<string, WixBundlePayloadSymbol> payloadSymbols)
31 {
32 this.Messaging = messaging;
32 -
33 - this.AuthoredPayloads = payloadSymbols;
33 this.Section = section;
35 - this.Facade = facade;
34 +
35 + this.ChainPackage = facade.PackageSymbol;
36 + this.MspPackage = (WixBundleMspPackageSymbol)facade.SpecificPackageSymbol;
37 + this.PackagePayload = payloadSymbols[this.ChainPackage.PayloadRef];
38 }
39
38 - public IMessaging Messaging { get; }
40 + private IMessaging Messaging { get; }
41
40 - public Dictionary<string, WixBundlePayloadSymbol> AuthoredPayloads { private get; set; }
42 + private WixBundlePackageSymbol ChainPackage { get; }
43
42 - public PackageFacade Facade { private get; set; }
44 + private WixBundleMspPackageSymbol MspPackage { get; }
45
44 - public IntermediateSection Section { get; }
46 + private WixBundlePayloadSymbol PackagePayload { get; }
47 +
48 + private IntermediateSection Section { get; }
49
50 /// <summary>
51 /// Processes the Msp packages to add properties and payloads from the Msp packages.
52 /// </summary>
53 public void Execute()
54 {
51 - var packagePayload = this.AuthoredPayloads[this.Facade.PackageSymbol.PayloadRef];
55 + var harvestedMspPackage = this.Section.Symbols.OfType<WixBundleHarvestedMspPackageSymbol>()
56 + .Where(h => h.Id == this.ChainPackage.Id)
57 + .SingleOrDefault();
58 +
59 + if (harvestedMspPackage == null)
60 + {
61 + harvestedMspPackage = this.HarvestPackage();
62 +
63 + if (harvestedMspPackage == null)
64 + {
65 + return;
66 + }
67 + }
68 +
69 + this.MspPackage.PatchCode = harvestedMspPackage.PatchCode;
70 + this.MspPackage.Manufacturer = harvestedMspPackage.ManufacturerName;
71 + this.MspPackage.PatchXml = harvestedMspPackage.PatchXml;
72 +
73 + if (String.IsNullOrEmpty(this.ChainPackage.DisplayName))
74 + {
75 + this.ChainPackage.DisplayName = harvestedMspPackage.DisplayName;
76 + }
77
53 - var mspPackage = (WixBundleMspPackageSymbol)this.Facade.SpecificPackageSymbol;
78 + if (String.IsNullOrEmpty(this.ChainPackage.Description))
79 + {
80 + this.ChainPackage.Description = harvestedMspPackage.Description;
81 + }
82
55 - var sourcePath = packagePayload.SourceFile.Path;
83 + if (String.IsNullOrEmpty(this.ChainPackage.CacheId))
84 + {
85 + this.ChainPackage.CacheId = this.MspPackage.PatchCode;
86 + }
87 + }
88 +
89 + private WixBundleHarvestedMspPackageSymbol HarvestPackage()
90 + {
91 + string patchCode;
92 + string displayName;
93 + string description;
94 + string manufacturerName;
95 + string patchXml;
96 +
97 + var sourcePath = this.PackagePayload.SourceFile.Path;
98
99 try
100 {
@@ -61,41 +103,37 @@ namespace WixToolset.Core.Burn.Bundles
103 // Read data out of the msp database...
104 using (var sumInfo = new SummaryInformation(db))
105 {
64 - var patchCode = sumInfo.GetProperty(SummaryInformation.Patch.PatchCode);
65 - mspPackage.PatchCode = patchCode.Substring(0, 38);
106 + var patchCodeValue = sumInfo.GetProperty(SummaryInformation.Patch.PatchCode);
107 + patchCode = patchCodeValue.Substring(0, 38);
108 }
109
110 using (var view = db.OpenView(PatchMetadataQuery))
111 {
70 - if (String.IsNullOrEmpty(this.Facade.PackageSymbol.DisplayName))
71 - {
72 - this.Facade.PackageSymbol.DisplayName = ProcessMspPackageCommand.GetPatchMetadataProperty(view, "DisplayName");
73 - }
74 -
75 - if (String.IsNullOrEmpty(this.Facade.PackageSymbol.Description))
76 - {
77 - this.Facade.PackageSymbol.Description = ProcessMspPackageCommand.GetPatchMetadataProperty(view, "Description");
78 - }
79 -
80 - mspPackage.Manufacturer = ProcessMspPackageCommand.GetPatchMetadataProperty(view, "ManufacturerName");
112 + displayName = ProcessMspPackageCommand.GetPatchMetadataProperty(view, "DisplayName");
113 + description = ProcessMspPackageCommand.GetPatchMetadataProperty(view, "Description");
114 + manufacturerName = ProcessMspPackageCommand.GetPatchMetadataProperty(view, "ManufacturerName");
115 }
116 }
117
84 - this.ProcessPatchXml(packagePayload, mspPackage, sourcePath);
118 + patchXml = ProcessMspPackageCommand.ProcessPatchXml(sourcePath, this.Section, this.PackagePayload.SourceLineNumbers, this.PackagePayload.Id);
119 }
120 catch (MsiException e)
121 {
88 - this.Messaging.Write(ErrorMessages.UnableToReadPackageInformation(packagePayload.SourceLineNumbers, sourcePath, e.Message));
89 - return;
122 + this.Messaging.Write(ErrorMessages.UnableToReadPackageInformation(this.PackagePayload.SourceLineNumbers, sourcePath, e.Message));
123 + return null;
124 }
125
92 - if (String.IsNullOrEmpty(this.Facade.PackageSymbol.CacheId))
126 + return this.Section.AddSymbol(new WixBundleHarvestedMspPackageSymbol(this.PackagePayload.SourceLineNumbers, this.ChainPackage.Id)
127 {
94 - this.Facade.PackageSymbol.CacheId = mspPackage.PatchCode;
95 - }
128 + PatchCode = patchCode,
129 + DisplayName = displayName,
130 + Description = description,
131 + ManufacturerName = manufacturerName,
132 + PatchXml = patchXml,
133 + });
134 }
135
98 - private void ProcessPatchXml(WixBundlePayloadSymbol packagePayload, WixBundleMspPackageSymbol mspPackage, string sourcePath)
136 + private static string ProcessPatchXml(string sourcePath, IntermediateSection section, SourceLineNumber sourceLineNumbers, Identifier id)
137 {
138 var uniqueTargetCodes = new Dictionary<string, WixBundlePatchTargetCodeSymbol>();
139
@@ -135,9 +173,9 @@ namespace WixToolset.Core.Burn.Bundles
173
174 if (!uniqueTargetCodes.TryGetValue(targetCode, out var existing))
175 {
138 - var symbol = this.Section.AddSymbol(new WixBundlePatchTargetCodeSymbol(packagePayload.SourceLineNumbers)
176 + var symbol = section.AddSymbol(new WixBundlePatchTargetCodeSymbol(sourceLineNumbers)
177 {
140 - PackageRef = packagePayload.Id.Id,
178 + PackageRef = id.Id,
179 TargetCode = targetCode,
180 Attributes = 0,
181 Type = type,
@@ -158,6 +196,8 @@ namespace WixToolset.Core.Burn.Bundles
196 root.RemoveChild(node);
197 }
198
199 + string compactPatchXml;
200 +
201 // Save the XML as compact as possible.
202 using (var writer = new StringWriter())
203 {
@@ -166,8 +206,10 @@ namespace WixToolset.Core.Burn.Bundles
206 doc.WriteTo(xmlWriter);
207 }
208
169 - mspPackage.PatchXml = writer.ToString();
209 + compactPatchXml = writer.ToString();
210 }
211 +
212 + return compactPatchXml;
213 }
214
215 private static string GetPatchMetadataProperty(View view, string property)
src/wix/WixToolset.Core.Burn/BurnBackendWarnings.cs
+2 -2
@@ -26,9 +26,9 @@ namespace WixToolset.Core.Burn
26 return Message(sourceLineNumbers, Ids.FailedToExtractAttachedContainers, "Failed to extract attached container. This most often happens when extracting a stripped bundle from the package cache, which is not supported.");
27 }
28
29 - public static Message HiddenBundleNotSupported(SourceLineNumber sourceLineNumbers, string bundleExecutable)
29 + public static Message HiddenBundleNotSupported(SourceLineNumber sourceLineNumbers, string packageId)
30 {
31 - return Message(sourceLineNumbers, Ids.HiddenBundleNotSupported, "The bundle '{0}' does not support hiding its ARP registration.", bundleExecutable);
31 + return Message(sourceLineNumbers, Ids.HiddenBundleNotSupported, "The BundlePackage '{0}' does not support hiding its ARP registration.", packageId);
32 }
33
34 public static Message UnknownBundleRelationAction(SourceLineNumber sourceLineNumbers, string bundleExecutable, string action)
src/wix/test/WixToolsetTest.CoreIntegration/BundlePackageFixture.cs
+1 -1
@@ -238,7 +238,7 @@ namespace WixToolsetTest.CoreIntegration
238 .ToArray();
239 WixAssert.CompareLineByLine(new[]
240 {
241 - "The bundle '<dotDataPath>\\v3bundle.exe' does not support hiding its ARP registration.",
241 + "The BundlePackage 'v3bundle.exe' does not support hiding its ARP registration.",
242 }, warningMessages);
243
244 Assert.True(File.Exists(parentBundlePath));