aboutsummaryrefslogtreecommitdiff
path: root/src/WixToolset.Core.WindowsInstaller/Decompile
diff options
context:
space:
mode:
authorRob Mensching <rob@firegiant.com>2020-06-12 12:55:28 -0700
committerRob Mensching <rob@firegiant.com>2020-06-13 09:22:27 -0700
commitc0f1332a0e18e9d506fe80c328548b001dcf93df (patch)
tree4980dddd35350e79b00a61574feafa859e857e3f /src/WixToolset.Core.WindowsInstaller/Decompile
parent167d26d002b1412e72d96ed2bbc0761fc0f1344b (diff)
downloadwix-c0f1332a0e18e9d506fe80c328548b001dcf93df.tar.gz
wix-c0f1332a0e18e9d506fe80c328548b001dcf93df.tar.bz2
wix-c0f1332a0e18e9d506fe80c328548b001dcf93df.zip
Remove use of remaining WixXxxRows
Diffstat (limited to 'src/WixToolset.Core.WindowsInstaller/Decompile')
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Decompile/Decompiler.cs237
1 files changed, 113 insertions, 124 deletions
diff --git a/src/WixToolset.Core.WindowsInstaller/Decompile/Decompiler.cs b/src/WixToolset.Core.WindowsInstaller/Decompile/Decompiler.cs
index 54a92f3c..34f57284 100644
--- a/src/WixToolset.Core.WindowsInstaller/Decompile/Decompiler.cs
+++ b/src/WixToolset.Core.WindowsInstaller/Decompile/Decompiler.cs
@@ -262,23 +262,23 @@ namespace WixToolset.Core.WindowsInstaller
262 /// <summary> 262 /// <summary>
263 /// Creates an action element. 263 /// Creates an action element.
264 /// </summary> 264 /// </summary>
265 /// <param name="actionRow">The action row from which the element should be created.</param> 265 /// <param name="actionTuple">The action from which the element should be created.</param>
266 private void CreateActionElement(WixActionRow actionRow) 266 private void CreateActionElement(WixActionTuple actionTuple)
267 { 267 {
268 Wix.ISchemaElement actionElement = null; 268 Wix.ISchemaElement actionElement = null;
269 269
270 if (null != this.core.GetIndexedElement("CustomAction", actionRow.Action)) // custom action 270 if (null != this.core.GetIndexedElement("CustomAction", actionTuple.Action)) // custom action
271 { 271 {
272 var custom = new Wix.Custom(); 272 var custom = new Wix.Custom();
273 273
274 custom.Action = actionRow.Action; 274 custom.Action = actionTuple.Action;
275 275
276 if (null != actionRow.Condition) 276 if (null != actionTuple.Condition)
277 { 277 {
278 custom.Content = actionRow.Condition; 278 custom.Content = actionTuple.Condition;
279 } 279 }
280 280
281 switch (actionRow.Sequence) 281 switch (actionTuple.Sequence)
282 { 282 {
283 case (-4): 283 case (-4):
284 custom.OnExit = Wix.ExitType.suspend; 284 custom.OnExit = Wix.ExitType.suspend;
@@ -293,35 +293,35 @@ namespace WixToolset.Core.WindowsInstaller
293 custom.OnExit = Wix.ExitType.success; 293 custom.OnExit = Wix.ExitType.success;
294 break; 294 break;
295 default: 295 default:
296 if (null != actionRow.Before) 296 if (null != actionTuple.Before)
297 { 297 {
298 custom.Before = actionRow.Before; 298 custom.Before = actionTuple.Before;
299 } 299 }
300 else if (null != actionRow.After) 300 else if (null != actionTuple.After)
301 { 301 {
302 custom.After = actionRow.After; 302 custom.After = actionTuple.After;
303 } 303 }
304 else if (0 < actionRow.Sequence) 304 else if (actionTuple.Sequence.HasValue)
305 { 305 {
306 custom.Sequence = actionRow.Sequence; 306 custom.Sequence = actionTuple.Sequence.Value;
307 } 307 }
308 break; 308 break;
309 } 309 }
310 310
311 actionElement = custom; 311 actionElement = custom;
312 } 312 }
313 else if (null != this.core.GetIndexedElement("Dialog", actionRow.Action)) // dialog 313 else if (null != this.core.GetIndexedElement("Dialog", actionTuple.Action)) // dialog
314 { 314 {
315 var show = new Wix.Show(); 315 var show = new Wix.Show();
316 316
317 show.Dialog = actionRow.Action; 317 show.Dialog = actionTuple.Action;
318 318
319 if (null != actionRow.Condition) 319 if (null != actionTuple.Condition)
320 { 320 {
321 show.Content = actionRow.Condition; 321 show.Content = actionTuple.Condition;
322 } 322 }
323 323
324 switch (actionRow.Sequence) 324 switch (actionTuple.Sequence)
325 { 325 {
326 case (-4): 326 case (-4):
327 show.OnExit = Wix.ExitType.suspend; 327 show.OnExit = Wix.ExitType.suspend;
@@ -336,17 +336,17 @@ namespace WixToolset.Core.WindowsInstaller
336 show.OnExit = Wix.ExitType.success; 336 show.OnExit = Wix.ExitType.success;
337 break; 337 break;
338 default: 338 default:
339 if (null != actionRow.Before) 339 if (null != actionTuple.Before)
340 { 340 {
341 show.Before = actionRow.Before; 341 show.Before = actionTuple.Before;
342 } 342 }
343 else if (null != actionRow.After) 343 else if (null != actionTuple.After)
344 { 344 {
345 show.After = actionRow.After; 345 show.After = actionTuple.After;
346 } 346 }
347 else if (0 < actionRow.Sequence) 347 else if (actionTuple.Sequence.HasValue)
348 { 348 {
349 show.Sequence = actionRow.Sequence; 349 show.Sequence = actionTuple.Sequence.Value;
350 } 350 }
351 break; 351 break;
352 } 352 }
@@ -355,18 +355,18 @@ namespace WixToolset.Core.WindowsInstaller
355 } 355 }
356 else // possibly a standard action without suggested sequence information 356 else // possibly a standard action without suggested sequence information
357 { 357 {
358 actionElement = this.CreateStandardActionElement(actionRow); 358 actionElement = this.CreateStandardActionElement(actionTuple);
359 } 359 }
360 360
361 // add the action element to the appropriate sequence element 361 // add the action element to the appropriate sequence element
362 if (null != actionElement) 362 if (null != actionElement)
363 { 363 {
364 var sequenceTable = actionRow.SequenceTable.ToString(); 364 var sequenceTable = actionTuple.SequenceTable.ToString();
365 var sequenceElement = (Wix.IParentElement)this.sequenceElements[sequenceTable]; 365 var sequenceElement = (Wix.IParentElement)this.sequenceElements[sequenceTable];
366 366
367 if (null == sequenceElement) 367 if (null == sequenceElement)
368 { 368 {
369 switch (actionRow.SequenceTable) 369 switch (actionTuple.SequenceTable)
370 { 370 {
371 case SequenceTable.AdminExecuteSequence: 371 case SequenceTable.AdminExecuteSequence:
372 sequenceElement = new Wix.AdminExecuteSequence(); 372 sequenceElement = new Wix.AdminExecuteSequence();
@@ -397,7 +397,7 @@ namespace WixToolset.Core.WindowsInstaller
397 } 397 }
398 catch (System.ArgumentException) // action/dialog is not valid for this sequence 398 catch (System.ArgumentException) // action/dialog is not valid for this sequence
399 { 399 {
400 this.Messaging.Write(WarningMessages.IllegalActionInSequence(actionRow.SourceLineNumbers, actionRow.SequenceTable.ToString(), actionRow.Action)); 400 this.Messaging.Write(WarningMessages.IllegalActionInSequence(actionTuple.SourceLineNumbers, actionTuple.SequenceTable.ToString(), actionTuple.Action));
401 } 401 }
402 } 402 }
403 } 403 }
@@ -405,40 +405,40 @@ namespace WixToolset.Core.WindowsInstaller
405 /// <summary> 405 /// <summary>
406 /// Creates a standard action element. 406 /// Creates a standard action element.
407 /// </summary> 407 /// </summary>
408 /// <param name="actionRow">The action row from which the element should be created.</param> 408 /// <param name="actionTuple">The action row from which the element should be created.</param>
409 /// <returns>The created element.</returns> 409 /// <returns>The created element.</returns>
410 private Wix.ISchemaElement CreateStandardActionElement(WixActionRow actionRow) 410 private Wix.ISchemaElement CreateStandardActionElement(WixActionTuple actionTuple)
411 { 411 {
412 Wix.ActionSequenceType actionElement = null; 412 Wix.ActionSequenceType actionElement = null;
413 413
414 switch (actionRow.Action) 414 switch (actionTuple.Action)
415 { 415 {
416 case "AllocateRegistrySpace": 416 case "AllocateRegistrySpace":
417 actionElement = new Wix.AllocateRegistrySpace(); 417 actionElement = new Wix.AllocateRegistrySpace();
418 break; 418 break;
419 case "AppSearch": 419 case "AppSearch":
420 this.StandardActions.TryGetValue(actionRow.GetPrimaryKey(), out var appSearchActionRow); 420 this.StandardActions.TryGetValue(actionTuple.Id.Id, out var appSearchActionRow);
421 421
422 if (null != actionRow.Before || null != actionRow.After || (null != appSearchActionRow && actionRow.Sequence != appSearchActionRow.Sequence)) 422 if (null != actionTuple.Before || null != actionTuple.After || (null != appSearchActionRow && actionTuple.Sequence != appSearchActionRow.Sequence))
423 { 423 {
424 var appSearch = new Wix.AppSearch(); 424 var appSearch = new Wix.AppSearch();
425 425
426 if (null != actionRow.Condition) 426 if (null != actionTuple.Condition)
427 { 427 {
428 appSearch.Content = actionRow.Condition; 428 appSearch.Content = actionTuple.Condition;
429 } 429 }
430 430
431 if (null != actionRow.Before) 431 if (null != actionTuple.Before)
432 { 432 {
433 appSearch.Before = actionRow.Before; 433 appSearch.Before = actionTuple.Before;
434 } 434 }
435 else if (null != actionRow.After) 435 else if (null != actionTuple.After)
436 { 436 {
437 appSearch.After = actionRow.After; 437 appSearch.After = actionTuple.After;
438 } 438 }
439 else if (0 < actionRow.Sequence) 439 else if (actionTuple.Sequence.HasValue)
440 { 440 {
441 appSearch.Sequence = actionRow.Sequence; 441 appSearch.Sequence = actionTuple.Sequence.Value;
442 } 442 }
443 443
444 return appSearch; 444 return appSearch;
@@ -449,7 +449,7 @@ namespace WixToolset.Core.WindowsInstaller
449 break; 449 break;
450 case "CCPSearch": 450 case "CCPSearch":
451 var ccpSearch = new Wix.CCPSearch(); 451 var ccpSearch = new Wix.CCPSearch();
452 Decompiler.SequenceRelativeAction(actionRow, ccpSearch); 452 Decompiler.SequenceRelativeAction(actionTuple, ccpSearch);
453 return ccpSearch; 453 return ccpSearch;
454 case "CostFinalize": 454 case "CostFinalize":
455 actionElement = new Wix.CostFinalize(); 455 actionElement = new Wix.CostFinalize();
@@ -468,7 +468,7 @@ namespace WixToolset.Core.WindowsInstaller
468 break; 468 break;
469 case "DisableRollback": 469 case "DisableRollback":
470 var disableRollback = new Wix.DisableRollback(); 470 var disableRollback = new Wix.DisableRollback();
471 Decompiler.SequenceRelativeAction(actionRow, disableRollback); 471 Decompiler.SequenceRelativeAction(actionTuple, disableRollback);
472 return disableRollback; 472 return disableRollback;
473 case "DuplicateFiles": 473 case "DuplicateFiles":
474 actionElement = new Wix.DuplicateFiles(); 474 actionElement = new Wix.DuplicateFiles();
@@ -481,22 +481,22 @@ namespace WixToolset.Core.WindowsInstaller
481 break; 481 break;
482 case "FindRelatedProducts": 482 case "FindRelatedProducts":
483 var findRelatedProducts = new Wix.FindRelatedProducts(); 483 var findRelatedProducts = new Wix.FindRelatedProducts();
484 Decompiler.SequenceRelativeAction(actionRow, findRelatedProducts); 484 Decompiler.SequenceRelativeAction(actionTuple, findRelatedProducts);
485 return findRelatedProducts; 485 return findRelatedProducts;
486 case "ForceReboot": 486 case "ForceReboot":
487 var forceReboot = new Wix.ForceReboot(); 487 var forceReboot = new Wix.ForceReboot();
488 Decompiler.SequenceRelativeAction(actionRow, forceReboot); 488 Decompiler.SequenceRelativeAction(actionTuple, forceReboot);
489 return forceReboot; 489 return forceReboot;
490 case "InstallAdminPackage": 490 case "InstallAdminPackage":
491 actionElement = new Wix.InstallAdminPackage(); 491 actionElement = new Wix.InstallAdminPackage();
492 break; 492 break;
493 case "InstallExecute": 493 case "InstallExecute":
494 var installExecute = new Wix.InstallExecute(); 494 var installExecute = new Wix.InstallExecute();
495 Decompiler.SequenceRelativeAction(actionRow, installExecute); 495 Decompiler.SequenceRelativeAction(actionTuple, installExecute);
496 return installExecute; 496 return installExecute;
497 case "InstallExecuteAgain": 497 case "InstallExecuteAgain":
498 var installExecuteAgain = new Wix.InstallExecuteAgain(); 498 var installExecuteAgain = new Wix.InstallExecuteAgain();
499 Decompiler.SequenceRelativeAction(actionRow, installExecuteAgain); 499 Decompiler.SequenceRelativeAction(actionTuple, installExecuteAgain);
500 return installExecuteAgain; 500 return installExecuteAgain;
501 case "InstallFiles": 501 case "InstallFiles":
502 actionElement = new Wix.InstallFiles(); 502 actionElement = new Wix.InstallFiles();
@@ -521,7 +521,7 @@ namespace WixToolset.Core.WindowsInstaller
521 break; 521 break;
522 case "LaunchConditions": 522 case "LaunchConditions":
523 var launchConditions = new Wix.LaunchConditions(); 523 var launchConditions = new Wix.LaunchConditions();
524 Decompiler.SequenceRelativeAction(actionRow, launchConditions); 524 Decompiler.SequenceRelativeAction(actionTuple, launchConditions);
525 return launchConditions; 525 return launchConditions;
526 case "MigrateFeatureStates": 526 case "MigrateFeatureStates":
527 actionElement = new Wix.MigrateFeatureStates(); 527 actionElement = new Wix.MigrateFeatureStates();
@@ -585,7 +585,7 @@ namespace WixToolset.Core.WindowsInstaller
585 break; 585 break;
586 case "RemoveExistingProducts": 586 case "RemoveExistingProducts":
587 var removeExistingProducts = new Wix.RemoveExistingProducts(); 587 var removeExistingProducts = new Wix.RemoveExistingProducts();
588 Decompiler.SequenceRelativeAction(actionRow, removeExistingProducts); 588 Decompiler.SequenceRelativeAction(actionTuple, removeExistingProducts);
589 return removeExistingProducts; 589 return removeExistingProducts;
590 case "RemoveFiles": 590 case "RemoveFiles":
591 actionElement = new Wix.RemoveFiles(); 591 actionElement = new Wix.RemoveFiles();
@@ -607,15 +607,15 @@ namespace WixToolset.Core.WindowsInstaller
607 break; 607 break;
608 case "ResolveSource": 608 case "ResolveSource":
609 var resolveSource = new Wix.ResolveSource(); 609 var resolveSource = new Wix.ResolveSource();
610 Decompiler.SequenceRelativeAction(actionRow, resolveSource); 610 Decompiler.SequenceRelativeAction(actionTuple, resolveSource);
611 return resolveSource; 611 return resolveSource;
612 case "RMCCPSearch": 612 case "RMCCPSearch":
613 var rmccpSearch = new Wix.RMCCPSearch(); 613 var rmccpSearch = new Wix.RMCCPSearch();
614 Decompiler.SequenceRelativeAction(actionRow, rmccpSearch); 614 Decompiler.SequenceRelativeAction(actionTuple, rmccpSearch);
615 return rmccpSearch; 615 return rmccpSearch;
616 case "ScheduleReboot": 616 case "ScheduleReboot":
617 var scheduleReboot = new Wix.ScheduleReboot(); 617 var scheduleReboot = new Wix.ScheduleReboot();
618 Decompiler.SequenceRelativeAction(actionRow, scheduleReboot); 618 Decompiler.SequenceRelativeAction(actionTuple, scheduleReboot);
619 return scheduleReboot; 619 return scheduleReboot;
620 case "SelfRegModules": 620 case "SelfRegModules":
621 actionElement = new Wix.SelfRegModules(); 621 actionElement = new Wix.SelfRegModules();
@@ -672,13 +672,13 @@ namespace WixToolset.Core.WindowsInstaller
672 actionElement = new Wix.WriteRegistryValues(); 672 actionElement = new Wix.WriteRegistryValues();
673 break; 673 break;
674 default: 674 default:
675 this.Messaging.Write(WarningMessages.UnknownAction(actionRow.SourceLineNumbers, actionRow.SequenceTable.ToString(), actionRow.Action)); 675 this.Messaging.Write(WarningMessages.UnknownAction(actionTuple.SourceLineNumbers, actionTuple.SequenceTable.ToString(), actionTuple.Action));
676 return null; 676 return null;
677 } 677 }
678 678
679 if (actionElement != null) 679 if (actionElement != null)
680 { 680 {
681 this.SequenceStandardAction(actionRow, actionElement); 681 this.SequenceStandardAction(actionTuple, actionElement);
682 } 682 }
683 683
684 return actionElement; 684 return actionElement;
@@ -687,48 +687,48 @@ namespace WixToolset.Core.WindowsInstaller
687 /// <summary> 687 /// <summary>
688 /// Applies the condition and sequence to a standard action element based on the action row data. 688 /// Applies the condition and sequence to a standard action element based on the action row data.
689 /// </summary> 689 /// </summary>
690 /// <param name="actionRow">Action row data from the database.</param> 690 /// <param name="actionTuple">Action data from the database.</param>
691 /// <param name="actionElement">Element to be sequenced.</param> 691 /// <param name="actionElement">Element to be sequenced.</param>
692 private void SequenceStandardAction(WixActionRow actionRow, Wix.ActionSequenceType actionElement) 692 private void SequenceStandardAction(WixActionTuple actionTuple, Wix.ActionSequenceType actionElement)
693 { 693 {
694 if (null != actionRow.Condition) 694 if (null != actionTuple.Condition)
695 { 695 {
696 actionElement.Content = actionRow.Condition; 696 actionElement.Content = actionTuple.Condition;
697 } 697 }
698 698
699 if ((null != actionRow.Before || null != actionRow.After) && 0 == actionRow.Sequence) 699 if ((null != actionTuple.Before || null != actionTuple.After) && 0 == actionTuple.Sequence)
700 { 700 {
701 this.Messaging.Write(WarningMessages.DecompiledStandardActionRelativelyScheduledInModule(actionRow.SourceLineNumbers, actionRow.SequenceTable.ToString(), actionRow.Action)); 701 this.Messaging.Write(WarningMessages.DecompiledStandardActionRelativelyScheduledInModule(actionTuple.SourceLineNumbers, actionTuple.SequenceTable.ToString(), actionTuple.Action));
702 } 702 }
703 else if (0 < actionRow.Sequence) 703 else if (actionTuple.Sequence.HasValue)
704 { 704 {
705 actionElement.Sequence = actionRow.Sequence; 705 actionElement.Sequence = actionTuple.Sequence.Value;
706 } 706 }
707 } 707 }
708 708
709 /// <summary> 709 /// <summary>
710 /// Applies the condition and relative sequence to an action element based on the action row data. 710 /// Applies the condition and relative sequence to an action element based on the action row data.
711 /// </summary> 711 /// </summary>
712 /// <param name="actionRow">Action row data from the database.</param> 712 /// <param name="actionTuple">Action data from the database.</param>
713 /// <param name="actionElement">Element to be sequenced.</param> 713 /// <param name="actionElement">Element to be sequenced.</param>
714 private static void SequenceRelativeAction(WixActionRow actionRow, Wix.ActionModuleSequenceType actionElement) 714 private static void SequenceRelativeAction(WixActionTuple actionTuple, Wix.ActionModuleSequenceType actionElement)
715 { 715 {
716 if (null != actionRow.Condition) 716 if (null != actionTuple.Condition)
717 { 717 {
718 actionElement.Content = actionRow.Condition; 718 actionElement.Content = actionTuple.Condition;
719 } 719 }
720 720
721 if (null != actionRow.Before) 721 if (null != actionTuple.Before)
722 { 722 {
723 actionElement.Before = actionRow.Before; 723 actionElement.Before = actionTuple.Before;
724 } 724 }
725 else if (null != actionRow.After) 725 else if (null != actionTuple.After)
726 { 726 {
727 actionElement.After = actionRow.After; 727 actionElement.After = actionTuple.After;
728 } 728 }
729 else if (0 < actionRow.Sequence) 729 else if (actionTuple.Sequence.HasValue)
730 { 730 {
731 actionElement.Sequence = actionRow.Sequence; 731 actionElement.Sequence = actionTuple.Sequence.Value;
732 } 732 }
733 } 733 }
734 734
@@ -2495,7 +2495,7 @@ namespace WixToolset.Core.WindowsInstaller
2495 { 2495 {
2496 foreach (SequenceTable sequenceTable in Enum.GetValues(typeof(SequenceTable))) 2496 foreach (SequenceTable sequenceTable in Enum.GetValues(typeof(SequenceTable)))
2497 { 2497 {
2498 var sequenceTableName = GetSequenceTableName(sequenceTable); 2498 var sequenceTableName = sequenceTable.WindowsInstallerTableName();
2499 2499
2500 // if suppressing UI elements, skip UI-related sequence tables 2500 // if suppressing UI elements, skip UI-related sequence tables
2501 if (this.SuppressUI && ("AdminUISequence" == sequenceTableName || "InstallUISequence" == sequenceTableName)) 2501 if (this.SuppressUI && ("AdminUISequence" == sequenceTableName || "InstallUISequence" == sequenceTableName))
@@ -2503,57 +2503,57 @@ namespace WixToolset.Core.WindowsInstaller
2503 continue; 2503 continue;
2504 } 2504 }
2505 2505
2506 var actionsTable = new Table(this.tableDefinitions["WixAction"]);
2507 var table = tables[sequenceTableName]; 2506 var table = tables[sequenceTableName];
2508 2507
2509 if (null != table) 2508 if (null != table)
2510 { 2509 {
2511 var actionRows = new List<WixActionRow>(); 2510 var actionTuples = new List<WixActionTuple>();
2512 var needAbsoluteScheduling = this.SuppressRelativeActionSequencing; 2511 var needAbsoluteScheduling = this.SuppressRelativeActionSequencing;
2513 var nonSequencedActionRows = new Dictionary<string, WixActionRow>(); 2512 var nonSequencedActionRows = new Dictionary<string, WixActionTuple>();
2514 var suppressedRelativeActionRows = new Dictionary<string, WixActionRow>(); 2513 var suppressedRelativeActionRows = new Dictionary<string, WixActionTuple>();
2515 2514
2516 // create a sorted array of actions in this table 2515 // create a sorted array of actions in this table
2517 foreach (var row in table.Rows) 2516 foreach (var row in table.Rows)
2518 { 2517 {
2519 var actionRow = (WixActionRow)actionsTable.CreateRow(null); 2518 var action = row.FieldAsString(0);
2519 var actionTuple = new WixActionTuple(null, new Identifier(AccessModifier.Public, sequenceTable, action));
2520 2520
2521 actionRow.Action = Convert.ToString(row[0]); 2521 actionTuple.Action = action;
2522 2522
2523 if (null != row[1]) 2523 if (null != row[1])
2524 { 2524 {
2525 actionRow.Condition = Convert.ToString(row[1]); 2525 actionTuple.Condition = Convert.ToString(row[1]);
2526 } 2526 }
2527 2527
2528 actionRow.Sequence = Convert.ToInt32(row[2]); 2528 actionTuple.Sequence = Convert.ToInt32(row[2]);
2529 2529
2530 actionRow.SequenceTable = sequenceTable; 2530 actionTuple.SequenceTable = sequenceTable;
2531 2531
2532 actionRows.Add(actionRow); 2532 actionTuples.Add(actionTuple);
2533 } 2533 }
2534 actionRows.Sort(); 2534 actionTuples = actionTuples.OrderBy(t => t.Sequence).ToList();
2535 2535
2536 for (var i = 0; i < actionRows.Count && !needAbsoluteScheduling; i++) 2536 for (var i = 0; i < actionTuples.Count && !needAbsoluteScheduling; i++)
2537 { 2537 {
2538 var actionRow = actionRows[i]; 2538 var actionTuple = actionTuples[i];
2539 this.StandardActions.TryGetValue(actionRow.GetPrimaryKey(), out var standardActionRow); 2539 this.StandardActions.TryGetValue(actionTuple.Id.Id, out var standardActionRow);
2540 2540
2541 // create actions for custom actions, dialogs, AppSearch when its moved, and standard actions with non-standard conditions 2541 // create actions for custom actions, dialogs, AppSearch when its moved, and standard actions with non-standard conditions
2542 if ("AppSearch" == actionRow.Action || null == standardActionRow || actionRow.Condition != standardActionRow.Condition) 2542 if ("AppSearch" == actionTuple.Action || null == standardActionRow || actionTuple.Condition != standardActionRow.Condition)
2543 { 2543 {
2544 WixActionRow previousActionRow = null; 2544 WixActionTuple previousActionTuple = null;
2545 WixActionRow nextActionRow = null; 2545 WixActionTuple nextActionTuple = null;
2546 2546
2547 // find the previous action row if there is one 2547 // find the previous action row if there is one
2548 if (0 <= i - 1) 2548 if (0 <= i - 1)
2549 { 2549 {
2550 previousActionRow = actionRows[i - 1]; 2550 previousActionTuple = actionTuples[i - 1];
2551 } 2551 }
2552 2552
2553 // find the next action row if there is one 2553 // find the next action row if there is one
2554 if (actionRows.Count > i + 1) 2554 if (actionTuples.Count > i + 1)
2555 { 2555 {
2556 nextActionRow = actionRows[i + 1]; 2556 nextActionTuple = actionTuples[i + 1];
2557 } 2557 }
2558 2558
2559 // the logic for setting the before or after attribute for an action: 2559 // the logic for setting the before or after attribute for an action:
@@ -2565,49 +2565,49 @@ namespace WixToolset.Core.WindowsInstaller
2565 // 6. If this action is AppSearch and has all standard information, ignore it. 2565 // 6. If this action is AppSearch and has all standard information, ignore it.
2566 // 7. If this action is standard and has a non-standard condition, create the action without any scheduling information. 2566 // 7. If this action is standard and has a non-standard condition, create the action without any scheduling information.
2567 // 8. Everything must be absolutely sequenced. 2567 // 8. Everything must be absolutely sequenced.
2568 if ((null != previousActionRow && actionRow.Sequence == previousActionRow.Sequence) || (null != nextActionRow && actionRow.Sequence == nextActionRow.Sequence)) 2568 if ((null != previousActionTuple && actionTuple.Sequence == previousActionTuple.Sequence) || (null != nextActionTuple && actionTuple.Sequence == nextActionTuple.Sequence))
2569 { 2569 {
2570 needAbsoluteScheduling = true; 2570 needAbsoluteScheduling = true;
2571 } 2571 }
2572 else if (null != nextActionRow && this.StandardActions.ContainsKey(nextActionRow.GetPrimaryKey()) && actionRow.Sequence + 1 == nextActionRow.Sequence) 2572 else if (null != nextActionTuple && this.StandardActions.ContainsKey(nextActionTuple.Id.Id) && actionTuple.Sequence + 1 == nextActionTuple.Sequence)
2573 { 2573 {
2574 actionRow.Before = nextActionRow.Action; 2574 actionTuple.Before = nextActionTuple.Action;
2575 } 2575 }
2576 else if (null != previousActionRow && this.StandardActions.ContainsKey(previousActionRow.GetPrimaryKey()) && actionRow.Sequence - 1 == previousActionRow.Sequence) 2576 else if (null != previousActionTuple && this.StandardActions.ContainsKey(previousActionTuple.Id.Id) && actionTuple.Sequence - 1 == previousActionTuple.Sequence)
2577 { 2577 {
2578 actionRow.After = previousActionRow.Action; 2578 actionTuple.After = previousActionTuple.Action;
2579 } 2579 }
2580 else if (null == standardActionRow && null != previousActionRow && actionRow.Sequence - 1 == previousActionRow.Sequence && previousActionRow.Before != actionRow.Action) 2580 else if (null == standardActionRow && null != previousActionTuple && actionTuple.Sequence - 1 == previousActionTuple.Sequence && previousActionTuple.Before != actionTuple.Action)
2581 { 2581 {
2582 actionRow.After = previousActionRow.Action; 2582 actionTuple.After = previousActionTuple.Action;
2583 } 2583 }
2584 else if (null == standardActionRow && null != previousActionRow && actionRow.Sequence != previousActionRow.Sequence && null != nextActionRow && actionRow.Sequence + 1 == nextActionRow.Sequence) 2584 else if (null == standardActionRow && null != previousActionTuple && actionTuple.Sequence != previousActionTuple.Sequence && null != nextActionTuple && actionTuple.Sequence + 1 == nextActionTuple.Sequence)
2585 { 2585 {
2586 actionRow.Before = nextActionRow.Action; 2586 actionTuple.Before = nextActionTuple.Action;
2587 } 2587 }
2588 else if ("AppSearch" == actionRow.Action && null != standardActionRow && actionRow.Sequence == standardActionRow.Sequence && actionRow.Condition == standardActionRow.Condition) 2588 else if ("AppSearch" == actionTuple.Action && null != standardActionRow && actionTuple.Sequence == standardActionRow.Sequence && actionTuple.Condition == standardActionRow.Condition)
2589 { 2589 {
2590 // ignore an AppSearch row which has the WiX standard sequence and a standard condition 2590 // ignore an AppSearch row which has the WiX standard sequence and a standard condition
2591 } 2591 }
2592 else if (null != standardActionRow && actionRow.Condition != standardActionRow.Condition) // standard actions get their standard sequence numbers 2592 else if (null != standardActionRow && actionTuple.Condition != standardActionRow.Condition) // standard actions get their standard sequence numbers
2593 { 2593 {
2594 nonSequencedActionRows.Add(actionRow.GetPrimaryKey(), actionRow); 2594 nonSequencedActionRows.Add(actionTuple.Id.Id, actionTuple);
2595 } 2595 }
2596 else if (0 < actionRow.Sequence) 2596 else if (0 < actionTuple.Sequence)
2597 { 2597 {
2598 needAbsoluteScheduling = true; 2598 needAbsoluteScheduling = true;
2599 } 2599 }
2600 } 2600 }
2601 else 2601 else
2602 { 2602 {
2603 suppressedRelativeActionRows.Add(actionRow.GetPrimaryKey(), actionRow); 2603 suppressedRelativeActionRows.Add(actionTuple.Id.Id, actionTuple);
2604 } 2604 }
2605 } 2605 }
2606 2606
2607 // create the actions now that we know if they must be absolutely or relatively scheduled 2607 // create the actions now that we know if they must be absolutely or relatively scheduled
2608 foreach (var actionRow in actionRows) 2608 foreach (var actionRow in actionTuples)
2609 { 2609 {
2610 var key = actionRow.GetPrimaryKey(); 2610 var key = actionRow.Id.Id;
2611 2611
2612 if (needAbsoluteScheduling) 2612 if (needAbsoluteScheduling)
2613 { 2613 {
@@ -2636,7 +2636,7 @@ namespace WixToolset.Core.WindowsInstaller
2636 { 2636 {
2637 foreach (SequenceTable sequenceTable in Enum.GetValues(typeof(SequenceTable))) 2637 foreach (SequenceTable sequenceTable in Enum.GetValues(typeof(SequenceTable)))
2638 { 2638 {
2639 var sequenceTableName = GetSequenceTableName(sequenceTable); 2639 var sequenceTableName = sequenceTable.WindowsInstallerTableName();
2640 2640
2641 // if suppressing UI elements, skip UI-related sequence tables 2641 // if suppressing UI elements, skip UI-related sequence tables
2642 if (this.SuppressUI && ("AdminUISequence" == sequenceTableName || "InstallUISequence" == sequenceTableName)) 2642 if (this.SuppressUI && ("AdminUISequence" == sequenceTableName || "InstallUISequence" == sequenceTableName))
@@ -2651,9 +2651,9 @@ namespace WixToolset.Core.WindowsInstaller
2651 { 2651 {
2652 foreach (var row in table.Rows) 2652 foreach (var row in table.Rows)
2653 { 2653 {
2654 var actionRow = (WixActionRow)actionsTable.CreateRow(null); 2654 var actionRow = new WixActionTuple(null, new Identifier(AccessModifier.Public, sequenceTable, row.FieldAsString(0)));
2655 2655
2656 actionRow.Action = Convert.ToString(row[0]); 2656 actionRow.Action = row.FieldAsString(0);
2657 2657
2658 if (null != row[1]) 2658 if (null != row[1])
2659 { 2659 {
@@ -2684,7 +2684,7 @@ namespace WixToolset.Core.WindowsInstaller
2684 actionRow.SequenceTable = sequenceTable; 2684 actionRow.SequenceTable = sequenceTable;
2685 2685
2686 // create action elements for non-standard actions 2686 // create action elements for non-standard actions
2687 if (!this.StandardActions.ContainsKey(actionRow.GetPrimaryKey()) || null != actionRow.After || null != actionRow.Before) 2687 if (!this.StandardActions.ContainsKey(actionRow.Id.Id) || null != actionRow.After || null != actionRow.Before)
2688 { 2688 {
2689 this.CreateActionElement(actionRow); 2689 this.CreateActionElement(actionRow);
2690 } 2690 }
@@ -2844,17 +2844,6 @@ namespace WixToolset.Core.WindowsInstaller
2844 } 2844 }
2845 } 2845 }
2846 2846
2847 private static string GetSequenceTableName(SequenceTable sequenceTable)
2848 {
2849 switch (sequenceTable)
2850 {
2851 case SequenceTable.AdvertiseExecuteSequence:
2852 return "AdvtExecuteSequence";
2853 default:
2854 return sequenceTable.ToString();
2855 }
2856 }
2857
2858 /// <summary> 2847 /// <summary>
2859 /// Get the path to a file in the source image. 2848 /// Get the path to a file in the source image.
2860 /// </summary> 2849 /// </summary>