aboutsummaryrefslogtreecommitdiff
path: root/src/WixToolset.Core/Compiler_Bundle.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/WixToolset.Core/Compiler_Bundle.cs')
-rw-r--r--src/WixToolset.Core/Compiler_Bundle.cs142
1 files changed, 110 insertions, 32 deletions
diff --git a/src/WixToolset.Core/Compiler_Bundle.cs b/src/WixToolset.Core/Compiler_Bundle.cs
index a840e448..5d7072d0 100644
--- a/src/WixToolset.Core/Compiler_Bundle.cs
+++ b/src/WixToolset.Core/Compiler_Bundle.cs
@@ -323,6 +323,12 @@ namespace WixToolset.Core
323 case "RelatedBundle": 323 case "RelatedBundle":
324 this.ParseRelatedBundleElement(child); 324 this.ParseRelatedBundleElement(child);
325 break; 325 break;
326 case "SetVariable":
327 this.ParseSetVariableElement(child);
328 break;
329 case "SetVariableRef":
330 this.ParseSimpleRefElement(child, "WixSetVariable");
331 break;
326 case "Update": 332 case "Update":
327 this.ParseUpdateElement(child); 333 this.ParseUpdateElement(child);
328 break; 334 break;
@@ -2705,6 +2711,78 @@ namespace WixToolset.Core
2705 } 2711 }
2706 2712
2707 /// <summary> 2713 /// <summary>
2714 /// Parse SetVariable element
2715 /// </summary>
2716 /// <param name="node">Element to parse</param>
2717 private void ParseSetVariableElement(XElement node)
2718 {
2719 var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);
2720 Identifier id = null;
2721 string variable = null;
2722 string condition = null;
2723 string after = null;
2724 string value = null;
2725 string type = null;
2726
2727 foreach (var attrib in node.Attributes())
2728 {
2729 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || CompilerCore.WixNamespace == attrib.Name.Namespace)
2730 {
2731 switch (attrib.Name.LocalName)
2732 {
2733 case "Id":
2734 id = this.Core.GetAttributeIdentifier(sourceLineNumbers, attrib);
2735 break;
2736 case "Variable":
2737 variable = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
2738 break;
2739 case "Condition":
2740 condition = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
2741 break;
2742 case "After":
2743 after = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
2744 break;
2745 case "Value":
2746 value = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
2747 break;
2748 case "Type":
2749 type = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
2750 break;
2751
2752 default:
2753 this.Core.UnexpectedAttribute(node, attrib);
2754 break;
2755 }
2756 }
2757 else
2758 {
2759 this.Core.ParseExtensionAttribute(node, attrib, null);
2760 }
2761 }
2762
2763 type = this.ValidateVariableTypeWithValue(sourceLineNumbers, type, value);
2764
2765 this.Core.ParseForExtensionElements(node);
2766
2767 if (id == null)
2768 {
2769 id = this.Core.CreateIdentifier("sbv", variable, condition, after, value, type);
2770 }
2771
2772 this.Core.CreateWixSearchTuple(sourceLineNumbers, node.Name.LocalName, id, variable, condition, after);
2773
2774 if (!this.Messaging.EncounteredError)
2775 {
2776 var tuple = new WixSetVariableTuple(sourceLineNumbers, id)
2777 {
2778 Value = value,
2779 Type = type,
2780 };
2781 this.Core.AddTuple(tuple);
2782 }
2783 }
2784
2785 /// <summary>
2708 /// Parse Variable element 2786 /// Parse Variable element
2709 /// </summary> 2787 /// </summary>
2710 /// <param name="node">Element to parse</param> 2788 /// <param name="node">Element to parse</param>
@@ -2764,64 +2842,64 @@ namespace WixToolset.Core
2764 this.Core.Write(ErrorMessages.ReservedNamespaceViolation(sourceLineNumbers, node.Name.LocalName, "Name", "Wix")); 2842 this.Core.Write(ErrorMessages.ReservedNamespaceViolation(sourceLineNumbers, node.Name.LocalName, "Name", "Wix"));
2765 } 2843 }
2766 2844
2767 if (null == type && null != value) 2845 type = this.ValidateVariableTypeWithValue(sourceLineNumbers, type, value);
2846
2847 this.Core.ParseForExtensionElements(node);
2848
2849 if (!this.Core.EncounteredError)
2850 {
2851 var tuple = new WixBundleVariableTuple(sourceLineNumbers, new Identifier(AccessModifier.Private, name))
2852 {
2853 Value = value,
2854 Type = type,
2855 Hidden = hidden,
2856 Persisted = persisted
2857 };
2858
2859 this.Core.AddTuple(tuple);
2860 }
2861 }
2862
2863 private string ValidateVariableTypeWithValue(SourceLineNumber sourceLineNumbers, string type, string value)
2864 {
2865 var newType = type;
2866 if (newType == null && value != null)
2768 { 2867 {
2769 // Infer the type from the current value... 2868 // Infer the type from the current value...
2770 if (value.StartsWith("v", StringComparison.OrdinalIgnoreCase)) 2869 if (value.StartsWith("v", StringComparison.OrdinalIgnoreCase))
2771 { 2870 {
2772 // Version constructor does not support simple "v#" syntax so check to see if the value is 2871 // Version constructor does not support simple "v#" syntax so check to see if the value is
2773 // non-negative real quick. 2872 // non-negative real quick.
2774 if (Int32.TryParse(value.Substring(1), NumberStyles.None, CultureInfo.InvariantCulture.NumberFormat, out var number)) 2873 if (Int32.TryParse(value.Substring(1), NumberStyles.None, CultureInfo.InvariantCulture.NumberFormat, out var _))
2775 { 2874 {
2776 type = "version"; 2875 newType = "version";
2777 } 2876 }
2778 else 2877 else if (Version.TryParse(value.Substring(1), out var _))
2779 { 2878 {
2780 // Sadly, Version doesn't have a TryParse() method until .NET 4, so we have to try/catch to see if it parses. 2879 newType = "version";
2781 try
2782 {
2783 var version = new Version(value.Substring(1));
2784 type = "version";
2785 }
2786 catch (Exception)
2787 {
2788 }
2789 } 2880 }
2790 } 2881 }
2791 2882
2792 // Not a version, check for numeric. 2883 // Not a version, check for numeric.
2793 if (null == type) 2884 if (newType == null)
2794 { 2885 {
2795 if (Int64.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture.NumberFormat, out var number)) 2886 if (Int64.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture.NumberFormat, out var _))
2796 { 2887 {
2797 type = "numeric"; 2888 newType = "numeric";
2798 } 2889 }
2799 else 2890 else
2800 { 2891 {
2801 type = "string"; 2892 newType = "string";
2802 } 2893 }
2803 } 2894 }
2804 } 2895 }
2805 2896
2806 if (null == value && null != type) 2897 if (value == null && newType != null)
2807 { 2898 {
2808 this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, "Variable", "Value", "Type")); 2899 this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, "Variable", "Value", "Type"));
2809 } 2900 }
2810 2901
2811 this.Core.ParseForExtensionElements(node); 2902 return newType;
2812
2813 if (!this.Core.EncounteredError)
2814 {
2815 var tuple = new WixBundleVariableTuple(sourceLineNumbers, new Identifier(AccessModifier.Private, name))
2816 {
2817 Value = value,
2818 Type = type,
2819 Hidden = hidden,
2820 Persisted = persisted
2821 };
2822
2823 this.Core.AddTuple(tuple);
2824 }
2825 } 2903 }
2826 2904
2827 private class RemotePayload 2905 private class RemotePayload