diff options
Diffstat (limited to 'src/WixToolset.Core/Compiler_Bundle.cs')
-rw-r--r-- | src/WixToolset.Core/Compiler_Bundle.cs | 244 |
1 files changed, 244 insertions, 0 deletions
diff --git a/src/WixToolset.Core/Compiler_Bundle.cs b/src/WixToolset.Core/Compiler_Bundle.cs index 31896a42..5154a72f 100644 --- a/src/WixToolset.Core/Compiler_Bundle.cs +++ b/src/WixToolset.Core/Compiler_Bundle.cs | |||
@@ -7,6 +7,7 @@ namespace WixToolset.Core | |||
7 | using System.Diagnostics; | 7 | using System.Diagnostics; |
8 | using System.Globalization; | 8 | using System.Globalization; |
9 | using System.IO; | 9 | using System.IO; |
10 | using System.Linq; | ||
10 | using System.Xml.Linq; | 11 | using System.Xml.Linq; |
11 | using WixToolset.Data; | 12 | using WixToolset.Data; |
12 | using WixToolset.Data.Burn; | 13 | using WixToolset.Data.Burn; |
@@ -276,6 +277,9 @@ namespace WixToolset.Core | |||
276 | case "BootstrapperApplicationRef": | 277 | case "BootstrapperApplicationRef": |
277 | this.ParseBootstrapperApplicationRefElement(child); | 278 | this.ParseBootstrapperApplicationRefElement(child); |
278 | break; | 279 | break; |
280 | case "BundleCustomData": | ||
281 | this.ParseBundleCustomDataElement(child); | ||
282 | break; | ||
279 | case "BundleExtension": | 283 | case "BundleExtension": |
280 | this.ParseBundleExtensionElement(child); | 284 | this.ParseBundleExtensionElement(child); |
281 | break; | 285 | break; |
@@ -767,6 +771,246 @@ namespace WixToolset.Core | |||
767 | } | 771 | } |
768 | } | 772 | } |
769 | 773 | ||
774 | |||
775 | |||
776 | /// <summary> | ||
777 | /// Parses a BundleCustomData element. | ||
778 | /// </summary> | ||
779 | /// <param name="node">Element to parse.</param> | ||
780 | private void ParseBundleCustomDataElement(XElement node) | ||
781 | { | ||
782 | var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); | ||
783 | string customDataId = null; | ||
784 | WixBundleCustomDataType? customDataType = null; | ||
785 | string extensionId = null; | ||
786 | var attributeDefinitions = new List<WixBundleCustomDataAttributeTuple>(); | ||
787 | |||
788 | foreach (var attrib in node.Attributes()) | ||
789 | { | ||
790 | if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || CompilerCore.WixNamespace == attrib.Name.Namespace) | ||
791 | { | ||
792 | switch (attrib.Name.LocalName) | ||
793 | { | ||
794 | case "Id": | ||
795 | customDataId = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); | ||
796 | break; | ||
797 | case "Type": | ||
798 | var typeValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib); | ||
799 | switch (typeValue) | ||
800 | { | ||
801 | case "bootstrapperApplication": | ||
802 | customDataType = WixBundleCustomDataType.BootstrapperApplication; | ||
803 | break; | ||
804 | case "bundleExtension": | ||
805 | customDataType = WixBundleCustomDataType.BundleExtension; | ||
806 | break; | ||
807 | default: | ||
808 | this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, "Type", typeValue, "bootstrapperApplication", "bundleExtension")); | ||
809 | customDataType = WixBundleCustomDataType.Unknown; // set a value to prevent expected attribute error below. | ||
810 | break; | ||
811 | } | ||
812 | break; | ||
813 | case "ExtensionId": | ||
814 | extensionId = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); | ||
815 | this.Core.CreateSimpleReference(sourceLineNumbers, TupleDefinitions.WixBundleExtension, extensionId); | ||
816 | break; | ||
817 | default: | ||
818 | this.Core.UnexpectedAttribute(node, attrib); | ||
819 | break; | ||
820 | } | ||
821 | } | ||
822 | else | ||
823 | { | ||
824 | this.Core.ParseExtensionAttribute(node, attrib); | ||
825 | } | ||
826 | } | ||
827 | |||
828 | if (null == customDataId) | ||
829 | { | ||
830 | this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Id")); | ||
831 | } | ||
832 | |||
833 | var hasExtensionId = null != extensionId; | ||
834 | if (hasExtensionId && !customDataType.HasValue) | ||
835 | { | ||
836 | customDataType = WixBundleCustomDataType.BundleExtension; | ||
837 | } | ||
838 | |||
839 | if (!customDataType.HasValue) | ||
840 | { | ||
841 | this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Type")); | ||
842 | } | ||
843 | else if (hasExtensionId) | ||
844 | { | ||
845 | if (customDataType.Value == WixBundleCustomDataType.BootstrapperApplication) | ||
846 | { | ||
847 | this.Core.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(sourceLineNumbers, node.Name.LocalName, "ExtensonId", "Type", "bootstrapperApplication")); | ||
848 | } | ||
849 | } | ||
850 | else if (customDataType.Value == WixBundleCustomDataType.BundleExtension) | ||
851 | { | ||
852 | this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "ExtensionId", "Type", "bundleExtension")); | ||
853 | } | ||
854 | |||
855 | foreach (var child in node.Elements()) | ||
856 | { | ||
857 | if (CompilerCore.WixNamespace == child.Name.Namespace) | ||
858 | { | ||
859 | var childSourceLineNumbers = Preprocessor.GetSourceLineNumbers(child); | ||
860 | switch (child.Name.LocalName) | ||
861 | { | ||
862 | case "BundleAttributeDefinition": | ||
863 | var attributeDefinition = this.ParseBundleAttributeDefinitionElement(child, childSourceLineNumbers, customDataId); | ||
864 | if (attributeDefinition != null) | ||
865 | { | ||
866 | attributeDefinitions.Add(attributeDefinition); | ||
867 | } | ||
868 | break; | ||
869 | case "BundleElement": | ||
870 | this.ParseBundleElementElement(child, childSourceLineNumbers, customDataId); | ||
871 | break; | ||
872 | default: | ||
873 | this.Core.UnexpectedElement(node, child); | ||
874 | break; | ||
875 | } | ||
876 | } | ||
877 | else | ||
878 | { | ||
879 | this.Core.ParseExtensionElement(node, child); | ||
880 | } | ||
881 | } | ||
882 | |||
883 | if (attributeDefinitions.Count > 0) | ||
884 | { | ||
885 | if (!this.Core.EncounteredError) | ||
886 | { | ||
887 | var attributeNames = String.Join(new string(WixBundleCustomDataTuple.AttributeNamesSeparator, 1), attributeDefinitions.Select(c => c.Name)); | ||
888 | |||
889 | this.Core.AddTuple(new WixBundleCustomDataTuple(sourceLineNumbers, new Identifier(AccessModifier.Public, customDataId)) | ||
890 | { | ||
891 | AttributeNames = attributeNames, | ||
892 | Type = customDataType.Value, | ||
893 | BundleExtensionRef = extensionId, | ||
894 | }); | ||
895 | } | ||
896 | } | ||
897 | } | ||
898 | |||
899 | /// <summary> | ||
900 | /// Parses a BundleAttributeDefinition element. | ||
901 | /// </summary> | ||
902 | /// <param name="node">Element to parse.</param> | ||
903 | /// <param name="sourceLineNumbers">Element's SourceLineNumbers.</param> | ||
904 | /// <param name="customDataId">BundleCustomData Id.</param> | ||
905 | private WixBundleCustomDataAttributeTuple ParseBundleAttributeDefinitionElement(XElement node, SourceLineNumber sourceLineNumbers, string customDataId) | ||
906 | { | ||
907 | string attributeName = null; | ||
908 | |||
909 | foreach (var attrib in node.Attributes()) | ||
910 | { | ||
911 | switch (attrib.Name.LocalName) | ||
912 | { | ||
913 | case "Id": | ||
914 | attributeName = this.Core.GetAttributeValue(sourceLineNumbers, attrib); | ||
915 | break; | ||
916 | default: | ||
917 | this.Core.UnexpectedAttribute(node, attrib); | ||
918 | break; | ||
919 | } | ||
920 | } | ||
921 | |||
922 | if (null == attributeName) | ||
923 | { | ||
924 | this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Id")); | ||
925 | } | ||
926 | |||
927 | this.Core.ParseForExtensionElements(node); | ||
928 | |||
929 | if (this.Core.EncounteredError) | ||
930 | { | ||
931 | return null; | ||
932 | } | ||
933 | |||
934 | var customDataAttribute = this.Core.AddTuple(new WixBundleCustomDataAttributeTuple(sourceLineNumbers, new Identifier(AccessModifier.Private, customDataId, attributeName)) | ||
935 | { | ||
936 | CustomDataRef = customDataId, | ||
937 | Name = attributeName, | ||
938 | }); | ||
939 | return customDataAttribute; | ||
940 | } | ||
941 | |||
942 | /// <summary> | ||
943 | /// Parses a BundleElement element. | ||
944 | /// </summary> | ||
945 | /// <param name="node">Element to parse.</param> | ||
946 | /// <param name="sourceLineNumbers">Element's SourceLineNumbers.</param> | ||
947 | /// <param name="customDataId">BundleCustomData Id.</param> | ||
948 | private void ParseBundleElementElement(XElement node, SourceLineNumber sourceLineNumbers, string customDataId) | ||
949 | { | ||
950 | var elementId = Guid.NewGuid().ToString("N").ToUpperInvariant(); | ||
951 | |||
952 | foreach (var attrib in node.Attributes()) | ||
953 | { | ||
954 | this.Core.ParseExtensionAttribute(node, attrib); | ||
955 | } | ||
956 | |||
957 | foreach (var child in node.Elements()) | ||
958 | { | ||
959 | var childSourceLineNumbers = Preprocessor.GetSourceLineNumbers(child); | ||
960 | switch (child.Name.LocalName) | ||
961 | { | ||
962 | case "BundleAttribute": | ||
963 | string attributeName = null; | ||
964 | string value = null; | ||
965 | foreach (var attrib in child.Attributes()) | ||
966 | { | ||
967 | switch (attrib.Name.LocalName) | ||
968 | { | ||
969 | case "Id": | ||
970 | attributeName = this.Core.GetAttributeValue(childSourceLineNumbers, attrib); | ||
971 | break; | ||
972 | case "Value": | ||
973 | value = this.Core.GetAttributeValue(childSourceLineNumbers, attrib); | ||
974 | break; | ||
975 | default: | ||
976 | this.Core.ParseExtensionAttribute(child, attrib); | ||
977 | break; | ||
978 | } | ||
979 | } | ||
980 | |||
981 | if (null == attributeName) | ||
982 | { | ||
983 | this.Core.Write(ErrorMessages.ExpectedAttribute(childSourceLineNumbers, child.Name.LocalName, "Id")); | ||
984 | } | ||
985 | |||
986 | if (String.IsNullOrEmpty(value)) | ||
987 | { | ||
988 | value = Common.GetInnerText(child); | ||
989 | } | ||
990 | |||
991 | if (!this.Core.EncounteredError) | ||
992 | { | ||
993 | this.Core.AddTuple(new WixBundleCustomDataCellTuple(childSourceLineNumbers, new Identifier(AccessModifier.Private, customDataId, elementId, attributeName)) | ||
994 | { | ||
995 | ElementId = elementId, | ||
996 | AttributeRef = attributeName, | ||
997 | CustomDataRef = customDataId, | ||
998 | Value = value, | ||
999 | }); | ||
1000 | } | ||
1001 | break; | ||
1002 | default: | ||
1003 | this.Core.UnexpectedElement(node, child); | ||
1004 | break; | ||
1005 | } | ||
1006 | } | ||
1007 | |||
1008 | if (!this.Core.EncounteredError) | ||
1009 | { | ||
1010 | this.Core.CreateSimpleReference(sourceLineNumbers, TupleDefinitions.WixBundleCustomData, customDataId); | ||
1011 | } | ||
1012 | } | ||
1013 | |||
770 | /// <summary> | 1014 | /// <summary> |
771 | /// Parse the BundleExtension element. | 1015 | /// Parse the BundleExtension element. |
772 | /// </summary> | 1016 | /// </summary> |