From abff61df823505abc01776cec7b207501c671bf2 Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Fri, 19 Jun 2020 13:52:20 +1000 Subject: Implement BundleCustomData. Remove Unreal from CustomTable. --- src/WixToolset.Core/Compiler.cs | 566 +++++++++++++++++++++------------------- 1 file changed, 293 insertions(+), 273 deletions(-) (limited to 'src/WixToolset.Core/Compiler.cs') diff --git a/src/WixToolset.Core/Compiler.cs b/src/WixToolset.Core/Compiler.cs index da0806fb..bbd6b292 100644 --- a/src/WixToolset.Core/Compiler.cs +++ b/src/WixToolset.Core/Compiler.cs @@ -3668,7 +3668,6 @@ namespace WixToolset.Core { var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); string tableId = null; - var unreal = false; var columns = new List(); foreach (var attrib in node.Attributes()) @@ -3680,9 +3679,6 @@ namespace WixToolset.Core case "Id": tableId = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); break; - case "Unreal": - unreal = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); - break; default: this.Core.UnexpectedAttribute(node, attrib); break; @@ -3710,315 +3706,336 @@ namespace WixToolset.Core var childSourceLineNumbers = Preprocessor.GetSourceLineNumbers(child); switch (child.Name.LocalName) { - case "Column": - string columnName = null; - IntermediateFieldType? columnType = null; - var description = String.Empty; - int? keyColumn = null; - var keyTable = String.Empty; - var localizable = false; - long? maxValue = null; - long? minValue = null; - WixCustomTableColumnCategoryType? category = null; - var modularization = WixCustomTableColumnModularizeType.None; - var nullable = false; - var primaryKey = false; - var setValues = String.Empty; - var columnUnreal = false; - var width = 0; - - foreach (var childAttrib in child.Attributes()) - { - switch (childAttrib.Name.LocalName) + case "Column": + var column = this.ParseColumnElement(child, childSourceLineNumbers, tableId); + if (column != null) { - case "Id": - columnName = this.Core.GetAttributeIdentifierValue(childSourceLineNumbers, childAttrib); + columns.Add(column); + } + break; + case "Row": + this.ParseRowElement(child, childSourceLineNumbers, tableId); + break; + default: + this.Core.UnexpectedElement(node, child); + break; + } + } + else + { + this.Core.ParseExtensionElement(node, child); + } + } + + if (columns.Count > 0) + { + if (!columns.Where(c => c.PrimaryKey).Any()) + { + this.Core.Write(ErrorMessages.CustomTableMissingPrimaryKey(sourceLineNumbers)); + } + + if (!this.Core.EncounteredError) + { + var columnNames = String.Join(new string(WixCustomTableTuple.ColumnNamesSeparator, 1), columns.Select(c => c.Name)); + + this.Core.AddTuple(new WixCustomTableTuple(sourceLineNumbers, new Identifier(AccessModifier.Public, tableId)) + { + ColumnNames = columnNames, + }); + } + } + } + + /// + /// Parses a Column element. + /// + /// Element to parse. + /// Element's SourceLineNumbers. + /// Table Id. + private WixCustomTableColumnTuple ParseColumnElement(XElement child, SourceLineNumber childSourceLineNumbers, string tableId) + { + string columnName = null; + IntermediateFieldType? columnType = null; + var description = String.Empty; + int? keyColumn = null; + var keyTable = String.Empty; + var localizable = false; + long? maxValue = null; + long? minValue = null; + WixCustomTableColumnCategoryType? category = null; + var modularization = WixCustomTableColumnModularizeType.None; + var nullable = false; + var primaryKey = false; + var setValues = String.Empty; + var columnUnreal = false; + var width = 0; + + foreach (var childAttrib in child.Attributes()) + { + switch (childAttrib.Name.LocalName) + { + case "Id": + columnName = this.Core.GetAttributeIdentifierValue(childSourceLineNumbers, childAttrib); + break; + case "Category": + var categoryValue = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib); + switch (categoryValue) + { + case "text": + category = WixCustomTableColumnCategoryType.Text; break; - case "Category": - var categoryValue = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib); - switch (categoryValue) - { - case "text": - category = WixCustomTableColumnCategoryType.Text; - break; - case "upperCase": - category = WixCustomTableColumnCategoryType.UpperCase; - break; - case "lowerCase": - category = WixCustomTableColumnCategoryType.LowerCase; - break; - case "integer": - category = WixCustomTableColumnCategoryType.Integer; - break; - case "doubleInteger": - category = WixCustomTableColumnCategoryType.DoubleInteger; - break; - case "timeDate": - category = WixCustomTableColumnCategoryType.TimeDate; - break; - case "identifier": - category = WixCustomTableColumnCategoryType.Identifier; - break; - case "property": - category = WixCustomTableColumnCategoryType.Property; - break; - case "filename": - category = WixCustomTableColumnCategoryType.Filename; - break; - case "wildCardFilename": - category = WixCustomTableColumnCategoryType.WildCardFilename; - break; - case "path": - category = WixCustomTableColumnCategoryType.Path; - break; - case "paths": - category = WixCustomTableColumnCategoryType.Paths; - break; - case "anyPath": - category = WixCustomTableColumnCategoryType.AnyPath; - break; - case "defaultDir": - category = WixCustomTableColumnCategoryType.DefaultDir; - break; - case "regPath": - category = WixCustomTableColumnCategoryType.RegPath; - break; - case "formatted": - category = WixCustomTableColumnCategoryType.Formatted; - break; - case "formattedSddl": - category = WixCustomTableColumnCategoryType.FormattedSddl; - break; - case "template": - category = WixCustomTableColumnCategoryType.Template; - break; - case "condition": - category = WixCustomTableColumnCategoryType.Condition; - break; - case "guid": - category = WixCustomTableColumnCategoryType.Guid; - break; - case "version": - category = WixCustomTableColumnCategoryType.Version; - break; - case "language": - category = WixCustomTableColumnCategoryType.Language; - break; - case "binary": - category = WixCustomTableColumnCategoryType.Binary; - break; - case "customSource": - category = WixCustomTableColumnCategoryType.CustomSource; - break; - case "cabinet": - category = WixCustomTableColumnCategoryType.Cabinet; - break; - case "shortcut": - category = WixCustomTableColumnCategoryType.Shortcut; - break; - case "": - break; - default: - this.Core.Write(ErrorMessages.IllegalAttributeValue(childSourceLineNumbers, child.Name.LocalName, "Category", categoryValue, - "text", "upperCase", "lowerCase", "integer", "doubleInteger", "timeDate", "identifier", "property", "filename", - "wildCardFilename", "path", "paths", "anyPath", "defaultDir", "regPath", "formatted", "formattedSddl", "template", - "condition", "guid", "version", "language", "binary", "customSource", "cabinet", "shortcut")); - columnType = IntermediateFieldType.String; // set a value to prevent expected attribute error below. - break; - } + case "upperCase": + category = WixCustomTableColumnCategoryType.UpperCase; break; - case "Description": - description = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib); + case "lowerCase": + category = WixCustomTableColumnCategoryType.LowerCase; break; - case "KeyColumn": - keyColumn = this.Core.GetAttributeIntegerValue(childSourceLineNumbers, childAttrib, 1, 32); + case "integer": + category = WixCustomTableColumnCategoryType.Integer; break; - case "KeyTable": - keyTable = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib); + case "doubleInteger": + category = WixCustomTableColumnCategoryType.DoubleInteger; break; - case "Localizable": - localizable = YesNoType.Yes == this.Core.GetAttributeYesNoValue(childSourceLineNumbers, childAttrib); + case "timeDate": + category = WixCustomTableColumnCategoryType.TimeDate; break; - case "MaxValue": - maxValue = this.Core.GetAttributeLongValue(childSourceLineNumbers, childAttrib, Int32.MinValue + 1, Int32.MaxValue); + case "identifier": + category = WixCustomTableColumnCategoryType.Identifier; break; - case "MinValue": - minValue = this.Core.GetAttributeLongValue(childSourceLineNumbers, childAttrib, Int32.MinValue + 1, Int32.MaxValue); + case "property": + category = WixCustomTableColumnCategoryType.Property; break; - case "Modularize": - var modularizeValue = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib); - switch (modularizeValue) - { - case "column": - modularization = WixCustomTableColumnModularizeType.Column; - break; - case "companionFile": - modularization = WixCustomTableColumnModularizeType.CompanionFile; - break; - case "condition": - modularization = WixCustomTableColumnModularizeType.Condition; - break; - case "controlEventArgument": - modularization = WixCustomTableColumnModularizeType.ControlEventArgument; - break; - case "controlText": - modularization = WixCustomTableColumnModularizeType.ControlText; - break; - case "icon": - modularization = WixCustomTableColumnModularizeType.Icon; - break; - case "none": - modularization = WixCustomTableColumnModularizeType.None; - break; - case "property": - modularization = WixCustomTableColumnModularizeType.Property; - break; - case "semicolonDelimited": - modularization = WixCustomTableColumnModularizeType.SemicolonDelimited; - break; - case "": - break; - default: - this.Core.Write(ErrorMessages.IllegalAttributeValue(childSourceLineNumbers, child.Name.LocalName, "Modularize", modularizeValue, "column", "companionFile", "condition", "controlEventArgument", "controlText", "icon", "property", "semicolonDelimited")); - columnType = IntermediateFieldType.String; // set a value to prevent expected attribute error below. - break; - } + case "filename": + category = WixCustomTableColumnCategoryType.Filename; break; - case "Nullable": - nullable = YesNoType.Yes == this.Core.GetAttributeYesNoValue(childSourceLineNumbers, childAttrib); + case "wildCardFilename": + category = WixCustomTableColumnCategoryType.WildCardFilename; break; - case "PrimaryKey": - primaryKey = YesNoType.Yes == this.Core.GetAttributeYesNoValue(childSourceLineNumbers, childAttrib); + case "path": + category = WixCustomTableColumnCategoryType.Path; break; - case "Set": - setValues = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib); + case "paths": + category = WixCustomTableColumnCategoryType.Paths; break; - case "Type": - var typeValue = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib); - switch (typeValue) - { - case "binary": - columnType = IntermediateFieldType.Path; - break; - case "int": - columnType = IntermediateFieldType.Number; - break; - case "string": - columnType = IntermediateFieldType.String; - break; - case "": - break; - default: - this.Core.Write(ErrorMessages.IllegalAttributeValue(childSourceLineNumbers, child.Name.LocalName, "Type", typeValue, "binary", "int", "string")); - columnType = IntermediateFieldType.String; // set a value to prevent expected attribute error below. - break; - } + case "anyPath": + category = WixCustomTableColumnCategoryType.AnyPath; + break; + case "defaultDir": + category = WixCustomTableColumnCategoryType.DefaultDir; + break; + case "regPath": + category = WixCustomTableColumnCategoryType.RegPath; + break; + case "formatted": + category = WixCustomTableColumnCategoryType.Formatted; + break; + case "formattedSddl": + category = WixCustomTableColumnCategoryType.FormattedSddl; + break; + case "template": + category = WixCustomTableColumnCategoryType.Template; + break; + case "condition": + category = WixCustomTableColumnCategoryType.Condition; + break; + case "guid": + category = WixCustomTableColumnCategoryType.Guid; break; - case "Width": - width = this.Core.GetAttributeIntegerValue(childSourceLineNumbers, childAttrib, 0, Int32.MaxValue); + case "version": + category = WixCustomTableColumnCategoryType.Version; break; - case "Unreal": - columnUnreal = YesNoType.Yes == this.Core.GetAttributeYesNoValue(childSourceLineNumbers, childAttrib); + case "language": + category = WixCustomTableColumnCategoryType.Language; + break; + case "binary": + category = WixCustomTableColumnCategoryType.Binary; + break; + case "customSource": + category = WixCustomTableColumnCategoryType.CustomSource; + break; + case "cabinet": + category = WixCustomTableColumnCategoryType.Cabinet; + break; + case "shortcut": + category = WixCustomTableColumnCategoryType.Shortcut; + break; + case "": break; default: - this.Core.UnexpectedAttribute(child, childAttrib); + this.Core.Write(ErrorMessages.IllegalAttributeValue(childSourceLineNumbers, child.Name.LocalName, "Category", categoryValue, + "text", "upperCase", "lowerCase", "integer", "doubleInteger", "timeDate", "identifier", "property", "filename", + "wildCardFilename", "path", "paths", "anyPath", "defaultDir", "regPath", "formatted", "formattedSddl", "template", + "condition", "guid", "version", "language", "binary", "customSource", "cabinet", "shortcut")); + columnType = IntermediateFieldType.String; // set a value to prevent expected attribute error below. break; - } - } - - if (null == columnName) - { - this.Core.Write(ErrorMessages.ExpectedAttribute(childSourceLineNumbers, child.Name.LocalName, "Id")); - } - - if (!columnType.HasValue) - { - this.Core.Write(ErrorMessages.ExpectedAttribute(childSourceLineNumbers, child.Name.LocalName, "Type")); } - else if (columnType == IntermediateFieldType.Number) - { - if (2 != width && 4 != width) - { - this.Core.Write(ErrorMessages.CustomTableIllegalColumnWidth(childSourceLineNumbers, child.Name.LocalName, "Width", width)); - } - } - else if (columnType == IntermediateFieldType.Path) + break; + case "Description": + description = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib); + break; + case "KeyColumn": + keyColumn = this.Core.GetAttributeIntegerValue(childSourceLineNumbers, childAttrib, 1, 32); + break; + case "KeyTable": + keyTable = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib); + break; + case "Localizable": + localizable = YesNoType.Yes == this.Core.GetAttributeYesNoValue(childSourceLineNumbers, childAttrib); + break; + case "MaxValue": + maxValue = this.Core.GetAttributeLongValue(childSourceLineNumbers, childAttrib, Int32.MinValue + 1, Int32.MaxValue); + break; + case "MinValue": + minValue = this.Core.GetAttributeLongValue(childSourceLineNumbers, childAttrib, Int32.MinValue + 1, Int32.MaxValue); + break; + case "Modularize": + var modularizeValue = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib); + switch (modularizeValue) { - if (!category.HasValue) - { - category = WixCustomTableColumnCategoryType.Binary; - } - else if (category != WixCustomTableColumnCategoryType.Binary) - { - this.Core.Write(ErrorMessages.ExpectedBinaryCategory(childSourceLineNumbers)); - } + case "column": + modularization = WixCustomTableColumnModularizeType.Column; + break; + case "companionFile": + modularization = WixCustomTableColumnModularizeType.CompanionFile; + break; + case "condition": + modularization = WixCustomTableColumnModularizeType.Condition; + break; + case "controlEventArgument": + modularization = WixCustomTableColumnModularizeType.ControlEventArgument; + break; + case "controlText": + modularization = WixCustomTableColumnModularizeType.ControlText; + break; + case "icon": + modularization = WixCustomTableColumnModularizeType.Icon; + break; + case "none": + modularization = WixCustomTableColumnModularizeType.None; + break; + case "property": + modularization = WixCustomTableColumnModularizeType.Property; + break; + case "semicolonDelimited": + modularization = WixCustomTableColumnModularizeType.SemicolonDelimited; + break; + case "": + break; + default: + this.Core.Write(ErrorMessages.IllegalAttributeValue(childSourceLineNumbers, child.Name.LocalName, "Modularize", modularizeValue, "column", "companionFile", "condition", "controlEventArgument", "controlText", "icon", "property", "semicolonDelimited")); + columnType = IntermediateFieldType.String; // set a value to prevent expected attribute error below. + break; } - - this.Core.ParseForExtensionElements(child); - - if (!this.Core.EncounteredError) + break; + case "Nullable": + nullable = YesNoType.Yes == this.Core.GetAttributeYesNoValue(childSourceLineNumbers, childAttrib); + break; + case "PrimaryKey": + primaryKey = YesNoType.Yes == this.Core.GetAttributeYesNoValue(childSourceLineNumbers, childAttrib); + break; + case "Set": + setValues = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib); + break; + case "Type": + var typeValue = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib); + switch (typeValue) { - var attributes = primaryKey ? WixCustomTableColumnTupleAttributes.PrimaryKey : WixCustomTableColumnTupleAttributes.None; - attributes |= localizable ? WixCustomTableColumnTupleAttributes.Localizable : WixCustomTableColumnTupleAttributes.None; - attributes |= nullable ? WixCustomTableColumnTupleAttributes.Nullable : WixCustomTableColumnTupleAttributes.None; - attributes |= columnUnreal ? WixCustomTableColumnTupleAttributes.Unreal : WixCustomTableColumnTupleAttributes.None; - - var column = this.Core.AddTuple(new WixCustomTableColumnTuple(childSourceLineNumbers, new Identifier(AccessModifier.Private, tableId, columnName)) - { - TableRef = tableId, - Name = columnName, - Type = columnType.Value, - Attributes = attributes, - Width = width, - Category = category, - Description = description, - KeyColumn = keyColumn, - KeyTable = keyTable, - MaxValue = maxValue, - MinValue = minValue, - Modularize = modularization, - Set = setValues, - }); - columns.Add(column); + case "binary": + columnType = IntermediateFieldType.Path; + break; + case "int": + columnType = IntermediateFieldType.Number; + break; + case "string": + columnType = IntermediateFieldType.String; + break; + case "": + break; + default: + this.Core.Write(ErrorMessages.IllegalAttributeValue(childSourceLineNumbers, child.Name.LocalName, "Type", typeValue, "binary", "int", "string")); + columnType = IntermediateFieldType.String; // set a value to prevent expected attribute error below. + break; } break; - case "Row": - this.ParseRow(child, tableId); + case "Width": + width = this.Core.GetAttributeIntegerValue(childSourceLineNumbers, childAttrib, 0, Int32.MaxValue); + break; + case "Unreal": + columnUnreal = YesNoType.Yes == this.Core.GetAttributeYesNoValue(childSourceLineNumbers, childAttrib); break; default: - this.Core.UnexpectedElement(node, child); + this.Core.UnexpectedAttribute(child, childAttrib); break; - } } - else + } + + if (null == columnName) + { + this.Core.Write(ErrorMessages.ExpectedAttribute(childSourceLineNumbers, child.Name.LocalName, "Id")); + } + + if (!columnType.HasValue) + { + this.Core.Write(ErrorMessages.ExpectedAttribute(childSourceLineNumbers, child.Name.LocalName, "Type")); + } + else if (columnType == IntermediateFieldType.Number) + { + if (2 != width && 4 != width) { - this.Core.ParseExtensionElement(node, child); + this.Core.Write(ErrorMessages.CustomTableIllegalColumnWidth(childSourceLineNumbers, child.Name.LocalName, "Width", width)); } } - - if (columns.Count > 0) + else if (columnType == IntermediateFieldType.Path) { - if (!columns.Where(c => c.PrimaryKey).Any()) + if (!category.HasValue) { - this.Core.Write(ErrorMessages.CustomTableMissingPrimaryKey(sourceLineNumbers)); + category = WixCustomTableColumnCategoryType.Binary; } - - if (!this.Core.EncounteredError) + else if (category != WixCustomTableColumnCategoryType.Binary) { - var columnNames = String.Join(new string(WixCustomTableTuple.ColumnNamesSeparator, 1), columns.Select(c => c.Name)); - - this.Core.AddTuple(new WixCustomTableTuple(sourceLineNumbers, new Identifier(AccessModifier.Public, tableId)) - { - ColumnNames = columnNames, - Unreal = unreal, - }); + this.Core.Write(ErrorMessages.ExpectedBinaryCategory(childSourceLineNumbers)); } } + + this.Core.ParseForExtensionElements(child); + + if (this.Core.EncounteredError) + { + return null; + } + + var attributes = primaryKey ? WixCustomTableColumnTupleAttributes.PrimaryKey : WixCustomTableColumnTupleAttributes.None; + attributes |= localizable ? WixCustomTableColumnTupleAttributes.Localizable : WixCustomTableColumnTupleAttributes.None; + attributes |= nullable ? WixCustomTableColumnTupleAttributes.Nullable : WixCustomTableColumnTupleAttributes.None; + attributes |= columnUnreal ? WixCustomTableColumnTupleAttributes.Unreal : WixCustomTableColumnTupleAttributes.None; + + var column = this.Core.AddTuple(new WixCustomTableColumnTuple(childSourceLineNumbers, new Identifier(AccessModifier.Private, tableId, columnName)) + { + TableRef = tableId, + Name = columnName, + Type = columnType.Value, + Attributes = attributes, + Width = width, + Category = category, + Description = description, + KeyColumn = keyColumn, + KeyTable = keyTable, + MaxValue = maxValue, + MinValue = minValue, + Modularize = modularization, + Set = setValues, + }); + return column; } - private void ParseRow(XElement node, string tableId) + /// + /// Parses a Row element. + /// + /// Element to parse. + /// Element's SourceLineNumbers. + /// Table Id. + private void ParseRowElement(XElement node, SourceLineNumber sourceLineNumbers, string tableId) { - var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); var rowId = Guid.NewGuid().ToString("N").ToUpperInvariant(); foreach (var attrib in node.Attributes()) @@ -6204,6 +6221,9 @@ namespace WixToolset.Core case "BootstrapperApplicationRef": this.ParseBootstrapperApplicationRefElement(child); break; + case "BundleCustomData": + this.ParseBundleCustomDataElement(child); + break; case "BundleExtension": this.ParseBundleExtensionElement(child); break; -- cgit v1.2.3-55-g6feb