From 6ff680e386b1543ad1a58d1b1d465ce8aa20bc7d Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Fri, 24 Jan 2020 15:27:20 -0800 Subject: Start on new patch infrastructure --- .../Bind/BindTransformCommand.cs | 197 ++++++++++----------- 1 file changed, 95 insertions(+), 102 deletions(-) (limited to 'src/WixToolset.Core.WindowsInstaller/Bind/BindTransformCommand.cs') diff --git a/src/WixToolset.Core.WindowsInstaller/Bind/BindTransformCommand.cs b/src/WixToolset.Core.WindowsInstaller/Bind/BindTransformCommand.cs index 8757024e..ea6e4f31 100644 --- a/src/WixToolset.Core.WindowsInstaller/Bind/BindTransformCommand.cs +++ b/src/WixToolset.Core.WindowsInstaller/Bind/BindTransformCommand.cs @@ -15,24 +15,37 @@ namespace WixToolset.Core.WindowsInstaller.Bind internal class BindTransformCommand { - public IEnumerable Extensions { private get; set; } + public BindTransformCommand(IMessaging messaging, IBackendHelper backendHelper, IEnumerable extensions, string intermediateFolder, WindowsInstallerData transform, string outputPath, TableDefinitionCollection tableDefinitions) + { + this.Messaging = messaging; + this.BackendHelper = backendHelper; + this.Extensions = extensions; + this.IntermediateFolder = intermediateFolder; + this.Transform = transform; + this.OutputPath = outputPath; + this.TableDefinitions = tableDefinitions; + } + + private IMessaging Messaging { get; } - public TableDefinitionCollection TableDefinitions { private get; set; } + private IBackendHelper BackendHelper { get; } - public string TempFilesLocation { private get; set; } + private IEnumerable Extensions { get; } - public WindowsInstallerData Transform { private get; set; } + private TableDefinitionCollection TableDefinitions { get; } - public IMessaging Messaging { private get; set; } + private string IntermediateFolder { get; } - public string OutputPath { private get; set; } + private WindowsInstallerData Transform { get; } + + private string OutputPath { get; } public void Execute() { - int transformFlags = 0; + var transformFlags = 0; - WindowsInstallerData targetOutput = new WindowsInstallerData(null); - WindowsInstallerData updatedOutput = new WindowsInstallerData(null); + var targetOutput = new WindowsInstallerData(null); + var updatedOutput = new WindowsInstallerData(null); // TODO: handle added columns @@ -49,8 +62,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind string targetUpgradeCode = null; string updatedUpgradeCode = null; - Table propertyTable = this.Transform.Tables["Property"]; - if (null != propertyTable) + if (this.Transform.TryGetTable("Property", out var propertyTable)) { for (int i = propertyTable.Rows.Count - 1; i >= 0; i--) { @@ -68,18 +80,21 @@ namespace WixToolset.Core.WindowsInstaller.Bind } } - Table targetSummaryInfo = targetOutput.EnsureTable(this.TableDefinitions["_SummaryInformation"]); - Table updatedSummaryInfo = updatedOutput.EnsureTable(this.TableDefinitions["_SummaryInformation"]); - Table targetPropertyTable = targetOutput.EnsureTable(this.TableDefinitions["Property"]); - Table updatedPropertyTable = updatedOutput.EnsureTable(this.TableDefinitions["Property"]); + var targetSummaryInfo = targetOutput.EnsureTable(this.TableDefinitions["_SummaryInformation"]); + var updatedSummaryInfo = updatedOutput.EnsureTable(this.TableDefinitions["_SummaryInformation"]); + var targetPropertyTable = targetOutput.EnsureTable(this.TableDefinitions["Property"]); + var updatedPropertyTable = updatedOutput.EnsureTable(this.TableDefinitions["Property"]); // process special summary information values - foreach (Row row in this.Transform.Tables["_SummaryInformation"].Rows) + foreach (var row in this.Transform.Tables["_SummaryInformation"].Rows) { - if ((int)SummaryInformation.Transform.CodePage == (int)row[0]) + var summaryId = row.FieldAsInteger(0); + var summaryData = row.FieldAsString(1); + + if ((int)SummaryInformation.Transform.CodePage == summaryId) { // convert from a web name if provided - string codePage = (string)row.Fields[1].Data; + var codePage = summaryData; if (null == codePage) { codePage = "0"; @@ -89,7 +104,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind codePage = Common.GetValidCodePage(codePage).ToString(CultureInfo.InvariantCulture); } - string previousCodePage = (string)row.Fields[1].PreviousData; + var previousCodePage = row.Fields[1].PreviousData; if (null == previousCodePage) { previousCodePage = "0"; @@ -99,50 +114,50 @@ namespace WixToolset.Core.WindowsInstaller.Bind previousCodePage = Common.GetValidCodePage(previousCodePage).ToString(CultureInfo.InvariantCulture); } - Row targetCodePageRow = targetSummaryInfo.CreateRow(null); + var targetCodePageRow = targetSummaryInfo.CreateRow(null); targetCodePageRow[0] = 1; // PID_CODEPAGE targetCodePageRow[1] = previousCodePage; - Row updatedCodePageRow = updatedSummaryInfo.CreateRow(null); + var updatedCodePageRow = updatedSummaryInfo.CreateRow(null); updatedCodePageRow[0] = 1; // PID_CODEPAGE updatedCodePageRow[1] = codePage; } - else if ((int)SummaryInformation.Transform.TargetPlatformAndLanguage == (int)row[0] || - (int)SummaryInformation.Transform.UpdatedPlatformAndLanguage == (int)row[0]) + else if ((int)SummaryInformation.Transform.TargetPlatformAndLanguage == summaryId || + (int)SummaryInformation.Transform.UpdatedPlatformAndLanguage == summaryId) { // the target language - string[] propertyData = ((string)row[1]).Split(';'); - string lang = 2 == propertyData.Length ? propertyData[1] : "0"; + var propertyData = summaryData.Split(';'); + var lang = 2 == propertyData.Length ? propertyData[1] : "0"; - Table tempSummaryInfo = (int)SummaryInformation.Transform.TargetPlatformAndLanguage == (int)row[0] ? targetSummaryInfo : updatedSummaryInfo; - Table tempPropertyTable = (int)SummaryInformation.Transform.TargetPlatformAndLanguage == (int)row[0] ? targetPropertyTable : updatedPropertyTable; + var tempSummaryInfo = (int)SummaryInformation.Transform.TargetPlatformAndLanguage == summaryId ? targetSummaryInfo : updatedSummaryInfo; + var tempPropertyTable = (int)SummaryInformation.Transform.TargetPlatformAndLanguage == summaryId ? targetPropertyTable : updatedPropertyTable; - Row productLanguageRow = tempPropertyTable.CreateRow(null); + var productLanguageRow = tempPropertyTable.CreateRow(null); productLanguageRow[0] = "ProductLanguage"; productLanguageRow[1] = lang; // set the platform;language on the MSI to be generated - Row templateRow = tempSummaryInfo.CreateRow(null); + var templateRow = tempSummaryInfo.CreateRow(null); templateRow[0] = 7; // PID_TEMPLATE - templateRow[1] = (string)row[1]; + templateRow[1] = summaryData; } - else if ((int)SummaryInformation.Transform.ProductCodes == (int)row[0]) + else if ((int)SummaryInformation.Transform.ProductCodes == summaryId) { - string[] propertyData = ((string)row[1]).Split(';'); + var propertyData = summaryData.Split(';'); - Row targetProductCodeRow = targetPropertyTable.CreateRow(null); + var targetProductCodeRow = targetPropertyTable.CreateRow(null); targetProductCodeRow[0] = "ProductCode"; targetProductCodeRow[1] = propertyData[0].Substring(0, 38); - Row targetProductVersionRow = targetPropertyTable.CreateRow(null); + var targetProductVersionRow = targetPropertyTable.CreateRow(null); targetProductVersionRow[0] = "ProductVersion"; targetProductVersionRow[1] = propertyData[0].Substring(38); - Row updatedProductCodeRow = updatedPropertyTable.CreateRow(null); + var updatedProductCodeRow = updatedPropertyTable.CreateRow(null); updatedProductCodeRow[0] = "ProductCode"; updatedProductCodeRow[1] = propertyData[1].Substring(0, 38); - Row updatedProductVersionRow = updatedPropertyTable.CreateRow(null); + var updatedProductVersionRow = updatedPropertyTable.CreateRow(null); updatedProductVersionRow[0] = "ProductVersion"; updatedProductVersionRow[1] = propertyData[1].Substring(38); @@ -153,7 +168,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind targetUpgradeCode = propertyData[2]; if (!String.IsNullOrEmpty(targetUpgradeCode)) { - Row targetUpgradeCodeRow = targetPropertyTable.CreateRow(null); + var targetUpgradeCodeRow = targetPropertyTable.CreateRow(null); targetUpgradeCodeRow[0] = "UpgradeCode"; targetUpgradeCodeRow[1] = targetUpgradeCode; @@ -167,16 +182,16 @@ namespace WixToolset.Core.WindowsInstaller.Bind if (!String.IsNullOrEmpty(updatedUpgradeCode)) { - Row updatedUpgradeCodeRow = updatedPropertyTable.CreateRow(null); + var updatedUpgradeCodeRow = updatedPropertyTable.CreateRow(null); updatedUpgradeCodeRow[0] = "UpgradeCode"; updatedUpgradeCodeRow[1] = updatedUpgradeCode; } } - else if ((int)SummaryInformation.Transform.ValidationFlags == (int)row[0]) + else if ((int)SummaryInformation.Transform.ValidationFlags == summaryId) { - transformFlags = Convert.ToInt32(row[1], CultureInfo.InvariantCulture); + transformFlags = Convert.ToInt32(summaryData, CultureInfo.InvariantCulture); } - else if ((int)SummaryInformation.Transform.Reserved11 == (int)row[0]) + else if ((int)SummaryInformation.Transform.Reserved11 == summaryId) { // PID_LASTPRINTED should be null for transforms row.Operation = RowOperation.None; @@ -184,11 +199,11 @@ namespace WixToolset.Core.WindowsInstaller.Bind else { // add everything else as is - Row targetRow = targetSummaryInfo.CreateRow(null); + var targetRow = targetSummaryInfo.CreateRow(null); targetRow[0] = row[0]; targetRow[1] = row[1]; - Row updatedRow = updatedSummaryInfo.CreateRow(null); + var updatedRow = updatedSummaryInfo.CreateRow(null); updatedRow[0] = row[0]; updatedRow[1] = row[1]; } @@ -205,7 +220,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind string emptyFile = null; - foreach (Table table in this.Transform.Tables) + foreach (var table in this.Transform.Tables) { // Ignore unreal tables when building transforms except the _Stream table. // These tables are ignored when generating the database so there is no reason @@ -231,20 +246,21 @@ namespace WixToolset.Core.WindowsInstaller.Bind } // process row operations - foreach (Row row in table.Rows) + foreach (var row in table.Rows) { switch (row.Operation) { case RowOperation.Add: - Table updatedTable = updatedOutput.EnsureTable(table.Definition); + var updatedTable = updatedOutput.EnsureTable(table.Definition); updatedTable.Rows.Add(row); continue; + case RowOperation.Delete: - Table targetTable = targetOutput.EnsureTable(table.Definition); + var targetTable = targetOutput.EnsureTable(table.Definition); targetTable.Rows.Add(row); // fill-in non-primary key values - foreach (Field field in row.Fields) + foreach (var field in row.Fields) { if (!field.Column.PrimaryKey) { @@ -256,7 +272,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind { if (null == emptyFile) { - emptyFile = Path.Combine(this.TempFilesLocation, "empty"); + emptyFile = Path.Combine(this.IntermediateFolder, "empty"); } field.Data = emptyFile; @@ -273,7 +289,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind // Assure that the file table's sequence is populated if ("File" == table.Name) { - foreach (Row fileRow in table.Rows) + foreach (var fileRow in table.Rows) { if (null == fileRow[7]) { @@ -290,60 +306,48 @@ namespace WixToolset.Core.WindowsInstaller.Bind } // process modified and unmodified rows - bool modifiedRow = false; - Row targetRow = new Row(null, table.Definition); - Row updatedRow = row; - for (int i = 0; i < row.Fields.Length; i++) + var modifiedRow = false; + var targetRow = new Row(null, table.Definition); + var updatedRow = row; + for (var i = 0; i < row.Fields.Length; i++) { - Field updatedField = row.Fields[i]; + var updatedField = row.Fields[i]; if (updatedField.Modified) { // set a different value in the target row to ensure this value will be modified during transform generation if (ColumnType.Number == updatedField.Column.Type && !updatedField.Column.IsLocalizable) { - if (null == updatedField.Data || 1 != (int)updatedField.Data) - { - targetRow[i] = 1; - } - else - { - targetRow[i] = 2; - } + var data = updatedField.AsNullableInteger(); + targetRow[i] = (data == 1) ? 2 : 1; } else if (ColumnType.Object == updatedField.Column.Type) { if (null == emptyFile) { - emptyFile = Path.Combine(this.TempFilesLocation, "empty"); + emptyFile = Path.Combine(this.IntermediateFolder, "empty"); } targetRow[i] = emptyFile; } else { - if ("0" != (string)updatedField.Data) - { - targetRow[i] = "0"; - } - else - { - targetRow[i] = "1"; - } + var data = updatedField.AsString(); + targetRow[i] = (data == "0") ? "1" : "0"; } modifiedRow = true; } else if (ColumnType.Object == updatedField.Column.Type) { - ObjectField objectField = (ObjectField)updatedField; + var objectField = (ObjectField)updatedField; // create an empty file for comparing against if (null == objectField.PreviousData) { if (null == emptyFile) { - emptyFile = Path.Combine(this.TempFilesLocation, "empty"); + emptyFile = Path.Combine(this.IntermediateFolder, "empty"); } targetRow[i] = emptyFile; @@ -372,10 +376,10 @@ namespace WixToolset.Core.WindowsInstaller.Bind "ProductVersion" == (string)row[0] || "UpgradeCode" == (string)row[0]))) { - Table targetTable = targetOutput.EnsureTable(table.Definition); + var targetTable = targetOutput.EnsureTable(table.Definition); targetTable.Rows.Add(targetRow); - Table updatedTable = updatedOutput.EnsureTable(table.Definition); + var updatedTable = updatedOutput.EnsureTable(table.Definition); updatedTable.Rows.Add(updatedRow); } } @@ -392,38 +396,36 @@ namespace WixToolset.Core.WindowsInstaller.Bind return; } - string transformFileName = Path.GetFileNameWithoutExtension(this.OutputPath); - string targetDatabaseFile = Path.Combine(this.TempFilesLocation, String.Concat(transformFileName, "_target.msi")); - string updatedDatabaseFile = Path.Combine(this.TempFilesLocation, String.Concat(transformFileName, "_updated.msi")); + var transformFileName = Path.GetFileNameWithoutExtension(this.OutputPath); + var targetDatabaseFile = Path.Combine(this.IntermediateFolder, String.Concat(transformFileName, "_target.msi")); + var updatedDatabaseFile = Path.Combine(this.IntermediateFolder, String.Concat(transformFileName, "_updated.msi")); try { if (!String.IsNullOrEmpty(emptyFile)) { - using (FileStream fileStream = File.Create(emptyFile)) + using (var fileStream = File.Create(emptyFile)) { } } - this.GenerateDatabase(targetOutput, targetDatabaseFile, false); - this.GenerateDatabase(updatedOutput, updatedDatabaseFile, true); + this.GenerateDatabase(targetOutput, targetDatabaseFile, keepAddedColumns: false); + this.GenerateDatabase(updatedOutput, updatedDatabaseFile, keepAddedColumns: true); // make sure the directory exists Directory.CreateDirectory(Path.GetDirectoryName(this.OutputPath)); // create the transform file - using (Database targetDatabase = new Database(targetDatabaseFile, OpenDatabase.ReadOnly)) + using (var targetDatabase = new Database(targetDatabaseFile, OpenDatabase.ReadOnly)) + using (var updatedDatabase = new Database(updatedDatabaseFile, OpenDatabase.ReadOnly)) { - using (Database updatedDatabase = new Database(updatedDatabaseFile, OpenDatabase.ReadOnly)) + if (updatedDatabase.GenerateTransform(targetDatabase, this.OutputPath)) { - if (updatedDatabase.GenerateTransform(targetDatabase, this.OutputPath)) - { - updatedDatabase.CreateTransformSummaryInfo(targetDatabase, this.OutputPath, (TransformErrorConditions)(transformFlags & 0xFFFF), (TransformValidations)((transformFlags >> 16) & 0xFFFF)); - } - else - { - this.Messaging.Write(ErrorMessages.NoDifferencesInTransform(this.Transform.SourceLineNumbers)); - } + updatedDatabase.CreateTransformSummaryInfo(targetDatabase, this.OutputPath, (TransformErrorConditions)(transformFlags & 0xFFFF), (TransformValidations)((transformFlags >> 16) & 0xFFFF)); + } + else + { + this.Messaging.Write(ErrorMessages.NoDifferencesInTransform(this.Transform.SourceLineNumbers)); } } } @@ -458,16 +460,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind private void GenerateDatabase(WindowsInstallerData output, string outputPath, bool keepAddedColumns) { - var command = new GenerateDatabaseCommand(); - command.Codepage = output.Codepage; - command.Extensions = this.Extensions; - command.KeepAddedColumns = keepAddedColumns; - command.Output = output; - command.OutputPath = outputPath; - command.TableDefinitions = this.TableDefinitions; - command.IntermediateFolder = this.TempFilesLocation; - command.SuppressAddingValidationRows = true; - command.UseSubDirectory = true; + var command = new GenerateDatabaseCommand(this.Messaging, this.BackendHelper, this.Extensions, output, outputPath, this.TableDefinitions, this.IntermediateFolder, codepage: -1, keepAddedColumns, suppressAddingValidationRows: true, useSubdirectory: true ); command.Execute(); } } -- cgit v1.2.3-55-g6feb