diff options
Diffstat (limited to 'src/ext')
-rw-r--r-- | src/ext/Util/test/WixToolsetTest.Util/UtilExtensionFixture.cs | 5 | ||||
-rw-r--r-- | src/ext/Util/wixext/UtilCompiler.cs | 103 |
2 files changed, 53 insertions, 55 deletions
diff --git a/src/ext/Util/test/WixToolsetTest.Util/UtilExtensionFixture.cs b/src/ext/Util/test/WixToolsetTest.Util/UtilExtensionFixture.cs index d2a4e34b..32d18e9c 100644 --- a/src/ext/Util/test/WixToolsetTest.Util/UtilExtensionFixture.cs +++ b/src/ext/Util/test/WixToolsetTest.Util/UtilExtensionFixture.cs | |||
@@ -242,7 +242,6 @@ namespace WixToolsetTest.Util | |||
242 | [Fact] | 242 | [Fact] |
243 | public void CanBuildBundleWithSearches() | 243 | public void CanBuildBundleWithSearches() |
244 | { | 244 | { |
245 | var burnStubPath = TestData.Get(@"TestData\.Data\burn.exe"); | ||
246 | var folder = TestData.Get(@"TestData\BundleWithSearches"); | 245 | var folder = TestData.Get(@"TestData\BundleWithSearches"); |
247 | var rootFolder = TestData.Get(); | 246 | var rootFolder = TestData.Get(); |
248 | var wixext = Path.Combine(rootFolder, "WixToolset.Util.wixext.dll"); | 247 | var wixext = Path.Combine(rootFolder, "WixToolset.Util.wixext.dll"); |
@@ -269,9 +268,7 @@ namespace WixToolsetTest.Util | |||
269 | result.AssertSuccess(); | 268 | result.AssertSuccess(); |
270 | 269 | ||
271 | Assert.True(File.Exists(bundlePath)); | 270 | Assert.True(File.Exists(bundlePath)); |
272 | #if TODO | ||
273 | Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\test.wixpdb"))); | 271 | Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\test.wixpdb"))); |
274 | #endif | ||
275 | 272 | ||
276 | var extractResult = BundleExtractor.ExtractBAContainer(null, bundlePath, baFolderPath, extractFolderPath); | 273 | var extractResult = BundleExtractor.ExtractBAContainer(null, bundlePath, baFolderPath, extractFolderPath); |
277 | extractResult.AssertSuccess(); | 274 | extractResult.AssertSuccess(); |
@@ -293,7 +290,7 @@ namespace WixToolsetTest.Util | |||
293 | Assert.Equal("<RegistrySearch Id='RegistrySearchId' Variable='RegistrySearchVariable' " + | 290 | Assert.Equal("<RegistrySearch Id='RegistrySearchId' Variable='RegistrySearchVariable' " + |
294 | @"Root='HKLM' Key='SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full' Value='Release' Type='value' VariableType='string' />", utilSearches[3].GetTestXml()); | 291 | @"Root='HKLM' Key='SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full' Value='Release' Type='value' VariableType='string' />", utilSearches[3].GetTestXml()); |
295 | Assert.Equal("<RegistrySearch Id='RegistrySearchId64' Variable='RegistrySearchVariable64' " + | 292 | Assert.Equal("<RegistrySearch Id='RegistrySearchId64' Variable='RegistrySearchVariable64' " + |
296 | @"Root='HKLM' Key='SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full' Value='Release' Type='value' Win64='yes' VariableType='string' />", utilSearches[4].GetTestXml()); | 293 | @"Root='HKLM' Key='SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full' Value='Release' Win64='yes' Type='value' VariableType='string' />", utilSearches[4].GetTestXml()); |
297 | } | 294 | } |
298 | } | 295 | } |
299 | 296 | ||
diff --git a/src/ext/Util/wixext/UtilCompiler.cs b/src/ext/Util/wixext/UtilCompiler.cs index 09a90928..323e0f6a 100644 --- a/src/ext/Util/wixext/UtilCompiler.cs +++ b/src/ext/Util/wixext/UtilCompiler.cs | |||
@@ -443,7 +443,8 @@ namespace WixToolset.Util | |||
443 | string after = null; | 443 | string after = null; |
444 | string guid = null; | 444 | string guid = null; |
445 | string productCode = null; | 445 | string productCode = null; |
446 | var attributes = WixComponentSearchAttributes.KeyPath; | 446 | var attributes = WixComponentSearchAttributes.None; |
447 | var type = WixComponentSearchType.KeyPath; | ||
447 | 448 | ||
448 | foreach (var attrib in element.Attributes()) | 449 | foreach (var attrib in element.Attributes()) |
449 | { | 450 | { |
@@ -468,13 +469,13 @@ namespace WixToolset.Util | |||
468 | switch (result) | 469 | switch (result) |
469 | { | 470 | { |
470 | case "directory": | 471 | case "directory": |
471 | attributes = WixComponentSearchAttributes.WantDirectory; | 472 | type = WixComponentSearchType.WantDirectory; |
472 | break; | 473 | break; |
473 | case "keyPath": | 474 | case "keyPath": |
474 | attributes = WixComponentSearchAttributes.KeyPath; | 475 | type = WixComponentSearchType.KeyPath; |
475 | break; | 476 | break; |
476 | case "state": | 477 | case "state": |
477 | attributes = WixComponentSearchAttributes.State; | 478 | type = WixComponentSearchType.State; |
478 | break; | 479 | break; |
479 | default: | 480 | default: |
480 | this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, attrib.Parent.Name.LocalName, attrib.Name.LocalName, result, "directory", "keyPath", "state")); | 481 | this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, attrib.Parent.Name.LocalName, attrib.Name.LocalName, result, "directory", "keyPath", "state")); |
@@ -499,7 +500,7 @@ namespace WixToolset.Util | |||
499 | 500 | ||
500 | if (null == id) | 501 | if (null == id) |
501 | { | 502 | { |
502 | id = this.ParseHelper.CreateIdentifier("wcs", variable, condition, after, guid, productCode, attributes.ToString()); | 503 | id = this.ParseHelper.CreateIdentifier("wcs", variable, condition, after, guid, productCode, attributes.ToString(), type.ToString()); |
503 | } | 504 | } |
504 | 505 | ||
505 | this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); | 506 | this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); |
@@ -513,6 +514,7 @@ namespace WixToolset.Util | |||
513 | Guid = guid, | 514 | Guid = guid, |
514 | ProductCode = productCode, | 515 | ProductCode = productCode, |
515 | Attributes = attributes, | 516 | Attributes = attributes, |
517 | Type = type, | ||
516 | }); | 518 | }); |
517 | } | 519 | } |
518 | } | 520 | } |
@@ -983,6 +985,7 @@ namespace WixToolset.Util | |||
983 | string after = null; | 985 | string after = null; |
984 | string path = null; | 986 | string path = null; |
985 | var attributes = WixFileSearchAttributes.IsDirectory; | 987 | var attributes = WixFileSearchAttributes.IsDirectory; |
988 | var type = WixFileSearchType.Path; | ||
986 | 989 | ||
987 | foreach (var attrib in element.Attributes()) | 990 | foreach (var attrib in element.Attributes()) |
988 | { | 991 | { |
@@ -1004,7 +1007,7 @@ namespace WixToolset.Util | |||
1004 | switch (result) | 1007 | switch (result) |
1005 | { | 1008 | { |
1006 | case "exists": | 1009 | case "exists": |
1007 | attributes |= WixFileSearchAttributes.WantExists; | 1010 | type = WixFileSearchType.Exists; |
1008 | break; | 1011 | break; |
1009 | default: | 1012 | default: |
1010 | this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, attrib.Parent.Name.LocalName, attrib.Name.LocalName, result, "exists")); | 1013 | this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, attrib.Parent.Name.LocalName, attrib.Name.LocalName, result, "exists")); |
@@ -1029,7 +1032,7 @@ namespace WixToolset.Util | |||
1029 | 1032 | ||
1030 | if (null == id) | 1033 | if (null == id) |
1031 | { | 1034 | { |
1032 | id = this.ParseHelper.CreateIdentifier("wds", variable, condition, after, path, attributes.ToString()); | 1035 | id = this.ParseHelper.CreateIdentifier("wds", variable, condition, after, path, attributes.ToString(), type.ToString()); |
1033 | } | 1036 | } |
1034 | 1037 | ||
1035 | this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); | 1038 | this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); |
@@ -1038,7 +1041,7 @@ namespace WixToolset.Util | |||
1038 | 1041 | ||
1039 | if (!this.Messaging.EncounteredError) | 1042 | if (!this.Messaging.EncounteredError) |
1040 | { | 1043 | { |
1041 | this.CreateWixFileSearchRow(section, sourceLineNumbers, id, path, attributes); | 1044 | this.CreateWixFileSearchRow(section, sourceLineNumbers, id, path, attributes, type); |
1042 | } | 1045 | } |
1043 | } | 1046 | } |
1044 | 1047 | ||
@@ -1086,7 +1089,8 @@ namespace WixToolset.Util | |||
1086 | string condition = null; | 1089 | string condition = null; |
1087 | string after = null; | 1090 | string after = null; |
1088 | string path = null; | 1091 | string path = null; |
1089 | var attributes = WixFileSearchAttributes.Default; | 1092 | var attributes = WixFileSearchAttributes.None; |
1093 | var type = WixFileSearchType.Path; | ||
1090 | 1094 | ||
1091 | foreach (var attrib in node.Attributes()) | 1095 | foreach (var attrib in node.Attributes()) |
1092 | { | 1096 | { |
@@ -1108,10 +1112,10 @@ namespace WixToolset.Util | |||
1108 | switch (result) | 1112 | switch (result) |
1109 | { | 1113 | { |
1110 | case "exists": | 1114 | case "exists": |
1111 | attributes |= WixFileSearchAttributes.WantExists; | 1115 | type = WixFileSearchType.Exists; |
1112 | break; | 1116 | break; |
1113 | case "version": | 1117 | case "version": |
1114 | attributes |= WixFileSearchAttributes.WantVersion; | 1118 | type = WixFileSearchType.Version; |
1115 | break; | 1119 | break; |
1116 | default: | 1120 | default: |
1117 | this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, attrib.Parent.Name.LocalName, attrib.Name.LocalName, result, "exists", "version")); | 1121 | this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, attrib.Parent.Name.LocalName, attrib.Name.LocalName, result, "exists", "version")); |
@@ -1136,7 +1140,7 @@ namespace WixToolset.Util | |||
1136 | 1140 | ||
1137 | if (null == id) | 1141 | if (null == id) |
1138 | { | 1142 | { |
1139 | id = this.ParseHelper.CreateIdentifier("wfs", variable, condition, after, path, attributes.ToString()); | 1143 | id = this.ParseHelper.CreateIdentifier("wfs", variable, condition, after, path, attributes.ToString(), type.ToString()); |
1140 | } | 1144 | } |
1141 | 1145 | ||
1142 | this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, node); | 1146 | this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, node); |
@@ -1145,7 +1149,7 @@ namespace WixToolset.Util | |||
1145 | 1149 | ||
1146 | if (!this.Messaging.EncounteredError) | 1150 | if (!this.Messaging.EncounteredError) |
1147 | { | 1151 | { |
1148 | this.CreateWixFileSearchRow(section, sourceLineNumbers, id, path, attributes); | 1152 | this.CreateWixFileSearchRow(section, sourceLineNumbers, id, path, attributes, type); |
1149 | } | 1153 | } |
1150 | } | 1154 | } |
1151 | 1155 | ||
@@ -1156,12 +1160,14 @@ namespace WixToolset.Util | |||
1156 | /// <param name="id">Identifier of the search (key into the WixSearch table)</param> | 1160 | /// <param name="id">Identifier of the search (key into the WixSearch table)</param> |
1157 | /// <param name="path">File/directory path to search for.</param> | 1161 | /// <param name="path">File/directory path to search for.</param> |
1158 | /// <param name="attributes"></param> | 1162 | /// <param name="attributes"></param> |
1159 | private void CreateWixFileSearchRow(IntermediateSection section, SourceLineNumber sourceLineNumbers, Identifier id, string path, WixFileSearchAttributes attributes) | 1163 | /// <param name="type"></param> |
1164 | private void CreateWixFileSearchRow(IntermediateSection section, SourceLineNumber sourceLineNumbers, Identifier id, string path, WixFileSearchAttributes attributes, WixFileSearchType type) | ||
1160 | { | 1165 | { |
1161 | section.AddSymbol(new WixFileSearchSymbol(sourceLineNumbers, id) | 1166 | section.AddSymbol(new WixFileSearchSymbol(sourceLineNumbers, id) |
1162 | { | 1167 | { |
1163 | Path = path, | 1168 | Path = path, |
1164 | Attributes = attributes, | 1169 | Attributes = attributes, |
1170 | Type = type, | ||
1165 | }); | 1171 | }); |
1166 | } | 1172 | } |
1167 | 1173 | ||
@@ -2545,7 +2551,8 @@ namespace WixToolset.Util | |||
2545 | string after = null; | 2551 | string after = null; |
2546 | string productCode = null; | 2552 | string productCode = null; |
2547 | string upgradeCode = null; | 2553 | string upgradeCode = null; |
2548 | var attributes = WixProductSearchAttributes.Version; | 2554 | var attributes = WixProductSearchAttributes.None; |
2555 | var type = WixProductSearchType.Version; | ||
2549 | 2556 | ||
2550 | foreach (var attrib in element.Attributes()) | 2557 | foreach (var attrib in element.Attributes()) |
2551 | { | 2558 | { |
@@ -2570,16 +2577,16 @@ namespace WixToolset.Util | |||
2570 | switch (result) | 2577 | switch (result) |
2571 | { | 2578 | { |
2572 | case "version": | 2579 | case "version": |
2573 | attributes = WixProductSearchAttributes.Version; | 2580 | type = WixProductSearchType.Version; |
2574 | break; | 2581 | break; |
2575 | case "language": | 2582 | case "language": |
2576 | attributes = WixProductSearchAttributes.Language; | 2583 | type = WixProductSearchType.Language; |
2577 | break; | 2584 | break; |
2578 | case "state": | 2585 | case "state": |
2579 | attributes = WixProductSearchAttributes.State; | 2586 | type = WixProductSearchType.State; |
2580 | break; | 2587 | break; |
2581 | case "assignment": | 2588 | case "assignment": |
2582 | attributes = WixProductSearchAttributes.Assignment; | 2589 | type = WixProductSearchType.Assignment; |
2583 | break; | 2590 | break; |
2584 | default: | 2591 | default: |
2585 | this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, attrib.Parent.Name.LocalName, attrib.Name.LocalName, result, "version", "language", "state", "assignment")); | 2592 | this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, attrib.Parent.Name.LocalName, attrib.Name.LocalName, result, "version", "language", "state", "assignment")); |
@@ -2607,9 +2614,21 @@ namespace WixToolset.Util | |||
2607 | this.Messaging.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(sourceLineNumbers, element.Name.LocalName, "UpgradeCode", "ProductCode")); | 2614 | this.Messaging.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(sourceLineNumbers, element.Name.LocalName, "UpgradeCode", "ProductCode")); |
2608 | } | 2615 | } |
2609 | 2616 | ||
2617 | string guid; | ||
2618 | if (upgradeCode != null) | ||
2619 | { | ||
2620 | // set an additional flag if this is an upgrade code | ||
2621 | attributes |= WixProductSearchAttributes.UpgradeCode; | ||
2622 | guid = upgradeCode; | ||
2623 | } | ||
2624 | else | ||
2625 | { | ||
2626 | guid = productCode; | ||
2627 | } | ||
2628 | |||
2610 | if (null == id) | 2629 | if (null == id) |
2611 | { | 2630 | { |
2612 | id = this.ParseHelper.CreateIdentifier("wps", variable, condition, after, productCode ?? upgradeCode, attributes.ToString()); | 2631 | id = this.ParseHelper.CreateIdentifier("wps", variable, condition, after, guid, attributes.ToString(), type.ToString()); |
2613 | } | 2632 | } |
2614 | 2633 | ||
2615 | this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); | 2634 | this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); |
@@ -2618,16 +2637,11 @@ namespace WixToolset.Util | |||
2618 | 2637 | ||
2619 | if (!this.Messaging.EncounteredError) | 2638 | if (!this.Messaging.EncounteredError) |
2620 | { | 2639 | { |
2621 | // set an additional flag if this is an upgrade code | ||
2622 | if (null != upgradeCode) | ||
2623 | { | ||
2624 | attributes |= WixProductSearchAttributes.UpgradeCode; | ||
2625 | } | ||
2626 | |||
2627 | section.AddSymbol(new WixProductSearchSymbol(sourceLineNumbers, id) | 2640 | section.AddSymbol(new WixProductSearchSymbol(sourceLineNumbers, id) |
2628 | { | 2641 | { |
2629 | Guid = productCode ?? upgradeCode, | 2642 | Guid = guid, |
2630 | Attributes = attributes, | 2643 | Attributes = attributes, |
2644 | Type = type, | ||
2631 | }); | 2645 | }); |
2632 | } | 2646 | } |
2633 | } | 2647 | } |
@@ -2648,7 +2662,8 @@ namespace WixToolset.Util | |||
2648 | string value = null; | 2662 | string value = null; |
2649 | var expand = YesNoType.NotSet; | 2663 | var expand = YesNoType.NotSet; |
2650 | var win64 = this.Context.IsCurrentPlatform64Bit; | 2664 | var win64 = this.Context.IsCurrentPlatform64Bit; |
2651 | var attributes = WixRegistrySearchAttributes.Raw | WixRegistrySearchAttributes.WantValue; | 2665 | var attributes = WixRegistrySearchAttributes.None; |
2666 | var type = WixRegistrySearchType.Value; | ||
2652 | 2667 | ||
2653 | foreach (var attrib in element.Attributes()) | 2668 | foreach (var attrib in element.Attributes()) |
2654 | { | 2669 | { |
@@ -2692,30 +2707,15 @@ namespace WixToolset.Util | |||
2692 | case "ExpandEnvironmentVariables": | 2707 | case "ExpandEnvironmentVariables": |
2693 | expand = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib); | 2708 | expand = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib); |
2694 | break; | 2709 | break; |
2695 | case "Format": | ||
2696 | string format = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); | ||
2697 | switch (format) | ||
2698 | { | ||
2699 | case "raw": | ||
2700 | attributes |= WixRegistrySearchAttributes.Raw; | ||
2701 | break; | ||
2702 | case "compatible": | ||
2703 | attributes |= WixRegistrySearchAttributes.Compatible; | ||
2704 | break; | ||
2705 | default: | ||
2706 | this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, attrib.Parent.Name.LocalName, attrib.Name.LocalName, format, "raw", "compatible")); | ||
2707 | break; | ||
2708 | } | ||
2709 | break; | ||
2710 | case "Result": | 2710 | case "Result": |
2711 | var result = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); | 2711 | var result = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); |
2712 | switch (result) | 2712 | switch (result) |
2713 | { | 2713 | { |
2714 | case "exists": | 2714 | case "exists": |
2715 | attributes |= WixRegistrySearchAttributes.WantExists; | 2715 | type = WixRegistrySearchType.Exists; |
2716 | break; | 2716 | break; |
2717 | case "value": | 2717 | case "value": |
2718 | attributes |= WixRegistrySearchAttributes.WantValue; | 2718 | type = WixRegistrySearchType.Value; |
2719 | break; | 2719 | break; |
2720 | default: | 2720 | default: |
2721 | this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, attrib.Parent.Name.LocalName, attrib.Name.LocalName, result, "exists", "value")); | 2721 | this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, attrib.Parent.Name.LocalName, attrib.Name.LocalName, result, "exists", "value")); |
@@ -2743,14 +2743,9 @@ namespace WixToolset.Util | |||
2743 | this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Key")); | 2743 | this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Key")); |
2744 | } | 2744 | } |
2745 | 2745 | ||
2746 | if (null == id) | ||
2747 | { | ||
2748 | id = this.ParseHelper.CreateIdentifier("wrs", variable, condition, after, root.ToString(), key, value, attributes.ToString()); | ||
2749 | } | ||
2750 | |||
2751 | if (expand == YesNoType.Yes) | 2746 | if (expand == YesNoType.Yes) |
2752 | { | 2747 | { |
2753 | if (0 != (attributes & WixRegistrySearchAttributes.WantExists)) | 2748 | if (type == WixRegistrySearchType.Exists) |
2754 | { | 2749 | { |
2755 | this.Messaging.Write(ErrorMessages.IllegalAttributeValueWithOtherAttribute(sourceLineNumbers, element.Name.LocalName, "ExpandEnvironmentVariables", expand.ToString(), "Result", "exists")); | 2750 | this.Messaging.Write(ErrorMessages.IllegalAttributeValueWithOtherAttribute(sourceLineNumbers, element.Name.LocalName, "ExpandEnvironmentVariables", expand.ToString(), "Result", "exists")); |
2756 | } | 2751 | } |
@@ -2763,6 +2758,11 @@ namespace WixToolset.Util | |||
2763 | attributes |= WixRegistrySearchAttributes.Win64; | 2758 | attributes |= WixRegistrySearchAttributes.Win64; |
2764 | } | 2759 | } |
2765 | 2760 | ||
2761 | if (null == id) | ||
2762 | { | ||
2763 | id = this.ParseHelper.CreateIdentifier("wrs", variable, condition, after, root.ToString(), key, value, attributes.ToString(), type.ToString()); | ||
2764 | } | ||
2765 | |||
2766 | this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); | 2766 | this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); |
2767 | 2767 | ||
2768 | this.ParseHelper.CreateWixSearchSymbol(section, sourceLineNumbers, element.Name.LocalName, id, variable, condition, after, null); | 2768 | this.ParseHelper.CreateWixSearchSymbol(section, sourceLineNumbers, element.Name.LocalName, id, variable, condition, after, null); |
@@ -2775,6 +2775,7 @@ namespace WixToolset.Util | |||
2775 | Key = key, | 2775 | Key = key, |
2776 | Value = value, | 2776 | Value = value, |
2777 | Attributes = attributes, | 2777 | Attributes = attributes, |
2778 | Type = type, | ||
2778 | }); | 2779 | }); |
2779 | } | 2780 | } |
2780 | } | 2781 | } |