aboutsummaryrefslogtreecommitdiff
path: root/src/WixToolset.Core/Compiler.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/WixToolset.Core/Compiler.cs')
-rw-r--r--src/WixToolset.Core/Compiler.cs566
1 files changed, 293 insertions, 273 deletions
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
3668 { 3668 {
3669 var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); 3669 var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);
3670 string tableId = null; 3670 string tableId = null;
3671 var unreal = false;
3672 var columns = new List<WixCustomTableColumnTuple>(); 3671 var columns = new List<WixCustomTableColumnTuple>();
3673 3672
3674 foreach (var attrib in node.Attributes()) 3673 foreach (var attrib in node.Attributes())
@@ -3680,9 +3679,6 @@ namespace WixToolset.Core
3680 case "Id": 3679 case "Id":
3681 tableId = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 3680 tableId = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
3682 break; 3681 break;
3683 case "Unreal":
3684 unreal = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib);
3685 break;
3686 default: 3682 default:
3687 this.Core.UnexpectedAttribute(node, attrib); 3683 this.Core.UnexpectedAttribute(node, attrib);
3688 break; 3684 break;
@@ -3710,315 +3706,336 @@ namespace WixToolset.Core
3710 var childSourceLineNumbers = Preprocessor.GetSourceLineNumbers(child); 3706 var childSourceLineNumbers = Preprocessor.GetSourceLineNumbers(child);
3711 switch (child.Name.LocalName) 3707 switch (child.Name.LocalName)
3712 { 3708 {
3713 case "Column": 3709 case "Column":
3714 string columnName = null; 3710 var column = this.ParseColumnElement(child, childSourceLineNumbers, tableId);
3715 IntermediateFieldType? columnType = null; 3711 if (column != null)
3716 var description = String.Empty;
3717 int? keyColumn = null;
3718 var keyTable = String.Empty;
3719 var localizable = false;
3720 long? maxValue = null;
3721 long? minValue = null;
3722 WixCustomTableColumnCategoryType? category = null;
3723 var modularization = WixCustomTableColumnModularizeType.None;
3724 var nullable = false;
3725 var primaryKey = false;
3726 var setValues = String.Empty;
3727 var columnUnreal = false;
3728 var width = 0;
3729
3730 foreach (var childAttrib in child.Attributes())
3731 {
3732 switch (childAttrib.Name.LocalName)
3733 { 3712 {
3734 case "Id": 3713 columns.Add(column);
3735 columnName = this.Core.GetAttributeIdentifierValue(childSourceLineNumbers, childAttrib); 3714 }
3715 break;
3716 case "Row":
3717 this.ParseRowElement(child, childSourceLineNumbers, tableId);
3718 break;
3719 default:
3720 this.Core.UnexpectedElement(node, child);
3721 break;
3722 }
3723 }
3724 else
3725 {
3726 this.Core.ParseExtensionElement(node, child);
3727 }
3728 }
3729
3730 if (columns.Count > 0)
3731 {
3732 if (!columns.Where(c => c.PrimaryKey).Any())
3733 {
3734 this.Core.Write(ErrorMessages.CustomTableMissingPrimaryKey(sourceLineNumbers));
3735 }
3736
3737 if (!this.Core.EncounteredError)
3738 {
3739 var columnNames = String.Join(new string(WixCustomTableTuple.ColumnNamesSeparator, 1), columns.Select(c => c.Name));
3740
3741 this.Core.AddTuple(new WixCustomTableTuple(sourceLineNumbers, new Identifier(AccessModifier.Public, tableId))
3742 {
3743 ColumnNames = columnNames,
3744 });
3745 }
3746 }
3747 }
3748
3749 /// <summary>
3750 /// Parses a Column element.
3751 /// </summary>
3752 /// <param name="child">Element to parse.</param>
3753 /// <param name="childSourceLineNumbers">Element's SourceLineNumbers.</param>
3754 /// <param name="tableId">Table Id.</param>
3755 private WixCustomTableColumnTuple ParseColumnElement(XElement child, SourceLineNumber childSourceLineNumbers, string tableId)
3756 {
3757 string columnName = null;
3758 IntermediateFieldType? columnType = null;
3759 var description = String.Empty;
3760 int? keyColumn = null;
3761 var keyTable = String.Empty;
3762 var localizable = false;
3763 long? maxValue = null;
3764 long? minValue = null;
3765 WixCustomTableColumnCategoryType? category = null;
3766 var modularization = WixCustomTableColumnModularizeType.None;
3767 var nullable = false;
3768 var primaryKey = false;
3769 var setValues = String.Empty;
3770 var columnUnreal = false;
3771 var width = 0;
3772
3773 foreach (var childAttrib in child.Attributes())
3774 {
3775 switch (childAttrib.Name.LocalName)
3776 {
3777 case "Id":
3778 columnName = this.Core.GetAttributeIdentifierValue(childSourceLineNumbers, childAttrib);
3779 break;
3780 case "Category":
3781 var categoryValue = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib);
3782 switch (categoryValue)
3783 {
3784 case "text":
3785 category = WixCustomTableColumnCategoryType.Text;
3736 break; 3786 break;
3737 case "Category": 3787 case "upperCase":
3738 var categoryValue = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib); 3788 category = WixCustomTableColumnCategoryType.UpperCase;
3739 switch (categoryValue)
3740 {
3741 case "text":
3742 category = WixCustomTableColumnCategoryType.Text;
3743 break;
3744 case "upperCase":
3745 category = WixCustomTableColumnCategoryType.UpperCase;
3746 break;
3747 case "lowerCase":
3748 category = WixCustomTableColumnCategoryType.LowerCase;
3749 break;
3750 case "integer":
3751 category = WixCustomTableColumnCategoryType.Integer;
3752 break;
3753 case "doubleInteger":
3754 category = WixCustomTableColumnCategoryType.DoubleInteger;
3755 break;
3756 case "timeDate":
3757 category = WixCustomTableColumnCategoryType.TimeDate;
3758 break;
3759 case "identifier":
3760 category = WixCustomTableColumnCategoryType.Identifier;
3761 break;
3762 case "property":
3763 category = WixCustomTableColumnCategoryType.Property;
3764 break;
3765 case "filename":
3766 category = WixCustomTableColumnCategoryType.Filename;
3767 break;
3768 case "wildCardFilename":
3769 category = WixCustomTableColumnCategoryType.WildCardFilename;
3770 break;
3771 case "path":
3772 category = WixCustomTableColumnCategoryType.Path;
3773 break;
3774 case "paths":
3775 category = WixCustomTableColumnCategoryType.Paths;
3776 break;
3777 case "anyPath":
3778 category = WixCustomTableColumnCategoryType.AnyPath;
3779 break;
3780 case "defaultDir":
3781 category = WixCustomTableColumnCategoryType.DefaultDir;
3782 break;
3783 case "regPath":
3784 category = WixCustomTableColumnCategoryType.RegPath;
3785 break;
3786 case "formatted":
3787 category = WixCustomTableColumnCategoryType.Formatted;
3788 break;
3789 case "formattedSddl":
3790 category = WixCustomTableColumnCategoryType.FormattedSddl;
3791 break;
3792 case "template":
3793 category = WixCustomTableColumnCategoryType.Template;
3794 break;
3795 case "condition":
3796 category = WixCustomTableColumnCategoryType.Condition;
3797 break;
3798 case "guid":
3799 category = WixCustomTableColumnCategoryType.Guid;
3800 break;
3801 case "version":
3802 category = WixCustomTableColumnCategoryType.Version;
3803 break;
3804 case "language":
3805 category = WixCustomTableColumnCategoryType.Language;
3806 break;
3807 case "binary":
3808 category = WixCustomTableColumnCategoryType.Binary;
3809 break;
3810 case "customSource":
3811 category = WixCustomTableColumnCategoryType.CustomSource;
3812 break;
3813 case "cabinet":
3814 category = WixCustomTableColumnCategoryType.Cabinet;
3815 break;
3816 case "shortcut":
3817 category = WixCustomTableColumnCategoryType.Shortcut;
3818 break;
3819 case "":
3820 break;
3821 default:
3822 this.Core.Write(ErrorMessages.IllegalAttributeValue(childSourceLineNumbers, child.Name.LocalName, "Category", categoryValue,
3823 "text", "upperCase", "lowerCase", "integer", "doubleInteger", "timeDate", "identifier", "property", "filename",
3824 "wildCardFilename", "path", "paths", "anyPath", "defaultDir", "regPath", "formatted", "formattedSddl", "template",
3825 "condition", "guid", "version", "language", "binary", "customSource", "cabinet", "shortcut"));
3826 columnType = IntermediateFieldType.String; // set a value to prevent expected attribute error below.
3827 break;
3828 }
3829 break; 3789 break;
3830 case "Description": 3790 case "lowerCase":
3831 description = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib); 3791 category = WixCustomTableColumnCategoryType.LowerCase;
3832 break; 3792 break;
3833 case "KeyColumn": 3793 case "integer":
3834 keyColumn = this.Core.GetAttributeIntegerValue(childSourceLineNumbers, childAttrib, 1, 32); 3794 category = WixCustomTableColumnCategoryType.Integer;
3835 break; 3795 break;
3836 case "KeyTable": 3796 case "doubleInteger":
3837 keyTable = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib); 3797 category = WixCustomTableColumnCategoryType.DoubleInteger;
3838 break; 3798 break;
3839 case "Localizable": 3799 case "timeDate":
3840 localizable = YesNoType.Yes == this.Core.GetAttributeYesNoValue(childSourceLineNumbers, childAttrib); 3800 category = WixCustomTableColumnCategoryType.TimeDate;
3841 break; 3801 break;
3842 case "MaxValue": 3802 case "identifier":
3843 maxValue = this.Core.GetAttributeLongValue(childSourceLineNumbers, childAttrib, Int32.MinValue + 1, Int32.MaxValue); 3803 category = WixCustomTableColumnCategoryType.Identifier;
3844 break; 3804 break;
3845 case "MinValue": 3805 case "property":
3846 minValue = this.Core.GetAttributeLongValue(childSourceLineNumbers, childAttrib, Int32.MinValue + 1, Int32.MaxValue); 3806 category = WixCustomTableColumnCategoryType.Property;
3847 break; 3807 break;
3848 case "Modularize": 3808 case "filename":
3849 var modularizeValue = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib); 3809 category = WixCustomTableColumnCategoryType.Filename;
3850 switch (modularizeValue)
3851 {
3852 case "column":
3853 modularization = WixCustomTableColumnModularizeType.Column;
3854 break;
3855 case "companionFile":
3856 modularization = WixCustomTableColumnModularizeType.CompanionFile;
3857 break;
3858 case "condition":
3859 modularization = WixCustomTableColumnModularizeType.Condition;
3860 break;
3861 case "controlEventArgument":
3862 modularization = WixCustomTableColumnModularizeType.ControlEventArgument;
3863 break;
3864 case "controlText":
3865 modularization = WixCustomTableColumnModularizeType.ControlText;
3866 break;
3867 case "icon":
3868 modularization = WixCustomTableColumnModularizeType.Icon;
3869 break;
3870 case "none":
3871 modularization = WixCustomTableColumnModularizeType.None;
3872 break;
3873 case "property":
3874 modularization = WixCustomTableColumnModularizeType.Property;
3875 break;
3876 case "semicolonDelimited":
3877 modularization = WixCustomTableColumnModularizeType.SemicolonDelimited;
3878 break;
3879 case "":
3880 break;
3881 default:
3882 this.Core.Write(ErrorMessages.IllegalAttributeValue(childSourceLineNumbers, child.Name.LocalName, "Modularize", modularizeValue, "column", "companionFile", "condition", "controlEventArgument", "controlText", "icon", "property", "semicolonDelimited"));
3883 columnType = IntermediateFieldType.String; // set a value to prevent expected attribute error below.
3884 break;
3885 }
3886 break; 3810 break;
3887 case "Nullable": 3811 case "wildCardFilename":
3888 nullable = YesNoType.Yes == this.Core.GetAttributeYesNoValue(childSourceLineNumbers, childAttrib); 3812 category = WixCustomTableColumnCategoryType.WildCardFilename;
3889 break; 3813 break;
3890 case "PrimaryKey": 3814 case "path":
3891 primaryKey = YesNoType.Yes == this.Core.GetAttributeYesNoValue(childSourceLineNumbers, childAttrib); 3815 category = WixCustomTableColumnCategoryType.Path;
3892 break; 3816 break;
3893 case "Set": 3817 case "paths":
3894 setValues = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib); 3818 category = WixCustomTableColumnCategoryType.Paths;
3895 break; 3819 break;
3896 case "Type": 3820 case "anyPath":
3897 var typeValue = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib); 3821 category = WixCustomTableColumnCategoryType.AnyPath;
3898 switch (typeValue) 3822 break;
3899 { 3823 case "defaultDir":
3900 case "binary": 3824 category = WixCustomTableColumnCategoryType.DefaultDir;
3901 columnType = IntermediateFieldType.Path; 3825 break;
3902 break; 3826 case "regPath":
3903 case "int": 3827 category = WixCustomTableColumnCategoryType.RegPath;
3904 columnType = IntermediateFieldType.Number; 3828 break;
3905 break; 3829 case "formatted":
3906 case "string": 3830 category = WixCustomTableColumnCategoryType.Formatted;
3907 columnType = IntermediateFieldType.String; 3831 break;
3908 break; 3832 case "formattedSddl":
3909 case "": 3833 category = WixCustomTableColumnCategoryType.FormattedSddl;
3910 break; 3834 break;
3911 default: 3835 case "template":
3912 this.Core.Write(ErrorMessages.IllegalAttributeValue(childSourceLineNumbers, child.Name.LocalName, "Type", typeValue, "binary", "int", "string")); 3836 category = WixCustomTableColumnCategoryType.Template;
3913 columnType = IntermediateFieldType.String; // set a value to prevent expected attribute error below. 3837 break;
3914 break; 3838 case "condition":
3915 } 3839 category = WixCustomTableColumnCategoryType.Condition;
3840 break;
3841 case "guid":
3842 category = WixCustomTableColumnCategoryType.Guid;
3916 break; 3843 break;
3917 case "Width": 3844 case "version":
3918 width = this.Core.GetAttributeIntegerValue(childSourceLineNumbers, childAttrib, 0, Int32.MaxValue); 3845 category = WixCustomTableColumnCategoryType.Version;
3919 break; 3846 break;
3920 case "Unreal": 3847 case "language":
3921 columnUnreal = YesNoType.Yes == this.Core.GetAttributeYesNoValue(childSourceLineNumbers, childAttrib); 3848 category = WixCustomTableColumnCategoryType.Language;
3849 break;
3850 case "binary":
3851 category = WixCustomTableColumnCategoryType.Binary;
3852 break;
3853 case "customSource":
3854 category = WixCustomTableColumnCategoryType.CustomSource;
3855 break;
3856 case "cabinet":
3857 category = WixCustomTableColumnCategoryType.Cabinet;
3858 break;
3859 case "shortcut":
3860 category = WixCustomTableColumnCategoryType.Shortcut;
3861 break;
3862 case "":
3922 break; 3863 break;
3923 default: 3864 default:
3924 this.Core.UnexpectedAttribute(child, childAttrib); 3865 this.Core.Write(ErrorMessages.IllegalAttributeValue(childSourceLineNumbers, child.Name.LocalName, "Category", categoryValue,
3866 "text", "upperCase", "lowerCase", "integer", "doubleInteger", "timeDate", "identifier", "property", "filename",
3867 "wildCardFilename", "path", "paths", "anyPath", "defaultDir", "regPath", "formatted", "formattedSddl", "template",
3868 "condition", "guid", "version", "language", "binary", "customSource", "cabinet", "shortcut"));
3869 columnType = IntermediateFieldType.String; // set a value to prevent expected attribute error below.
3925 break; 3870 break;
3926 }
3927 }
3928
3929 if (null == columnName)
3930 {
3931 this.Core.Write(ErrorMessages.ExpectedAttribute(childSourceLineNumbers, child.Name.LocalName, "Id"));
3932 }
3933
3934 if (!columnType.HasValue)
3935 {
3936 this.Core.Write(ErrorMessages.ExpectedAttribute(childSourceLineNumbers, child.Name.LocalName, "Type"));
3937 } 3871 }
3938 else if (columnType == IntermediateFieldType.Number) 3872 break;
3939 { 3873 case "Description":
3940 if (2 != width && 4 != width) 3874 description = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib);
3941 { 3875 break;
3942 this.Core.Write(ErrorMessages.CustomTableIllegalColumnWidth(childSourceLineNumbers, child.Name.LocalName, "Width", width)); 3876 case "KeyColumn":
3943 } 3877 keyColumn = this.Core.GetAttributeIntegerValue(childSourceLineNumbers, childAttrib, 1, 32);
3944 } 3878 break;
3945 else if (columnType == IntermediateFieldType.Path) 3879 case "KeyTable":
3880 keyTable = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib);
3881 break;
3882 case "Localizable":
3883 localizable = YesNoType.Yes == this.Core.GetAttributeYesNoValue(childSourceLineNumbers, childAttrib);
3884 break;
3885 case "MaxValue":
3886 maxValue = this.Core.GetAttributeLongValue(childSourceLineNumbers, childAttrib, Int32.MinValue + 1, Int32.MaxValue);
3887 break;
3888 case "MinValue":
3889 minValue = this.Core.GetAttributeLongValue(childSourceLineNumbers, childAttrib, Int32.MinValue + 1, Int32.MaxValue);
3890 break;
3891 case "Modularize":
3892 var modularizeValue = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib);
3893 switch (modularizeValue)
3946 { 3894 {
3947 if (!category.HasValue) 3895 case "column":
3948 { 3896 modularization = WixCustomTableColumnModularizeType.Column;
3949 category = WixCustomTableColumnCategoryType.Binary; 3897 break;
3950 } 3898 case "companionFile":
3951 else if (category != WixCustomTableColumnCategoryType.Binary) 3899 modularization = WixCustomTableColumnModularizeType.CompanionFile;
3952 { 3900 break;
3953 this.Core.Write(ErrorMessages.ExpectedBinaryCategory(childSourceLineNumbers)); 3901 case "condition":
3954 } 3902 modularization = WixCustomTableColumnModularizeType.Condition;
3903 break;
3904 case "controlEventArgument":
3905 modularization = WixCustomTableColumnModularizeType.ControlEventArgument;
3906 break;
3907 case "controlText":
3908 modularization = WixCustomTableColumnModularizeType.ControlText;
3909 break;
3910 case "icon":
3911 modularization = WixCustomTableColumnModularizeType.Icon;
3912 break;
3913 case "none":
3914 modularization = WixCustomTableColumnModularizeType.None;
3915 break;
3916 case "property":
3917 modularization = WixCustomTableColumnModularizeType.Property;
3918 break;
3919 case "semicolonDelimited":
3920 modularization = WixCustomTableColumnModularizeType.SemicolonDelimited;
3921 break;
3922 case "":
3923 break;
3924 default:
3925 this.Core.Write(ErrorMessages.IllegalAttributeValue(childSourceLineNumbers, child.Name.LocalName, "Modularize", modularizeValue, "column", "companionFile", "condition", "controlEventArgument", "controlText", "icon", "property", "semicolonDelimited"));
3926 columnType = IntermediateFieldType.String; // set a value to prevent expected attribute error below.
3927 break;
3955 } 3928 }
3956 3929 break;
3957 this.Core.ParseForExtensionElements(child); 3930 case "Nullable":
3958 3931 nullable = YesNoType.Yes == this.Core.GetAttributeYesNoValue(childSourceLineNumbers, childAttrib);
3959 if (!this.Core.EncounteredError) 3932 break;
3933 case "PrimaryKey":
3934 primaryKey = YesNoType.Yes == this.Core.GetAttributeYesNoValue(childSourceLineNumbers, childAttrib);
3935 break;
3936 case "Set":
3937 setValues = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib);
3938 break;
3939 case "Type":
3940 var typeValue = this.Core.GetAttributeValue(childSourceLineNumbers, childAttrib);
3941 switch (typeValue)
3960 { 3942 {
3961 var attributes = primaryKey ? WixCustomTableColumnTupleAttributes.PrimaryKey : WixCustomTableColumnTupleAttributes.None; 3943 case "binary":
3962 attributes |= localizable ? WixCustomTableColumnTupleAttributes.Localizable : WixCustomTableColumnTupleAttributes.None; 3944 columnType = IntermediateFieldType.Path;
3963 attributes |= nullable ? WixCustomTableColumnTupleAttributes.Nullable : WixCustomTableColumnTupleAttributes.None; 3945 break;
3964 attributes |= columnUnreal ? WixCustomTableColumnTupleAttributes.Unreal : WixCustomTableColumnTupleAttributes.None; 3946 case "int":
3965 3947 columnType = IntermediateFieldType.Number;
3966 var column = this.Core.AddTuple(new WixCustomTableColumnTuple(childSourceLineNumbers, new Identifier(AccessModifier.Private, tableId, columnName)) 3948 break;
3967 { 3949 case "string":
3968 TableRef = tableId, 3950 columnType = IntermediateFieldType.String;
3969 Name = columnName, 3951 break;
3970 Type = columnType.Value, 3952 case "":
3971 Attributes = attributes, 3953 break;
3972 Width = width, 3954 default:
3973 Category = category, 3955 this.Core.Write(ErrorMessages.IllegalAttributeValue(childSourceLineNumbers, child.Name.LocalName, "Type", typeValue, "binary", "int", "string"));
3974 Description = description, 3956 columnType = IntermediateFieldType.String; // set a value to prevent expected attribute error below.
3975 KeyColumn = keyColumn, 3957 break;
3976 KeyTable = keyTable,
3977 MaxValue = maxValue,
3978 MinValue = minValue,
3979 Modularize = modularization,
3980 Set = setValues,
3981 });
3982 columns.Add(column);
3983 } 3958 }
3984 break; 3959 break;
3985 case "Row": 3960 case "Width":
3986 this.ParseRow(child, tableId); 3961 width = this.Core.GetAttributeIntegerValue(childSourceLineNumbers, childAttrib, 0, Int32.MaxValue);
3962 break;
3963 case "Unreal":
3964 columnUnreal = YesNoType.Yes == this.Core.GetAttributeYesNoValue(childSourceLineNumbers, childAttrib);
3987 break; 3965 break;
3988 default: 3966 default:
3989 this.Core.UnexpectedElement(node, child); 3967 this.Core.UnexpectedAttribute(child, childAttrib);
3990 break; 3968 break;
3991 }
3992 } 3969 }
3993 else 3970 }
3971
3972 if (null == columnName)
3973 {
3974 this.Core.Write(ErrorMessages.ExpectedAttribute(childSourceLineNumbers, child.Name.LocalName, "Id"));
3975 }
3976
3977 if (!columnType.HasValue)
3978 {
3979 this.Core.Write(ErrorMessages.ExpectedAttribute(childSourceLineNumbers, child.Name.LocalName, "Type"));
3980 }
3981 else if (columnType == IntermediateFieldType.Number)
3982 {
3983 if (2 != width && 4 != width)
3994 { 3984 {
3995 this.Core.ParseExtensionElement(node, child); 3985 this.Core.Write(ErrorMessages.CustomTableIllegalColumnWidth(childSourceLineNumbers, child.Name.LocalName, "Width", width));
3996 } 3986 }
3997 } 3987 }
3998 3988 else if (columnType == IntermediateFieldType.Path)
3999 if (columns.Count > 0)
4000 { 3989 {
4001 if (!columns.Where(c => c.PrimaryKey).Any()) 3990 if (!category.HasValue)
4002 { 3991 {
4003 this.Core.Write(ErrorMessages.CustomTableMissingPrimaryKey(sourceLineNumbers)); 3992 category = WixCustomTableColumnCategoryType.Binary;
4004 } 3993 }
4005 3994 else if (category != WixCustomTableColumnCategoryType.Binary)
4006 if (!this.Core.EncounteredError)
4007 { 3995 {
4008 var columnNames = String.Join(new string(WixCustomTableTuple.ColumnNamesSeparator, 1), columns.Select(c => c.Name)); 3996 this.Core.Write(ErrorMessages.ExpectedBinaryCategory(childSourceLineNumbers));
4009
4010 this.Core.AddTuple(new WixCustomTableTuple(sourceLineNumbers, new Identifier(AccessModifier.Public, tableId))
4011 {
4012 ColumnNames = columnNames,
4013 Unreal = unreal,
4014 });
4015 } 3997 }
4016 } 3998 }
3999
4000 this.Core.ParseForExtensionElements(child);
4001
4002 if (this.Core.EncounteredError)
4003 {
4004 return null;
4005 }
4006
4007 var attributes = primaryKey ? WixCustomTableColumnTupleAttributes.PrimaryKey : WixCustomTableColumnTupleAttributes.None;
4008 attributes |= localizable ? WixCustomTableColumnTupleAttributes.Localizable : WixCustomTableColumnTupleAttributes.None;
4009 attributes |= nullable ? WixCustomTableColumnTupleAttributes.Nullable : WixCustomTableColumnTupleAttributes.None;
4010 attributes |= columnUnreal ? WixCustomTableColumnTupleAttributes.Unreal : WixCustomTableColumnTupleAttributes.None;
4011
4012 var column = this.Core.AddTuple(new WixCustomTableColumnTuple(childSourceLineNumbers, new Identifier(AccessModifier.Private, tableId, columnName))
4013 {
4014 TableRef = tableId,
4015 Name = columnName,
4016 Type = columnType.Value,
4017 Attributes = attributes,
4018 Width = width,
4019 Category = category,
4020 Description = description,
4021 KeyColumn = keyColumn,
4022 KeyTable = keyTable,
4023 MaxValue = maxValue,
4024 MinValue = minValue,
4025 Modularize = modularization,
4026 Set = setValues,
4027 });
4028 return column;
4017 } 4029 }
4018 4030
4019 private void ParseRow(XElement node, string tableId) 4031 /// <summary>
4032 /// Parses a Row element.
4033 /// </summary>
4034 /// <param name="node">Element to parse.</param>
4035 /// <param name="sourceLineNumbers">Element's SourceLineNumbers.</param>
4036 /// <param name="tableId">Table Id.</param>
4037 private void ParseRowElement(XElement node, SourceLineNumber sourceLineNumbers, string tableId)
4020 { 4038 {
4021 var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);
4022 var rowId = Guid.NewGuid().ToString("N").ToUpperInvariant(); 4039 var rowId = Guid.NewGuid().ToString("N").ToUpperInvariant();
4023 4040
4024 foreach (var attrib in node.Attributes()) 4041 foreach (var attrib in node.Attributes())
@@ -6204,6 +6221,9 @@ namespace WixToolset.Core
6204 case "BootstrapperApplicationRef": 6221 case "BootstrapperApplicationRef":
6205 this.ParseBootstrapperApplicationRefElement(child); 6222 this.ParseBootstrapperApplicationRefElement(child);
6206 break; 6223 break;
6224 case "BundleCustomData":
6225 this.ParseBundleCustomDataElement(child);
6226 break;
6207 case "BundleExtension": 6227 case "BundleExtension":
6208 this.ParseBundleExtensionElement(child); 6228 this.ParseBundleExtensionElement(child);
6209 break; 6229 break;