aboutsummaryrefslogtreecommitdiff
path: root/src/WixToolset.Core.WindowsInstaller/Bind/CreateOutputFromIRCommand.cs
diff options
context:
space:
mode:
authorRob Mensching <rob@firegiant.com>2020-01-24 15:27:20 -0800
committerRob Mensching <rob@firegiant.com>2020-02-05 16:15:47 -0800
commit6ff680e386b1543ad1a58d1b1d465ce8aa20bc7d (patch)
treec717333cd10d5592e59dfb898b391275bba1f389 /src/WixToolset.Core.WindowsInstaller/Bind/CreateOutputFromIRCommand.cs
parent6e2e67ab55c75f4655397588c0dcc64f50d22f92 (diff)
downloadwix-6ff680e386b1543ad1a58d1b1d465ce8aa20bc7d.tar.gz
wix-6ff680e386b1543ad1a58d1b1d465ce8aa20bc7d.tar.bz2
wix-6ff680e386b1543ad1a58d1b1d465ce8aa20bc7d.zip
Start on new patch infrastructure
Diffstat (limited to 'src/WixToolset.Core.WindowsInstaller/Bind/CreateOutputFromIRCommand.cs')
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Bind/CreateOutputFromIRCommand.cs353
1 files changed, 166 insertions, 187 deletions
diff --git a/src/WixToolset.Core.WindowsInstaller/Bind/CreateOutputFromIRCommand.cs b/src/WixToolset.Core.WindowsInstaller/Bind/CreateOutputFromIRCommand.cs
index 31d0b3a6..5707f7ce 100644
--- a/src/WixToolset.Core.WindowsInstaller/Bind/CreateOutputFromIRCommand.cs
+++ b/src/WixToolset.Core.WindowsInstaller/Bind/CreateOutputFromIRCommand.cs
@@ -40,193 +40,193 @@ namespace WixToolset.Core.WindowsInstaller.Bind
40 40
41 public void Execute() 41 public void Execute()
42 { 42 {
43 var output = new WindowsInstallerData(this.Section.Tuples.First().SourceLineNumbers); 43 this.Output = new WindowsInstallerData(this.Section.Tuples.First().SourceLineNumbers)
44 output.Codepage = this.Section.Codepage; 44 {
45 output.Type = SectionTypeToOutputType(this.Section.Type); 45 Codepage = this.Section.Codepage,
46 46 Type = SectionTypeToOutputType(this.Section.Type)
47 this.AddSectionToOutput(this.Section, output); 47 };
48 48
49 this.Output = output; 49 this.AddSectionToOutput();
50 } 50 }
51 51
52 private void AddSectionToOutput(IntermediateSection section, WindowsInstallerData output) 52 private void AddSectionToOutput()
53 { 53 {
54 foreach (var tuple in section.Tuples) 54 foreach (var tuple in this.Section.Tuples)
55 { 55 {
56 switch (tuple.Definition.Type) 56 switch (tuple.Definition.Type)
57 { 57 {
58 case TupleDefinitionType.AppSearch: 58 case TupleDefinitionType.AppSearch:
59 this.AddTupleDefaultly(tuple, output); 59 this.AddTupleDefaultly(tuple);
60 output.EnsureTable(this.TableDefinitions["Signature"]); 60 this.Output.EnsureTable(this.TableDefinitions["Signature"]);
61 break; 61 break;
62 62
63 case TupleDefinitionType.Assembly: 63 case TupleDefinitionType.Assembly:
64 this.AddAssemblyTuple((AssemblyTuple)tuple, output); 64 this.AddAssemblyTuple((AssemblyTuple)tuple);
65 break; 65 break;
66 66
67 case TupleDefinitionType.Binary: 67 case TupleDefinitionType.Binary:
68 this.AddTupleDefaultly(tuple, output, idIsPrimaryKey: true); 68 this.AddTupleDefaultly(tuple, idIsPrimaryKey: true);
69 break; 69 break;
70 70
71 case TupleDefinitionType.BBControl: 71 case TupleDefinitionType.BBControl:
72 this.AddBBControlTuple((BBControlTuple)tuple, output); 72 this.AddBBControlTuple((BBControlTuple)tuple);
73 break; 73 break;
74 74
75 case TupleDefinitionType.Class: 75 case TupleDefinitionType.Class:
76 this.AddClassTuple((ClassTuple)tuple, output); 76 this.AddClassTuple((ClassTuple)tuple);
77 break; 77 break;
78 78
79 case TupleDefinitionType.Control: 79 case TupleDefinitionType.Control:
80 this.AddControlTuple((ControlTuple)tuple, output); 80 this.AddControlTuple((ControlTuple)tuple);
81 break; 81 break;
82 82
83 case TupleDefinitionType.Component: 83 case TupleDefinitionType.Component:
84 this.AddComponentTuple((ComponentTuple)tuple, output); 84 this.AddComponentTuple((ComponentTuple)tuple);
85 break; 85 break;
86 86
87 case TupleDefinitionType.CustomAction: 87 case TupleDefinitionType.CustomAction:
88 this.AddCustomActionTuple((CustomActionTuple)tuple, output); 88 this.AddCustomActionTuple((CustomActionTuple)tuple);
89 break; 89 break;
90 90
91 case TupleDefinitionType.Dialog: 91 case TupleDefinitionType.Dialog:
92 this.AddDialogTuple((DialogTuple)tuple, output); 92 this.AddDialogTuple((DialogTuple)tuple);
93 break; 93 break;
94 94
95 case TupleDefinitionType.Directory: 95 case TupleDefinitionType.Directory:
96 this.AddDirectoryTuple((DirectoryTuple)tuple, output); 96 this.AddDirectoryTuple((DirectoryTuple)tuple);
97 break; 97 break;
98 98
99 case TupleDefinitionType.Environment: 99 case TupleDefinitionType.Environment:
100 this.AddEnvironmentTuple((EnvironmentTuple)tuple, output); 100 this.AddEnvironmentTuple((EnvironmentTuple)tuple);
101 break; 101 break;
102 102
103 case TupleDefinitionType.Error: 103 case TupleDefinitionType.Error:
104 this.AddErrorTuple((ErrorTuple)tuple, output); 104 this.AddErrorTuple((ErrorTuple)tuple);
105 break; 105 break;
106 106
107 case TupleDefinitionType.Feature: 107 case TupleDefinitionType.Feature:
108 this.AddFeatureTuple((FeatureTuple)tuple, output); 108 this.AddFeatureTuple((FeatureTuple)tuple);
109 break; 109 break;
110 110
111 case TupleDefinitionType.File: 111 case TupleDefinitionType.File:
112 this.AddFileTuple((FileTuple)tuple, output); 112 this.AddFileTuple((FileTuple)tuple);
113 break; 113 break;
114 114
115 case TupleDefinitionType.Icon: 115 case TupleDefinitionType.Icon:
116 this.AddTupleDefaultly(tuple, output, idIsPrimaryKey: true); 116 this.AddTupleDefaultly(tuple, idIsPrimaryKey: true);
117 break; 117 break;
118 118
119 case TupleDefinitionType.IniFile: 119 case TupleDefinitionType.IniFile:
120 this.AddIniFileTuple((IniFileTuple)tuple, output); 120 this.AddIniFileTuple((IniFileTuple)tuple);
121 break; 121 break;
122 122
123 case TupleDefinitionType.Media: 123 case TupleDefinitionType.Media:
124 this.AddMediaTuple((MediaTuple)tuple, output); 124 this.AddMediaTuple((MediaTuple)tuple);
125 break; 125 break;
126 126
127 case TupleDefinitionType.ModuleConfiguration: 127 case TupleDefinitionType.ModuleConfiguration:
128 this.AddModuleConfigurationTuple((ModuleConfigurationTuple)tuple, output); 128 this.AddModuleConfigurationTuple((ModuleConfigurationTuple)tuple);
129 break; 129 break;
130 130
131 case TupleDefinitionType.MsiEmbeddedUI: 131 case TupleDefinitionType.MsiEmbeddedUI:
132 this.AddMsiEmbeddedUITuple((MsiEmbeddedUITuple)tuple, output); 132 this.AddMsiEmbeddedUITuple((MsiEmbeddedUITuple)tuple);
133 break; 133 break;
134 134
135 case TupleDefinitionType.MsiFileHash: 135 case TupleDefinitionType.MsiFileHash:
136 this.AddMsiFileHashTuple((MsiFileHashTuple)tuple, output); 136 this.AddMsiFileHashTuple((MsiFileHashTuple)tuple);
137 break; 137 break;
138 138
139 case TupleDefinitionType.MsiServiceConfig: 139 case TupleDefinitionType.MsiServiceConfig:
140 this.AddMsiServiceConfigTuple((MsiServiceConfigTuple)tuple, output); 140 this.AddMsiServiceConfigTuple((MsiServiceConfigTuple)tuple);
141 break; 141 break;
142 142
143 case TupleDefinitionType.MsiServiceConfigFailureActions: 143 case TupleDefinitionType.MsiServiceConfigFailureActions:
144 this.AddMsiServiceConfigFailureActionsTuple((MsiServiceConfigFailureActionsTuple)tuple, output); 144 this.AddMsiServiceConfigFailureActionsTuple((MsiServiceConfigFailureActionsTuple)tuple);
145 break; 145 break;
146 146
147 case TupleDefinitionType.MsiShortcutProperty: 147 case TupleDefinitionType.MsiShortcutProperty:
148 this.AddTupleDefaultly(tuple, output, idIsPrimaryKey: true); 148 this.AddTupleDefaultly(tuple, idIsPrimaryKey: true);
149 break; 149 break;
150 150
151 case TupleDefinitionType.MoveFile: 151 case TupleDefinitionType.MoveFile:
152 this.AddMoveFileTuple((MoveFileTuple)tuple, output); 152 this.AddMoveFileTuple((MoveFileTuple)tuple);
153 break; 153 break;
154 154
155 case TupleDefinitionType.ProgId: 155 case TupleDefinitionType.ProgId:
156 this.AddTupleDefaultly(tuple, output); 156 this.AddTupleDefaultly(tuple);
157 output.EnsureTable(this.TableDefinitions["Extension"]); 157 this.Output.EnsureTable(this.TableDefinitions["Extension"]);
158 break; 158 break;
159 159
160 case TupleDefinitionType.Property: 160 case TupleDefinitionType.Property:
161 this.AddPropertyTuple((PropertyTuple)tuple, output); 161 this.AddPropertyTuple((PropertyTuple)tuple);
162 break; 162 break;
163 163
164 case TupleDefinitionType.RemoveFile: 164 case TupleDefinitionType.RemoveFile:
165 this.AddRemoveFileTuple((RemoveFileTuple)tuple, output); 165 this.AddRemoveFileTuple((RemoveFileTuple)tuple);
166 break; 166 break;
167 167
168 case TupleDefinitionType.Registry: 168 case TupleDefinitionType.Registry:
169 this.AddRegistryTuple((RegistryTuple)tuple, output); 169 this.AddRegistryTuple((RegistryTuple)tuple);
170 break; 170 break;
171 171
172 case TupleDefinitionType.RegLocator: 172 case TupleDefinitionType.RegLocator:
173 this.AddRegLocatorTuple((RegLocatorTuple)tuple, output); 173 this.AddRegLocatorTuple((RegLocatorTuple)tuple);
174 break; 174 break;
175 175
176 case TupleDefinitionType.RemoveRegistry: 176 case TupleDefinitionType.RemoveRegistry:
177 this.AddRemoveRegistryTuple((RemoveRegistryTuple)tuple, output); 177 this.AddRemoveRegistryTuple((RemoveRegistryTuple)tuple);
178 break; 178 break;
179 179
180 case TupleDefinitionType.ReserveCost: 180 case TupleDefinitionType.ReserveCost:
181 this.AddTupleDefaultly(tuple, output, idIsPrimaryKey: true); 181 this.AddTupleDefaultly(tuple, idIsPrimaryKey: true);
182 break; 182 break;
183 183
184 case TupleDefinitionType.ServiceControl: 184 case TupleDefinitionType.ServiceControl:
185 this.AddServiceControlTuple((ServiceControlTuple)tuple, output); 185 this.AddServiceControlTuple((ServiceControlTuple)tuple);
186 break; 186 break;
187 187
188 case TupleDefinitionType.ServiceInstall: 188 case TupleDefinitionType.ServiceInstall:
189 this.AddServiceInstallTuple((ServiceInstallTuple)tuple, output); 189 this.AddServiceInstallTuple((ServiceInstallTuple)tuple);
190 break; 190 break;
191 191
192 case TupleDefinitionType.Shortcut: 192 case TupleDefinitionType.Shortcut:
193 this.AddShortcutTuple((ShortcutTuple)tuple, output); 193 this.AddShortcutTuple((ShortcutTuple)tuple);
194 break; 194 break;
195 195
196 case TupleDefinitionType.Signature: 196 case TupleDefinitionType.Signature:
197 this.AddTupleDefaultly(tuple, output, idIsPrimaryKey: true); 197 this.AddTupleDefaultly(tuple, idIsPrimaryKey: true);
198 break; 198 break;
199 199
200 case TupleDefinitionType.SummaryInformation: 200 case TupleDefinitionType.SummaryInformation:
201 this.AddTupleDefaultly(tuple, output, tableName: "_SummaryInformation"); 201 this.AddTupleDefaultly(tuple, tableName: "_SummaryInformation");
202 break; 202 break;
203 203
204 case TupleDefinitionType.TextStyle: 204 case TupleDefinitionType.TextStyle:
205 this.AddTextStyleTuple((TextStyleTuple)tuple, output); 205 this.AddTextStyleTuple((TextStyleTuple)tuple);
206 break; 206 break;
207 207
208 case TupleDefinitionType.Upgrade: 208 case TupleDefinitionType.Upgrade:
209 this.AddUpgradeTuple((UpgradeTuple)tuple, output); 209 this.AddUpgradeTuple((UpgradeTuple)tuple);
210 break; 210 break;
211 211
212 case TupleDefinitionType.WixAction: 212 case TupleDefinitionType.WixAction:
213 this.AddWixActionTuple((WixActionTuple)tuple, output); 213 this.AddWixActionTuple((WixActionTuple)tuple);
214 break; 214 break;
215 215
216 case TupleDefinitionType.WixMediaTemplate: 216 case TupleDefinitionType.WixMediaTemplate:
217 this.AddWixMediaTemplateTuple((WixMediaTemplateTuple)tuple, output); 217 this.AddWixMediaTemplateTuple((WixMediaTemplateTuple)tuple);
218 break; 218 break;
219 219
220 case TupleDefinitionType.MustBeFromAnExtension: 220 case TupleDefinitionType.MustBeFromAnExtension:
221 this.AddTupleFromExtension(tuple, output); 221 this.AddTupleFromExtension(tuple);
222 break; 222 break;
223 223
224 case TupleDefinitionType.WixCustomRow: 224 case TupleDefinitionType.WixCustomRow:
225 this.AddWixCustomRowTuple((WixCustomRowTuple)tuple, output); 225 this.AddWixCustomRowTuple((WixCustomRowTuple)tuple);
226 break; 226 break;
227 227
228 case TupleDefinitionType.WixEnsureTable: 228 case TupleDefinitionType.WixEnsureTable:
229 this.AddWixEnsureTableTuple((WixEnsureTableTuple)tuple, output); 229 this.AddWixEnsureTableTuple((WixEnsureTableTuple)tuple);
230 break; 230 break;
231 231
232 // ignored. 232 // ignored.
@@ -234,25 +234,25 @@ namespace WixToolset.Core.WindowsInstaller.Bind
234 case TupleDefinitionType.WixComponentGroup: 234 case TupleDefinitionType.WixComponentGroup:
235 case TupleDefinitionType.WixDeltaPatchFile: 235 case TupleDefinitionType.WixDeltaPatchFile:
236 case TupleDefinitionType.WixFeatureGroup: 236 case TupleDefinitionType.WixFeatureGroup:
237 break; 237 case TupleDefinitionType.WixPatchBaseline:
238 break;
238 239
239 // Already processed. 240 // Already processed.
240 case TupleDefinitionType.WixCustomTable: 241 case TupleDefinitionType.WixCustomTable:
241 break; 242 break;
242 243
243 default: 244 default:
244 this.AddTupleDefaultly(tuple, output); 245 this.AddTupleDefaultly(tuple);
245 break; 246 break;
246 } 247 }
247 } 248 }
248 } 249 }
249 250
250 private void AddAssemblyTuple(AssemblyTuple tuple, WindowsInstallerData output) 251 private void AddAssemblyTuple(AssemblyTuple tuple)
251 { 252 {
252 var attributes = tuple.Type == AssemblyType.Win32Assembly ? 1 : (int?)null; 253 var attributes = tuple.Type == AssemblyType.Win32Assembly ? 1 : (int?)null;
253 254
254 var table = output.EnsureTable(this.TableDefinitions["MsiAssembly"]); 255 var row = this.CreateRow(tuple, "MsiAssembly");
255 var row = table.CreateRow(tuple.SourceLineNumbers);
256 row[0] = tuple.ComponentRef; 256 row[0] = tuple.ComponentRef;
257 row[1] = tuple.FeatureRef; 257 row[1] = tuple.FeatureRef;
258 row[2] = tuple.ManifestFileRef; 258 row[2] = tuple.ManifestFileRef;
@@ -260,7 +260,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
260 row[4] = attributes; 260 row[4] = attributes;
261 } 261 }
262 262
263 private void AddBBControlTuple(BBControlTuple tuple, WindowsInstallerData output) 263 private void AddBBControlTuple(BBControlTuple tuple)
264 { 264 {
265 var attributes = tuple.Attributes; 265 var attributes = tuple.Attributes;
266 attributes |= tuple.Enabled ? WindowsInstallerConstants.MsidbControlAttributesEnabled : 0; 266 attributes |= tuple.Enabled ? WindowsInstallerConstants.MsidbControlAttributesEnabled : 0;
@@ -272,8 +272,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
272 attributes |= tuple.Sunken ? WindowsInstallerConstants.MsidbControlAttributesSunken : 0; 272 attributes |= tuple.Sunken ? WindowsInstallerConstants.MsidbControlAttributesSunken : 0;
273 attributes |= tuple.Visible ? WindowsInstallerConstants.MsidbControlAttributesVisible : 0; 273 attributes |= tuple.Visible ? WindowsInstallerConstants.MsidbControlAttributesVisible : 0;
274 274
275 var table = output.EnsureTable(this.TableDefinitions["BBControl"]); 275 var row = this.CreateRow(tuple, "BBControl");
276 var row = table.CreateRow(tuple.SourceLineNumbers);
277 row[0] = tuple.BillboardRef; 276 row[0] = tuple.BillboardRef;
278 row[1] = tuple.BBControl; 277 row[1] = tuple.BBControl;
279 row[2] = tuple.Type; 278 row[2] = tuple.Type;
@@ -285,10 +284,9 @@ namespace WixToolset.Core.WindowsInstaller.Bind
285 row[8] = tuple.Text; 284 row[8] = tuple.Text;
286 } 285 }
287 286
288 private void AddClassTuple(ClassTuple tuple, WindowsInstallerData output) 287 private void AddClassTuple(ClassTuple tuple)
289 { 288 {
290 var table = output.EnsureTable(this.TableDefinitions["Class"]); 289 var row = this.CreateRow(tuple, "Class");
291 var row = table.CreateRow(tuple.SourceLineNumbers);
292 row[0] = tuple.CLSID; 290 row[0] = tuple.CLSID;
293 row[1] = tuple.Context; 291 row[1] = tuple.Context;
294 row[2] = tuple.ComponentRef; 292 row[2] = tuple.ComponentRef;
@@ -304,7 +302,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
304 row[12] = tuple.RelativePath ? (int?)1 : null; 302 row[12] = tuple.RelativePath ? (int?)1 : null;
305 } 303 }
306 304
307 private void AddControlTuple(ControlTuple tuple, WindowsInstallerData output) 305 private void AddControlTuple(ControlTuple tuple)
308 { 306 {
309 var text = tuple.Text; 307 var text = tuple.Text;
310 var attributes = tuple.Attributes; 308 var attributes = tuple.Attributes;
@@ -329,8 +327,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
329 text = String.Concat(text, " "); 327 text = String.Concat(text, " ");
330 } 328 }
331 329
332 var table = output.EnsureTable(this.TableDefinitions["Control"]); 330 var row = this.CreateRow(tuple, "Control");
333 var row = table.CreateRow(tuple.SourceLineNumbers);
334 row[0] = tuple.DialogRef; 331 row[0] = tuple.DialogRef;
335 row[1] = tuple.Control; 332 row[1] = tuple.Control;
336 row[2] = tuple.Type; 333 row[2] = tuple.Type;
@@ -344,7 +341,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
344 row[10] = tuple.Help; 341 row[10] = tuple.Help;
345 } 342 }
346 343
347 private void AddComponentTuple(ComponentTuple tuple, WindowsInstallerData output) 344 private void AddComponentTuple(ComponentTuple tuple)
348 { 345 {
349 var attributes = ComponentLocation.Either == tuple.Location ? WindowsInstallerConstants.MsidbComponentAttributesOptional : 0; 346 var attributes = ComponentLocation.Either == tuple.Location ? WindowsInstallerConstants.MsidbComponentAttributesOptional : 0;
350 attributes |= ComponentLocation.SourceOnly == tuple.Location ? WindowsInstallerConstants.MsidbComponentAttributesSourceOnly : 0; 347 attributes |= ComponentLocation.SourceOnly == tuple.Location ? WindowsInstallerConstants.MsidbComponentAttributesSourceOnly : 0;
@@ -359,8 +356,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
359 attributes |= tuple.UninstallWhenSuperseded ? WindowsInstallerConstants.MsidbComponentAttributesUninstallOnSupersedence : 0; 356 attributes |= tuple.UninstallWhenSuperseded ? WindowsInstallerConstants.MsidbComponentAttributesUninstallOnSupersedence : 0;
360 attributes |= tuple.Win64 ? WindowsInstallerConstants.MsidbComponentAttributes64bit : 0; 357 attributes |= tuple.Win64 ? WindowsInstallerConstants.MsidbComponentAttributes64bit : 0;
361 358
362 var table = output.EnsureTable(this.TableDefinitions["Component"]); 359 var row = this.CreateRow(tuple, "Component");
363 var row = table.CreateRow(tuple.SourceLineNumbers);
364 row[0] = tuple.Id.Id; 360 row[0] = tuple.Id.Id;
365 row[1] = tuple.ComponentId; 361 row[1] = tuple.ComponentId;
366 row[2] = tuple.DirectoryRef; 362 row[2] = tuple.DirectoryRef;
@@ -369,7 +365,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
369 row[5] = tuple.KeyPath; 365 row[5] = tuple.KeyPath;
370 } 366 }
371 367
372 private void AddCustomActionTuple(CustomActionTuple tuple, WindowsInstallerData output) 368 private void AddCustomActionTuple(CustomActionTuple tuple)
373 { 369 {
374 var type = tuple.Win64 ? WindowsInstallerConstants.MsidbCustomActionType64BitScript : 0; 370 var type = tuple.Win64 ? WindowsInstallerConstants.MsidbCustomActionType64BitScript : 0;
375 type |= tuple.IgnoreResult ? WindowsInstallerConstants.MsidbCustomActionTypeContinue : 0; 371 type |= tuple.IgnoreResult ? WindowsInstallerConstants.MsidbCustomActionTypeContinue : 0;
@@ -396,8 +392,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
396 type |= tuple.TSAware ? WindowsInstallerConstants.MsidbCustomActionTypeTSAware : 0; 392 type |= tuple.TSAware ? WindowsInstallerConstants.MsidbCustomActionTypeTSAware : 0;
397 } 393 }
398 394
399 var table = output.EnsureTable(this.TableDefinitions["CustomAction"]); 395 var row = this.CreateRow(tuple, "CustomAction");
400 var row = table.CreateRow(tuple.SourceLineNumbers);
401 row[0] = tuple.Id.Id; 396 row[0] = tuple.Id.Id;
402 row[1] = type; 397 row[1] = type;
403 row[2] = tuple.Source; 398 row[2] = tuple.Source;
@@ -405,7 +400,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
405 row[4] = tuple.PatchUninstall ? (int?)WindowsInstallerConstants.MsidbCustomActionTypePatchUninstall : null; 400 row[4] = tuple.PatchUninstall ? (int?)WindowsInstallerConstants.MsidbCustomActionTypePatchUninstall : null;
406 } 401 }
407 402
408 private void AddDialogTuple(DialogTuple tuple, WindowsInstallerData output) 403 private void AddDialogTuple(DialogTuple tuple)
409 { 404 {
410 var attributes = tuple.Visible ? WindowsInstallerConstants.MsidbDialogAttributesVisible : 0; 405 var attributes = tuple.Visible ? WindowsInstallerConstants.MsidbDialogAttributesVisible : 0;
411 attributes|= tuple.Modal ? WindowsInstallerConstants.MsidbDialogAttributesModal : 0; 406 attributes|= tuple.Modal ? WindowsInstallerConstants.MsidbDialogAttributesModal : 0;
@@ -419,8 +414,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
419 attributes|= tuple.SystemModal ? WindowsInstallerConstants.MsidbDialogAttributesSysModal : 0; 414 attributes|= tuple.SystemModal ? WindowsInstallerConstants.MsidbDialogAttributesSysModal : 0;
420 attributes|= tuple.TrackDiskSpace ? WindowsInstallerConstants.MsidbDialogAttributesTrackDiskSpace : 0; 415 attributes|= tuple.TrackDiskSpace ? WindowsInstallerConstants.MsidbDialogAttributesTrackDiskSpace : 0;
421 416
422 var table = output.EnsureTable(this.TableDefinitions["Dialog"]); 417 var row = this.CreateRow(tuple, "Dialog");
423 var row = table.CreateRow(tuple.SourceLineNumbers);
424 row[0] = tuple.Id.Id; 418 row[0] = tuple.Id.Id;
425 row[1] = tuple.HCentering; 419 row[1] = tuple.HCentering;
426 row[2] = tuple.VCentering; 420 row[2] = tuple.VCentering;
@@ -432,10 +426,10 @@ namespace WixToolset.Core.WindowsInstaller.Bind
432 row[8] = tuple.DefaultControlRef; 426 row[8] = tuple.DefaultControlRef;
433 row[9] = tuple.CancelControlRef; 427 row[9] = tuple.CancelControlRef;
434 428
435 output.EnsureTable(this.TableDefinitions["ListBox"]); 429 this.Output.EnsureTable(this.TableDefinitions["ListBox"]);
436 } 430 }
437 431
438 private void AddDirectoryTuple(DirectoryTuple tuple, WindowsInstallerData output) 432 private void AddDirectoryTuple(DirectoryTuple tuple)
439 { 433 {
440 var sourceName = GetMsiFilenameValue(tuple.SourceShortName, tuple.SourceName); 434 var sourceName = GetMsiFilenameValue(tuple.SourceShortName, tuple.SourceName);
441 var targetName = GetMsiFilenameValue(tuple.ShortName, tuple.Name); 435 var targetName = GetMsiFilenameValue(tuple.ShortName, tuple.Name);
@@ -447,14 +441,13 @@ namespace WixToolset.Core.WindowsInstaller.Bind
447 441
448 var defaultDir = String.IsNullOrEmpty(sourceName) ? targetName : targetName + ":" + sourceName ; 442 var defaultDir = String.IsNullOrEmpty(sourceName) ? targetName : targetName + ":" + sourceName ;
449 443
450 var table = output.EnsureTable(this.TableDefinitions["Directory"]); 444 var row = this.CreateRow(tuple, "Directory");
451 var row = table.CreateRow(tuple.SourceLineNumbers);
452 row[0] = tuple.Id.Id; 445 row[0] = tuple.Id.Id;
453 row[1] = tuple.ParentDirectoryRef; 446 row[1] = tuple.ParentDirectoryRef;
454 row[2] = defaultDir; 447 row[2] = defaultDir;
455 } 448 }
456 449
457 private void AddEnvironmentTuple(EnvironmentTuple tuple, WindowsInstallerData output) 450 private void AddEnvironmentTuple(EnvironmentTuple tuple)
458 { 451 {
459 var action = String.Empty; 452 var action = String.Empty;
460 var system = tuple.System ? "*" : String.Empty; 453 var system = tuple.System ? "*" : String.Empty;
@@ -484,23 +477,21 @@ namespace WixToolset.Core.WindowsInstaller.Bind
484 break; 477 break;
485 } 478 }
486 479
487 var table = output.EnsureTable(this.TableDefinitions["Environment"]); 480 var row = this.CreateRow(tuple, "Environment");
488 var row = table.CreateRow(tuple.SourceLineNumbers);
489 row[0] = tuple.Id.Id; 481 row[0] = tuple.Id.Id;
490 row[1] = String.Concat(action, uninstall, system, tuple.Name); 482 row[1] = String.Concat(action, uninstall, system, tuple.Name);
491 row[2] = value; 483 row[2] = value;
492 row[3] = tuple.ComponentRef; 484 row[3] = tuple.ComponentRef;
493 } 485 }
494 486
495 private void AddErrorTuple(ErrorTuple tuple, WindowsInstallerData output) 487 private void AddErrorTuple(ErrorTuple tuple)
496 { 488 {
497 var table = output.EnsureTable(this.TableDefinitions["Error"]); 489 var row = this.CreateRow(tuple, "Error");
498 var row = table.CreateRow(tuple.SourceLineNumbers);
499 row[0] = Convert.ToInt32(tuple.Id.Id); 490 row[0] = Convert.ToInt32(tuple.Id.Id);
500 row[1] = tuple.Message; 491 row[1] = tuple.Message;
501 } 492 }
502 493
503 private void AddFeatureTuple(FeatureTuple tuple, WindowsInstallerData output) 494 private void AddFeatureTuple(FeatureTuple tuple)
504 { 495 {
505 var attributes = tuple.DisallowAbsent ? WindowsInstallerConstants.MsidbFeatureAttributesUIDisallowAbsent : 0; 496 var attributes = tuple.DisallowAbsent ? WindowsInstallerConstants.MsidbFeatureAttributesUIDisallowAbsent : 0;
506 attributes |= tuple.DisallowAdvertise ? WindowsInstallerConstants.MsidbFeatureAttributesDisallowAdvertise : 0; 497 attributes |= tuple.DisallowAdvertise ? WindowsInstallerConstants.MsidbFeatureAttributesDisallowAdvertise : 0;
@@ -508,8 +499,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
508 attributes |= FeatureInstallDefault.Source == tuple.InstallDefault ? WindowsInstallerConstants.MsidbFeatureAttributesFavorSource : 0; 499 attributes |= FeatureInstallDefault.Source == tuple.InstallDefault ? WindowsInstallerConstants.MsidbFeatureAttributesFavorSource : 0;
509 attributes |= FeatureTypicalDefault.Advertise == tuple.TypicalDefault ? WindowsInstallerConstants.MsidbFeatureAttributesFavorAdvertise : 0; 500 attributes |= FeatureTypicalDefault.Advertise == tuple.TypicalDefault ? WindowsInstallerConstants.MsidbFeatureAttributesFavorAdvertise : 0;
510 501
511 var table = output.EnsureTable(this.TableDefinitions["Feature"]); 502 var row = this.CreateRow(tuple, "Feature");
512 var row = table.CreateRow(tuple.SourceLineNumbers);
513 row[0] = tuple.Id.Id; 503 row[0] = tuple.Id.Id;
514 row[1] = tuple.ParentFeatureRef; 504 row[1] = tuple.ParentFeatureRef;
515 row[2] = tuple.Title; 505 row[2] = tuple.Title;
@@ -520,16 +510,17 @@ namespace WixToolset.Core.WindowsInstaller.Bind
520 row[7] = attributes; 510 row[7] = attributes;
521 } 511 }
522 512
523 private void AddFileTuple(FileTuple tuple, WindowsInstallerData output) 513 private void AddFileTuple(FileTuple tuple)
524 { 514 {
525 var table = output.EnsureTable(this.TableDefinitions["File"]); 515 var row = (FileRow)this.CreateRow(tuple, "File");
526 var row = (FileRow)table.CreateRow(tuple.SourceLineNumbers);
527 row.File = tuple.Id.Id; 516 row.File = tuple.Id.Id;
528 row.Component = tuple.ComponentRef; 517 row.Component = tuple.ComponentRef;
529 row.FileName = GetMsiFilenameValue(tuple.ShortName, tuple.Name); 518 row.FileName = GetMsiFilenameValue(tuple.ShortName, tuple.Name);
530 row.FileSize = tuple.FileSize; 519 row.FileSize = tuple.FileSize;
531 row.Version = tuple.Version; 520 row.Version = tuple.Version;
532 row.Language = tuple.Language; 521 row.Language = tuple.Language;
522 row.DiskId = tuple.DiskId ?? 1; // TODO: is 0 the correct thing to default here
523 row.Source = tuple.Source.Path;
533 524
534 var attributes = (tuple.Attributes & FileTupleAttributes.Checksum) == FileTupleAttributes.Checksum ? WindowsInstallerConstants.MsidbFileAttributesChecksum : 0; 525 var attributes = (tuple.Attributes & FileTupleAttributes.Checksum) == FileTupleAttributes.Checksum ? WindowsInstallerConstants.MsidbFileAttributesChecksum : 0;
535 attributes |= (tuple.Attributes & FileTupleAttributes.Compressed) == FileTupleAttributes.Compressed ? WindowsInstallerConstants.MsidbFileAttributesCompressed : 0; 526 attributes |= (tuple.Attributes & FileTupleAttributes.Compressed) == FileTupleAttributes.Compressed ? WindowsInstallerConstants.MsidbFileAttributesCompressed : 0;
@@ -542,19 +533,17 @@ namespace WixToolset.Core.WindowsInstaller.Bind
542 533
543 if (!String.IsNullOrEmpty(tuple.FontTitle)) 534 if (!String.IsNullOrEmpty(tuple.FontTitle))
544 { 535 {
545 var fontTable = output.EnsureTable(this.TableDefinitions["Font"]); 536 var fontRow = this.CreateRow(tuple, "Font");
546 var fontRow = fontTable.CreateRow(tuple.SourceLineNumbers);
547 fontRow[0] = tuple.Id.Id; 537 fontRow[0] = tuple.Id.Id;
548 fontRow[1] = tuple.FontTitle; 538 fontRow[1] = tuple.FontTitle;
549 } 539 }
550 } 540 }
551 541
552 private void AddIniFileTuple(IniFileTuple tuple, WindowsInstallerData output) 542 private void AddIniFileTuple(IniFileTuple tuple)
553 { 543 {
554 var tableName = (InifFileActionType.AddLine == tuple.Action || InifFileActionType.AddTag == tuple.Action || InifFileActionType.CreateLine == tuple.Action) ? "IniFile" : "RemoveIniFile"; 544 var tableName = (InifFileActionType.AddLine == tuple.Action || InifFileActionType.AddTag == tuple.Action || InifFileActionType.CreateLine == tuple.Action) ? "IniFile" : "RemoveIniFile";
555 545
556 var table = output.EnsureTable(this.TableDefinitions[tableName]); 546 var row = this.CreateRow(tuple, tableName);
557 var row = table.CreateRow(tuple.SourceLineNumbers);
558 row[0] = tuple.Id.Id; 547 row[0] = tuple.Id.Id;
559 row[1] = tuple.FileName; 548 row[1] = tuple.FileName;
560 row[2] = tuple.DirProperty; 549 row[2] = tuple.DirProperty;
@@ -565,12 +554,11 @@ namespace WixToolset.Core.WindowsInstaller.Bind
565 row[7] = tuple.ComponentRef; 554 row[7] = tuple.ComponentRef;
566 } 555 }
567 556
568 private void AddMediaTuple(MediaTuple tuple, WindowsInstallerData output) 557 private void AddMediaTuple(MediaTuple tuple)
569 { 558 {
570 if (this.Section.Type != SectionType.Module) 559 if (this.Section.Type != SectionType.Module)
571 { 560 {
572 var table = output.EnsureTable(this.TableDefinitions["Media"]); 561 var row = (MediaRow)this.CreateRow(tuple, "Media");
573 var row = (MediaRow)table.CreateRow(tuple.SourceLineNumbers);
574 row.DiskId = tuple.DiskId; 562 row.DiskId = tuple.DiskId;
575 row.LastSequence = tuple.LastSequence ?? 0; 563 row.LastSequence = tuple.LastSequence ?? 0;
576 row.DiskPrompt = tuple.DiskPrompt; 564 row.DiskPrompt = tuple.DiskPrompt;
@@ -580,10 +568,9 @@ namespace WixToolset.Core.WindowsInstaller.Bind
580 } 568 }
581 } 569 }
582 570
583 private void AddModuleConfigurationTuple(ModuleConfigurationTuple tuple, WindowsInstallerData output) 571 private void AddModuleConfigurationTuple(ModuleConfigurationTuple tuple)
584 { 572 {
585 var table = output.EnsureTable(this.TableDefinitions["ModuleConfiguration"]); 573 var row = this.CreateRow(tuple, "ModuleConfiguration");
586 var row = table.CreateRow(tuple.SourceLineNumbers);
587 row[0] = tuple.Id.Id; 574 row[0] = tuple.Id.Id;
588 row[1] = tuple.Format; 575 row[1] = tuple.Format;
589 row[2] = tuple.Type; 576 row[2] = tuple.Type;
@@ -597,13 +584,12 @@ namespace WixToolset.Core.WindowsInstaller.Bind
597 row[9] = tuple.HelpKeyword; 584 row[9] = tuple.HelpKeyword;
598 } 585 }
599 586
600 private void AddMsiEmbeddedUITuple(MsiEmbeddedUITuple tuple, WindowsInstallerData output) 587 private void AddMsiEmbeddedUITuple(MsiEmbeddedUITuple tuple)
601 { 588 {
602 var attributes = tuple.EntryPoint ? WindowsInstallerConstants.MsidbEmbeddedUI : 0; 589 var attributes = tuple.EntryPoint ? WindowsInstallerConstants.MsidbEmbeddedUI : 0;
603 attributes |= tuple.SupportsBasicUI ? WindowsInstallerConstants.MsidbEmbeddedHandlesBasic : 0; 590 attributes |= tuple.SupportsBasicUI ? WindowsInstallerConstants.MsidbEmbeddedHandlesBasic : 0;
604 591
605 var table = output.EnsureTable(this.TableDefinitions["MsiEmbeddedUI"]); 592 var row = this.CreateRow(tuple, "MsiEmbeddedUI");
606 var row = table.CreateRow(tuple.SourceLineNumbers);
607 row[0] = tuple.Id.Id; 593 row[0] = tuple.Id.Id;
608 row[1] = tuple.FileName; 594 row[1] = tuple.FileName;
609 row[2] = attributes; 595 row[2] = attributes;
@@ -611,10 +597,9 @@ namespace WixToolset.Core.WindowsInstaller.Bind
611 row[4] = tuple.Source; 597 row[4] = tuple.Source;
612 } 598 }
613 599
614 private void AddMsiFileHashTuple(MsiFileHashTuple tuple, WindowsInstallerData output) 600 private void AddMsiFileHashTuple(MsiFileHashTuple tuple)
615 { 601 {
616 var table = output.EnsureTable(this.TableDefinitions["MsiFileHash"]); 602 var row = this.CreateRow(tuple, "MsiFileHash");
617 var row = table.CreateRow(tuple.SourceLineNumbers);
618 row[0] = tuple.Id.Id; 603 row[0] = tuple.Id.Id;
619 row[1] = tuple.Options; 604 row[1] = tuple.Options;
620 row[2] = tuple.HashPart1; 605 row[2] = tuple.HashPart1;
@@ -623,14 +608,13 @@ namespace WixToolset.Core.WindowsInstaller.Bind
623 row[5] = tuple.HashPart4; 608 row[5] = tuple.HashPart4;
624 } 609 }
625 610
626 private void AddMsiServiceConfigTuple(MsiServiceConfigTuple tuple, WindowsInstallerData output) 611 private void AddMsiServiceConfigTuple(MsiServiceConfigTuple tuple)
627 { 612 {
628 var events = tuple.OnInstall ? WindowsInstallerConstants.MsidbServiceConfigEventInstall : 0; 613 var events = tuple.OnInstall ? WindowsInstallerConstants.MsidbServiceConfigEventInstall : 0;
629 events |= tuple.OnReinstall ? WindowsInstallerConstants.MsidbServiceConfigEventReinstall : 0; 614 events |= tuple.OnReinstall ? WindowsInstallerConstants.MsidbServiceConfigEventReinstall : 0;
630 events |= tuple.OnUninstall ? WindowsInstallerConstants.MsidbServiceConfigEventUninstall : 0; 615 events |= tuple.OnUninstall ? WindowsInstallerConstants.MsidbServiceConfigEventUninstall : 0;
631 616
632 var table = output.EnsureTable(this.TableDefinitions["MsiServiceConfigFailureActions"]); 617 var row = this.CreateRow(tuple, "MsiServiceConfigFailureActions");
633 var row = table.CreateRow(tuple.SourceLineNumbers);
634 row[0] = tuple.Id.Id; 618 row[0] = tuple.Id.Id;
635 row[1] = tuple.Name; 619 row[1] = tuple.Name;
636 row[2] = events; 620 row[2] = events;
@@ -639,14 +623,13 @@ namespace WixToolset.Core.WindowsInstaller.Bind
639 row[5] = tuple.ComponentRef; 623 row[5] = tuple.ComponentRef;
640 } 624 }
641 625
642 private void AddMsiServiceConfigFailureActionsTuple(MsiServiceConfigFailureActionsTuple tuple, WindowsInstallerData output) 626 private void AddMsiServiceConfigFailureActionsTuple(MsiServiceConfigFailureActionsTuple tuple)
643 { 627 {
644 var events = tuple.OnInstall ? WindowsInstallerConstants.MsidbServiceConfigEventInstall : 0; 628 var events = tuple.OnInstall ? WindowsInstallerConstants.MsidbServiceConfigEventInstall : 0;
645 events |= tuple.OnReinstall ? WindowsInstallerConstants.MsidbServiceConfigEventReinstall : 0; 629 events |= tuple.OnReinstall ? WindowsInstallerConstants.MsidbServiceConfigEventReinstall : 0;
646 events |= tuple.OnUninstall ? WindowsInstallerConstants.MsidbServiceConfigEventUninstall : 0; 630 events |= tuple.OnUninstall ? WindowsInstallerConstants.MsidbServiceConfigEventUninstall : 0;
647 631
648 var table = output.EnsureTable(this.TableDefinitions["MsiServiceConfig"]); 632 var row = this.CreateRow(tuple, "MsiServiceConfig");
649 var row = table.CreateRow(tuple.SourceLineNumbers);
650 row[0] = tuple.Id.Id; 633 row[0] = tuple.Id.Id;
651 row[1] = tuple.Name; 634 row[1] = tuple.Name;
652 row[2] = events; 635 row[2] = events;
@@ -658,10 +641,9 @@ namespace WixToolset.Core.WindowsInstaller.Bind
658 row[8] = tuple.ComponentRef; 641 row[8] = tuple.ComponentRef;
659 } 642 }
660 643
661 private void AddMoveFileTuple(MoveFileTuple tuple, WindowsInstallerData output) 644 private void AddMoveFileTuple(MoveFileTuple tuple)
662 { 645 {
663 var table = output.EnsureTable(this.TableDefinitions["MoveFile"]); 646 var row = this.CreateRow(tuple, "MoveFile");
664 var row = table.CreateRow(tuple.SourceLineNumbers);
665 row[0] = tuple.Id.Id; 647 row[0] = tuple.Id.Id;
666 row[1] = tuple.ComponentRef; 648 row[1] = tuple.ComponentRef;
667 row[2] = tuple.SourceName; 649 row[2] = tuple.SourceName;
@@ -671,26 +653,24 @@ namespace WixToolset.Core.WindowsInstaller.Bind
671 row[6] = tuple.Delete ? WindowsInstallerConstants.MsidbMoveFileOptionsMove : 0; 653 row[6] = tuple.Delete ? WindowsInstallerConstants.MsidbMoveFileOptionsMove : 0;
672 } 654 }
673 655
674 private void AddPropertyTuple(PropertyTuple tuple, WindowsInstallerData output) 656 private void AddPropertyTuple(PropertyTuple tuple)
675 { 657 {
676 if (String.IsNullOrEmpty(tuple.Value)) 658 if (String.IsNullOrEmpty(tuple.Value))
677 { 659 {
678 return; 660 return;
679 } 661 }
680 662
681 var table = output.EnsureTable(this.TableDefinitions["Property"]); 663 var row = (PropertyRow)this.CreateRow(tuple, "Property");
682 var row = (PropertyRow)table.CreateRow(tuple.SourceLineNumbers);
683 row.Property = tuple.Id.Id; 664 row.Property = tuple.Id.Id;
684 row.Value = tuple.Value; 665 row.Value = tuple.Value;
685 } 666 }
686 667
687 private void AddRemoveFileTuple(RemoveFileTuple tuple, WindowsInstallerData output) 668 private void AddRemoveFileTuple(RemoveFileTuple tuple)
688 { 669 {
689 var installMode = tuple.OnInstall == true ? WindowsInstallerConstants.MsidbRemoveFileInstallModeOnInstall : 0; 670 var installMode = tuple.OnInstall == true ? WindowsInstallerConstants.MsidbRemoveFileInstallModeOnInstall : 0;
690 installMode |= tuple.OnUninstall == true ? WindowsInstallerConstants.MsidbRemoveFileInstallModeOnRemove : 0; 671 installMode |= tuple.OnUninstall == true ? WindowsInstallerConstants.MsidbRemoveFileInstallModeOnRemove : 0;
691 672
692 var table = output.EnsureTable(this.TableDefinitions["RemoveFile"]); 673 var row = this.CreateRow(tuple, "RemoveFile");
693 var row = table.CreateRow(tuple.SourceLineNumbers);
694 row[0] = tuple.Id.Id; 674 row[0] = tuple.Id.Id;
695 row[1] = tuple.ComponentRef; 675 row[1] = tuple.ComponentRef;
696 row[2] = tuple.FileName; 676 row[2] = tuple.FileName;
@@ -698,7 +678,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
698 row[4] = installMode; 678 row[4] = installMode;
699 } 679 }
700 680
701 private void AddRegistryTuple(RegistryTuple tuple, WindowsInstallerData output) 681 private void AddRegistryTuple(RegistryTuple tuple)
702 { 682 {
703 var value = tuple.Value; 683 var value = tuple.Value;
704 684
@@ -740,8 +720,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
740 break; 720 break;
741 } 721 }
742 722
743 var table = output.EnsureTable(this.TableDefinitions["Registry"]); 723 var row = this.CreateRow(tuple, "Registry");
744 var row = table.CreateRow(tuple.SourceLineNumbers);
745 row[0] = tuple.Id.Id; 724 row[0] = tuple.Id.Id;
746 row[1] = tuple.Root; 725 row[1] = tuple.Root;
747 row[2] = tuple.Key; 726 row[2] = tuple.Key;
@@ -750,13 +729,12 @@ namespace WixToolset.Core.WindowsInstaller.Bind
750 row[5] = tuple.ComponentRef; 729 row[5] = tuple.ComponentRef;
751 } 730 }
752 731
753 private void AddRegLocatorTuple(RegLocatorTuple tuple, WindowsInstallerData output) 732 private void AddRegLocatorTuple(RegLocatorTuple tuple)
754 { 733 {
755 var type = (int)tuple.Type; 734 var type = (int)tuple.Type;
756 type |= tuple.Win64 ? WindowsInstallerConstants.MsidbLocatorType64bit : 0; 735 type |= tuple.Win64 ? WindowsInstallerConstants.MsidbLocatorType64bit : 0;
757 736
758 var table = output.EnsureTable(this.TableDefinitions["RegLocator"]); 737 var row = this.CreateRow(tuple, "RegLocator");
759 var row = table.CreateRow(tuple.SourceLineNumbers);
760 row[0] = tuple.Id.Id; 738 row[0] = tuple.Id.Id;
761 row[1] = tuple.Root; 739 row[1] = tuple.Root;
762 row[2] = tuple.Key; 740 row[2] = tuple.Key;
@@ -764,12 +742,11 @@ namespace WixToolset.Core.WindowsInstaller.Bind
764 row[4] = type; 742 row[4] = type;
765 } 743 }
766 744
767 private void AddRemoveRegistryTuple(RemoveRegistryTuple tuple, WindowsInstallerData output) 745 private void AddRemoveRegistryTuple(RemoveRegistryTuple tuple)
768 { 746 {
769 if (tuple.Action == RemoveRegistryActionType.RemoveOnInstall) 747 if (tuple.Action == RemoveRegistryActionType.RemoveOnInstall)
770 { 748 {
771 var table = output.EnsureTable(this.TableDefinitions["RemoveRegistry"]); 749 var row = this.CreateRow(tuple, "RemoveRegistry");
772 var row = table.CreateRow(tuple.SourceLineNumbers);
773 row[0] = tuple.Id.Id; 750 row[0] = tuple.Id.Id;
774 row[1] = tuple.Root; 751 row[1] = tuple.Root;
775 row[2] = tuple.Key; 752 row[2] = tuple.Key;
@@ -778,8 +755,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
778 } 755 }
779 else // Registry table is used to remove registry keys on uninstall. 756 else // Registry table is used to remove registry keys on uninstall.
780 { 757 {
781 var table = output.EnsureTable(this.TableDefinitions["Registry"]); 758 var row = this.CreateRow(tuple, "Registry");
782 var row = table.CreateRow(tuple.SourceLineNumbers);
783 row[0] = tuple.Id.Id; 759 row[0] = tuple.Id.Id;
784 row[1] = tuple.Root; 760 row[1] = tuple.Root;
785 row[2] = tuple.Key; 761 row[2] = tuple.Key;
@@ -788,7 +764,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
788 } 764 }
789 } 765 }
790 766
791 private void AddServiceControlTuple(ServiceControlTuple tuple, WindowsInstallerData output) 767 private void AddServiceControlTuple(ServiceControlTuple tuple)
792 { 768 {
793 var events = tuple.InstallRemove ? WindowsInstallerConstants.MsidbServiceControlEventDelete : 0; 769 var events = tuple.InstallRemove ? WindowsInstallerConstants.MsidbServiceControlEventDelete : 0;
794 events |= tuple.UninstallRemove ? WindowsInstallerConstants.MsidbServiceControlEventUninstallDelete : 0; 770 events |= tuple.UninstallRemove ? WindowsInstallerConstants.MsidbServiceControlEventUninstallDelete : 0;
@@ -797,8 +773,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
797 events |= tuple.InstallStop ? WindowsInstallerConstants.MsidbServiceControlEventStop : 0; 773 events |= tuple.InstallStop ? WindowsInstallerConstants.MsidbServiceControlEventStop : 0;
798 events |= tuple.UninstallStop ? WindowsInstallerConstants.MsidbServiceControlEventUninstallStop : 0; 774 events |= tuple.UninstallStop ? WindowsInstallerConstants.MsidbServiceControlEventUninstallStop : 0;
799 775
800 var table = output.EnsureTable(this.TableDefinitions["ServiceControl"]); 776 var row = this.CreateRow(tuple, "ServiceControl");
801 var row = table.CreateRow(tuple.SourceLineNumbers);
802 row[0] = tuple.Id.Id; 777 row[0] = tuple.Id.Id;
803 row[1] = tuple.Name; 778 row[1] = tuple.Name;
804 row[2] = events; 779 row[2] = events;
@@ -810,7 +785,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
810 row[5] = tuple.ComponentRef; 785 row[5] = tuple.ComponentRef;
811 } 786 }
812 787
813 private void AddServiceInstallTuple(ServiceInstallTuple tuple, WindowsInstallerData output) 788 private void AddServiceInstallTuple(ServiceInstallTuple tuple)
814 { 789 {
815 var errorControl = (int)tuple.ErrorControl; 790 var errorControl = (int)tuple.ErrorControl;
816 errorControl |= tuple.Vital ? WindowsInstallerConstants.MsidbServiceInstallErrorControlVital : 0; 791 errorControl |= tuple.Vital ? WindowsInstallerConstants.MsidbServiceInstallErrorControlVital : 0;
@@ -818,8 +793,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
818 var serviceType = (int)tuple.ServiceType; 793 var serviceType = (int)tuple.ServiceType;
819 serviceType |= tuple.Interactive ? WindowsInstallerConstants.MsidbServiceInstallInteractive : 0; 794 serviceType |= tuple.Interactive ? WindowsInstallerConstants.MsidbServiceInstallInteractive : 0;
820 795
821 var table = output.EnsureTable(this.TableDefinitions["ServiceInstall"]); 796 var row = this.CreateRow(tuple, "ServiceInstall");
822 var row = table.CreateRow(tuple.SourceLineNumbers);
823 row[0] = tuple.Id.Id; 797 row[0] = tuple.Id.Id;
824 row[1] = tuple.Name; 798 row[1] = tuple.Name;
825 row[2] = tuple.DisplayName; 799 row[2] = tuple.DisplayName;
@@ -835,10 +809,9 @@ namespace WixToolset.Core.WindowsInstaller.Bind
835 row[12] = tuple.Description; 809 row[12] = tuple.Description;
836 } 810 }
837 811
838 private void AddShortcutTuple(ShortcutTuple tuple, WindowsInstallerData output) 812 private void AddShortcutTuple(ShortcutTuple tuple)
839 { 813 {
840 var table = output.EnsureTable(this.TableDefinitions["Shortcut"]); 814 var row = this.CreateRow(tuple, "Shortcut");
841 var row = table.CreateRow(tuple.SourceLineNumbers);
842 row[0] = tuple.Id.Id; 815 row[0] = tuple.Id.Id;
843 row[1] = tuple.DirectoryRef; 816 row[1] = tuple.DirectoryRef;
844 row[2] = GetMsiFilenameValue(tuple.ShortName, tuple.Name); 817 row[2] = GetMsiFilenameValue(tuple.ShortName, tuple.Name);
@@ -857,7 +830,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
857 row[15] = tuple.DescriptionResourceId; 830 row[15] = tuple.DescriptionResourceId;
858 } 831 }
859 832
860 private void AddTextStyleTuple(TextStyleTuple tuple, WindowsInstallerData output) 833 private void AddTextStyleTuple(TextStyleTuple tuple)
861 { 834 {
862 var styleBits = tuple.Bold ? WindowsInstallerConstants.MsidbTextStyleStyleBitsBold : 0; 835 var styleBits = tuple.Bold ? WindowsInstallerConstants.MsidbTextStyleStyleBitsBold : 0;
863 styleBits |= tuple.Italic ? WindowsInstallerConstants.MsidbTextStyleStyleBitsItalic : 0; 836 styleBits |= tuple.Italic ? WindowsInstallerConstants.MsidbTextStyleStyleBitsItalic : 0;
@@ -873,8 +846,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
873 color += (long)(tuple.Blue ?? 0) * 65536; 846 color += (long)(tuple.Blue ?? 0) * 65536;
874 } 847 }
875 848
876 var table = output.EnsureTable(this.TableDefinitions["TextStyle"]); 849 var row = this.CreateRow(tuple, "TextStyle");
877 var row = table.CreateRow(tuple.SourceLineNumbers);
878 row[0] = tuple.Id.Id; 850 row[0] = tuple.Id.Id;
879 row[1] = tuple.FaceName; 851 row[1] = tuple.FaceName;
880 row[2] = tuple.Size; 852 row[2] = tuple.Size;
@@ -882,10 +854,9 @@ namespace WixToolset.Core.WindowsInstaller.Bind
882 row[4] = styleBits == 0 ? null : (int?)styleBits; 854 row[4] = styleBits == 0 ? null : (int?)styleBits;
883 } 855 }
884 856
885 private void AddUpgradeTuple(UpgradeTuple tuple, WindowsInstallerData output) 857 private void AddUpgradeTuple(UpgradeTuple tuple)
886 { 858 {
887 var table = output.EnsureTable(this.TableDefinitions["Upgrade"]); 859 var row = (UpgradeRow)this.CreateRow(tuple, "Upgrade");
888 var row = (UpgradeRow)table.CreateRow(tuple.SourceLineNumbers);
889 row.UpgradeCode = tuple.UpgradeCode; 860 row.UpgradeCode = tuple.UpgradeCode;
890 row.VersionMin = tuple.VersionMin; 861 row.VersionMin = tuple.VersionMin;
891 row.VersionMax = tuple.VersionMax; 862 row.VersionMax = tuple.VersionMax;
@@ -902,72 +873,71 @@ namespace WixToolset.Core.WindowsInstaller.Bind
902 row.Attributes = attributes; 873 row.Attributes = attributes;
903 } 874 }
904 875
905 private void AddWixActionTuple(WixActionTuple tuple, WindowsInstallerData output) 876 private void AddWixActionTuple(WixActionTuple tuple)
906 { 877 {
907 // Get the table definition for the action (and ensure the proper table exists for a module). 878 // Get the table definition for the action (and ensure the proper table exists for a module).
908 TableDefinition sequenceTableDefinition = null; 879 string sequenceTableName = null;
909 switch (tuple.SequenceTable) 880 switch (tuple.SequenceTable)
910 { 881 {
911 case SequenceTable.AdminExecuteSequence: 882 case SequenceTable.AdminExecuteSequence:
912 if (OutputType.Module == output.Type) 883 if (OutputType.Module == this.Output.Type)
913 { 884 {
914 output.EnsureTable(this.TableDefinitions["AdminExecuteSequence"]); 885 this.Output.EnsureTable(this.TableDefinitions["AdminExecuteSequence"]);
915 sequenceTableDefinition = this.TableDefinitions["ModuleAdminExecuteSequence"]; 886 sequenceTableName = "ModuleAdminExecuteSequence";
916 } 887 }
917 else 888 else
918 { 889 {
919 sequenceTableDefinition = this.TableDefinitions["AdminExecuteSequence"]; 890 sequenceTableName = "AdminExecuteSequence";
920 } 891 }
921 break; 892 break;
922 case SequenceTable.AdminUISequence: 893 case SequenceTable.AdminUISequence:
923 if (OutputType.Module == output.Type) 894 if (OutputType.Module == this.Output.Type)
924 { 895 {
925 output.EnsureTable(this.TableDefinitions["AdminUISequence"]); 896 this.Output.EnsureTable(this.TableDefinitions["AdminUISequence"]);
926 sequenceTableDefinition = this.TableDefinitions["ModuleAdminUISequence"]; 897 sequenceTableName = "ModuleAdminUISequence";
927 } 898 }
928 else 899 else
929 { 900 {
930 sequenceTableDefinition = this.TableDefinitions["AdminUISequence"]; 901 sequenceTableName = "AdminUISequence";
931 } 902 }
932 break; 903 break;
933 case SequenceTable.AdvertiseExecuteSequence: 904 case SequenceTable.AdvertiseExecuteSequence:
934 if (OutputType.Module == output.Type) 905 if (OutputType.Module == this.Output.Type)
935 { 906 {
936 output.EnsureTable(this.TableDefinitions["AdvtExecuteSequence"]); 907 this.Output.EnsureTable(this.TableDefinitions["AdvtExecuteSequence"]);
937 sequenceTableDefinition = this.TableDefinitions["ModuleAdvtExecuteSequence"]; 908 sequenceTableName = "ModuleAdvtExecuteSequence";
938 } 909 }
939 else 910 else
940 { 911 {
941 sequenceTableDefinition = this.TableDefinitions["AdvtExecuteSequence"]; 912 sequenceTableName = "AdvtExecuteSequence";
942 } 913 }
943 break; 914 break;
944 case SequenceTable.InstallExecuteSequence: 915 case SequenceTable.InstallExecuteSequence:
945 if (OutputType.Module == output.Type) 916 if (OutputType.Module == this.Output.Type)
946 { 917 {
947 output.EnsureTable(this.TableDefinitions["InstallExecuteSequence"]); 918 this.Output.EnsureTable(this.TableDefinitions["InstallExecuteSequence"]);
948 sequenceTableDefinition = this.TableDefinitions["ModuleInstallExecuteSequence"]; 919 sequenceTableName = "ModuleInstallExecuteSequence";
949 } 920 }
950 else 921 else
951 { 922 {
952 sequenceTableDefinition = this.TableDefinitions["InstallExecuteSequence"]; 923 sequenceTableName = "InstallExecuteSequence";
953 } 924 }
954 break; 925 break;
955 case SequenceTable.InstallUISequence: 926 case SequenceTable.InstallUISequence:
956 if (OutputType.Module == output.Type) 927 if (OutputType.Module == this.Output.Type)
957 { 928 {
958 output.EnsureTable(this.TableDefinitions["InstallUISequence"]); 929 this.Output.EnsureTable(this.TableDefinitions["InstallUISequence"]);
959 sequenceTableDefinition = this.TableDefinitions["ModuleInstallUISequence"]; 930 sequenceTableName = "ModuleInstallUISequence";
960 } 931 }
961 else 932 else
962 { 933 {
963 sequenceTableDefinition = this.TableDefinitions["InstallUISequence"]; 934 sequenceTableName = "InstallUISequence";
964 } 935 }
965 break; 936 break;
966 } 937 }
967 938
968 // create the action sequence row in the output 939 // create the action sequence row in the output
969 var sequenceTable = output.EnsureTable(sequenceTableDefinition); 940 var row = this.CreateRow(tuple, sequenceTableName);
970 var row = sequenceTable.CreateRow(tuple.SourceLineNumbers);
971 941
972 if (SectionType.Module == this.Section.Type) 942 if (SectionType.Module == this.Section.Type)
973 { 943 {
@@ -992,7 +962,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
992 } 962 }
993 } 963 }
994 964
995 private void AddWixCustomRowTuple(WixCustomRowTuple tuple, WindowsInstallerData output) 965 private void AddWixCustomRowTuple(WixCustomRowTuple tuple)
996 { 966 {
997 var customTableDefinition = this.TableDefinitions[tuple.Table]; 967 var customTableDefinition = this.TableDefinitions[tuple.Table];
998 968
@@ -1002,8 +972,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
1002 return; 972 return;
1003 } 973 }
1004 974
1005 var customTable = output.EnsureTable(customTableDefinition); 975 var customRow = this.CreateRow(tuple, customTableDefinition);
1006 var customRow = customTable.CreateRow(tuple.SourceLineNumbers);
1007 976
1008#if TODO // SectionId seems like a good thing to preserve. 977#if TODO // SectionId seems like a good thing to preserve.
1009 customRow.SectionId = tuple.SectionId; 978 customRow.SectionId = tuple.SectionId;
@@ -1073,16 +1042,15 @@ namespace WixToolset.Core.WindowsInstaller.Bind
1073 } 1042 }
1074 } 1043 }
1075 1044
1076 private void AddWixEnsureTableTuple(WixEnsureTableTuple tuple, WindowsInstallerData output) 1045 private void AddWixEnsureTableTuple(WixEnsureTableTuple tuple)
1077 { 1046 {
1078 var tableDefinition = this.TableDefinitions[tuple.Table]; 1047 var tableDefinition = this.TableDefinitions[tuple.Table];
1079 output.EnsureTable(tableDefinition); 1048 this.Output.EnsureTable(tableDefinition);
1080 } 1049 }
1081 1050
1082 private void AddWixMediaTemplateTuple(WixMediaTemplateTuple tuple, WindowsInstallerData output) 1051 private void AddWixMediaTemplateTuple(WixMediaTemplateTuple tuple)
1083 { 1052 {
1084 var table = output.EnsureTable(this.TableDefinitions["WixMediaTemplate"]); 1053 var row = (WixMediaTemplateRow)this.CreateRow(tuple, "WixMediaTemplate");
1085 var row = (WixMediaTemplateRow)table.CreateRow(tuple.SourceLineNumbers);
1086 row.CabinetTemplate = tuple.CabinetTemplate; 1054 row.CabinetTemplate = tuple.CabinetTemplate;
1087 row.CompressionLevel = tuple.CompressionLevel; 1055 row.CompressionLevel = tuple.CompressionLevel;
1088 row.DiskPrompt = tuple.DiskPrompt; 1056 row.DiskPrompt = tuple.DiskPrompt;
@@ -1091,26 +1059,25 @@ namespace WixToolset.Core.WindowsInstaller.Bind
1091 row.MaximumCabinetSizeForLargeFileSplitting = tuple.MaximumCabinetSizeForLargeFileSplitting ?? MaxValueOfMaxCabSizeForLargeFileSplitting; 1059 row.MaximumCabinetSizeForLargeFileSplitting = tuple.MaximumCabinetSizeForLargeFileSplitting ?? MaxValueOfMaxCabSizeForLargeFileSplitting;
1092 } 1060 }
1093 1061
1094 private void AddTupleFromExtension(IntermediateTuple tuple, WindowsInstallerData output) 1062 private void AddTupleFromExtension(IntermediateTuple tuple)
1095 { 1063 {
1096 foreach (var extension in this.BackendExtensions) 1064 foreach (var extension in this.BackendExtensions)
1097 { 1065 {
1098 if (extension.TryAddTupleToOutput(tuple, output)) 1066 if (extension.TryAddTupleToOutput(tuple, this.Output))
1099 { 1067 {
1100 break; 1068 break;
1101 } 1069 }
1102 } 1070 }
1103 } 1071 }
1104 1072
1105 private void AddTupleDefaultly(IntermediateTuple tuple, WindowsInstallerData output, bool idIsPrimaryKey = false, string tableName = null) 1073 private void AddTupleDefaultly(IntermediateTuple tuple, bool idIsPrimaryKey = false, string tableName = null)
1106 { 1074 {
1107 if (!this.TableDefinitions.TryGet(tableName ?? tuple.Definition.Name, out var tableDefinition)) 1075 if (!this.TableDefinitions.TryGet(tableName ?? tuple.Definition.Name, out var tableDefinition))
1108 { 1076 {
1109 return; 1077 return;
1110 } 1078 }
1111 1079
1112 var table = output.EnsureTable(tableDefinition); 1080 var row = this.CreateRow(tuple, tableDefinition);
1113 var row = table.CreateRow(tuple.SourceLineNumbers);
1114 var rowOffset = 0; 1081 var rowOffset = 0;
1115 1082
1116 if (idIsPrimaryKey) 1083 if (idIsPrimaryKey)
@@ -1159,6 +1126,18 @@ namespace WixToolset.Core.WindowsInstaller.Bind
1159 } 1126 }
1160 } 1127 }
1161 1128
1129 private Row CreateRow(IntermediateTuple tuple, string tableDefinitionName) => this.CreateRow(tuple, this.TableDefinitions[tableDefinitionName]);
1130
1131 private Row CreateRow(IntermediateTuple tuple, TableDefinition tableDefinition)
1132 {
1133 var table = this.Output.EnsureTable(tableDefinition);
1134
1135 var row = table.CreateRow(tuple.SourceLineNumbers);
1136 row.SectionId = this.Section.Id;
1137
1138 return row;
1139 }
1140
1162 private static string GetMsiFilenameValue(string shortName, string longName) 1141 private static string GetMsiFilenameValue(string shortName, string longName)
1163 { 1142 {
1164 if (String.IsNullOrEmpty(shortName) || String.Equals(shortName, longName, StringComparison.OrdinalIgnoreCase)) 1143 if (String.IsNullOrEmpty(shortName) || String.Equals(shortName, longName, StringComparison.OrdinalIgnoreCase))