// 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());
}
}
}
}
}