From dbde9e7104b907bbbaea17e21247d8cafc8b3a4c Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Sat, 14 Oct 2017 16:12:07 -0700 Subject: Massive refactoring to introduce the concept of IBackend --- .../Bind/BindSummaryInfoCommand.cs | 135 +++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 src/WixToolset.Core.WindowsInstaller/Bind/BindSummaryInfoCommand.cs (limited to 'src/WixToolset.Core.WindowsInstaller/Bind/BindSummaryInfoCommand.cs') diff --git a/src/WixToolset.Core.WindowsInstaller/Bind/BindSummaryInfoCommand.cs b/src/WixToolset.Core.WindowsInstaller/Bind/BindSummaryInfoCommand.cs new file mode 100644 index 00000000..5471792d --- /dev/null +++ b/src/WixToolset.Core.WindowsInstaller/Bind/BindSummaryInfoCommand.cs @@ -0,0 +1,135 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +namespace WixToolset.Core.WindowsInstaller.Databases +{ + using System; + using System.Globalization; + using WixToolset.Data; + + /// + /// Binds the summary information table of a database. + /// + internal class BindSummaryInfoCommand + { + /// + /// The output to bind. + /// + public Output Output { private get; set; } + + /// + /// Returns a flag indicating if files are compressed by default. + /// + public bool Compressed { get; private set; } + + /// + /// Returns a flag indicating if uncompressed files use long filenames. + /// + public bool LongNames { get; private set; } + + public int InstallerVersion { get; private set; } + + /// + /// Modularization guid, or null if the output is not a module. + /// + public string ModularizationGuid { get; private set; } + + public void Execute() + { + this.Compressed = false; + this.LongNames = false; + this.InstallerVersion = 0; + this.ModularizationGuid = null; + + Table summaryInformationTable = this.Output.Tables["_SummaryInformation"]; + + if (null != summaryInformationTable) + { + bool foundCreateDataTime = false; + bool foundLastSaveDataTime = false; + bool foundCreatingApplication = false; + string now = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss", CultureInfo.InvariantCulture); + + foreach (Row summaryInformationRow in summaryInformationTable.Rows) + { + switch (summaryInformationRow.FieldAsInteger(0)) + { + case 1: // PID_CODEPAGE + // make sure the code page is an int and not a web name or null + string codepage = summaryInformationRow.FieldAsString(1); + + if (null == codepage) + { + codepage = "0"; + } + else + { + summaryInformationRow[1] = Common.GetValidCodePage(codepage, false, false, summaryInformationRow.SourceLineNumbers).ToString(CultureInfo.InvariantCulture); + } + break; + case 9: // PID_REVNUMBER + string packageCode = (string)summaryInformationRow[1]; + + if (OutputType.Module == this.Output.Type) + { + this.ModularizationGuid = packageCode.Substring(1, 36).Replace('-', '_'); + } + else if ("*" == packageCode) + { + // set the revision number (package/patch code) if it should be automatically generated + summaryInformationRow[1] = Common.GenerateGuid(); + } + break; + case 12: // PID_CREATE_DTM + foundCreateDataTime = true; + break; + case 13: // PID_LASTSAVE_DTM + foundLastSaveDataTime = true; + break; + case 14: + this.InstallerVersion = summaryInformationRow.FieldAsInteger(1); + break; + case 15: // PID_WORDCOUNT + if (OutputType.Patch == this.Output.Type) + { + this.LongNames = true; + this.Compressed = true; + } + else + { + this.LongNames = (0 == (summaryInformationRow.FieldAsInteger(1) & 1)); + this.Compressed = (2 == (summaryInformationRow.FieldAsInteger(1) & 2)); + } + break; + case 18: // PID_APPNAME + foundCreatingApplication = true; + break; + } + } + + // add a summary information row for the create time/date property if its not already set + if (!foundCreateDataTime) + { + Row createTimeDateRow = summaryInformationTable.CreateRow(null); + createTimeDateRow[0] = 12; + createTimeDateRow[1] = now; + } + + // add a summary information row for the last save time/date property if its not already set + if (!foundLastSaveDataTime) + { + Row lastSaveTimeDateRow = summaryInformationTable.CreateRow(null); + lastSaveTimeDateRow[0] = 13; + lastSaveTimeDateRow[1] = now; + } + + // add a summary information row for the creating application property if its not already set + if (!foundCreatingApplication) + { + Row creatingApplicationRow = summaryInformationTable.CreateRow(null); + creatingApplicationRow[0] = 18; + creatingApplicationRow[1] = String.Format(CultureInfo.InvariantCulture, AppCommon.GetCreatingApplicationString()); + } + } + } + } +} -- cgit v1.2.3-55-g6feb