aboutsummaryrefslogtreecommitdiff
path: root/src/wixext
diff options
context:
space:
mode:
Diffstat (limited to 'src/wixext')
-rw-r--r--src/wixext/ComPlusCompiler.cs2188
-rw-r--r--src/wixext/ComPlusDecompiler.cs1843
-rw-r--r--src/wixext/ComPlusExtensionData.cs64
-rw-r--r--src/wixext/WixComPlusExtension.csproj50
-rw-r--r--src/wixext/complus.xsd944
-rw-r--r--src/wixext/messages.xml77
-rw-r--r--src/wixext/tables.xml250
7 files changed, 5416 insertions, 0 deletions
diff --git a/src/wixext/ComPlusCompiler.cs b/src/wixext/ComPlusCompiler.cs
new file mode 100644
index 00000000..7f22c56b
--- /dev/null
+++ b/src/wixext/ComPlusCompiler.cs
@@ -0,0 +1,2188 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Extensions
4{
5 using System;
6 using System.Collections;
7 using System.Collections.Generic;
8 using System.Globalization;
9 using System.Reflection;
10 using System.Xml;
11 using System.Xml.Linq;
12 using System.Xml.Schema;
13 using WixToolset.Data;
14 using WixToolset.Extensibility;
15
16 /// <summary>
17 /// The compiler for the WiX Toolset Internet Information Services Extension.
18 /// </summary>
19 public sealed class ComPlusCompiler : CompilerExtension
20 {
21 /// <summary>
22 /// Instantiate a new ComPlusCompiler.
23 /// </summary>
24 public ComPlusCompiler()
25 {
26 this.Namespace = "http://wixtoolset.org/schemas/v4/wxs/complus";
27 }
28
29 /// <summary>
30 /// </summary>
31 /// <remarks></remarks>
32 public enum CpiAssemblyAttributes
33 {
34 EventClass = (1 << 0),
35 DotNetAssembly = (1 << 1),
36 DllPathFromGAC = (1 << 2),
37 RegisterInCommit = (1 << 3)
38 }
39
40 /// <summary>
41 /// Processes an element for the Compiler.
42 /// </summary>
43 /// <param name="sourceLineNumbers">Source line number for the parent element.</param>
44 /// <param name="parentElement">Parent element of element to process.</param>
45 /// <param name="element">Element to process.</param>
46 /// <param name="contextValues">Extra information about the context in which this element is being parsed.</param>
47 public override void ParseElement(XElement parentElement, XElement element, IDictionary<string, string> context)
48 {
49 switch (parentElement.Name.LocalName)
50 {
51 case "Component":
52 string componentId = context["ComponentId"];
53 string directoryId = context["DirectoryId"];
54 bool win64 = Boolean.Parse(context["Win64"]);
55
56 switch (element.Name.LocalName)
57 {
58 case "ComPlusPartition":
59 this.ParseComPlusPartitionElement(element, componentId, win64);
60 break;
61 case "ComPlusPartitionRole":
62 this.ParseComPlusPartitionRoleElement(element, componentId, null);
63 break;
64 case "ComPlusUserInPartitionRole":
65 this.ParseComPlusUserInPartitionRoleElement(element, componentId, null);
66 break;
67 case "ComPlusGroupInPartitionRole":
68 this.ParseComPlusGroupInPartitionRoleElement(element, componentId, null);
69 break;
70 case "ComPlusPartitionUser":
71 this.ParseComPlusPartitionUserElement(element, componentId, null);
72 break;
73 case "ComPlusApplication":
74 this.ParseComPlusApplicationElement(element, componentId, win64, null);
75 break;
76 case "ComPlusApplicationRole":
77 this.ParseComPlusApplicationRoleElement(element, componentId, null);
78 break;
79 case "ComPlusUserInApplicationRole":
80 this.ParseComPlusUserInApplicationRoleElement(element, componentId, null);
81 break;
82 case "ComPlusGroupInApplicationRole":
83 this.ParseComPlusGroupInApplicationRoleElement(element, componentId, null);
84 break;
85 case "ComPlusAssembly":
86 this.ParseComPlusAssemblyElement(element, componentId, win64, null);
87 break;
88 case "ComPlusRoleForComponent":
89 this.ParseComPlusRoleForComponentElement(element, componentId, null);
90 break;
91 case "ComPlusRoleForInterface":
92 this.ParseComPlusRoleForInterfaceElement(element, componentId, null);
93 break;
94 case "ComPlusRoleForMethod":
95 this.ParseComPlusRoleForMethodElement(element, componentId, null);
96 break;
97 case "ComPlusSubscription":
98 this.ParseComPlusSubscriptionElement(element, componentId, null);
99 break;
100 default:
101 this.Core.UnexpectedElement(parentElement, element);
102 break;
103 }
104 break;
105 case "Fragment":
106 case "Module":
107 case "Product":
108 switch (element.Name.LocalName)
109 {
110 case "ComPlusPartition":
111 this.ParseComPlusPartitionElement(element, null, false);
112 break;
113 case "ComPlusPartitionRole":
114 this.ParseComPlusPartitionRoleElement(element, null, null);
115 break;
116 case "ComPlusApplication":
117 this.ParseComPlusApplicationElement(element, null, false, null);
118 break;
119 case "ComPlusApplicationRole":
120 this.ParseComPlusApplicationRoleElement(element, null, null);
121 break;
122 default:
123 this.Core.UnexpectedElement(parentElement, element);
124 break;
125 }
126 break;
127 default:
128 this.Core.UnexpectedElement(parentElement, element);
129 break;
130 }
131 }
132
133 /// <summary>
134 /// Parses a COM+ partition element.
135 /// </summary>
136 /// <param name="node">Element to parse.</param>
137 /// <param name="componentKey">Identifier of parent component.</param>
138 private void ParseComPlusPartitionElement(XElement node, string componentKey, bool win64)
139 {
140 SourceLineNumber sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);
141
142 string key = null;
143 string id = null;
144 string name = null;
145
146 Hashtable properties = new Hashtable();
147
148 foreach (XAttribute attrib in node.Attributes())
149 {
150 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
151 {
152 switch (attrib.Name.LocalName)
153 {
154 case "Id":
155 key = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
156 break;
157 case "PartitionId":
158 id = TryFormatGuidValue(this.Core.GetAttributeValue(sourceLineNumbers, attrib));
159 break;
160 case "Name":
161 name = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
162 break;
163 case "Changeable":
164 this.Core.OnMessage(WixWarnings.DeprecatedAttribute(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
165 break;
166 case "Deleteable":
167 if (null == componentKey)
168 {
169 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
170 }
171 properties["Deleteable"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
172 break;
173 case "Description":
174 if (null == componentKey)
175 {
176 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
177 }
178 properties["Description"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
179 break;
180 default:
181 this.Core.UnexpectedAttribute(node, attrib);
182 break;
183 }
184 }
185 else
186 {
187 this.Core.ParseExtensionAttribute(node, attrib);
188 }
189 }
190
191 if (null != componentKey && null == name)
192 {
193 this.Core.OnMessage(ComPlusErrors.RequiredAttributeUnderComponent(sourceLineNumbers, node.Name.LocalName, "Name"));
194 }
195 if (null == componentKey && null == id && null == name)
196 {
197 this.Core.OnMessage(ComPlusErrors.RequiredAttributeNotUnderComponent(sourceLineNumbers, node.Name.LocalName, "Id", "Name"));
198 }
199
200 foreach (XElement child in node.Elements())
201 {
202 if (this.Namespace == child.Name.Namespace)
203 {
204 switch (child.Name.LocalName)
205 {
206 case "ComPlusPartitionRole":
207 this.ParseComPlusPartitionRoleElement(child, componentKey, key);
208 break;
209 case "ComPlusPartitionUser":
210 this.ParseComPlusPartitionUserElement(child, componentKey, key);
211 break;
212 case "ComPlusApplication":
213 this.ParseComPlusApplicationElement(child, componentKey, win64, key);
214 break;
215 default:
216 this.Core.UnexpectedElement(node, child);
217 break;
218 }
219 }
220 else
221 {
222 this.Core.ParseExtensionElement(node, child);
223 }
224 }
225
226 Row row = this.Core.CreateRow(sourceLineNumbers, "ComPlusPartition");
227 row[0] = key;
228 row[1] = componentKey;
229 row[2] = id;
230 row[3] = name;
231
232 IDictionaryEnumerator propertiesEnumerator = properties.GetEnumerator();
233 while (propertiesEnumerator.MoveNext())
234 {
235 Row propertyRow = this.Core.CreateRow(sourceLineNumbers, "ComPlusPartitionProperty");
236 propertyRow[0] = key;
237 propertyRow[1] = (string)propertiesEnumerator.Key;
238 propertyRow[2] = (string)propertiesEnumerator.Value;
239 }
240
241 if (componentKey != null)
242 {
243 if (win64)
244 {
245 if (this.Core.CurrentPlatform == Platform.IA64)
246 {
247 this.Core.OnMessage(WixErrors.UnsupportedPlatformForElement(sourceLineNumbers, "ia64", node.Name.LocalName));
248 }
249 else
250 {
251 this.Core.CreateSimpleReference(sourceLineNumbers, "CustomAction", "ConfigureComPlusInstall_x64");
252 this.Core.CreateSimpleReference(sourceLineNumbers, "CustomAction", "ConfigureComPlusUninstall_x64");
253 }
254 }
255 else
256 {
257 this.Core.CreateSimpleReference(sourceLineNumbers, "CustomAction", "ConfigureComPlusInstall");
258 this.Core.CreateSimpleReference(sourceLineNumbers, "CustomAction", "ConfigureComPlusUninstall");
259 }
260 }
261 }
262
263 /// <summary>
264 /// Parses a COM+ partition role element.
265 /// </summary>
266 /// <param name="node">Element to parse.</param>
267 /// <param name="componentKey">Identifier of parent component.</param>
268 /// <param name="applicationKey">Optional identifier of parent application.</param>
269 private void ParseComPlusPartitionRoleElement(XElement node, string componentKey, string partitionKey)
270 {
271 SourceLineNumber sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);
272
273 string key = null;
274 string name = null;
275
276 foreach (XAttribute attrib in node.Attributes())
277 {
278 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
279 {
280 switch (attrib.Name.LocalName)
281 {
282 case "Id":
283 key = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
284 break;
285 case "Partition":
286 if (null != partitionKey)
287 {
288 this.Core.OnMessage(WixErrors.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName));
289 }
290 partitionKey = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
291 this.Core.CreateSimpleReference(sourceLineNumbers, "ComPlusPartition", partitionKey);
292 break;
293 case "Name":
294 name = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
295 break;
296 default:
297 this.Core.UnexpectedAttribute(node, attrib);
298 break;
299 }
300 }
301 else
302 {
303 this.Core.ParseExtensionAttribute(node, attrib);
304 }
305 }
306
307 if (null == partitionKey)
308 {
309 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Partition"));
310 }
311
312 foreach (XElement child in node.Elements())
313 {
314 if (this.Namespace == child.Name.Namespace)
315 {
316 switch (child.Name.LocalName)
317 {
318 case "ComPlusUserInPartitionRole":
319 this.ParseComPlusUserInPartitionRoleElement(child, componentKey, key);
320 break;
321 case "ComPlusGroupInPartitionRole":
322 this.ParseComPlusGroupInPartitionRoleElement(child, componentKey, key);
323 break;
324 default:
325 this.Core.UnexpectedElement(node, child);
326 break;
327 }
328 }
329 else
330 {
331 this.Core.ParseExtensionElement(node, child);
332 }
333 }
334
335 // add table row
336 Row row = this.Core.CreateRow(sourceLineNumbers, "ComPlusPartitionRole");
337 row[0] = key;
338 row[1] = partitionKey;
339 row[3] = name;
340 }
341
342 /// <summary>
343 /// Parses a COM+ partition role user element.
344 /// </summary>
345 /// <param name="node">Element to parse.</param>
346 /// <param name="componentKey">Identifier of parent component.</param>
347 /// <param name="applicationKey">Optional identifier of parent application role.</param>
348 private void ParseComPlusUserInPartitionRoleElement(XElement node, string componentKey, string partitionRoleKey)
349 {
350 SourceLineNumber sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);
351
352 string key = null;
353 string user = null;
354
355 foreach (XAttribute attrib in node.Attributes())
356 {
357 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
358 {
359 switch (attrib.Name.LocalName)
360 {
361 case "Id":
362 key = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
363 break;
364 case "PartitionRole":
365 if (null != partitionRoleKey)
366 {
367 this.Core.OnMessage(WixErrors.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName));
368 }
369 partitionRoleKey = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
370 this.Core.CreateSimpleReference(sourceLineNumbers, "ComPlusPartitionRole", partitionRoleKey);
371 break;
372 case "User":
373 user = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
374 this.Core.CreateSimpleReference(sourceLineNumbers, "User", user);
375 break;
376 default:
377 this.Core.UnexpectedAttribute(node, attrib);
378 break;
379 }
380 }
381 else
382 {
383 this.Core.ParseExtensionAttribute(node, attrib);
384 }
385 }
386
387 if (null == partitionRoleKey)
388 {
389 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "PartitionRole"));
390 }
391
392 Row row = this.Core.CreateRow(sourceLineNumbers, "ComPlusUserInPartitionRole");
393 row[0] = key;
394 row[1] = partitionRoleKey;
395 row[2] = componentKey;
396 row[3] = user;
397 }
398
399 /// <summary>
400 /// Parses a COM+ partition role user element.
401 /// </summary>
402 /// <param name="node">Element to parse.</param>
403 /// <param name="componentKey">Identifier of parent component.</param>
404 /// <param name="applicationKey">Optional identifier of parent application role.</param>
405 private void ParseComPlusGroupInPartitionRoleElement(XElement node, string componentKey, string partitionRoleKey)
406 {
407 SourceLineNumber sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);
408
409 string key = null;
410 string group = null;
411
412 foreach (XAttribute attrib in node.Attributes())
413 {
414 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
415 {
416 switch (attrib.Name.LocalName)
417 {
418 case "Id":
419 key = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
420 break;
421 case "PartitionRole":
422 if (null != partitionRoleKey)
423 {
424 this.Core.OnMessage(WixErrors.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName));
425 }
426 partitionRoleKey = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
427 this.Core.CreateSimpleReference(sourceLineNumbers, "ComPlusPartitionRole", partitionRoleKey);
428 break;
429 case "Group":
430 group = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
431 this.Core.CreateSimpleReference(sourceLineNumbers, "Group", group);
432 break;
433 default:
434 this.Core.UnexpectedAttribute(node, attrib);
435 break;
436 }
437 }
438 else
439 {
440 this.Core.ParseExtensionAttribute(node, attrib);
441 }
442 }
443
444 if (null == partitionRoleKey)
445 {
446 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "PartitionRole"));
447 }
448
449 Row row = this.Core.CreateRow(sourceLineNumbers, "ComPlusGroupInPartitionRole");
450 row[0] = key;
451 row[1] = partitionRoleKey;
452 row[2] = componentKey;
453 row[3] = group;
454 }
455
456 /// <summary>
457 /// Parses a COM+ partition element.
458 /// </summary>
459 /// <param name="node">Element to parse.</param>
460 /// <param name="componentKey">Identifier of parent component.</param>
461 private void ParseComPlusPartitionUserElement(XElement node, string componentKey, string partitionKey)
462 {
463 SourceLineNumber sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);
464
465 string key = null;
466 string user = null;
467
468 foreach (XAttribute attrib in node.Attributes())
469 {
470 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
471 {
472 switch (attrib.Name.LocalName)
473 {
474 case "Id":
475 key = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
476 break;
477 case "Partition":
478 if (null != partitionKey)
479 {
480 this.Core.OnMessage(WixErrors.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName));
481 }
482 partitionKey = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
483 this.Core.CreateSimpleReference(sourceLineNumbers, "ComPlusPartition", partitionKey);
484 break;
485 case "User":
486 user = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
487 this.Core.CreateSimpleReference(sourceLineNumbers, "User", user);
488 break;
489 default:
490 this.Core.UnexpectedAttribute(node, attrib);
491 break;
492 }
493 }
494 else
495 {
496 this.Core.ParseExtensionAttribute(node, attrib);
497 }
498 }
499
500 if (null == partitionKey)
501 {
502 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Partition"));
503 }
504
505 Row row = this.Core.CreateRow(sourceLineNumbers, "ComPlusPartitionUser");
506 row[0] = key;
507 row[1] = partitionKey;
508 row[2] = componentKey;
509 row[3] = user;
510 }
511
512 /// <summary>
513 /// Parses a COM+ application element.
514 /// </summary>
515 /// <param name="node">Element to parse.</param>
516 /// <param name="componentKey">Identifier of parent component.</param>
517 /// <param name="partitionKey">Optional identifier of parent partition.</param>
518 private void ParseComPlusApplicationElement(XElement node, string componentKey, bool win64, string partitionKey)
519 {
520 SourceLineNumber sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);
521
522 string key = null;
523 string id = null;
524 string name = null;
525
526 Hashtable properties = new Hashtable();
527
528 foreach (XAttribute attrib in node.Attributes())
529 {
530 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
531 {
532 switch (attrib.Name.LocalName)
533 {
534 case "Id":
535 key = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
536 break;
537 case "Partition":
538 if (null != partitionKey)
539 {
540 this.Core.OnMessage(WixErrors.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName));
541 }
542 partitionKey = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
543 this.Core.CreateSimpleReference(sourceLineNumbers, "ComPlusPartition", partitionKey);
544 break;
545 case "ApplicationId":
546 id = TryFormatGuidValue(this.Core.GetAttributeValue(sourceLineNumbers, attrib));
547 break;
548 case "Name":
549 name = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
550 break;
551 case "ThreeGigSupportEnabled":
552 if (null == componentKey)
553 {
554 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
555 }
556 properties["3GigSupportEnabled"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
557 break;
558 case "AccessChecksLevel":
559 if (null == componentKey)
560 {
561 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
562 }
563 string accessChecksLevelValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
564 switch (accessChecksLevelValue)
565 {
566 case "applicationLevel":
567 properties["AccessChecksLevel"] = "0";
568 break;
569 case "applicationComponentLevel":
570 properties["AccessChecksLevel"] = "1";
571 break;
572 default:
573 this.Core.OnMessage(WixErrors.IllegalAttributeValue(sourceLineNumbers, "ComPlusApplication", "AccessChecksLevel", accessChecksLevelValue, "applicationLevel", "applicationComponentLevel"));
574 break;
575 }
576 break;
577 case "Activation":
578 if (null == componentKey)
579 {
580 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
581 }
582 string activationValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
583 switch (activationValue)
584 {
585 case "inproc":
586 properties["Activation"] = "Inproc";
587 break;
588 case "local":
589 properties["Activation"] = "Local";
590 break;
591 default:
592 this.Core.OnMessage(WixErrors.IllegalAttributeValue(sourceLineNumbers, "ComPlusApplication", "Activation", activationValue, "inproc", "local"));
593 break;
594 }
595 break;
596 case "ApplicationAccessChecksEnabled":
597 if (null == componentKey)
598 {
599 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
600 }
601 properties["ApplicationAccessChecksEnabled"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
602 break;
603 case "ApplicationDirectory":
604 if (null == componentKey)
605 {
606 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
607 }
608 properties["ApplicationDirectory"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
609 break;
610 case "Authentication":
611 if (null == componentKey)
612 {
613 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
614 }
615 string authenticationValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
616 switch (authenticationValue)
617 {
618 case "default":
619 properties["Authentication"] = "0";
620 break;
621 case "none":
622 properties["Authentication"] = "1";
623 break;
624 case "connect":
625 properties["Authentication"] = "2";
626 break;
627 case "call":
628 properties["Authentication"] = "3";
629 break;
630 case "packet":
631 properties["Authentication"] = "4";
632 break;
633 case "integrity":
634 properties["Authentication"] = "5";
635 break;
636 case "privacy":
637 properties["Authentication"] = "6";
638 break;
639 default:
640 this.Core.OnMessage(WixErrors.IllegalAttributeValue(sourceLineNumbers, "ComPlusApplication", "Authentication", authenticationValue, "default", "none", "connect", "call", "packet", "integrity", "privacy"));
641 break;
642 }
643 break;
644 case "AuthenticationCapability":
645 if (null == componentKey)
646 {
647 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
648 }
649 string authenticationCapabilityValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
650 switch (authenticationCapabilityValue)
651 {
652 case "none":
653 properties["AuthenticationCapability"] = "0";
654 break;
655 case "secureReference":
656 properties["AuthenticationCapability"] = "2";
657 break;
658 case "staticCloaking":
659 properties["AuthenticationCapability"] = "32";
660 break;
661 case "dynamicCloaking":
662 properties["AuthenticationCapability"] = "64";
663 break;
664 default:
665 this.Core.OnMessage(WixErrors.IllegalAttributeValue(sourceLineNumbers, "ComPlusApplication", "AuthenticationCapability", authenticationCapabilityValue, "none", "secureReference", "staticCloaking", "dynamicCloaking"));
666 break;
667 }
668 break;
669 case "Changeable":
670 this.Core.OnMessage(WixWarnings.DeprecatedAttribute(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
671 break;
672 case "CommandLine":
673 if (null == componentKey)
674 {
675 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
676 }
677 properties["CommandLine"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
678 break;
679 case "ConcurrentApps":
680 if (null == componentKey)
681 {
682 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
683 }
684 properties["ConcurrentApps"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
685 break;
686 case "CreatedBy":
687 if (null == componentKey)
688 {
689 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
690 }
691 properties["CreatedBy"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
692 break;
693 case "CRMEnabled":
694 if (null == componentKey)
695 {
696 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
697 }
698 properties["CRMEnabled"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
699 break;
700 case "CRMLogFile":
701 if (null == componentKey)
702 {
703 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
704 }
705 properties["CRMLogFile"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
706 break;
707 case "Deleteable":
708 if (null == componentKey)
709 {
710 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
711 }
712 properties["Deleteable"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
713 break;
714 case "Description":
715 if (null == componentKey)
716 {
717 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
718 }
719 properties["Description"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
720 break;
721 case "DumpEnabled":
722 if (null == componentKey)
723 {
724 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
725 }
726 properties["DumpEnabled"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
727 break;
728 case "DumpOnException":
729 if (null == componentKey)
730 {
731 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
732 }
733 properties["DumpOnException"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
734 break;
735 case "DumpOnFailfast":
736 if (null == componentKey)
737 {
738 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
739 }
740 properties["DumpOnFailfast"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
741 break;
742 case "DumpPath":
743 if (null == componentKey)
744 {
745 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
746 }
747 properties["DumpPath"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
748 break;
749 case "EventsEnabled":
750 if (null == componentKey)
751 {
752 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
753 }
754 properties["EventsEnabled"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
755 break;
756 case "Identity":
757 if (null == componentKey)
758 {
759 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
760 }
761 properties["Identity"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
762 break;
763 case "ImpersonationLevel":
764 if (null == componentKey)
765 {
766 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
767 }
768 string impersonationLevelValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
769 switch (impersonationLevelValue)
770 {
771 case "anonymous":
772 properties["ImpersonationLevel"] = "1";
773 break;
774 case "identify":
775 properties["ImpersonationLevel"] = "2";
776 break;
777 case "impersonate":
778 properties["ImpersonationLevel"] = "3";
779 break;
780 case "delegate":
781 properties["ImpersonationLevel"] = "4";
782 break;
783 default:
784 this.Core.OnMessage(WixErrors.IllegalAttributeValue(sourceLineNumbers, "ComPlusApplication", "ImpersonationLevel", impersonationLevelValue, "anonymous", "identify", "impersonate", "delegate"));
785 break;
786 }
787 break;
788 case "IsEnabled":
789 if (null == componentKey)
790 {
791 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
792 }
793 properties["IsEnabled"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
794 break;
795 case "MaxDumpCount":
796 if (null == componentKey)
797 {
798 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
799 }
800 properties["MaxDumpCount"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
801 break;
802 case "Password":
803 if (null == componentKey)
804 {
805 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
806 }
807 properties["Password"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
808 break;
809 case "QCAuthenticateMsgs":
810 if (null == componentKey)
811 {
812 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
813 }
814 string qcAuthenticateMsgsValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
815 switch (qcAuthenticateMsgsValue)
816 {
817 case "secureApps":
818 properties["QCAuthenticateMsgs"] = "0";
819 break;
820 case "off":
821 properties["QCAuthenticateMsgs"] = "1";
822 break;
823 case "on":
824 properties["QCAuthenticateMsgs"] = "2";
825 break;
826 default:
827 this.Core.OnMessage(WixErrors.IllegalAttributeValue(sourceLineNumbers, "ComPlusApplication", "QCAuthenticateMsgs", qcAuthenticateMsgsValue, "secureApps", "off", "on"));
828 break;
829 }
830 break;
831 case "QCListenerMaxThreads":
832 if (null == componentKey)
833 {
834 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
835 }
836 properties["QCListenerMaxThreads"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
837 break;
838 case "QueueListenerEnabled":
839 if (null == componentKey)
840 {
841 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
842 }
843 properties["QueueListenerEnabled"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
844 break;
845 case "QueuingEnabled":
846 if (null == componentKey)
847 {
848 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
849 }
850 properties["QueuingEnabled"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
851 break;
852 case "RecycleActivationLimit":
853 if (null == componentKey)
854 {
855 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
856 }
857 properties["RecycleActivationLimit"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
858 break;
859 case "RecycleCallLimit":
860 if (null == componentKey)
861 {
862 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
863 }
864 properties["RecycleCallLimit"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
865 break;
866 case "RecycleExpirationTimeout":
867 if (null == componentKey)
868 {
869 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
870 }
871 properties["RecycleExpirationTimeout"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
872 break;
873 case "RecycleLifetimeLimit":
874 if (null == componentKey)
875 {
876 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
877 }
878 properties["RecycleLifetimeLimit"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
879 break;
880 case "RecycleMemoryLimit":
881 if (null == componentKey)
882 {
883 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
884 }
885 properties["RecycleMemoryLimit"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
886 break;
887 case "Replicable":
888 if (null == componentKey)
889 {
890 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
891 }
892 properties["Replicable"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
893 break;
894 case "RunForever":
895 if (null == componentKey)
896 {
897 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
898 }
899 properties["RunForever"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
900 break;
901 case "ShutdownAfter":
902 if (null == componentKey)
903 {
904 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
905 }
906 properties["ShutdownAfter"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
907 break;
908 case "SoapActivated":
909 if (null == componentKey)
910 {
911 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
912 }
913 properties["SoapActivated"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
914 break;
915 case "SoapBaseUrl":
916 if (null == componentKey)
917 {
918 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
919 }
920 properties["SoapBaseUrl"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
921 break;
922 case "SoapMailTo":
923 if (null == componentKey)
924 {
925 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
926 }
927 properties["SoapMailTo"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
928 break;
929 case "SoapVRoot":
930 if (null == componentKey)
931 {
932 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
933 }
934 properties["SoapVRoot"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
935 break;
936 case "SRPEnabled":
937 if (null == componentKey)
938 {
939 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
940 }
941 properties["SRPEnabled"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
942 break;
943 case "SRPTrustLevel":
944 if (null == componentKey)
945 {
946 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
947 }
948 string srpTrustLevelValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
949 switch (srpTrustLevelValue)
950 {
951 case "disallowed":
952 properties["SRPTrustLevel"] = "0";
953 break;
954 case "fullyTrusted":
955 properties["SRPTrustLevel"] = "262144";
956 break;
957 default:
958 this.Core.OnMessage(WixErrors.IllegalAttributeValue(sourceLineNumbers, "ComPlusApplication", "SRPTrustLevel", srpTrustLevelValue, "disallowed", "fullyTrusted"));
959 break;
960 }
961 break;
962 default:
963 this.Core.UnexpectedAttribute(node, attrib);
964 break;
965 }
966 }
967 else
968 {
969 this.Core.ParseExtensionAttribute(node, attrib);
970 }
971 }
972
973 if (null != componentKey && null == name)
974 {
975 this.Core.OnMessage(ComPlusErrors.RequiredAttributeUnderComponent(sourceLineNumbers, node.Name.LocalName, "Name"));
976 }
977 if (null == componentKey && null == id && null == name)
978 {
979 this.Core.OnMessage(ComPlusErrors.RequiredAttributeNotUnderComponent(sourceLineNumbers, node.Name.LocalName, "Id", "Name"));
980 }
981
982 foreach (XElement child in node.Elements())
983 {
984 if (this.Namespace == child.Name.Namespace)
985 {
986 switch (child.Name.LocalName)
987 {
988 case "ComPlusApplicationRole":
989 this.ParseComPlusApplicationRoleElement(child, componentKey, key);
990 break;
991 case "ComPlusAssembly":
992 this.ParseComPlusAssemblyElement(child, componentKey, win64, key);
993 break;
994 default:
995 this.Core.UnexpectedElement(node, child);
996 break;
997 }
998 }
999 else
1000 {
1001 this.Core.ParseExtensionElement(node, child);
1002 }
1003 }
1004
1005 Row row = this.Core.CreateRow(sourceLineNumbers, "ComPlusApplication");
1006 row[0] = key;
1007 row[1] = partitionKey;
1008 row[2] = componentKey;
1009 row[3] = id;
1010 row[4] = name;
1011
1012 IDictionaryEnumerator propertiesEnumerator = properties.GetEnumerator();
1013 while (propertiesEnumerator.MoveNext())
1014 {
1015 Row propertyRow = this.Core.CreateRow(sourceLineNumbers, "ComPlusApplicationProperty");
1016 propertyRow[0] = key;
1017 propertyRow[1] = (string)propertiesEnumerator.Key;
1018 propertyRow[2] = (string)propertiesEnumerator.Value;
1019 }
1020
1021 if (componentKey != null)
1022 {
1023 if (win64)
1024 {
1025 if (this.Core.CurrentPlatform == Platform.IA64)
1026 {
1027 this.Core.OnMessage(WixErrors.UnsupportedPlatformForElement(sourceLineNumbers, "ia64", node.Name.LocalName));
1028 }
1029 else
1030 {
1031 this.Core.CreateSimpleReference(sourceLineNumbers, "CustomAction", "ConfigureComPlusInstall_x64");
1032 this.Core.CreateSimpleReference(sourceLineNumbers, "CustomAction", "ConfigureComPlusUninstall_x64");
1033 }
1034 }
1035 else
1036 {
1037 this.Core.CreateSimpleReference(sourceLineNumbers, "CustomAction", "ConfigureComPlusInstall");
1038 this.Core.CreateSimpleReference(sourceLineNumbers, "CustomAction", "ConfigureComPlusUninstall");
1039 }
1040 }
1041 }
1042
1043 /// <summary>
1044 /// Parses a COM+ application role element.
1045 /// </summary>
1046 /// <param name="node">Element to parse.</param>
1047 /// <param name="componentKey">Identifier of parent component.</param>
1048 /// <param name="applicationKey">Optional identifier of parent application.</param>
1049 private void ParseComPlusApplicationRoleElement(XElement node, string componentKey, string applicationKey)
1050 {
1051 SourceLineNumber sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);
1052
1053 string key = null;
1054 string name = null;
1055
1056 Hashtable properties = new Hashtable();
1057
1058 foreach (XAttribute attrib in node.Attributes())
1059 {
1060 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1061 {
1062 switch (attrib.Name.LocalName)
1063 {
1064 case "Id":
1065 key = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
1066 break;
1067 case "Application":
1068 if (null != applicationKey)
1069 {
1070 this.Core.OnMessage(WixErrors.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName));
1071 }
1072 applicationKey = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1073 this.Core.CreateSimpleReference(sourceLineNumbers, "ComPlusApplication", applicationKey);
1074 break;
1075 case "Name":
1076 name = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1077 break;
1078 case "Description":
1079 if (null == componentKey)
1080 {
1081 this.Core.OnMessage(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName));
1082 }
1083 properties["Description"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1084 break;
1085 default:
1086 this.Core.UnexpectedAttribute(node, attrib);
1087 break;
1088 }
1089 }
1090 else
1091 {
1092 this.Core.ParseExtensionAttribute(node, attrib);
1093 }
1094 }
1095
1096 if (null == applicationKey)
1097 {
1098 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Application"));
1099 }
1100
1101 foreach (XElement child in node.Elements())
1102 {
1103 if (this.Namespace == child.Name.Namespace)
1104 {
1105 switch (child.Name.LocalName)
1106 {
1107 case "ComPlusUserInApplicationRole":
1108 this.ParseComPlusUserInApplicationRoleElement(child, componentKey, key);
1109 break;
1110 case "ComPlusGroupInApplicationRole":
1111 this.ParseComPlusGroupInApplicationRoleElement(child, componentKey, key);
1112 break;
1113 default:
1114 this.Core.UnexpectedElement(node, child);
1115 break;
1116 }
1117 }
1118 else
1119 {
1120 this.Core.ParseExtensionElement(node, child);
1121 }
1122 }
1123
1124 Row row = this.Core.CreateRow(sourceLineNumbers, "ComPlusApplicationRole");
1125 row[0] = key;
1126 row[1] = applicationKey;
1127 row[2] = componentKey;
1128 row[3] = name;
1129
1130 IDictionaryEnumerator propertiesEnumerator = properties.GetEnumerator();
1131 while (propertiesEnumerator.MoveNext())
1132 {
1133 Row propertyRow = this.Core.CreateRow(sourceLineNumbers, "ComPlusApplicationRoleProperty");
1134 propertyRow[0] = key;
1135 propertyRow[1] = (string)propertiesEnumerator.Key;
1136 propertyRow[2] = (string)propertiesEnumerator.Value;
1137 }
1138 }
1139
1140 /// <summary>
1141 /// Parses a COM+ application role user element.
1142 /// </summary>
1143 /// <param name="node">Element to parse.</param>
1144 /// <param name="componentKey">Identifier of parent component.</param>
1145 /// <param name="applicationKey">Optional identifier of parent application role.</param>
1146 private void ParseComPlusUserInApplicationRoleElement(XElement node, string componentKey, string applicationRoleKey)
1147 {
1148 SourceLineNumber sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);
1149
1150 string key = null;
1151 string user = null;
1152
1153 foreach (XAttribute attrib in node.Attributes())
1154 {
1155 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1156 {
1157 switch (attrib.Name.LocalName)
1158 {
1159 case "Id":
1160 key = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
1161 break;
1162 case "ApplicationRole":
1163 if (null != applicationRoleKey)
1164 {
1165 this.Core.OnMessage(WixErrors.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName));
1166 }
1167 applicationRoleKey = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1168 this.Core.CreateSimpleReference(sourceLineNumbers, "ComPlusApplicationRole", applicationRoleKey);
1169 break;
1170 case "User":
1171 user = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1172 this.Core.CreateSimpleReference(sourceLineNumbers, "User", user);
1173 break;
1174 default:
1175 this.Core.UnexpectedAttribute(node, attrib);
1176 break;
1177 }
1178 }
1179 else
1180 {
1181 this.Core.ParseExtensionAttribute(node, attrib);
1182 }
1183 }
1184
1185 if (null == applicationRoleKey)
1186 {
1187 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "ApplicationRole"));
1188 }
1189
1190 Row row = this.Core.CreateRow(sourceLineNumbers, "ComPlusUserInApplicationRole");
1191 row[0] = key;
1192 row[1] = applicationRoleKey;
1193 row[2] = componentKey;
1194 row[3] = user;
1195 }
1196
1197 /// <summary>
1198 /// Parses a COM+ application role group element.
1199 /// </summary>
1200 /// <param name="node">Element to parse.</param>
1201 /// <param name="componentKey">Identifier of parent component.</param>
1202 /// <param name="applicationKey">Optional identifier of parent application role.</param>
1203 private void ParseComPlusGroupInApplicationRoleElement(XElement node, string componentKey, string applicationRoleKey)
1204 {
1205 SourceLineNumber sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);
1206
1207 string key = null;
1208 string group = null;
1209
1210 foreach (XAttribute attrib in node.Attributes())
1211 {
1212 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1213 {
1214 switch (attrib.Name.LocalName)
1215 {
1216 case "Id":
1217 key = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
1218 break;
1219 case "ApplicationRole":
1220 if (null != applicationRoleKey)
1221 {
1222 this.Core.OnMessage(WixErrors.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName));
1223 }
1224 applicationRoleKey = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1225 this.Core.CreateSimpleReference(sourceLineNumbers, "ComPlusApplicationRole", applicationRoleKey);
1226 break;
1227 case "Group":
1228 group = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1229 this.Core.CreateSimpleReference(sourceLineNumbers, "Group", group);
1230 break;
1231 default:
1232 this.Core.UnexpectedAttribute(node, attrib);
1233 break;
1234 }
1235 }
1236 else
1237 {
1238 this.Core.ParseExtensionAttribute(node, attrib);
1239 }
1240 }
1241
1242 if (null == applicationRoleKey)
1243 {
1244 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "ApplicationRole"));
1245 }
1246
1247 Row row = this.Core.CreateRow(sourceLineNumbers, "ComPlusGroupInApplicationRole");
1248 row[0] = key;
1249 row[1] = applicationRoleKey;
1250 row[2] = componentKey;
1251 row[3] = group;
1252 }
1253
1254 /// <summary>
1255 /// Parses a COM+ assembly element.
1256 /// </summary>
1257 /// <param name="node">Element to parse.</param>
1258 /// <param name="componentKey">Identifier of parent component.</param>
1259 /// <param name="applicationKey">Optional identifier of parent application.</param>
1260 private void ParseComPlusAssemblyElement(XElement node, string componentKey, bool win64, string applicationKey)
1261 {
1262 SourceLineNumber sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);
1263
1264 string key = null;
1265 string assemblyName = null;
1266 string dllPath = null;
1267 string tlbPath = null;
1268 string psDllPath = null;
1269 int attributes = 0;
1270
1271 bool hasComponents = false;
1272
1273 foreach (XAttribute attrib in node.Attributes())
1274 {
1275 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1276 {
1277 switch (attrib.Name.LocalName)
1278 {
1279 case "Id":
1280 key = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
1281 break;
1282 case "Application":
1283 if (null != applicationKey)
1284 {
1285 this.Core.OnMessage(WixErrors.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName));
1286 }
1287 applicationKey = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1288 this.Core.CreateSimpleReference(sourceLineNumbers, "ComPlusApplication", applicationKey);
1289 break;
1290 case "AssemblyName":
1291 assemblyName = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1292 break;
1293 case "DllPath":
1294 dllPath = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1295 break;
1296 case "TlbPath":
1297 tlbPath = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1298 break;
1299 case "PSDllPath":
1300 psDllPath = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1301 break;
1302 case "Type":
1303 string typeValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1304 switch (typeValue)
1305 {
1306 case ".net":
1307 attributes |= (int)CpiAssemblyAttributes.DotNetAssembly;
1308 break;
1309 case "native":
1310 attributes &= ~(int)CpiAssemblyAttributes.DotNetAssembly;
1311 break;
1312 default:
1313 this.Core.OnMessage(WixErrors.IllegalAttributeValue(sourceLineNumbers, "ComPlusAssembly", "Type", typeValue, ".net", "native"));
1314 break;
1315 }
1316 break;
1317 case "EventClass":
1318 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
1319 {
1320 attributes |= (int)CpiAssemblyAttributes.EventClass;
1321 }
1322 else
1323 {
1324 attributes &= ~(int)CpiAssemblyAttributes.EventClass;
1325 }
1326 break;
1327 case "DllPathFromGAC":
1328 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
1329 {
1330 attributes |= (int)CpiAssemblyAttributes.DllPathFromGAC;
1331 }
1332 else
1333 {
1334 attributes &= ~(int)CpiAssemblyAttributes.DllPathFromGAC;
1335 }
1336 break;
1337 case "RegisterInCommit":
1338 if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib))
1339 {
1340 attributes |= (int)CpiAssemblyAttributes.RegisterInCommit;
1341 }
1342 else
1343 {
1344 attributes &= ~(int)CpiAssemblyAttributes.RegisterInCommit;
1345 }
1346 break;
1347 default:
1348 this.Core.UnexpectedAttribute(node, attrib);
1349 break;
1350 }
1351 }
1352 else
1353 {
1354 this.Core.ParseExtensionAttribute(node, attrib);
1355 }
1356 }
1357
1358 if (null == applicationKey && 0 == (attributes & (int)CpiAssemblyAttributes.DotNetAssembly))
1359 {
1360 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Application", "Type", "native"));
1361 }
1362 if (null != assemblyName && 0 == (attributes & (int)CpiAssemblyAttributes.DllPathFromGAC))
1363 {
1364 this.Core.OnMessage(ComPlusErrors.UnexpectedAttributeWithoutOtherValue(sourceLineNumbers, node.Name.LocalName, "AssemblyName", "DllPathFromGAC", "no"));
1365 }
1366 if (null == tlbPath && 0 != (attributes & (int)CpiAssemblyAttributes.DotNetAssembly))
1367 {
1368 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "TlbPath", "Type", ".net"));
1369 }
1370 if (null != psDllPath && 0 != (attributes & (int)CpiAssemblyAttributes.DotNetAssembly))
1371 {
1372 this.Core.OnMessage(ComPlusErrors.UnexpectedAttributeWithOtherValue(sourceLineNumbers, node.Name.LocalName, "PSDllPath", "Type", ".net"));
1373 }
1374 if (0 != (attributes & (int)CpiAssemblyAttributes.EventClass) && 0 != (attributes & (int)CpiAssemblyAttributes.DotNetAssembly))
1375 {
1376 this.Core.OnMessage(ComPlusErrors.UnexpectedAttributeWithOtherValue(sourceLineNumbers, node.Name.LocalName, "EventClass", "yes", "Type", ".net"));
1377 }
1378
1379 foreach (XElement child in node.Elements())
1380 {
1381 if (this.Namespace == child.Name.Namespace)
1382 {
1383 switch (child.Name.LocalName)
1384 {
1385 case "ComPlusAssemblyDependency":
1386 this.ParseComPlusAssemblyDependencyElement(child, key);
1387 break;
1388 case "ComPlusComponent":
1389 this.ParseComPlusComponentElement(child, componentKey, key);
1390 hasComponents = true;
1391 break;
1392 default:
1393 this.Core.UnexpectedElement(node, child);
1394 break;
1395 }
1396 }
1397 else
1398 {
1399 this.Core.ParseExtensionElement(node, child);
1400 }
1401 }
1402
1403 if (0 == (attributes & (int)CpiAssemblyAttributes.DotNetAssembly) && !hasComponents)
1404 {
1405 this.Core.OnMessage(ComPlusWarnings.MissingComponents(sourceLineNumbers));
1406 }
1407
1408 Row row = this.Core.CreateRow(sourceLineNumbers, "ComPlusAssembly");
1409 row[0] = key;
1410 row[1] = applicationKey;
1411 row[2] = componentKey;
1412 row[3] = assemblyName;
1413 row[4] = dllPath;
1414 row[5] = tlbPath;
1415 row[6] = psDllPath;
1416 row[7] = attributes;
1417
1418 if (win64)
1419 {
1420 if (this.Core.CurrentPlatform == Platform.IA64)
1421 {
1422 this.Core.OnMessage(WixErrors.UnsupportedPlatformForElement(sourceLineNumbers, "ia64", node.Name.LocalName));
1423 }
1424 else
1425 {
1426 this.Core.CreateSimpleReference(sourceLineNumbers, "CustomAction", "ConfigureComPlusInstall_x64");
1427 this.Core.CreateSimpleReference(sourceLineNumbers, "CustomAction", "ConfigureComPlusUninstall_x64");
1428 }
1429 }
1430 else
1431 {
1432 this.Core.CreateSimpleReference(sourceLineNumbers, "CustomAction", "ConfigureComPlusInstall");
1433 this.Core.CreateSimpleReference(sourceLineNumbers, "CustomAction", "ConfigureComPlusUninstall");
1434 }
1435 }
1436
1437 /// <summary>
1438 /// Parses a COM+ assembly dependency element.
1439 /// </summary>
1440 /// <param name="node">Element to parse.</param>
1441 /// <param name="assemblyKey">Identifier of parent assembly.</param>
1442 private void ParseComPlusAssemblyDependencyElement(XElement node, string assemblyKey)
1443 {
1444 SourceLineNumber sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);
1445
1446 string requiredAssemblyKey = null;
1447
1448 foreach (XAttribute attrib in node.Attributes())
1449 {
1450 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1451 {
1452 switch (attrib.Name.LocalName)
1453 {
1454 case "RequiredAssembly":
1455 requiredAssemblyKey = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1456 break;
1457 default:
1458 this.Core.UnexpectedAttribute(node, attrib);
1459 break;
1460 }
1461 }
1462 else
1463 {
1464 this.Core.ParseExtensionAttribute(node, attrib);
1465 }
1466 }
1467
1468 Row row = this.Core.CreateRow(sourceLineNumbers, "ComPlusAssemblyDependency");
1469 row[0] = assemblyKey;
1470 row[1] = requiredAssemblyKey;
1471 }
1472
1473 /// <summary>
1474 /// Parses a COM+ component element.
1475 /// </summary>
1476 /// <param name="node">Element to parse.</param>
1477 /// <param name="componentKey">Identifier of parent component.</param>
1478 /// <param name="assemblyKey">Identifier of parent assembly.</param>
1479 private void ParseComPlusComponentElement(XElement node, string componentKey, string assemblyKey)
1480 {
1481 SourceLineNumber sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);
1482
1483 string key = null;
1484 string clsid = null;
1485
1486 Hashtable properties = new Hashtable();
1487
1488 foreach (XAttribute attrib in node.Attributes())
1489 {
1490 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1491 {
1492 switch (attrib.Name.LocalName)
1493 {
1494 case "Id":
1495 key = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
1496 break;
1497 case "CLSID":
1498 clsid = "{" + this.Core.GetAttributeValue(sourceLineNumbers, attrib) + "}";
1499 break;
1500 case "AllowInprocSubscribers":
1501 properties["AllowInprocSubscribers"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1502 break;
1503 case "ComponentAccessChecksEnabled":
1504 properties["ComponentAccessChecksEnabled"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1505 break;
1506 case "ComponentTransactionTimeout":
1507 properties["ComponentTransactionTimeout"] = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, 3600).ToString();
1508 break;
1509 case "ComponentTransactionTimeoutEnabled":
1510 properties["ComponentTransactionTimeoutEnabled"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1511 break;
1512 case "COMTIIntrinsics":
1513 properties["COMTIIntrinsics"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1514 break;
1515 case "ConstructionEnabled":
1516 properties["ConstructionEnabled"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1517 break;
1518 case "ConstructorString":
1519 properties["ConstructorString"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1520 break;
1521 case "CreationTimeout":
1522 properties["CreationTimeout"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1523 break;
1524 case "Description":
1525 properties["Description"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1526 break;
1527 case "EventTrackingEnabled":
1528 properties["EventTrackingEnabled"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1529 break;
1530 case "ExceptionClass":
1531 properties["ExceptionClass"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1532 break;
1533 case "FireInParallel":
1534 properties["FireInParallel"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1535 break;
1536 case "IISIntrinsics":
1537 properties["IISIntrinsics"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1538 break;
1539 case "InitializesServerApplication":
1540 properties["InitializesServerApplication"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1541 break;
1542 case "IsEnabled":
1543 properties["IsEnabled"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1544 break;
1545 case "IsPrivateComponent":
1546 properties["IsPrivateComponent"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1547 break;
1548 case "JustInTimeActivation":
1549 properties["JustInTimeActivation"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1550 break;
1551 case "LoadBalancingSupported":
1552 properties["LoadBalancingSupported"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1553 break;
1554 case "MaxPoolSize":
1555 properties["MaxPoolSize"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1556 break;
1557 case "MinPoolSize":
1558 properties["MinPoolSize"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1559 break;
1560 case "MultiInterfacePublisherFilterCLSID":
1561 properties["MultiInterfacePublisherFilterCLSID"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1562 break;
1563 case "MustRunInClientContext":
1564 properties["MustRunInClientContext"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1565 break;
1566 case "MustRunInDefaultContext":
1567 properties["MustRunInDefaultContext"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1568 break;
1569 case "ObjectPoolingEnabled":
1570 properties["ObjectPoolingEnabled"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1571 break;
1572 case "PublisherID":
1573 properties["PublisherID"] = TryFormatGuidValue(this.Core.GetAttributeValue(sourceLineNumbers, attrib));
1574 break;
1575 case "SoapAssemblyName":
1576 properties["SoapAssemblyName"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1577 break;
1578 case "SoapTypeName":
1579 properties["SoapTypeName"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1580 break;
1581 case "Synchronization":
1582 string synchronizationValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1583 switch (synchronizationValue)
1584 {
1585 case "ignored":
1586 properties["Synchronization"] = "0";
1587 break;
1588 case "none":
1589 properties["Synchronization"] = "1";
1590 break;
1591 case "supported":
1592 properties["Synchronization"] = "2";
1593 break;
1594 case "required":
1595 properties["Synchronization"] = "3";
1596 break;
1597 case "requiresNew":
1598 properties["Synchronization"] = "4";
1599 break;
1600 default:
1601 this.Core.OnMessage(WixErrors.IllegalAttributeValue(sourceLineNumbers, "ComPlusComponent", "Synchronization", synchronizationValue, "ignored", "none", "supported", "required", "requiresNew"));
1602 break;
1603 }
1604 break;
1605 case "Transaction":
1606 string transactionValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1607 switch (transactionValue)
1608 {
1609 case "ignored":
1610 properties["Transaction"] = "0";
1611 break;
1612 case "none":
1613 properties["Transaction"] = "1";
1614 break;
1615 case "supported":
1616 properties["Transaction"] = "2";
1617 break;
1618 case "required":
1619 properties["Transaction"] = "3";
1620 break;
1621 case "requiresNew":
1622 properties["Transaction"] = "4";
1623 break;
1624 default:
1625 this.Core.OnMessage(WixErrors.IllegalAttributeValue(sourceLineNumbers, "ComPlusComponent", "Transaction", transactionValue, "ignored", "none", "supported", "required", "requiresNew"));
1626 break;
1627 }
1628 break;
1629 case "TxIsolationLevel":
1630 string txIsolationLevelValue = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1631 switch (txIsolationLevelValue)
1632 {
1633 case "any":
1634 properties["TxIsolationLevel"] = "0";
1635 break;
1636 case "readUnCommitted":
1637 properties["TxIsolationLevel"] = "1";
1638 break;
1639 case "readCommitted":
1640 properties["TxIsolationLevel"] = "2";
1641 break;
1642 case "repeatableRead":
1643 properties["TxIsolationLevel"] = "3";
1644 break;
1645 case "serializable":
1646 properties["TxIsolationLevel"] = "4";
1647 break;
1648 default:
1649 this.Core.OnMessage(WixErrors.IllegalAttributeValue(sourceLineNumbers, "ComPlusComponent", "TxIsolationLevel", txIsolationLevelValue, "any", "readUnCommitted", "readCommitted", "repeatableRead", "serializable"));
1650 break;
1651 }
1652 break;
1653 default:
1654 this.Core.UnexpectedAttribute(node, attrib);
1655 break;
1656 }
1657 }
1658 else
1659 {
1660 this.Core.ParseExtensionAttribute(node, attrib);
1661 }
1662 }
1663
1664 foreach (XElement child in node.Elements())
1665 {
1666 if (this.Namespace == child.Name.Namespace)
1667 {
1668 switch (child.Name.LocalName)
1669 {
1670 case "ComPlusRoleForComponent":
1671 this.ParseComPlusRoleForComponentElement(child, componentKey, key);
1672 break;
1673 case "ComPlusInterface":
1674 this.ParseComPlusInterfaceElement(child, componentKey, key);
1675 break;
1676 case "ComPlusSubscription":
1677 this.ParseComPlusSubscriptionElement(child, componentKey, key);
1678 break;
1679 default:
1680 this.Core.UnexpectedElement(node, child);
1681 break;
1682 }
1683 }
1684 else
1685 {
1686 this.Core.ParseExtensionElement(node, child);
1687 }
1688 }
1689
1690 Row row = this.Core.CreateRow(sourceLineNumbers, "ComPlusComponent");
1691 row[0] = key;
1692 row[1] = assemblyKey;
1693 row[2] = clsid;
1694
1695 IDictionaryEnumerator propertiesEnumerator = properties.GetEnumerator();
1696 while (propertiesEnumerator.MoveNext())
1697 {
1698 Row propertyRow = this.Core.CreateRow(sourceLineNumbers, "ComPlusComponentProperty");
1699 propertyRow[0] = key;
1700 propertyRow[1] = (string)propertiesEnumerator.Key;
1701 propertyRow[2] = (string)propertiesEnumerator.Value;
1702 }
1703 }
1704
1705 /// <summary>
1706 /// Parses a COM+ application role for component element.
1707 /// </summary>
1708 /// <param name="node">Element to parse.</param>
1709 /// <param name="componentKey">Identifier of parent component.</param>
1710 /// <param name="cpcomponentKey">Identifier of parent COM+ component.</param>
1711 private void ParseComPlusRoleForComponentElement(XElement node, string componentKey, string cpcomponentKey)
1712 {
1713 SourceLineNumber sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);
1714
1715 string key = null;
1716 string applicationRoleKey = null;
1717
1718 foreach (XAttribute attrib in node.Attributes())
1719 {
1720 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1721 {
1722 switch (attrib.Name.LocalName)
1723 {
1724 case "Id":
1725 key = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
1726 break;
1727 case "Component":
1728 if (null != cpcomponentKey)
1729 {
1730 this.Core.OnMessage(WixErrors.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName));
1731 }
1732 cpcomponentKey = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1733 this.Core.CreateSimpleReference(sourceLineNumbers, "ComPlusComponent", cpcomponentKey);
1734 break;
1735 case "ApplicationRole":
1736 applicationRoleKey = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1737 break;
1738 default:
1739 this.Core.UnexpectedAttribute(node, attrib);
1740 break;
1741 }
1742 }
1743 else
1744 {
1745 this.Core.ParseExtensionAttribute(node, attrib);
1746 }
1747 }
1748
1749 if (null == cpcomponentKey)
1750 {
1751 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Component"));
1752 }
1753
1754 Row row = this.Core.CreateRow(sourceLineNumbers, "ComPlusRoleForComponent");
1755 row[0] = key;
1756 row[1] = cpcomponentKey;
1757 row[2] = applicationRoleKey;
1758 row[3] = componentKey;
1759 }
1760
1761 /// <summary>
1762 /// Parses a COM+ interface element.
1763 /// </summary>
1764 /// <param name="node">Element to parse.</param>
1765 /// <param name="componentKey">Identifier of parent component.</param>
1766 /// <param name="cpcomponentKey">Identifier of parent COM+ component.</param>
1767 private void ParseComPlusInterfaceElement(XElement node, string componentKey, string cpcomponentKey)
1768 {
1769 SourceLineNumber sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);
1770
1771 // parse attributes
1772 string key = null;
1773 string iid = null;
1774
1775 Hashtable properties = new Hashtable();
1776
1777 foreach (XAttribute attrib in node.Attributes())
1778 {
1779 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1780 {
1781 switch (attrib.Name.LocalName)
1782 {
1783 case "Id":
1784 key = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
1785 break;
1786 case "IID":
1787 iid = "{" + this.Core.GetAttributeValue(sourceLineNumbers, attrib) + "}";
1788 break;
1789 case "Description":
1790 properties["Description"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1791 break;
1792 case "QueuingEnabled":
1793 properties["QueuingEnabled"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1794 break;
1795 default:
1796 this.Core.UnexpectedAttribute(node, attrib);
1797 break;
1798 }
1799 }
1800 else
1801 {
1802 this.Core.ParseExtensionAttribute(node, attrib);
1803 }
1804 }
1805
1806 foreach (XElement child in node.Elements())
1807 {
1808 if (this.Namespace == child.Name.Namespace)
1809 {
1810 switch (child.Name.LocalName)
1811 {
1812 case "ComPlusRoleForInterface":
1813 this.ParseComPlusRoleForInterfaceElement(child, componentKey, key);
1814 break;
1815 case "ComPlusMethod":
1816 this.ParseComPlusMethodElement(child, componentKey, key);
1817 break;
1818 default:
1819 this.Core.UnexpectedElement(node, child);
1820 break;
1821 }
1822 }
1823 else
1824 {
1825 this.Core.ParseExtensionElement(node, child);
1826 }
1827 }
1828
1829 Row row = this.Core.CreateRow(sourceLineNumbers, "ComPlusInterface");
1830 row[0] = key;
1831 row[1] = cpcomponentKey;
1832 row[2] = iid;
1833
1834 IDictionaryEnumerator propertiesEnumerator = properties.GetEnumerator();
1835 while (propertiesEnumerator.MoveNext())
1836 {
1837 Row propertyRow = this.Core.CreateRow(sourceLineNumbers, "ComPlusInterfaceProperty");
1838 propertyRow[0] = key;
1839 propertyRow[1] = (string)propertiesEnumerator.Key;
1840 propertyRow[2] = (string)propertiesEnumerator.Value;
1841 }
1842 }
1843
1844 /// <summary>
1845 /// Parses a COM+ application role for interface element.
1846 /// </summary>
1847 /// <param name="node">Element to parse.</param>
1848 /// <param name="componentKey">Identifier of parent component.</param>
1849 /// <param name="interfaceKey">Identifier of parent interface.</param>
1850 private void ParseComPlusRoleForInterfaceElement(XElement node, string componentKey, string interfaceKey)
1851 {
1852 SourceLineNumber sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);
1853
1854 string key = null;
1855 string applicationRoleKey = null;
1856
1857 foreach (XAttribute attrib in node.Attributes())
1858 {
1859 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1860 {
1861 switch (attrib.Name.LocalName)
1862 {
1863 case "Id":
1864 key = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
1865 break;
1866 case "Interface":
1867 if (null != interfaceKey)
1868 {
1869 this.Core.OnMessage(WixErrors.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName));
1870 }
1871 interfaceKey = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1872 this.Core.CreateSimpleReference(sourceLineNumbers, "ComPlusInterface", interfaceKey);
1873 break;
1874 case "ApplicationRole":
1875 applicationRoleKey = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1876 break;
1877 default:
1878 this.Core.UnexpectedAttribute(node, attrib);
1879 break;
1880 }
1881 }
1882 else
1883 {
1884 this.Core.ParseExtensionAttribute(node, attrib);
1885 }
1886 }
1887
1888 if (null == interfaceKey)
1889 {
1890 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Interface"));
1891 }
1892
1893 Row row = this.Core.CreateRow(sourceLineNumbers, "ComPlusRoleForInterface");
1894 row[0] = key;
1895 row[1] = interfaceKey;
1896 row[2] = applicationRoleKey;
1897 row[3] = componentKey;
1898 }
1899
1900 /// <summary>
1901 /// Parses a COM+ method element.
1902 /// </summary>
1903 /// <param name="node">Element to parse.</param>
1904 /// <param name="componentKey">Identifier of parent component.</param>
1905 /// <param name="interfaceKey">Identifier of parent interface.</param>
1906 private void ParseComPlusMethodElement(XElement node, string componentKey, string interfaceKey)
1907 {
1908 SourceLineNumber sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);
1909
1910 string key = null;
1911 int index = CompilerConstants.IntegerNotSet;
1912 string name = null;
1913
1914 Hashtable properties = new Hashtable();
1915
1916 foreach (XAttribute attrib in node.Attributes())
1917 {
1918 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
1919 {
1920 switch (attrib.Name.LocalName)
1921 {
1922 case "Id":
1923 key = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
1924 break;
1925 case "Index":
1926 index = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, int.MaxValue);
1927 break;
1928 case "Name":
1929 name = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1930 break;
1931 case "AutoComplete":
1932 properties["AutoComplete"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
1933 break;
1934 case "Description":
1935 properties["Description"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
1936 break;
1937 default:
1938 this.Core.UnexpectedAttribute(node, attrib);
1939 break;
1940 }
1941 }
1942 else
1943 {
1944 this.Core.ParseExtensionAttribute(node, attrib);
1945 }
1946 }
1947
1948 foreach (XElement child in node.Elements())
1949 {
1950 if (this.Namespace == child.Name.Namespace)
1951 {
1952 switch (child.Name.LocalName)
1953 {
1954 case "ComPlusRoleForMethod":
1955 this.ParseComPlusRoleForMethodElement(child, componentKey, key);
1956 break;
1957 default:
1958 this.Core.UnexpectedElement(node, child);
1959 break;
1960 }
1961 }
1962 else
1963 {
1964 this.Core.ParseExtensionElement(node, child);
1965 }
1966 }
1967
1968 if (CompilerConstants.IntegerNotSet == index && null == name)
1969 {
1970 this.Core.OnMessage(ComPlusErrors.RequiredAttribute(sourceLineNumbers, node.Name.LocalName, "Index", "Name"));
1971 }
1972
1973 Row row = this.Core.CreateRow(sourceLineNumbers, "ComPlusMethod");
1974 row[0] = key;
1975 row[1] = interfaceKey;
1976 if (CompilerConstants.IntegerNotSet != index)
1977 {
1978 row[2] = index;
1979 }
1980 row[3] = name;
1981
1982 IDictionaryEnumerator propertiesEnumerator = properties.GetEnumerator();
1983 while (propertiesEnumerator.MoveNext())
1984 {
1985 Row propertyRow = this.Core.CreateRow(sourceLineNumbers, "ComPlusMethodProperty");
1986 propertyRow[0] = key;
1987 propertyRow[1] = (string)propertiesEnumerator.Key;
1988 propertyRow[2] = (string)propertiesEnumerator.Value;
1989 }
1990 }
1991
1992 /// <summary>
1993 /// Parses a COM+ application role for method element.
1994 /// </summary>
1995 /// <param name="node">Element to parse.</param>
1996 /// <param name="componentKey">Identifier of parent component.</param>
1997 /// <param name="methodKey">Identifier of parent method.</param>
1998 private void ParseComPlusRoleForMethodElement(XElement node, string componentKey, string methodKey)
1999 {
2000 SourceLineNumber sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);
2001
2002 string key = null;
2003 string applicationRoleKey = null;
2004
2005 foreach (XAttribute attrib in node.Attributes())
2006 {
2007 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
2008 {
2009 switch (attrib.Name.LocalName)
2010 {
2011 case "Id":
2012 key = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
2013 break;
2014 case "Method":
2015 if (null != methodKey)
2016 {
2017 this.Core.OnMessage(WixErrors.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName));
2018 }
2019 methodKey = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
2020 this.Core.CreateSimpleReference(sourceLineNumbers, "ComPlusMethod", methodKey);
2021 break;
2022 case "ApplicationRole":
2023 applicationRoleKey = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
2024 break;
2025 default:
2026 this.Core.UnexpectedAttribute(node, attrib);
2027 break;
2028 }
2029 }
2030 else
2031 {
2032 this.Core.ParseExtensionAttribute(node, attrib);
2033 }
2034 }
2035
2036 if (null == methodKey)
2037 {
2038 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Method"));
2039 }
2040
2041 Row row = this.Core.CreateRow(sourceLineNumbers, "ComPlusRoleForMethod");
2042 row[0] = key;
2043 row[1] = methodKey;
2044 row[2] = applicationRoleKey;
2045 row[3] = componentKey;
2046 }
2047
2048 /// <summary>
2049 /// Parses a COM+ event subscription element.
2050 /// </summary>
2051 /// <param name="node">Element to parse.</param>
2052 /// <param name="componentKey">Identifier of parent component.</param>
2053 /// <param name="cpcomponentKey">Identifier of parent COM+ component.</param>
2054 private void ParseComPlusSubscriptionElement(XElement node, string componentKey, string cpcomponentKey)
2055 {
2056 SourceLineNumber sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);
2057
2058 string key = null;
2059 string id = null;
2060 string name = null;
2061 string eventCLSID = null;
2062 string publisherID = null;
2063
2064 Hashtable properties = new Hashtable();
2065
2066 foreach (XAttribute attrib in node.Attributes())
2067 {
2068 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
2069 {
2070 switch (attrib.Name.LocalName)
2071 {
2072 case "Id":
2073 key = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
2074 break;
2075 case "Component":
2076 if (null != cpcomponentKey)
2077 {
2078 this.Core.OnMessage(WixErrors.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName));
2079 }
2080 cpcomponentKey = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
2081 this.Core.CreateSimpleReference(sourceLineNumbers, "ComPlusComponent", cpcomponentKey);
2082 break;
2083 case "SubscriptionId":
2084 id = TryFormatGuidValue(this.Core.GetAttributeValue(sourceLineNumbers, attrib));
2085 break;
2086 case "Name":
2087 name = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
2088 break;
2089 case "EventCLSID":
2090 eventCLSID = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
2091 break;
2092 case "PublisherID":
2093 publisherID = TryFormatGuidValue(this.Core.GetAttributeValue(sourceLineNumbers, attrib));
2094 break;
2095 case "Description":
2096 properties["Description"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
2097 break;
2098 case "Enabled":
2099 properties["Enabled"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
2100 break;
2101 case "EventClassPartitionID":
2102 properties["EventClassPartitionID"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
2103 break;
2104 case "FilterCriteria":
2105 properties["FilterCriteria"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
2106 break;
2107 case "InterfaceID":
2108 properties["InterfaceID"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
2109 break;
2110 case "MachineName":
2111 properties["MachineName"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
2112 break;
2113 case "MethodName":
2114 properties["MethodName"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
2115 break;
2116 case "PerUser":
2117 properties["PerUser"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
2118 break;
2119 case "Queued":
2120 properties["Queued"] = YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0";
2121 break;
2122 case "SubscriberMoniker":
2123 properties["SubscriberMoniker"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
2124 break;
2125 case "UserName":
2126 properties["UserName"] = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
2127 break;
2128 default:
2129 this.Core.UnexpectedAttribute(node, attrib);
2130 break;
2131 }
2132 }
2133 else
2134 {
2135 this.Core.ParseExtensionAttribute(node, attrib);
2136 }
2137 }
2138
2139 if (null == cpcomponentKey)
2140 {
2141 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Component"));
2142 }
2143
2144 this.Core.ParseForExtensionElements(node);
2145
2146 Row row = this.Core.CreateRow(sourceLineNumbers, "ComPlusSubscription");
2147 row[0] = key;
2148 row[1] = cpcomponentKey;
2149 row[2] = componentKey;
2150 row[3] = id;
2151 row[4] = name;
2152 row[5] = eventCLSID;
2153 row[6] = publisherID;
2154
2155 IDictionaryEnumerator propertiesEnumerator = properties.GetEnumerator();
2156 while (propertiesEnumerator.MoveNext())
2157 {
2158 Row propertyRow = this.Core.CreateRow(sourceLineNumbers, "ComPlusSubscriptionProperty");
2159 propertyRow[0] = key;
2160 propertyRow[1] = (string)propertiesEnumerator.Key;
2161 propertyRow[2] = (string)propertiesEnumerator.Value;
2162 }
2163 }
2164
2165 /// <summary>
2166 /// Attempts to parse the input value as a GUID, and in case the value is a valid
2167 /// GUID returnes it in the format "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}".
2168 /// </summary>
2169 /// <param name="val"></param>
2170 /// <returns></returns>
2171 string TryFormatGuidValue(string val)
2172 {
2173 try
2174 {
2175 Guid guid = new Guid(val);
2176 return guid.ToString("B").ToUpper();
2177 }
2178 catch (FormatException)
2179 {
2180 return val;
2181 }
2182 catch (OverflowException)
2183 {
2184 return val;
2185 }
2186 }
2187 }
2188}
diff --git a/src/wixext/ComPlusDecompiler.cs b/src/wixext/ComPlusDecompiler.cs
new file mode 100644
index 00000000..27f1653e
--- /dev/null
+++ b/src/wixext/ComPlusDecompiler.cs
@@ -0,0 +1,1843 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Extensions
4{
5 using System;
6 using System.Collections;
7 using System.Globalization;
8 using WixToolset.Data;
9 using WixToolset.Extensibility;
10 using ComPlus = WixToolset.Extensions.Serialize.ComPlus;
11 using Wix = WixToolset.Data.Serialize;
12
13 /// <summary>
14 /// The decompiler for the WiX Toolset COM+ Extension.
15 /// </summary>
16 public sealed class ComPlusDecompiler : DecompilerExtension
17 {
18 /// <summary>
19 /// Creates a decompiler for ComPlus Extension.
20 /// </summary>
21 public ComPlusDecompiler()
22 {
23 this.TableDefinitions = ComPlusExtensionData.GetExtensionTableDefinitions();
24 }
25
26 /// <summary>
27 /// Get the extensions library to be removed.
28 /// </summary>
29 /// <param name="tableDefinitions">Table definitions for library.</param>
30 /// <returns>Library to remove from decompiled output.</returns>
31 public override Library GetLibraryToRemove(TableDefinitionCollection tableDefinitions)
32 {
33 return ComPlusExtensionData.GetExtensionLibrary(tableDefinitions);
34 }
35
36 /// <summary>
37 /// Decompiles an extension table.
38 /// </summary>
39 /// <param name="table">The table to decompile.</param>
40 public override void DecompileTable(Table table)
41 {
42 switch (table.Name)
43 {
44 case "ComPlusPartition":
45 this.DecompileComPlusPartitionTable(table);
46 break;
47 case "ComPlusPartitionProperty":
48 this.DecompileComPlusPartitionPropertyTable(table);
49 break;
50 case "ComPlusPartitionRole":
51 this.DecompileComPlusPartitionRoleTable(table);
52 break;
53 case "ComPlusUserInPartitionRole":
54 this.DecompileComPlusUserInPartitionRoleTable(table);
55 break;
56 case "ComPlusGroupInPartitionRole":
57 this.DecompileComPlusGroupInPartitionRoleTable(table);
58 break;
59 case "ComPlusPartitionUser":
60 this.DecompileComPlusPartitionUserTable(table);
61 break;
62 case "ComPlusApplication":
63 this.DecompileComPlusApplicationTable(table);
64 break;
65 case "ComPlusApplicationProperty":
66 this.DecompileComPlusApplicationPropertyTable(table);
67 break;
68 case "ComPlusApplicationRole":
69 this.DecompileComPlusApplicationRoleTable(table);
70 break;
71 case "ComPlusApplicationRoleProperty":
72 this.DecompileComPlusApplicationRolePropertyTable(table);
73 break;
74 case "ComPlusUserInApplicationRole":
75 this.DecompileComPlusUserInApplicationRoleTable(table);
76 break;
77 case "ComPlusGroupInApplicationRole":
78 this.DecompileComPlusGroupInApplicationRoleTable(table);
79 break;
80 case "ComPlusAssembly":
81 this.DecompileComPlusAssemblyTable(table);
82 break;
83 case "ComPlusComponent":
84 this.DecompileComPlusComponentTable(table);
85 break;
86 case "ComPlusComponentProperty":
87 this.DecompileComPlusComponentPropertyTable(table);
88 break;
89 case "ComPlusRoleForComponent":
90 this.DecompileComPlusRoleForComponentTable(table);
91 break;
92 case "ComPlusInterface":
93 this.DecompileComPlusInterfaceTable(table);
94 break;
95 case "ComPlusInterfaceProperty":
96 this.DecompileComPlusInterfacePropertyTable(table);
97 break;
98 case "ComPlusRoleForInterface":
99 this.DecompileComPlusRoleForInterfaceTable(table);
100 break;
101 case "ComPlusMethod":
102 this.DecompileComPlusMethodTable(table);
103 break;
104 case "ComPlusMethodProperty":
105 this.DecompileComPlusMethodPropertyTable(table);
106 break;
107 case "ComPlusRoleForMethod":
108 this.DecompileComPlusRoleForMethodTable(table);
109 break;
110 case "ComPlusSubscription":
111 this.DecompileComPlusSubscriptionTable(table);
112 break;
113 case "ComPlusSubscriptionProperty":
114 this.DecompileComPlusSubscriptionPropertyTable(table);
115 break;
116 default:
117 base.DecompileTable(table);
118 break;
119 }
120 }
121
122 /// <summary>
123 /// Decompile the ComPlusPartition table.
124 /// </summary>
125 /// <param name="table">The table to decompile.</param>
126 private void DecompileComPlusPartitionTable(Table table)
127 {
128 foreach (Row row in table.Rows)
129 {
130 ComPlus.ComPlusPartition partition = new ComPlus.ComPlusPartition();
131
132 partition.Id = (string)row[0];
133
134 if (null != row[2])
135 {
136 partition.PartitionId = (string)row[2];
137 }
138
139 if (null != row[3])
140 {
141 partition.Name = (string)row[3];
142 }
143
144 if (null != row[1])
145 {
146 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[1]);
147 if (null != component)
148 {
149 component.AddChild(partition);
150 }
151 else
152 {
153 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[1], "Component"));
154 }
155 }
156 else
157 {
158 this.Core.RootElement.AddChild(partition);
159 }
160 this.Core.IndexElement(row, partition);
161 }
162 }
163
164 /// <summary>
165 /// Decompile the ComPlusPartitionProperty table.
166 /// </summary>
167 /// <param name="table">The table to decompile.</param>
168 private void DecompileComPlusPartitionPropertyTable(Table table)
169 {
170 foreach (Row row in table.Rows)
171 {
172 ComPlus.ComPlusPartition partition = (ComPlus.ComPlusPartition)this.Core.GetIndexedElement("ComPlusPartition", (string)row[0]);
173 if (null == partition)
174 {
175 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Partition_", (string)row[0], "ComPlusPartition"));
176 }
177
178 switch ((string)row[1])
179 {
180 case "Changeable":
181 switch ((string)row[2])
182 {
183 case "1":
184 partition.Changeable = ComPlus.YesNoType.yes;
185 break;
186 case "0":
187 partition.Changeable = ComPlus.YesNoType.no;
188 break;
189 default:
190 // TODO: Warning
191 break;
192 }
193 break;
194 case "Deleteable":
195 switch ((string)row[2])
196 {
197 case "1":
198 partition.Deleteable = ComPlus.YesNoType.yes;
199 break;
200 case "0":
201 partition.Deleteable = ComPlus.YesNoType.no;
202 break;
203 default:
204 // TODO: Warning
205 break;
206 }
207 break;
208 case "Description":
209 partition.Description = (string)row[2];
210 break;
211 default:
212 // TODO: Warning
213 break;
214 }
215 }
216 }
217
218 /// <summary>
219 /// Decompile the ComPlusPartitionRole table.
220 /// </summary>
221 /// <param name="table">The table to decompile.</param>
222 private void DecompileComPlusPartitionRoleTable(Table table)
223 {
224 foreach (Row row in table.Rows)
225 {
226 ComPlus.ComPlusPartitionRole partitionRole = new ComPlus.ComPlusPartitionRole();
227
228 partitionRole.Id = (string)row[0];
229 partitionRole.Partition = (string)row[1];
230 partitionRole.Name = (string)row[3];
231
232 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[2]);
233 if (null != component)
234 {
235 component.AddChild(partitionRole);
236 }
237 else
238 {
239 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[2], "Component"));
240 }
241 }
242 }
243
244 /// <summary>
245 /// Decompile the ComPlusUserInPartitionRole table.
246 /// </summary>
247 /// <param name="table">The table to decompile.</param>
248 private void DecompileComPlusUserInPartitionRoleTable(Table table)
249 {
250 foreach (Row row in table.Rows)
251 {
252 ComPlus.ComPlusUserInPartitionRole userInPartitionRole = new ComPlus.ComPlusUserInPartitionRole();
253
254 userInPartitionRole.Id = (string)row[0];
255 userInPartitionRole.PartitionRole = (string)row[1];
256 userInPartitionRole.User = (string)row[3];
257
258 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[2]);
259 if (null != component)
260 {
261 component.AddChild(userInPartitionRole);
262 }
263 else
264 {
265 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[2], "Component"));
266 }
267 }
268 }
269
270 /// <summary>
271 /// Decompile the ComPlusGroupInPartitionRole table.
272 /// </summary>
273 /// <param name="table">The table to decompile.</param>
274 private void DecompileComPlusGroupInPartitionRoleTable(Table table)
275 {
276 foreach (Row row in table.Rows)
277 {
278 ComPlus.ComPlusGroupInPartitionRole groupInPartitionRole = new ComPlus.ComPlusGroupInPartitionRole();
279
280 groupInPartitionRole.Id = (string)row[0];
281 groupInPartitionRole.PartitionRole = (string)row[1];
282 groupInPartitionRole.Group = (string)row[3];
283
284 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[2]);
285 if (null != component)
286 {
287 component.AddChild(groupInPartitionRole);
288 }
289 else
290 {
291 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[2], "Component"));
292 }
293 }
294 }
295
296 /// <summary>
297 /// Decompile the ComPlusPartitionUser table.
298 /// </summary>
299 /// <param name="table">The table to decompile.</param>
300 private void DecompileComPlusPartitionUserTable(Table table)
301 {
302 foreach (Row row in table.Rows)
303 {
304 ComPlus.ComPlusPartitionUser partitionUser = new ComPlus.ComPlusPartitionUser();
305
306 partitionUser.Id = (string)row[0];
307 partitionUser.Partition = (string)row[1];
308 partitionUser.User = (string)row[3];
309
310 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[2]);
311 if (null != component)
312 {
313 component.AddChild(partitionUser);
314 }
315 else
316 {
317 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[2], "Component"));
318 }
319 }
320 }
321
322 /// <summary>
323 /// Decompile the ComPlusApplication table.
324 /// </summary>
325 /// <param name="table">The table to decompile.</param>
326 private void DecompileComPlusApplicationTable(Table table)
327 {
328 foreach (Row row in table.Rows)
329 {
330 ComPlus.ComPlusApplication application = new ComPlus.ComPlusApplication();
331
332 application.Id = (string)row[0];
333 application.Partition = (string)row[1];
334
335 if (null != row[3])
336 {
337 application.ApplicationId = (string)row[3];
338 }
339
340 if (null != row[4])
341 {
342 application.Name = (string)row[4];
343 }
344
345 if (null != row[2])
346 {
347 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[1]);
348 if (null != component)
349 {
350 component.AddChild(application);
351 }
352 else
353 {
354 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[2], "Component"));
355 }
356 }
357 else
358 {
359 this.Core.RootElement.AddChild(application);
360 }
361 this.Core.IndexElement(row, application);
362 }
363 }
364
365 /// <summary>
366 /// Decompile the ComPlusApplicationProperty table.
367 /// </summary>
368 /// <param name="table">The table to decompile.</param>
369 private void DecompileComPlusApplicationPropertyTable(Table table)
370 {
371 foreach (Row row in table.Rows)
372 {
373 ComPlus.ComPlusApplication application = (ComPlus.ComPlusApplication)this.Core.GetIndexedElement("ComPlusApplication", (string)row[0]);
374 if (null == application)
375 {
376 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Application_", (string)row[0], "ComPlusApplication"));
377 }
378
379 switch ((string)row[1])
380 {
381 case "3GigSupportEnabled":
382 switch ((string)row[2])
383 {
384 case "1":
385 application.ThreeGigSupportEnabled = ComPlus.YesNoType.yes;
386 break;
387 case "0":
388 application.ThreeGigSupportEnabled = ComPlus.YesNoType.no;
389 break;
390 default:
391 // TODO: Warning
392 break;
393 }
394 break;
395 case "AccessChecksLevel":
396 switch ((string)row[2])
397 {
398 case "0":
399 application.AccessChecksLevel = ComPlus.ComPlusApplication.AccessChecksLevelType.applicationLevel;
400 break;
401 case "1":
402 application.AccessChecksLevel = ComPlus.ComPlusApplication.AccessChecksLevelType.applicationComponentLevel;
403 break;
404 default:
405 // TODO: Warning
406 break;
407 }
408 break;
409 case "Activation":
410 switch ((string)row[2])
411 {
412 case "Inproc":
413 application.Activation = ComPlus.ComPlusApplication.ActivationType.inproc;
414 break;
415 case "Local":
416 application.Activation = ComPlus.ComPlusApplication.ActivationType.local;
417 break;
418 default:
419 // TODO: Warning
420 break;
421 }
422 break;
423 case "ApplicationAccessChecksEnabled":
424 switch ((string)row[2])
425 {
426 case "1":
427 application.ApplicationAccessChecksEnabled = ComPlus.YesNoType.yes;
428 break;
429 case "0":
430 application.ApplicationAccessChecksEnabled = ComPlus.YesNoType.no;
431 break;
432 default:
433 // TODO: Warning
434 break;
435 }
436 break;
437 case "ApplicationDirectory":
438 application.ApplicationDirectory = (string)row[2];
439 break;
440 case "Authentication":
441 switch ((string)row[2])
442 {
443 case "0":
444 application.Authentication = ComPlus.ComPlusApplication.AuthenticationType.@default;
445 break;
446 case "1":
447 application.Authentication = ComPlus.ComPlusApplication.AuthenticationType.none;
448 break;
449 case "2":
450 application.Authentication = ComPlus.ComPlusApplication.AuthenticationType.connect;
451 break;
452 case "3":
453 application.Authentication = ComPlus.ComPlusApplication.AuthenticationType.call;
454 break;
455 case "4":
456 application.Authentication = ComPlus.ComPlusApplication.AuthenticationType.packet;
457 break;
458 case "5":
459 application.Authentication = ComPlus.ComPlusApplication.AuthenticationType.integrity;
460 break;
461 case "6":
462 application.Authentication = ComPlus.ComPlusApplication.AuthenticationType.privacy;
463 break;
464 default:
465 // TODO: Warning
466 break;
467 }
468 break;
469 case "AuthenticationCapability":
470 switch ((string)row[2])
471 {
472 case "0":
473 application.AuthenticationCapability = ComPlus.ComPlusApplication.AuthenticationCapabilityType.none;
474 break;
475 case "2":
476 application.AuthenticationCapability = ComPlus.ComPlusApplication.AuthenticationCapabilityType.secureReference;
477 break;
478 case "32":
479 application.AuthenticationCapability = ComPlus.ComPlusApplication.AuthenticationCapabilityType.staticCloaking;
480 break;
481 case "64":
482 application.AuthenticationCapability = ComPlus.ComPlusApplication.AuthenticationCapabilityType.dynamicCloaking;
483 break;
484 default:
485 // TODO: Warning
486 break;
487 }
488 break;
489 case "Changeable":
490 switch ((string)row[2])
491 {
492 case "1":
493 application.Changeable = ComPlus.YesNoType.yes;
494 break;
495 case "0":
496 application.Changeable = ComPlus.YesNoType.no;
497 break;
498 default:
499 // TODO: Warning
500 break;
501 }
502 break;
503 case "CommandLine":
504 application.CommandLine = (string)row[2];
505 break;
506 case "ConcurrentApps":
507 int concurrentApps;
508 if (Int32.TryParse((string)row[2], out concurrentApps))
509 {
510 application.ConcurrentApps = concurrentApps;
511 }
512 else
513 {
514 // TODO: Warning
515 }
516 break;
517 case "CreatedBy":
518 application.CreatedBy = (string)row[2];
519 break;
520 case "CRMEnabled":
521 switch ((string)row[2])
522 {
523 case "1":
524 application.CRMEnabled = ComPlus.YesNoType.yes;
525 break;
526 case "0":
527 application.CRMEnabled = ComPlus.YesNoType.no;
528 break;
529 default:
530 // TODO: Warning
531 break;
532 }
533 break;
534 case "CRMLogFile":
535 application.CRMLogFile = (string)row[2];
536 break;
537 case "Deleteable":
538 switch ((string)row[2])
539 {
540 case "1":
541 application.Deleteable = ComPlus.YesNoType.yes;
542 break;
543 case "0":
544 application.Deleteable = ComPlus.YesNoType.no;
545 break;
546 default:
547 // TODO: Warning
548 break;
549 }
550 break;
551 case "Description":
552 application.Description = (string)row[2];
553 break;
554 case "DumpEnabled":
555 switch ((string)row[2])
556 {
557 case "1":
558 application.DumpEnabled = ComPlus.YesNoType.yes;
559 break;
560 case "0":
561 application.DumpEnabled = ComPlus.YesNoType.no;
562 break;
563 default:
564 // TODO: Warning
565 break;
566 }
567 break;
568 case "DumpOnException":
569 switch ((string)row[2])
570 {
571 case "1":
572 application.DumpOnException = ComPlus.YesNoType.yes;
573 break;
574 case "0":
575 application.DumpOnException = ComPlus.YesNoType.no;
576 break;
577 default:
578 // TODO: Warning
579 break;
580 }
581 break;
582 case "DumpOnFailfast":
583 switch ((string)row[2])
584 {
585 case "1":
586 application.DumpOnFailfast = ComPlus.YesNoType.yes;
587 break;
588 case "0":
589 application.DumpOnFailfast = ComPlus.YesNoType.no;
590 break;
591 default:
592 // TODO: Warning
593 break;
594 }
595 break;
596 case "DumpPath":
597 application.DumpPath = (string)row[2];
598 break;
599 case "EventsEnabled":
600 switch ((string)row[2])
601 {
602 case "1":
603 application.EventsEnabled = ComPlus.YesNoType.yes;
604 break;
605 case "0":
606 application.EventsEnabled = ComPlus.YesNoType.no;
607 break;
608 default:
609 // TODO: Warning
610 break;
611 }
612 break;
613 case "Identity":
614 application.Identity = (string)row[2];
615 break;
616 case "ImpersonationLevel":
617 switch ((string)row[2])
618 {
619 case "1":
620 application.ImpersonationLevel = ComPlus.ComPlusApplication.ImpersonationLevelType.anonymous;
621 break;
622 case "2":
623 application.ImpersonationLevel = ComPlus.ComPlusApplication.ImpersonationLevelType.identify;
624 break;
625 case "3":
626 application.ImpersonationLevel = ComPlus.ComPlusApplication.ImpersonationLevelType.impersonate;
627 break;
628 case "4":
629 application.ImpersonationLevel = ComPlus.ComPlusApplication.ImpersonationLevelType.@delegate;
630 break;
631 default:
632 // TODO: Warning
633 break;
634 }
635 break;
636 case "IsEnabled":
637 switch ((string)row[2])
638 {
639 case "1":
640 application.IsEnabled = ComPlus.YesNoType.yes;
641 break;
642 case "0":
643 application.IsEnabled = ComPlus.YesNoType.no;
644 break;
645 default:
646 // TODO: Warning
647 break;
648 }
649 break;
650 case "MaxDumpCount":
651 int maxDumpCount;
652 if (Int32.TryParse((string)row[2], out maxDumpCount))
653 {
654 application.MaxDumpCount = maxDumpCount;
655 }
656 else
657 {
658 // TODO: Warning
659 }
660 break;
661 case "Password":
662 application.Password = (string)row[2];
663 break;
664 case "QCAuthenticateMsgs":
665 switch ((string)row[2])
666 {
667 case "0":
668 application.QCAuthenticateMsgs = ComPlus.ComPlusApplication.QCAuthenticateMsgsType.secureApps;
669 break;
670 case "1":
671 application.QCAuthenticateMsgs = ComPlus.ComPlusApplication.QCAuthenticateMsgsType.off;
672 break;
673 case "2":
674 application.QCAuthenticateMsgs = ComPlus.ComPlusApplication.QCAuthenticateMsgsType.on;
675 break;
676 default:
677 // TODO: Warning
678 break;
679 }
680 break;
681 case "QCListenerMaxThreads":
682 int qcListenerMaxThreads;
683 if (Int32.TryParse((string)row[2], out qcListenerMaxThreads))
684 {
685 application.QCListenerMaxThreads = qcListenerMaxThreads;
686 }
687 else
688 {
689 // TODO: Warning
690 }
691 break;
692 case "QueueListenerEnabled":
693 switch ((string)row[2])
694 {
695 case "1":
696 application.QueueListenerEnabled = ComPlus.YesNoType.yes;
697 break;
698 case "0":
699 application.QueueListenerEnabled = ComPlus.YesNoType.no;
700 break;
701 default:
702 // TODO: Warning
703 break;
704 }
705 break;
706 case "QueuingEnabled":
707 switch ((string)row[2])
708 {
709 case "1":
710 application.QueuingEnabled = ComPlus.YesNoType.yes;
711 break;
712 case "0":
713 application.QueuingEnabled = ComPlus.YesNoType.no;
714 break;
715 default:
716 // TODO: Warning
717 break;
718 }
719 break;
720 case "RecycleActivationLimit":
721 int recycleActivationLimit;
722 if (Int32.TryParse((string)row[2], out recycleActivationLimit))
723 {
724 application.RecycleActivationLimit = recycleActivationLimit;
725 }
726 else
727 {
728 // TODO: Warning
729 }
730 break;
731 case "RecycleCallLimit":
732 int recycleCallLimit;
733 if (Int32.TryParse((string)row[2], out recycleCallLimit))
734 {
735 application.RecycleCallLimit = recycleCallLimit;
736 }
737 else
738 {
739 // TODO: Warning
740 }
741 break;
742 case "RecycleExpirationTimeout":
743 int recycleExpirationTimeout;
744 if (Int32.TryParse((string)row[2], out recycleExpirationTimeout))
745 {
746 application.RecycleExpirationTimeout = recycleExpirationTimeout;
747 }
748 else
749 {
750 // TODO: Warning
751 }
752 break;
753 case "RecycleLifetimeLimit":
754 int recycleLifetimeLimit;
755 if (Int32.TryParse((string)row[2], out recycleLifetimeLimit))
756 {
757 application.RecycleLifetimeLimit = recycleLifetimeLimit;
758 }
759 else
760 {
761 // TODO: Warning
762 }
763 break;
764 case "RecycleMemoryLimit":
765 int recycleMemoryLimit;
766 if (Int32.TryParse((string)row[2], out recycleMemoryLimit))
767 {
768 application.RecycleMemoryLimit = recycleMemoryLimit;
769 }
770 else
771 {
772 // TODO: Warning
773 }
774 break;
775 case "Replicable":
776 switch ((string)row[2])
777 {
778 case "1":
779 application.Replicable = ComPlus.YesNoType.yes;
780 break;
781 case "0":
782 application.Replicable = ComPlus.YesNoType.no;
783 break;
784 default:
785 // TODO: Warning
786 break;
787 }
788 break;
789 case "RunForever":
790 switch ((string)row[2])
791 {
792 case "1":
793 application.RunForever = ComPlus.YesNoType.yes;
794 break;
795 case "0":
796 application.RunForever = ComPlus.YesNoType.no;
797 break;
798 default:
799 // TODO: Warning
800 break;
801 }
802 break;
803 case "ShutdownAfter":
804 int shutdownAfter;
805 if (Int32.TryParse((string)row[2], out shutdownAfter))
806 {
807 application.ShutdownAfter = shutdownAfter;
808 }
809 else
810 {
811 // TODO: Warning
812 }
813 break;
814 case "SoapActivated":
815 switch ((string)row[2])
816 {
817 case "1":
818 application.SoapActivated = ComPlus.YesNoType.yes;
819 break;
820 case "0":
821 application.SoapActivated = ComPlus.YesNoType.no;
822 break;
823 default:
824 // TODO: Warning
825 break;
826 }
827 break;
828 case "SoapBaseUrl":
829 application.SoapBaseUrl = (string)row[2];
830 break;
831 case "SoapMailTo":
832 application.SoapMailTo = (string)row[2];
833 break;
834 case "SoapVRoot":
835 application.SoapVRoot = (string)row[2];
836 break;
837 case "SRPEnabled":
838 switch ((string)row[2])
839 {
840 case "1":
841 application.SRPEnabled = ComPlus.YesNoType.yes;
842 break;
843 case "0":
844 application.SRPEnabled = ComPlus.YesNoType.no;
845 break;
846 default:
847 // TODO: Warning
848 break;
849 }
850 break;
851 case "SRPTrustLevel":
852 switch ((string)row[2])
853 {
854 case "0":
855 application.SRPTrustLevel = ComPlus.ComPlusApplication.SRPTrustLevelType.disallowed;
856 break;
857 case "262144":
858 application.SRPTrustLevel = ComPlus.ComPlusApplication.SRPTrustLevelType.fullyTrusted;
859 break;
860 default:
861 // TODO: Warning
862 break;
863 }
864 break;
865 default:
866 // TODO: Warning
867 break;
868 }
869 }
870 }
871
872 /// <summary>
873 /// Decompile the ComPlusApplicationRole table.
874 /// </summary>
875 /// <param name="table">The table to decompile.</param>
876 private void DecompileComPlusApplicationRoleTable(Table table)
877 {
878 foreach (Row row in table.Rows)
879 {
880 ComPlus.ComPlusApplicationRole applicationRole = new ComPlus.ComPlusApplicationRole();
881
882 applicationRole.Id = (string)row[0];
883 applicationRole.Application = (string)row[1];
884
885 if (null != row[3])
886 {
887 applicationRole.Name = (string)row[3];
888 }
889
890 if (null != row[2])
891 {
892 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[2]);
893 if (null != component)
894 {
895 component.AddChild(applicationRole);
896 }
897 else
898 {
899 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[2], "Component"));
900 }
901 }
902 else
903 {
904 this.Core.RootElement.AddChild(applicationRole);
905 }
906 this.Core.IndexElement(row, applicationRole);
907 }
908 }
909
910 /// <summary>
911 /// Decompile the ComPlusApplicationRoleProperty table.
912 /// </summary>
913 /// <param name="table">The table to decompile.</param>
914 private void DecompileComPlusApplicationRolePropertyTable(Table table)
915 {
916 foreach (Row row in table.Rows)
917 {
918 ComPlus.ComPlusApplicationRole applicationRole = (ComPlus.ComPlusApplicationRole)this.Core.GetIndexedElement("ComPlusApplicationRole", (string)row[0]);
919 if (null == applicationRole)
920 {
921 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "ApplicationRole_", (string)row[0], "ComPlusApplicationRole"));
922 }
923
924 switch ((string)row[1])
925 {
926 case "Description":
927 applicationRole.Description = (string)row[2];
928 break;
929 default:
930 // TODO: Warning
931 break;
932 }
933 }
934 }
935
936 /// <summary>
937 /// Decompile the ComPlusUserInApplicationRole table.
938 /// </summary>
939 /// <param name="table">The table to decompile.</param>
940 private void DecompileComPlusUserInApplicationRoleTable(Table table)
941 {
942 foreach (Row row in table.Rows)
943 {
944 ComPlus.ComPlusUserInApplicationRole userInApplicationRole = new ComPlus.ComPlusUserInApplicationRole();
945
946 userInApplicationRole.Id = (string)row[0];
947 userInApplicationRole.ApplicationRole = (string)row[1];
948 userInApplicationRole.User = (string)row[3];
949
950 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[2]);
951 if (null != component)
952 {
953 component.AddChild(userInApplicationRole);
954 }
955 else
956 {
957 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[2], "Component"));
958 }
959 }
960 }
961
962 /// <summary>
963 /// Decompile the ComPlusGroupInApplicationRole table.
964 /// </summary>
965 /// <param name="table">The table to decompile.</param>
966 private void DecompileComPlusGroupInApplicationRoleTable(Table table)
967 {
968 foreach (Row row in table.Rows)
969 {
970 ComPlus.ComPlusGroupInApplicationRole groupInApplicationRole = new ComPlus.ComPlusGroupInApplicationRole();
971
972 groupInApplicationRole.Id = (string)row[0];
973 groupInApplicationRole.ApplicationRole = (string)row[1];
974 groupInApplicationRole.Group = (string)row[3];
975
976 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[2]);
977 if (null != component)
978 {
979 component.AddChild(groupInApplicationRole);
980 }
981 else
982 {
983 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[2], "Component"));
984 }
985 }
986 }
987
988 /// <summary>
989 /// Decompile the ComPlusAssembly table.
990 /// </summary>
991 /// <param name="table">The table to decompile.</param>
992 private void DecompileComPlusAssemblyTable(Table table)
993 {
994 foreach (Row row in table.Rows)
995 {
996 ComPlus.ComPlusAssembly assembly = new ComPlus.ComPlusAssembly();
997
998 assembly.Id = (string)row[0];
999 assembly.Application = (string)row[1];
1000
1001 if (null != row[3])
1002 {
1003 assembly.AssemblyName = (string)row[3];
1004 }
1005
1006 if (null != row[4])
1007 {
1008 assembly.DllPath = (string)row[4];
1009 }
1010
1011 if (null != row[5])
1012 {
1013 assembly.TlbPath = (string)row[5];
1014 }
1015
1016 if (null != row[6])
1017 {
1018 assembly.PSDllPath = (string)row[6];
1019 }
1020
1021 int attributes = (int)row[7];
1022
1023 if (0 != (attributes & (int)ComPlusCompiler.CpiAssemblyAttributes.EventClass))
1024 {
1025 assembly.EventClass = ComPlus.YesNoType.yes;
1026 }
1027
1028 if (0 != (attributes & (int)ComPlusCompiler.CpiAssemblyAttributes.DotNetAssembly))
1029 {
1030 assembly.Type = ComPlus.ComPlusAssembly.TypeType.net;
1031 }
1032
1033 if (0 != (attributes & (int)ComPlusCompiler.CpiAssemblyAttributes.DllPathFromGAC))
1034 {
1035 assembly.DllPathFromGAC = ComPlus.YesNoType.yes;
1036 }
1037
1038 if (0 != (attributes & (int)ComPlusCompiler.CpiAssemblyAttributes.RegisterInCommit))
1039 {
1040 assembly.RegisterInCommit = ComPlus.YesNoType.yes;
1041 }
1042
1043 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[2]);
1044 if (null != component)
1045 {
1046 component.AddChild(assembly);
1047 }
1048 else
1049 {
1050 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[2], "Component"));
1051 }
1052 this.Core.IndexElement(row, assembly);
1053 }
1054 }
1055
1056 /// <summary>
1057 /// Decompile the ComPlusAssemblyDependency table.
1058 /// </summary>
1059 /// <param name="table">The table to decompile.</param>
1060 private void DecompileComPlusAssemblyDependencyTable(Table table)
1061 {
1062 foreach (Row row in table.Rows)
1063 {
1064 ComPlus.ComPlusAssemblyDependency assemblyDependency = new ComPlus.ComPlusAssemblyDependency();
1065
1066 assemblyDependency.RequiredAssembly = (string)row[1];
1067
1068 ComPlus.ComPlusAssembly assembly = (ComPlus.ComPlusAssembly)this.Core.GetIndexedElement("ComPlusAssembly", (string)row[0]);
1069 if (null != assembly)
1070 {
1071 assembly.AddChild(assemblyDependency);
1072 }
1073 else
1074 {
1075 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Assembly_", (string)row[0], "ComPlusAssembly"));
1076 }
1077 }
1078 }
1079
1080 /// <summary>
1081 /// Decompile the ComPlusComponent table.
1082 /// </summary>
1083 /// <param name="table">The table to decompile.</param>
1084 private void DecompileComPlusComponentTable(Table table)
1085 {
1086 foreach (Row row in table.Rows)
1087 {
1088 ComPlus.ComPlusComponent comPlusComponent = new ComPlus.ComPlusComponent();
1089
1090 comPlusComponent.Id = (string)row[0];
1091
1092 try
1093 {
1094 Guid clsid = new Guid((string)row[2]);
1095 comPlusComponent.CLSID = clsid.ToString().ToUpper();
1096 }
1097 catch
1098 {
1099 // TODO: Warning
1100 }
1101
1102 ComPlus.ComPlusAssembly assembly = (ComPlus.ComPlusAssembly)this.Core.GetIndexedElement("ComPlusAssembly", (string)row[1]);
1103 if (null != assembly)
1104 {
1105 assembly.AddChild(comPlusComponent);
1106 }
1107 else
1108 {
1109 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Assembly_", (string)row[1], "ComPlusAssembly"));
1110 }
1111 this.Core.IndexElement(row, comPlusComponent);
1112 }
1113 }
1114
1115 /// <summary>
1116 /// Decompile the ComPlusComponentProperty table.
1117 /// </summary>
1118 /// <param name="table">The table to decompile.</param>
1119 private void DecompileComPlusComponentPropertyTable(Table table)
1120 {
1121 foreach (Row row in table.Rows)
1122 {
1123 ComPlus.ComPlusComponent comPlusComponent = (ComPlus.ComPlusComponent)this.Core.GetIndexedElement("ComPlusComponent", (string)row[0]);
1124 if (null == comPlusComponent)
1125 {
1126 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "ComPlusComponent_", (string)row[0], "ComPlusComponent"));
1127 }
1128
1129 switch ((string)row[1])
1130 {
1131 case "AllowInprocSubscribers":
1132 switch ((string)row[2])
1133 {
1134 case "1":
1135 comPlusComponent.AllowInprocSubscribers = ComPlus.YesNoType.yes;
1136 break;
1137 case "0":
1138 comPlusComponent.AllowInprocSubscribers = ComPlus.YesNoType.no;
1139 break;
1140 default:
1141 // TODO: Warning
1142 break;
1143 }
1144 break;
1145 case "ComponentAccessChecksEnabled":
1146 switch ((string)row[2])
1147 {
1148 case "1":
1149 comPlusComponent.ComponentAccessChecksEnabled = ComPlus.YesNoType.yes;
1150 break;
1151 case "0":
1152 comPlusComponent.ComponentAccessChecksEnabled = ComPlus.YesNoType.no;
1153 break;
1154 default:
1155 // TODO: Warning
1156 break;
1157 }
1158 break;
1159 case "ComponentTransactionTimeout":
1160 int componentTransactionTimeout;
1161 if (Int32.TryParse((string)row[2], out componentTransactionTimeout))
1162 {
1163 comPlusComponent.ComponentTransactionTimeout = componentTransactionTimeout;
1164 }
1165 else
1166 {
1167 // TODO: Warning
1168 }
1169 break;
1170 case "ComponentTransactionTimeoutEnabled":
1171 switch ((string)row[2])
1172 {
1173 case "1":
1174 comPlusComponent.ComponentTransactionTimeoutEnabled = ComPlus.YesNoType.yes;
1175 break;
1176 case "0":
1177 comPlusComponent.ComponentTransactionTimeoutEnabled = ComPlus.YesNoType.no;
1178 break;
1179 default:
1180 // TODO: Warning
1181 break;
1182 }
1183 break;
1184 case "COMTIIntrinsics":
1185 switch ((string)row[2])
1186 {
1187 case "1":
1188 comPlusComponent.COMTIIntrinsics = ComPlus.YesNoType.yes;
1189 break;
1190 case "0":
1191 comPlusComponent.COMTIIntrinsics = ComPlus.YesNoType.no;
1192 break;
1193 default:
1194 // TODO: Warning
1195 break;
1196 }
1197 break;
1198 case "ConstructionEnabled":
1199 switch ((string)row[2])
1200 {
1201 case "1":
1202 comPlusComponent.ConstructionEnabled = ComPlus.YesNoType.yes;
1203 break;
1204 case "0":
1205 comPlusComponent.ConstructionEnabled = ComPlus.YesNoType.no;
1206 break;
1207 default:
1208 // TODO: Warning
1209 break;
1210 }
1211 break;
1212 case "ConstructorString":
1213 comPlusComponent.ConstructorString = (string)row[2];
1214 break;
1215 case "CreationTimeout":
1216 int creationTimeout;
1217 if (Int32.TryParse((string)row[2], out creationTimeout))
1218 {
1219 comPlusComponent.CreationTimeout = creationTimeout;
1220 }
1221 else
1222 {
1223 // TODO: Warning
1224 }
1225 break;
1226 case "Description":
1227 comPlusComponent.Description = (string)row[2];
1228 break;
1229 case "EventTrackingEnabled":
1230 switch ((string)row[2])
1231 {
1232 case "1":
1233 comPlusComponent.EventTrackingEnabled = ComPlus.YesNoType.yes;
1234 break;
1235 case "0":
1236 comPlusComponent.EventTrackingEnabled = ComPlus.YesNoType.no;
1237 break;
1238 default:
1239 // TODO: Warning
1240 break;
1241 }
1242 break;
1243 case "ExceptionClass":
1244 comPlusComponent.ExceptionClass = (string)row[2];
1245 break;
1246 case "FireInParallel":
1247 switch ((string)row[2])
1248 {
1249 case "1":
1250 comPlusComponent.FireInParallel = ComPlus.YesNoType.yes;
1251 break;
1252 case "0":
1253 comPlusComponent.FireInParallel = ComPlus.YesNoType.no;
1254 break;
1255 default:
1256 // TODO: Warning
1257 break;
1258 }
1259 break;
1260 case "IISIntrinsics":
1261 switch ((string)row[2])
1262 {
1263 case "1":
1264 comPlusComponent.IISIntrinsics = ComPlus.YesNoType.yes;
1265 break;
1266 case "0":
1267 comPlusComponent.IISIntrinsics = ComPlus.YesNoType.no;
1268 break;
1269 default:
1270 // TODO: Warning
1271 break;
1272 }
1273 break;
1274 case "InitializesServerApplication":
1275 switch ((string)row[2])
1276 {
1277 case "1":
1278 comPlusComponent.InitializesServerApplication = ComPlus.YesNoType.yes;
1279 break;
1280 case "0":
1281 comPlusComponent.InitializesServerApplication = ComPlus.YesNoType.no;
1282 break;
1283 default:
1284 // TODO: Warning
1285 break;
1286 }
1287 break;
1288 case "IsEnabled":
1289 switch ((string)row[2])
1290 {
1291 case "1":
1292 comPlusComponent.IsEnabled = ComPlus.YesNoType.yes;
1293 break;
1294 case "0":
1295 comPlusComponent.IsEnabled = ComPlus.YesNoType.no;
1296 break;
1297 default:
1298 // TODO: Warning
1299 break;
1300 }
1301 break;
1302 case "IsPrivateComponent":
1303 switch ((string)row[2])
1304 {
1305 case "1":
1306 comPlusComponent.IsPrivateComponent = ComPlus.YesNoType.yes;
1307 break;
1308 case "0":
1309 comPlusComponent.IsPrivateComponent = ComPlus.YesNoType.no;
1310 break;
1311 default:
1312 // TODO: Warning
1313 break;
1314 }
1315 break;
1316 case "JustInTimeActivation":
1317 switch ((string)row[2])
1318 {
1319 case "1":
1320 comPlusComponent.JustInTimeActivation = ComPlus.YesNoType.yes;
1321 break;
1322 case "0":
1323 comPlusComponent.JustInTimeActivation = ComPlus.YesNoType.no;
1324 break;
1325 default:
1326 // TODO: Warning
1327 break;
1328 }
1329 break;
1330 case "LoadBalancingSupported":
1331 switch ((string)row[2])
1332 {
1333 case "1":
1334 comPlusComponent.LoadBalancingSupported = ComPlus.YesNoType.yes;
1335 break;
1336 case "0":
1337 comPlusComponent.LoadBalancingSupported = ComPlus.YesNoType.no;
1338 break;
1339 default:
1340 // TODO: Warning
1341 break;
1342 }
1343 break;
1344 case "MaxPoolSize":
1345 int maxPoolSize;
1346 if (Int32.TryParse((string)row[2], out maxPoolSize))
1347 {
1348 comPlusComponent.MaxPoolSize = maxPoolSize;
1349 }
1350 else
1351 {
1352 // TODO: Warning
1353 }
1354 break;
1355 case "MinPoolSize":
1356 int minPoolSize;
1357 if (Int32.TryParse((string)row[2], out minPoolSize))
1358 {
1359 comPlusComponent.MinPoolSize = minPoolSize;
1360 }
1361 else
1362 {
1363 // TODO: Warning
1364 }
1365 break;
1366 case "MultiInterfacePublisherFilterCLSID":
1367 comPlusComponent.MultiInterfacePublisherFilterCLSID = (string)row[2];
1368 break;
1369 case "MustRunInClientContext":
1370 switch ((string)row[2])
1371 {
1372 case "1":
1373 comPlusComponent.MustRunInClientContext = ComPlus.YesNoType.yes;
1374 break;
1375 case "0":
1376 comPlusComponent.MustRunInClientContext = ComPlus.YesNoType.no;
1377 break;
1378 default:
1379 // TODO: Warning
1380 break;
1381 }
1382 break;
1383 case "MustRunInDefaultContext":
1384 switch ((string)row[2])
1385 {
1386 case "1":
1387 comPlusComponent.MustRunInDefaultContext = ComPlus.YesNoType.yes;
1388 break;
1389 case "0":
1390 comPlusComponent.MustRunInDefaultContext = ComPlus.YesNoType.no;
1391 break;
1392 default:
1393 // TODO: Warning
1394 break;
1395 }
1396 break;
1397 case "ObjectPoolingEnabled":
1398 switch ((string)row[2])
1399 {
1400 case "1":
1401 comPlusComponent.ObjectPoolingEnabled = ComPlus.YesNoType.yes;
1402 break;
1403 case "0":
1404 comPlusComponent.ObjectPoolingEnabled = ComPlus.YesNoType.no;
1405 break;
1406 default:
1407 // TODO: Warning
1408 break;
1409 }
1410 break;
1411 case "PublisherID":
1412 comPlusComponent.PublisherID = (string)row[2];
1413 break;
1414 case "SoapAssemblyName":
1415 comPlusComponent.SoapAssemblyName = (string)row[2];
1416 break;
1417 case "SoapTypeName":
1418 comPlusComponent.SoapTypeName = (string)row[2];
1419 break;
1420 case "Synchronization":
1421 switch ((string)row[2])
1422 {
1423 case "0":
1424 comPlusComponent.Synchronization = ComPlus.ComPlusComponent.SynchronizationType.ignored;
1425 break;
1426 case "1":
1427 comPlusComponent.Synchronization = ComPlus.ComPlusComponent.SynchronizationType.none;
1428 break;
1429 case "2":
1430 comPlusComponent.Synchronization = ComPlus.ComPlusComponent.SynchronizationType.supported;
1431 break;
1432 case "3":
1433 comPlusComponent.Synchronization = ComPlus.ComPlusComponent.SynchronizationType.required;
1434 break;
1435 case "4":
1436 comPlusComponent.Synchronization = ComPlus.ComPlusComponent.SynchronizationType.requiresNew;
1437 break;
1438 default:
1439 // TODO: Warning
1440 break;
1441 }
1442 break;
1443 case "Transaction":
1444 switch ((string)row[2])
1445 {
1446 case "0":
1447 comPlusComponent.Transaction = ComPlus.ComPlusComponent.TransactionType.ignored;
1448 break;
1449 case "1":
1450 comPlusComponent.Transaction = ComPlus.ComPlusComponent.TransactionType.none;
1451 break;
1452 case "2":
1453 comPlusComponent.Transaction = ComPlus.ComPlusComponent.TransactionType.supported;
1454 break;
1455 case "3":
1456 comPlusComponent.Transaction = ComPlus.ComPlusComponent.TransactionType.required;
1457 break;
1458 case "4":
1459 comPlusComponent.Transaction = ComPlus.ComPlusComponent.TransactionType.requiresNew;
1460 break;
1461 default:
1462 // TODO: Warning
1463 break;
1464 }
1465 break;
1466 case "TxIsolationLevel":
1467 switch ((string)row[2])
1468 {
1469 case "0":
1470 comPlusComponent.TxIsolationLevel = ComPlus.ComPlusComponent.TxIsolationLevelType.any;
1471 break;
1472 case "1":
1473 comPlusComponent.TxIsolationLevel = ComPlus.ComPlusComponent.TxIsolationLevelType.readUnCommitted;
1474 break;
1475 case "2":
1476 comPlusComponent.TxIsolationLevel = ComPlus.ComPlusComponent.TxIsolationLevelType.readCommitted;
1477 break;
1478 case "3":
1479 comPlusComponent.TxIsolationLevel = ComPlus.ComPlusComponent.TxIsolationLevelType.repeatableRead;
1480 break;
1481 case "4":
1482 comPlusComponent.TxIsolationLevel = ComPlus.ComPlusComponent.TxIsolationLevelType.serializable;
1483 break;
1484 default:
1485 // TODO: Warning
1486 break;
1487 }
1488 break;
1489 default:
1490 // TODO: Warning
1491 break;
1492 }
1493 }
1494 }
1495
1496 /// <summary>
1497 /// Decompile the ComPlusRoleForComponent table.
1498 /// </summary>
1499 /// <param name="table">The table to decompile.</param>
1500 private void DecompileComPlusRoleForComponentTable(Table table)
1501 {
1502 foreach (Row row in table.Rows)
1503 {
1504 ComPlus.ComPlusRoleForComponent roleForComponent = new ComPlus.ComPlusRoleForComponent();
1505
1506 roleForComponent.Id = (string)row[0];
1507 roleForComponent.Component = (string)row[1];
1508 roleForComponent.ApplicationRole = (string)row[2];
1509
1510 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[3]);
1511 if (null != component)
1512 {
1513 component.AddChild(roleForComponent);
1514 }
1515 else
1516 {
1517 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[3], "Component"));
1518 }
1519 }
1520 }
1521
1522 /// <summary>
1523 /// Decompile the ComPlusInterface table.
1524 /// </summary>
1525 /// <param name="table">The table to decompile.</param>
1526 private void DecompileComPlusInterfaceTable(Table table)
1527 {
1528 foreach (Row row in table.Rows)
1529 {
1530 ComPlus.ComPlusInterface comPlusInterface = new ComPlus.ComPlusInterface();
1531
1532 comPlusInterface.Id = (string)row[0];
1533
1534 try
1535 {
1536 Guid iid = new Guid((string)row[2]);
1537 comPlusInterface.IID = iid.ToString().ToUpper();
1538 }
1539 catch
1540 {
1541 // TODO: Warning
1542 }
1543
1544 ComPlus.ComPlusComponent comPlusComponent = (ComPlus.ComPlusComponent)this.Core.GetIndexedElement("ComPlusComponent", (string)row[1]);
1545 if (null != comPlusComponent)
1546 {
1547 comPlusComponent.AddChild(comPlusInterface);
1548 }
1549 else
1550 {
1551 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "ComPlusComponent_", (string)row[1], "ComPlusComponent"));
1552 }
1553 this.Core.IndexElement(row, comPlusInterface);
1554 }
1555 }
1556
1557 /// <summary>
1558 /// Decompile the ComPlusInterfaceProperty table.
1559 /// </summary>
1560 /// <param name="table">The table to decompile.</param>
1561 private void DecompileComPlusInterfacePropertyTable(Table table)
1562 {
1563 foreach (Row row in table.Rows)
1564 {
1565 ComPlus.ComPlusInterface comPlusInterface = (ComPlus.ComPlusInterface)this.Core.GetIndexedElement("ComPlusInterface", (string)row[0]);
1566 if (null == comPlusInterface)
1567 {
1568 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Interface_", (string)row[0], "ComPlusInterface"));
1569 }
1570
1571 switch ((string)row[1])
1572 {
1573 case "Description":
1574 comPlusInterface.Description = (string)row[2];
1575 break;
1576 case "QueuingEnabled":
1577 switch ((string)row[2])
1578 {
1579 case "1":
1580 comPlusInterface.QueuingEnabled = ComPlus.YesNoType.yes;
1581 break;
1582 case "0":
1583 comPlusInterface.QueuingEnabled = ComPlus.YesNoType.no;
1584 break;
1585 default:
1586 // TODO: Warning
1587 break;
1588 }
1589 break;
1590 default:
1591 // TODO: Warning
1592 break;
1593 }
1594 }
1595 }
1596
1597 /// <summary>
1598 /// Decompile the ComPlusRoleForInterface table.
1599 /// </summary>
1600 /// <param name="table">The table to decompile.</param>
1601 private void DecompileComPlusRoleForInterfaceTable(Table table)
1602 {
1603 foreach (Row row in table.Rows)
1604 {
1605 ComPlus.ComPlusRoleForInterface roleForInterface = new ComPlus.ComPlusRoleForInterface();
1606
1607 roleForInterface.Id = (string)row[0];
1608 roleForInterface.Interface = (string)row[1];
1609 roleForInterface.ApplicationRole = (string)row[2];
1610
1611 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[3]);
1612 if (null != component)
1613 {
1614 component.AddChild(roleForInterface);
1615 }
1616 else
1617 {
1618 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[3], "Component"));
1619 }
1620 }
1621 }
1622
1623 /// <summary>
1624 /// Decompile the ComPlusMethod table.
1625 /// </summary>
1626 /// <param name="table">The table to decompile.</param>
1627 private void DecompileComPlusMethodTable(Table table)
1628 {
1629 foreach (Row row in table.Rows)
1630 {
1631 ComPlus.ComPlusMethod comPlusMethod = new ComPlus.ComPlusMethod();
1632
1633 comPlusMethod.Id = (string)row[0];
1634
1635 if (null != row[2])
1636 {
1637 comPlusMethod.Index = (int)row[2];
1638 }
1639
1640 if (null != row[3])
1641 {
1642 comPlusMethod.Name = (string)row[3];
1643 }
1644
1645 ComPlus.ComPlusInterface comPlusInterface = (ComPlus.ComPlusInterface)this.Core.GetIndexedElement("ComPlusInterface", (string)row[1]);
1646 if (null != comPlusInterface)
1647 {
1648 comPlusInterface.AddChild(comPlusMethod);
1649 }
1650 else
1651 {
1652 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Interface_", (string)row[1], "ComPlusInterface"));
1653 }
1654 this.Core.IndexElement(row, comPlusMethod);
1655 }
1656 }
1657
1658 /// <summary>
1659 /// Decompile the ComPlusMethodProperty table.
1660 /// </summary>
1661 /// <param name="table">The table to decompile.</param>
1662 private void DecompileComPlusMethodPropertyTable(Table table)
1663 {
1664 foreach (Row row in table.Rows)
1665 {
1666 ComPlus.ComPlusMethod comPlusMethod = (ComPlus.ComPlusMethod)this.Core.GetIndexedElement("ComPlusMethod", (string)row[0]);
1667 if (null == comPlusMethod)
1668 {
1669 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Method_", (string)row[0], "ComPlusMethod"));
1670 }
1671
1672 switch ((string)row[1])
1673 {
1674 case "AutoComplete":
1675 switch ((string)row[2])
1676 {
1677 case "1":
1678 comPlusMethod.AutoComplete = ComPlus.YesNoType.yes;
1679 break;
1680 case "0":
1681 comPlusMethod.AutoComplete = ComPlus.YesNoType.no;
1682 break;
1683 default:
1684 // TODO: Warning
1685 break;
1686 }
1687 break;
1688 case "Description":
1689 comPlusMethod.Description = (string)row[2];
1690 break;
1691 default:
1692 // TODO: Warning
1693 break;
1694 }
1695 }
1696 }
1697
1698 /// <summary>
1699 /// Decompile the ComPlusRoleForMethod table.
1700 /// </summary>
1701 /// <param name="table">The table to decompile.</param>
1702 private void DecompileComPlusRoleForMethodTable(Table table)
1703 {
1704 foreach (Row row in table.Rows)
1705 {
1706 ComPlus.ComPlusRoleForMethod roleForMethod = new ComPlus.ComPlusRoleForMethod();
1707
1708 roleForMethod.Id = (string)row[0];
1709 roleForMethod.Method = (string)row[1];
1710 roleForMethod.ApplicationRole = (string)row[2];
1711
1712 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[3]);
1713 if (null != component)
1714 {
1715 component.AddChild(roleForMethod);
1716 }
1717 else
1718 {
1719 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[3], "Component"));
1720 }
1721 }
1722 }
1723
1724 /// <summary>
1725 /// Decompile the ComPlusSubscription table.
1726 /// </summary>
1727 /// <param name="table">The table to decompile.</param>
1728 private void DecompileComPlusSubscriptionTable(Table table)
1729 {
1730 foreach (Row row in table.Rows)
1731 {
1732 ComPlus.ComPlusSubscription subscription = new ComPlus.ComPlusSubscription();
1733
1734 subscription.Id = (string)row[0];
1735 subscription.Component = (string)row[1];
1736 subscription.SubscriptionId = (string)row[3];
1737 subscription.Name = (string)row[4];
1738 subscription.EventCLSID = (string)row[5];
1739 subscription.PublisherID = (string)row[6];
1740
1741 Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[2]);
1742 if (null != component)
1743 {
1744 component.AddChild(subscription);
1745 }
1746 else
1747 {
1748 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[2], "Component"));
1749 }
1750 this.Core.IndexElement(row, subscription);
1751 }
1752 }
1753
1754 /// <summary>
1755 /// Decompile the ComPlusSubscriptionProperty table.
1756 /// </summary>
1757 /// <param name="table">The table to decompile.</param>
1758 private void DecompileComPlusSubscriptionPropertyTable(Table table)
1759 {
1760 foreach (Row row in table.Rows)
1761 {
1762 ComPlus.ComPlusSubscription subscription = (ComPlus.ComPlusSubscription)this.Core.GetIndexedElement("ComPlusSubscription", (string)row[0]);
1763 if (null == subscription)
1764 {
1765 this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Subscription_", (string)row[0], "ComPlusSubscription"));
1766 }
1767
1768 switch ((string)row[1])
1769 {
1770 case "Description":
1771 subscription.Description = (string)row[2];
1772 break;
1773 case "Enabled":
1774 switch ((string)row[2])
1775 {
1776 case "1":
1777 subscription.Enabled = ComPlus.YesNoType.yes;
1778 break;
1779 case "0":
1780 subscription.Enabled = ComPlus.YesNoType.no;
1781 break;
1782 default:
1783 // TODO: Warning
1784 break;
1785 }
1786 break;
1787 case "EventClassPartitionID":
1788 subscription.EventClassPartitionID = (string)row[2];
1789 break;
1790 case "FilterCriteria":
1791 subscription.FilterCriteria = (string)row[2];
1792 break;
1793 case "InterfaceID":
1794 subscription.InterfaceID = (string)row[2];
1795 break;
1796 case "MachineName":
1797 subscription.MachineName = (string)row[2];
1798 break;
1799 case "MethodName":
1800 subscription.MethodName = (string)row[2];
1801 break;
1802 case "PerUser":
1803 switch ((string)row[2])
1804 {
1805 case "1":
1806 subscription.PerUser = ComPlus.YesNoType.yes;
1807 break;
1808 case "0":
1809 subscription.PerUser = ComPlus.YesNoType.no;
1810 break;
1811 default:
1812 // TODO: Warning
1813 break;
1814 }
1815 break;
1816 case "Queued":
1817 switch ((string)row[2])
1818 {
1819 case "1":
1820 subscription.Queued = ComPlus.YesNoType.yes;
1821 break;
1822 case "0":
1823 subscription.Queued = ComPlus.YesNoType.no;
1824 break;
1825 default:
1826 // TODO: Warning
1827 break;
1828 }
1829 break;
1830 case "SubscriberMoniker":
1831 subscription.SubscriberMoniker = (string)row[2];
1832 break;
1833 case "UserName":
1834 subscription.UserName = (string)row[2];
1835 break;
1836 default:
1837 // TODO: Warning
1838 break;
1839 }
1840 }
1841 }
1842 }
1843}
diff --git a/src/wixext/ComPlusExtensionData.cs b/src/wixext/ComPlusExtensionData.cs
new file mode 100644
index 00000000..cedc2474
--- /dev/null
+++ b/src/wixext/ComPlusExtensionData.cs
@@ -0,0 +1,64 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Extensions
4{
5 using System;
6 using System.Reflection;
7 using WixToolset.Data;
8 using WixToolset.Extensibility;
9
10 /// <summary>
11 /// The WiX Toolset COM+ Extension.
12 /// </summary>
13 public sealed class ComPlusExtensionData : ExtensionData
14 {
15 /// <summary>
16 /// Gets the default culture.
17 /// </summary>
18 /// <value>The default culture.</value>
19 public override string DefaultCulture
20 {
21 get { return "en-us"; }
22 }
23
24 /// <summary>
25 /// Gets the optional table definitions for this extension.
26 /// </summary>
27 /// <value>The optional table definitions for this extension.</value>
28 public override TableDefinitionCollection TableDefinitions
29 {
30 get
31 {
32 return ComPlusExtensionData.GetExtensionTableDefinitions();
33 }
34 }
35
36 /// <summary>
37 /// Gets the library associated with this extension.
38 /// </summary>
39 /// <param name="tableDefinitions">The table definitions to use while loading the library.</param>
40 /// <returns>The loaded library.</returns>
41 public override Library GetLibrary(TableDefinitionCollection tableDefinitions)
42 {
43 return ComPlusExtensionData.GetExtensionLibrary(tableDefinitions);
44 }
45
46 /// <summary>
47 /// Internal mechanism to access the extension's table definitions.
48 /// </summary>
49 /// <returns>Extension's table definitions.</returns>
50 internal static TableDefinitionCollection GetExtensionTableDefinitions()
51 {
52 return ExtensionData.LoadTableDefinitionHelper(Assembly.GetExecutingAssembly(), "WixToolset.Extensions.Data.tables.xml");
53 }
54
55 /// <summary>
56 /// Internal mechanism to access the extension's library.
57 /// </summary>
58 /// <returns>Extension's library.</returns>
59 internal static Library GetExtensionLibrary(TableDefinitionCollection tableDefinitions)
60 {
61 return ExtensionData.LoadLibraryHelper(Assembly.GetExecutingAssembly(), "WixToolset.Extensions.Data.complus.wixlib", tableDefinitions);
62 }
63 }
64}
diff --git a/src/wixext/WixComPlusExtension.csproj b/src/wixext/WixComPlusExtension.csproj
new file mode 100644
index 00000000..92cbacae
--- /dev/null
+++ b/src/wixext/WixComPlusExtension.csproj
@@ -0,0 +1,50 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
6 <PropertyGroup>
7 <ProjectGuid>{1497B777-330B-4CFE-927A-22850CD24D64}</ProjectGuid>
8 <AssemblyName>WixComPlusExtension</AssemblyName>
9 <OutputType>Library</OutputType>
10 <RootNamespace>WixToolset.Extensions</RootNamespace>
11 </PropertyGroup>
12 <ItemGroup>
13 <Compile Include="AssemblyInfo.cs" />
14 <Compile Include="ComPlusCompiler.cs" />
15 <Compile Include="ComPlusDecompiler.cs" />
16 <Compile Include="ComPlusExtensionData.cs" />
17 <MsgGenSource Include="Data\messages.xml">
18 <ResourcesLogicalName>$(RootNamespace).Data.Messages.resources</ResourcesLogicalName>
19 </MsgGenSource>
20 <EmbeddedFlattenedResource Include="Data\tables.xml">
21 <LogicalName>$(RootNamespace).Data.tables.xml</LogicalName>
22 </EmbeddedFlattenedResource>
23 <EmbeddedFlattenedResource Include="Xsd\complus.xsd">
24 <LogicalName>$(RootNamespace).Xsd.complus.xsd</LogicalName>
25 </EmbeddedFlattenedResource>
26 <XsdGenSource Include="Xsd\complus.xsd">
27 <CommonNamespace>WixToolset.Data.Serialize</CommonNamespace>
28 <Namespace>WixToolset.Extensions.Serialize.ComPlus</Namespace>
29 </XsdGenSource>
30 <None Include="Xsd\complus.xsd">
31 <Link>complus.xsd</Link>
32 <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
33 </None>
34 <EmbeddedResource Include="$(OutputPath)\complus.wixlib">
35 <Link>Data\complus.wixlib</Link>
36 </EmbeddedResource>
37 </ItemGroup>
38 <ItemGroup>
39 <Reference Include="System" />
40 <Reference Include="System.Xml" />
41 <Reference Include="System.Xml.Linq" />
42 <ProjectReference Include="..\..\..\libs\WixToolset.Data\WixToolset.Data.csproj" />
43 <ProjectReference Include="..\..\..\libs\WixToolset.Extensibility\WixToolset.Extensibility.csproj" />
44 <ProjectReference Include="..\..\..\tools\wix\Wix.csproj" />
45 <ProjectReference Include="..\wixlib\ComPlusExtension.wixproj">
46 <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
47 </ProjectReference>
48 </ItemGroup>
49 <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildProjectDirectory), wix.proj))\tools\WixBuild.targets" />
50</Project>
diff --git a/src/wixext/complus.xsd b/src/wixext/complus.xsd
new file mode 100644
index 00000000..f7ddacc6
--- /dev/null
+++ b/src/wixext/complus.xsd
@@ -0,0 +1,944 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<xs:schema xmlns:html="http://www.w3.org/1999/xhtml"
6 xmlns:wix="http://wixtoolset.org/schemas/v4/wxs"
7 xmlns:xs="http://www.w3.org/2001/XMLSchema"
8 xmlns:xse=" http://wixtoolset.org/schemas/XmlSchemaExtension"
9 targetNamespace="http://wixtoolset.org/schemas/v4/wxs/complus"
10 xmlns="http://wixtoolset.org/schemas/v4/wxs/complus">
11 <xs:annotation>
12 <xs:documentation>
13 The source code schema for the WiX Toolset COM+ Extension.
14 </xs:documentation>
15 </xs:annotation>
16
17 <xs:import namespace="http://wixtoolset.org/schemas/v4/wxs" />
18
19 <xs:element name="ComPlusPartition">
20 <xs:annotation>
21 <xs:appinfo>
22 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Component" />
23 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Fragment" />
24 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Module" />
25 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Product" />
26 </xs:appinfo>
27 <xs:documentation>
28 Defines a COM+ partition. If this element is a child of a
29 Component element, the partition will be created in association with this
30 component. If the element is a child of any of the Fragment, Module or Product
31 elements it is considered to be a locater, referencing an existing partition.
32 </xs:documentation>
33 </xs:annotation>
34 <xs:complexType>
35 <xs:sequence>
36 <xs:choice minOccurs="0" maxOccurs="unbounded">
37 <xs:element ref="ComPlusPartitionRole" />
38 <xs:element ref="ComPlusPartitionUser" />
39 <xs:element ref="ComPlusApplication" />
40 </xs:choice>
41 </xs:sequence>
42 <xs:attribute name="Id" use="required" type="xs:string">
43 <xs:annotation><xs:documentation>
44 Identifier for the element.
45 </xs:documentation></xs:annotation>
46 </xs:attribute>
47 <xs:attribute name="PartitionId" use="optional" type="xs:string">
48 <xs:annotation><xs:documentation>
49 Id for the partition. This attribute can be omitted, in
50 which case an id will be generated on install. If the element is a locater,
51 this attribute can be omitted if a value is provided for the Name attribute.
52 </xs:documentation></xs:annotation>
53 </xs:attribute>
54 <xs:attribute name="Name" use="optional" type="xs:string">
55 <xs:annotation><xs:documentation>
56 Name of the partition. This attribute can be omitted if
57 the element is a locater, and a value is provided for the PartitionId
58 attribute.
59 </xs:documentation></xs:annotation>
60 </xs:attribute>
61 <xs:attribute name="Changeable" use="optional" type="YesNoType" />
62 <xs:attribute name="Deleteable" use="optional" type="YesNoType" />
63 <xs:attribute name="Description" use="optional" type="xs:string" />
64 </xs:complexType>
65 </xs:element>
66
67 <xs:element name="ComPlusPartitionRole">
68 <xs:annotation>
69 <xs:appinfo>
70 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Component" />
71 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Fragment" />
72 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Module" />
73 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Product" />
74 </xs:appinfo>
75 <xs:documentation>
76 Defines a COM+ partition role. Partition roles can not be
77 created; this element can only be used as a locater to reference an existing
78 role.
79 </xs:documentation>
80 </xs:annotation>
81 <xs:complexType>
82 <xs:sequence>
83 <xs:choice minOccurs="0" maxOccurs="unbounded">
84 <xs:element ref="ComPlusUserInPartitionRole" />
85 <xs:element ref="ComPlusGroupInPartitionRole" />
86 </xs:choice>
87 </xs:sequence>
88 <xs:attribute name="Id" use="required" type="xs:string">
89 <xs:annotation><xs:documentation>
90 Identifier for the element.
91 </xs:documentation></xs:annotation>
92 </xs:attribute>
93 <xs:attribute name="Partition" use="optional" type="xs:string">
94 <xs:annotation><xs:documentation>
95 The id of a ComPlusPartition element representing the partition
96 the role belongs to.
97 </xs:documentation></xs:annotation>
98 </xs:attribute>
99 <xs:attribute name="Name" use="required" type="xs:string">
100 <xs:annotation><xs:documentation>
101 Name of the partition role.
102 </xs:documentation></xs:annotation>
103 </xs:attribute>
104 </xs:complexType>
105 </xs:element>
106
107 <xs:element name="ComPlusUserInPartitionRole">
108 <xs:annotation>
109 <xs:appinfo>
110 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Component" />
111 </xs:appinfo>
112 <xs:documentation>
113 This element represents a user membership in a partition
114 role. When the parent component of this element is installed, the user will be
115 added to the associated partition role.
116 </xs:documentation>
117 </xs:annotation>
118 <xs:complexType>
119 <xs:attribute name="Id" use="required" type="xs:string">
120 <xs:annotation><xs:documentation>
121 Identifier for the element.
122 </xs:documentation></xs:annotation>
123 </xs:attribute>
124 <xs:attribute name="PartitionRole" use="optional" type="xs:string">
125 <xs:annotation><xs:documentation>
126 The id of a ComPlusPartitionRole element representing the
127 partition the user should be added to.
128 </xs:documentation></xs:annotation>
129 </xs:attribute>
130 <xs:attribute name="User" use="required" type="xs:string">
131 <xs:annotation><xs:documentation>
132 Foreign key into the User table.
133 </xs:documentation></xs:annotation>
134 </xs:attribute>
135 </xs:complexType>
136 </xs:element>
137
138 <xs:element name="ComPlusGroupInPartitionRole">
139 <xs:annotation>
140 <xs:appinfo>
141 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Component" />
142 </xs:appinfo>
143 <xs:documentation>
144 This element represents a security group membership in a
145 partition role. When the parent component of this element is installed, the
146 security group will be added to the associated partition role.
147 </xs:documentation>
148 </xs:annotation>
149 <xs:complexType>
150 <xs:attribute name="Id" use="required" type="xs:string">
151 <xs:annotation><xs:documentation>
152 Identifier for the element.
153 </xs:documentation></xs:annotation>
154 </xs:attribute>
155 <xs:attribute name="PartitionRole" use="optional" type="xs:string">
156 <xs:annotation><xs:documentation>
157 The id of a ComPlusPartitionRole element representing the
158 partition the user should be added to.
159 </xs:documentation></xs:annotation>
160 </xs:attribute>
161 <xs:attribute name="Group" use="required" type="xs:string">
162 <xs:annotation><xs:documentation>
163 Foreign key into the Group table.
164 </xs:documentation></xs:annotation>
165 </xs:attribute>
166 </xs:complexType>
167 </xs:element>
168
169 <xs:element name="ComPlusPartitionUser">
170 <xs:annotation>
171 <xs:appinfo>
172 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Component" />
173 </xs:appinfo>
174 <xs:documentation>
175 Represents a default partition definition for a user. When
176 the parent component of this element is installed, the default partition of the
177 user will be set to the referenced partition.
178 </xs:documentation>
179 </xs:annotation>
180 <xs:complexType>
181 <xs:attribute name="Id" use="required" type="xs:string">
182 <xs:annotation><xs:documentation>
183 Identifier for the element.
184 </xs:documentation></xs:annotation>
185 </xs:attribute>
186 <xs:attribute name="Partition" use="optional" type="xs:string">
187 <xs:annotation><xs:documentation>
188 The id of a ComPlusPartition element representing the
189 partition that will be the default partition for the user.
190 </xs:documentation></xs:annotation>
191 </xs:attribute>
192 <xs:attribute name="User" use="required" type="xs:string">
193 <xs:annotation><xs:documentation>
194 Foreign key into the User table.
195 </xs:documentation></xs:annotation>
196 </xs:attribute>
197 </xs:complexType>
198 </xs:element>
199
200 <xs:element name="ComPlusApplication">
201 <xs:annotation>
202 <xs:appinfo>
203 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Component" />
204 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Fragment" />
205 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Module" />
206 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Product" />
207 </xs:appinfo>
208 <xs:documentation>
209 Defines a COM+ application. If this element is a descendent
210 of a Component element, the application will be created in association with
211 this component. If the element is a child of any of the Fragment, Module or
212 Product elements it is considered to be a locater, referencing an existing
213 application.
214
215 If the element is a child of a ComPlusPartition element,
216 or have its Partition attribute set, the application will be installed under
217 the referenced partition.
218 </xs:documentation>
219 </xs:annotation>
220 <xs:complexType>
221 <xs:sequence>
222 <xs:choice minOccurs="0" maxOccurs="unbounded">
223 <xs:element ref="ComPlusApplicationRole" />
224 <xs:element ref="ComPlusAssembly" />
225 </xs:choice>
226 </xs:sequence>
227 <xs:attribute name="Id" use="required" type="xs:string">
228 <xs:annotation><xs:documentation>
229 Identifier for the element.
230 </xs:documentation></xs:annotation>
231 </xs:attribute>
232 <xs:attribute name="Partition" use="optional" type="xs:string">
233 <xs:annotation><xs:documentation>
234 If the element is not a child of a ComPlusPartition
235 element, this attribute can be provided with the id of a ComPlusPartition
236 element representing the partition the application belongs to.
237 </xs:documentation></xs:annotation>
238 </xs:attribute>
239 <xs:attribute name="ApplicationId" use="optional" type="xs:string">
240 <xs:annotation><xs:documentation>
241 Id for the application. This attribute can be omitted, in
242 which case an id will be generated on install. If the element is a locater,
243 this attribute can be omitted if a value is provided for the Name attribute.
244 </xs:documentation></xs:annotation>
245 </xs:attribute>
246 <xs:attribute name="Name" use="optional" type="xs:string">
247 <xs:annotation><xs:documentation>
248 Name of the application. This attribute can be omitted if
249 the element is a locater, and a value is provided for the PartitionId
250 attribute.
251 </xs:documentation></xs:annotation>
252 </xs:attribute>
253 <xs:attribute name="ThreeGigSupportEnabled" use="optional" type="YesNoType" />
254 <xs:attribute name="AccessChecksLevel" use="optional">
255 <xs:simpleType>
256 <xs:restriction base="xs:NMTOKEN">
257 <xs:enumeration value="applicationLevel" />
258 <xs:enumeration value="applicationComponentLevel" />
259 </xs:restriction>
260 </xs:simpleType>
261 </xs:attribute>
262 <xs:attribute name="Activation" use="optional">
263 <xs:simpleType>
264 <xs:restriction base="xs:NMTOKEN">
265 <xs:enumeration value="inproc" />
266 <xs:enumeration value="local" />
267 </xs:restriction>
268 </xs:simpleType>
269 </xs:attribute>
270 <xs:attribute name="ApplicationAccessChecksEnabled" use="optional" type="YesNoType" />
271 <xs:attribute name="ApplicationDirectory" use="optional" type="xs:string" />
272 <xs:attribute name="Authentication" use="optional">
273 <xs:simpleType>
274 <xs:restriction base="xs:NMTOKEN">
275 <xs:enumeration value="default" />
276 <xs:enumeration value="none" />
277 <xs:enumeration value="connect" />
278 <xs:enumeration value="call" />
279 <xs:enumeration value="packet" />
280 <xs:enumeration value="integrity" />
281 <xs:enumeration value="privacy" />
282 </xs:restriction>
283 </xs:simpleType>
284 </xs:attribute>
285 <xs:attribute name="AuthenticationCapability" use="optional">
286 <xs:simpleType>
287 <xs:restriction base="xs:NMTOKEN">
288 <xs:enumeration value="none" />
289 <xs:enumeration value="secureReference" />
290 <xs:enumeration value="staticCloaking" />
291 <xs:enumeration value="dynamicCloaking" />
292 </xs:restriction>
293 </xs:simpleType>
294 </xs:attribute>
295 <xs:attribute name="Changeable" use="optional" type="YesNoType" />
296 <xs:attribute name="CommandLine" use="optional" type="xs:string" />
297 <xs:attribute name="ConcurrentApps" use="optional" type="xs:int" />
298 <xs:attribute name="CreatedBy" use="optional" type="xs:string" />
299 <xs:attribute name="CRMEnabled" use="optional" type="YesNoType" />
300 <xs:attribute name="CRMLogFile" use="optional" type="xs:string" />
301 <xs:attribute name="Deleteable" use="optional" type="YesNoType" />
302 <xs:attribute name="Description" use="optional" type="xs:string" />
303 <xs:attribute name="DumpEnabled" use="optional" type="YesNoType" />
304 <xs:attribute name="DumpOnException" use="optional" type="YesNoType" />
305 <xs:attribute name="DumpOnFailfast" use="optional" type="YesNoType" />
306 <xs:attribute name="DumpPath" use="optional" type="xs:string" />
307 <xs:attribute name="EventsEnabled" use="optional" type="YesNoType" />
308 <xs:attribute name="Identity" use="optional" type="xs:string" />
309 <xs:attribute name="ImpersonationLevel" use="optional">
310 <xs:simpleType>
311 <xs:restriction base="xs:NMTOKEN">
312 <xs:enumeration value="anonymous" />
313 <xs:enumeration value="identify" />
314 <xs:enumeration value="impersonate" />
315 <xs:enumeration value="delegate" />
316 </xs:restriction>
317 </xs:simpleType>
318 </xs:attribute>
319 <xs:attribute name="IsEnabled" use="optional" type="YesNoType" />
320 <xs:attribute name="MaxDumpCount" use="optional" type="xs:int" />
321 <xs:attribute name="Password" use="optional" type="xs:string" />
322 <xs:attribute name="QCAuthenticateMsgs" use="optional">
323 <xs:simpleType>
324 <xs:restriction base="xs:NMTOKEN">
325 <xs:enumeration value="secureApps" />
326 <xs:enumeration value="off" />
327 <xs:enumeration value="on" />
328 </xs:restriction>
329 </xs:simpleType>
330 </xs:attribute>
331 <xs:attribute name="QCListenerMaxThreads" use="optional" type="xs:int" />
332 <xs:attribute name="QueueListenerEnabled" use="optional" type="YesNoType" />
333 <xs:attribute name="QueuingEnabled" use="optional" type="YesNoType" />
334 <xs:attribute name="RecycleActivationLimit" use="optional" type="xs:int" />
335 <xs:attribute name="RecycleCallLimit" use="optional" type="xs:int" />
336 <xs:attribute name="RecycleExpirationTimeout" use="optional" type="xs:int" />
337 <xs:attribute name="RecycleLifetimeLimit" use="optional" type="xs:int" />
338 <xs:attribute name="RecycleMemoryLimit" use="optional" type="xs:int" />
339 <xs:attribute name="Replicable" use="optional" type="YesNoType" />
340 <xs:attribute name="RunForever" use="optional" type="YesNoType" />
341 <xs:attribute name="ShutdownAfter" use="optional" type="xs:int" />
342 <xs:attribute name="SoapActivated" use="optional" type="YesNoType" />
343 <xs:attribute name="SoapBaseUrl" use="optional" type="xs:string" />
344 <xs:attribute name="SoapMailTo" use="optional" type="xs:string" />
345 <xs:attribute name="SoapVRoot" use="optional" type="xs:string" />
346 <xs:attribute name="SRPEnabled" use="optional" type="YesNoType" />
347 <xs:attribute name="SRPTrustLevel" use="optional">
348 <xs:simpleType>
349 <xs:restriction base="xs:NMTOKEN">
350 <xs:enumeration value="disallowed" />
351 <xs:enumeration value="fullyTrusted" />
352 </xs:restriction>
353 </xs:simpleType>
354 </xs:attribute>
355 </xs:complexType>
356 </xs:element>
357
358 <xs:element name="ComPlusApplicationRole">
359 <xs:annotation>
360 <xs:appinfo>
361 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Component" />
362 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Fragment" />
363 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Module" />
364 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Product" />
365 </xs:appinfo>
366 <xs:documentation>
367 Defines an application role. If this element is a descendent
368 of a Component element, the application role will be created in association
369 with this component. If the element is a child of any of the Fragment, Module
370 or Product elements it is considered to be a locater, referencing an existing
371 application role.
372 </xs:documentation>
373 </xs:annotation>
374 <xs:complexType>
375 <xs:sequence>
376 <xs:choice minOccurs="0" maxOccurs="unbounded">
377 <xs:element ref="ComPlusUserInApplicationRole" />
378 <xs:element ref="ComPlusGroupInApplicationRole" />
379 </xs:choice>
380 </xs:sequence>
381 <xs:attribute name="Id" use="required" type="xs:string">
382 <xs:annotation><xs:documentation>
383 Identifier for the element.
384 </xs:documentation></xs:annotation>
385 </xs:attribute>
386 <xs:attribute name="Application" use="optional" type="xs:string">
387 <xs:annotation><xs:documentation>
388 If the element is not a child of a ComPlusApplication
389 element, this attribute should be provided with the id of a
390 ComPlusApplication element representing the application the role belongs to.
391 </xs:documentation></xs:annotation>
392 </xs:attribute>
393 <xs:attribute name="Name" use="required" type="xs:string">
394 <xs:annotation><xs:documentation>
395 Name of the application role.
396 </xs:documentation></xs:annotation>
397 </xs:attribute>
398 <xs:attribute name="Description" use="optional" type="xs:string" />
399 </xs:complexType>
400 </xs:element>
401
402 <xs:element name="ComPlusUserInApplicationRole">
403 <xs:annotation>
404 <xs:appinfo>
405 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Component" />
406 </xs:appinfo>
407 <xs:documentation>
408 This element represents a user membership in an
409 application role. When the parent component of this element is installed, the
410 user will be added to the associated application role. This element must be a descendent
411 of a Component element; it can not be a child of a ComPlusApplicationRole
412 locater element. To reference a locater element use the ApplicationRole
413 attribute.
414 </xs:documentation>
415 </xs:annotation>
416 <xs:complexType>
417 <xs:attribute name="Id" use="required" type="xs:string">
418 <xs:annotation><xs:documentation>
419 Identifier for the element.
420 </xs:documentation></xs:annotation>
421 </xs:attribute>
422 <xs:attribute name="ApplicationRole" use="optional" type="xs:string">
423 <xs:annotation><xs:documentation>
424 If the element is not a child of a ComPlusApplicationRole
425 element, this attribute should be provided with the id of a
426 ComPlusApplicationRole element representing the application role the user is
427 to be added to.
428 </xs:documentation></xs:annotation>
429 </xs:attribute>
430 <xs:attribute name="User" use="required" type="xs:string">
431 <xs:annotation><xs:documentation>
432 Foreign key into the User table.
433 </xs:documentation></xs:annotation>
434 </xs:attribute>
435 </xs:complexType>
436 </xs:element>
437
438 <xs:element name="ComPlusGroupInApplicationRole">
439 <xs:annotation>
440 <xs:appinfo>
441 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Component" />
442 </xs:appinfo>
443 <xs:documentation>
444 This element represents a security group membership in an
445 application role. When the parent component of this element is installed, the
446 user will be added to the associated application role. This element must be a
447 descendent of a Component element; it can not be a child of a
448 ComPlusApplicationRole locater element. To reference a locater element use the
449 ApplicationRole attribute.
450 </xs:documentation>
451 </xs:annotation>
452 <xs:complexType>
453 <xs:attribute name="Id" use="required" type="xs:string">
454 <xs:annotation><xs:documentation>
455 Identifier for the element.
456 </xs:documentation></xs:annotation>
457 </xs:attribute>
458 <xs:attribute name="ApplicationRole" use="optional" type="xs:string">
459 <xs:annotation><xs:documentation>
460 If the element is not a child of a ComPlusApplicationRole
461 element, this attribute should be provided with the id of a
462 ComPlusApplicationRole element representing the application role the user is
463 to be added to.
464 </xs:documentation></xs:annotation>
465 </xs:attribute>
466 <xs:attribute name="Group" use="required" type="xs:string">
467 <xs:annotation><xs:documentation>
468 Foreign key into the Group table.
469 </xs:documentation></xs:annotation>
470 </xs:attribute>
471 </xs:complexType>
472 </xs:element>
473
474 <xs:element name="ComPlusAssembly">
475 <xs:annotation>
476 <xs:documentation>
477 Represents a DLL or assembly to be registered with COM+. If
478 this element is a child of a ComPlusApplication element, the assembly will be
479 registered in this application. Other ways the Application attribute must be
480 set to an application. The element must be a descendent of a Component element,
481 it can not be a child of a ComPlusApplication locator element.
482 </xs:documentation>
483 <xs:appinfo>
484 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Component" />
485 <xse:remarks>
486 <html:p>
487 When installing a native assembly, all components
488 contained in the assembly must be represented as ComPlusComponent elements
489 under this element. Any component not listed will not be removed during
490 uninstall.
491 </html:p>
492
493 <html:p>
494 The fields DllPath, TlbPath and PSDllPath are formatted
495 fields that should contain file paths to there respective file types. A typical
496 value for DllPath for example, should be something like “[#MyAssembly_dll]”,
497 where “MyAssembly_dll” is the key of the dll file in the File table.
498 </html:p>
499
500 <html:p>
501 <html:b>Warning</html:b>: The assembly name provided in the AssemblyName
502 attribute must be a fully specified assembly name, if a partial name is
503 provided a random assembly matching the partial name will be selected.
504 </html:p>
505 </xse:remarks>
506 </xs:appinfo>
507 </xs:annotation>
508 <xs:complexType>
509 <xs:sequence>
510 <xs:choice minOccurs="0" maxOccurs="unbounded">
511 <xs:element ref="ComPlusAssemblyDependency" />
512 <xs:element ref="ComPlusComponent" />
513 </xs:choice>
514 </xs:sequence>
515 <xs:attribute name="Id" use="required" type="xs:string">
516 <xs:annotation><xs:documentation>
517 Identifier for the element.
518 </xs:documentation></xs:annotation>
519 </xs:attribute>
520 <xs:attribute name="Application" use="optional" type="xs:string">
521 <xs:annotation><xs:documentation>
522 If the element is not a child of a ComPlusApplication
523 element, this attribute should be provided with the id of a ComPlusApplication
524 element representing the application the assembly is to be registered in.
525 This attribute can be omitted for a .NET assembly even if the application is
526 not a child of a ComPlusApplication element.
527 </xs:documentation></xs:annotation>
528 </xs:attribute>
529 <xs:attribute name="AssemblyName" use="optional" type="xs:string">
530 <xs:annotation><xs:documentation>
531 The name of the assembly used to identify the assembly in
532 the GAC. This attribute can be provided only if DllPathFromGAC is set to
533 “yes”.
534 </xs:documentation></xs:annotation>
535 </xs:attribute>
536 <xs:attribute name="DllPath" use="optional" type="xs:string">
537 <xs:annotation><xs:documentation>
538 The path to locate the assembly DLL during registration.
539 This attribute should be provided if DllPathFromGAC is not set to “yes”.
540 </xs:documentation></xs:annotation>
541 </xs:attribute>
542 <xs:attribute name="TlbPath" use="optional" type="xs:string">
543 <xs:annotation><xs:documentation>
544 An optional path to an external type lib for the assembly.
545 This attribute must be provided if the Type attribute is set to “.net”.
546 </xs:documentation></xs:annotation>
547 </xs:attribute>
548 <xs:attribute name="PSDllPath" use="optional" type="xs:string">
549 <xs:annotation><xs:documentation>
550 An optional path to an external proxy/stub DLL for the assembly.
551 </xs:documentation></xs:annotation>
552 </xs:attribute>
553 <xs:attribute name="Type" use="required">
554 <xs:annotation><xs:documentation>
555 </xs:documentation></xs:annotation>
556 <xs:simpleType>
557 <xs:restriction base="xs:NMTOKEN">
558 <xs:enumeration value="native" />
559 <xs:enumeration value=".net" />
560 </xs:restriction>
561 </xs:simpleType>
562 </xs:attribute>
563 <xs:attribute name="EventClass" use="optional" type="YesNoType">
564 <xs:annotation><xs:documentation>
565 Indicates that the assembly is to be installed as an event
566 class DLL. This attribute is only valid for native assemblies. The assembly
567 will be installed with the COM+ catalog’s InstallEventClass() function.
568 </xs:documentation></xs:annotation>
569 </xs:attribute>
570 <xs:attribute name="DllPathFromGAC" use="optional" type="YesNoType">
571 <xs:annotation><xs:documentation>
572 Indicates that the DLL path should be extracted from the
573 GAC instead for being provided in the DllPath attribute. If this attribute is
574 set to “yes”, the name of the assembly can be provided using the AssemblyName
575 attribute. Or, if this AssemblyName attribute is missing, the name will be
576 extracted from the MsiAssemblyName table using the id of the parent Component
577 element.
578 </xs:documentation></xs:annotation>
579 </xs:attribute>
580 <xs:attribute name="RegisterInCommit" use="optional" type="YesNoType">
581 <xs:annotation><xs:documentation>
582 Indicates that the assembly should be installed in the
583 commit custom action instead of the normal deferred custom action. This is
584 necessary when installing .NET assemblies to the GAC in the same
585 installation, as the assemblies are not visible in the GAC until after the
586 InstallFinalize action has run.
587 </xs:documentation></xs:annotation>
588 </xs:attribute>
589 </xs:complexType>
590 </xs:element>
591
592 <xs:element name="ComPlusAssemblyDependency">
593 <xs:annotation>
594 <xs:documentation>
595 Defines a dependency between two assemblies. This element
596 affects the order in which assembles are registered. Any assemblies referenced
597 by this element are guarantied to be registered before, and unregistered after,
598 the assembly referenced by the parent ComPlusAssembly element.
599 </xs:documentation>
600 <xs:appinfo>
601 <xse:remarks>
602 It is only necessary to explicitly specify dependencies between
603 assemblies contained in the same package (MSI or MSM). Assemblies merged in to a
604 package from a merge module will always be installed before any assemblies
605 specified in the base package. Assemblies merged in from different merge
606 modules are sequenced using the ModuleDependency MSI table. It is not possible
607 to have cross dependencies between merge modules or have an assembly in a merge
608 module depend on an assembly in the base package.
609 </xse:remarks>
610 </xs:appinfo>
611 </xs:annotation>
612 <xs:complexType>
613 <xs:attribute name="RequiredAssembly" use="required" type="xs:string">
614 <xs:annotation><xs:documentation>
615 Reference to the id of the assembly required by the parent
616 ComPlusAssembly element.
617 </xs:documentation></xs:annotation>
618 </xs:attribute>
619 </xs:complexType>
620 </xs:element>
621
622 <xs:element name="ComPlusComponent">
623 <xs:annotation><xs:documentation>
624 Represents a COM+ component in an assembly.
625 </xs:documentation></xs:annotation>
626 <xs:complexType>
627 <xs:sequence>
628 <xs:choice minOccurs="0" maxOccurs="unbounded">
629 <xs:element ref="ComPlusRoleForComponent" />
630 <xs:element ref="ComPlusInterface" />
631 <xs:element ref="ComPlusSubscription" />
632 </xs:choice>
633 </xs:sequence>
634 <xs:attribute name="Id" use="required" type="xs:string">
635 <xs:annotation><xs:documentation>
636 Identifier for the element.
637 </xs:documentation></xs:annotation>
638 </xs:attribute>
639 <xs:attribute name="CLSID" use="required" type="uuid">
640 <xs:annotation><xs:documentation>
641 CLSID of the component.
642 </xs:documentation></xs:annotation>
643 </xs:attribute>
644 <xs:attribute name="AllowInprocSubscribers" use="optional" type="YesNoType" />
645 <xs:attribute name="ComponentAccessChecksEnabled" use="optional" type="YesNoType" />
646 <xs:attribute name="ComponentTransactionTimeout" use="optional" type="xs:int" />
647 <xs:attribute name="ComponentTransactionTimeoutEnabled" use="optional" type="YesNoType" />
648 <xs:attribute name="COMTIIntrinsics" use="optional" type="YesNoType" />
649 <xs:attribute name="ConstructionEnabled" use="optional" type="YesNoType" />
650 <xs:attribute name="ConstructorString" use="optional" type="xs:string" />
651 <xs:attribute name="CreationTimeout" use="optional" type="xs:int" />
652 <xs:attribute name="Description" use="optional" type="xs:string" />
653 <xs:attribute name="EventTrackingEnabled" use="optional" type="YesNoType" />
654 <xs:attribute name="ExceptionClass" use="optional" type="xs:string" />
655 <xs:attribute name="FireInParallel" use="optional" type="YesNoType" />
656 <xs:attribute name="IISIntrinsics" use="optional" type="YesNoType" />
657 <xs:attribute name="InitializesServerApplication" use="optional" type="YesNoType" />
658 <xs:attribute name="IsEnabled" use="optional" type="YesNoType" />
659 <xs:attribute name="IsPrivateComponent" use="optional" type="YesNoType" />
660 <xs:attribute name="JustInTimeActivation" use="optional" type="YesNoType" />
661 <xs:attribute name="LoadBalancingSupported" use="optional" type="YesNoType" />
662 <xs:attribute name="MaxPoolSize" use="optional" type="xs:int" />
663 <xs:attribute name="MinPoolSize" use="optional" type="xs:int" />
664 <xs:attribute name="MultiInterfacePublisherFilterCLSID" use="optional" type="xs:string" />
665 <xs:attribute name="MustRunInClientContext" use="optional" type="YesNoType" />
666 <xs:attribute name="MustRunInDefaultContext" use="optional" type="YesNoType" />
667 <xs:attribute name="ObjectPoolingEnabled" use="optional" type="YesNoType" />
668 <xs:attribute name="PublisherID" use="optional" type="xs:string" />
669 <xs:attribute name="SoapAssemblyName" use="optional" type="xs:string" />
670 <xs:attribute name="SoapTypeName" use="optional" type="xs:string" />
671 <xs:attribute name="Synchronization" use="optional">
672 <xs:simpleType>
673 <xs:restriction base="xs:NMTOKEN">
674 <xs:enumeration value="ignored" />
675 <xs:enumeration value="none" />
676 <xs:enumeration value="supported" />
677 <xs:enumeration value="required" />
678 <xs:enumeration value="requiresNew" />
679 </xs:restriction>
680 </xs:simpleType>
681 </xs:attribute>
682 <xs:attribute name="Transaction" use="optional">
683 <xs:simpleType>
684 <xs:restriction base="xs:NMTOKEN">
685 <xs:enumeration value="ignored" />
686 <xs:enumeration value="none" />
687 <xs:enumeration value="supported" />
688 <xs:enumeration value="required" />
689 <xs:enumeration value="requiresNew" />
690 </xs:restriction>
691 </xs:simpleType>
692 </xs:attribute>
693 <xs:attribute name="TxIsolationLevel" use="optional">
694 <xs:simpleType>
695 <xs:restriction base="xs:NMTOKEN">
696 <xs:enumeration value="any" />
697 <xs:enumeration value="readUnCommitted" />
698 <xs:enumeration value="readCommitted" />
699 <xs:enumeration value="repeatableRead" />
700 <xs:enumeration value="serializable" />
701 </xs:restriction>
702 </xs:simpleType>
703 </xs:attribute>
704 </xs:complexType>
705 </xs:element>
706
707 <xs:element name="ComPlusRoleForComponent">
708 <xs:annotation>
709 <xs:appinfo>
710 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Component" />
711 </xs:appinfo>
712 <xs:documentation>
713 Represents a role assignment to a COM+ component.
714 </xs:documentation>
715 </xs:annotation>
716 <xs:complexType>
717 <xs:attribute name="Id" use="required" type="xs:string">
718 <xs:annotation><xs:documentation>
719 Identifier for the element.
720 </xs:documentation></xs:annotation>
721 </xs:attribute>
722 <xs:attribute name="Component" use="optional" type="xs:string">
723 <xs:annotation><xs:documentation>
724 If the element is not a child of a ComPlusComponent
725 element, this attribute should be provided with the id of a ComPlusComponent
726 element representing the component the role is to be added to.
727 </xs:documentation></xs:annotation>
728 </xs:attribute>
729 <xs:attribute name="ApplicationRole" use="required" type="xs:string">
730 <xs:annotation><xs:documentation>
731 Id of the ComPlusApplicationRole element representing the
732 role that shall be granted access to the component.
733 </xs:documentation></xs:annotation>
734 </xs:attribute>
735 </xs:complexType>
736 </xs:element>
737
738 <xs:element name="ComPlusInterface">
739 <xs:annotation><xs:documentation>
740 Represents an interface for a COM+ component.
741 </xs:documentation></xs:annotation>
742 <xs:complexType>
743 <xs:sequence>
744 <xs:choice minOccurs="0" maxOccurs="unbounded">
745 <xs:element ref="ComPlusRoleForInterface" />
746 <xs:element ref="ComPlusMethod" />
747 </xs:choice>
748 </xs:sequence>
749 <xs:attribute name="Id" use="required" type="xs:string">
750 <xs:annotation><xs:documentation>
751 Identifier for the element.
752 </xs:documentation></xs:annotation>
753 </xs:attribute>
754 <xs:attribute name="IID" use="required" type="uuid">
755 <xs:annotation><xs:documentation>
756 IID of the interface.
757 </xs:documentation></xs:annotation>
758 </xs:attribute>
759 <xs:attribute name="Description" use="optional" type="xs:string" />
760 <xs:attribute name="QueuingEnabled" use="optional" type="YesNoType" />
761 </xs:complexType>
762 </xs:element>
763
764 <xs:element name="ComPlusRoleForInterface">
765 <xs:annotation>
766 <xs:appinfo>
767 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Component" />
768 </xs:appinfo>
769 <xs:documentation>
770 Represents a role assignment to an interface.
771 </xs:documentation>
772 </xs:annotation>
773 <xs:complexType>
774 <xs:attribute name="Id" use="required" type="xs:string">
775 <xs:annotation><xs:documentation>
776 Identifier for the element.
777 </xs:documentation></xs:annotation>
778 </xs:attribute>
779 <xs:attribute name="Interface" use="optional" type="xs:string">
780 <xs:annotation><xs:documentation>
781 If the element is not a child of a ComPlusInterface
782 element, this attribute should be provided with the id of a ComPlusInterface
783 element representing the interface the role is to be added to.
784 </xs:documentation></xs:annotation>
785 </xs:attribute>
786 <xs:attribute name="ApplicationRole" use="required" type="xs:string">
787 <xs:annotation><xs:documentation>
788 Id of the ComPlusApplicationRole element representing the
789 role that shall be granted access to the interface.
790 </xs:documentation></xs:annotation>
791 </xs:attribute>
792 </xs:complexType>
793 </xs:element>
794
795 <xs:element name="ComPlusMethod">
796 <xs:annotation>
797 <xs:documentation>
798 Represents a method for an interface.
799 </xs:documentation>
800 </xs:annotation>
801 <xs:complexType>
802 <xs:sequence>
803 <xs:element ref="ComPlusRoleForMethod" minOccurs="0" maxOccurs="unbounded" />
804 </xs:sequence>
805 <xs:attribute name="Id" use="required" type="xs:string">
806 <xs:annotation>
807 <xs:documentation>
808 Identifier for the element.
809 </xs:documentation>
810 </xs:annotation>
811 </xs:attribute>
812 <xs:attribute name="Index" use="optional" type="xs:int">
813 <xs:annotation>
814 <xs:documentation>
815 Dispatch id of the method. If this attribute is not set a
816 value must be provided for the Name attribute.
817 </xs:documentation>
818 </xs:annotation>
819 </xs:attribute>
820 <xs:attribute name="Name" use="optional" type="xs:string">
821 <xs:annotation>
822 <xs:documentation>
823 Name of the method. If this attribute is not set a value
824 must be provided for the Index attribute.
825 </xs:documentation>
826 </xs:annotation>
827 </xs:attribute>
828 <xs:attribute name="AutoComplete" use="optional" type="YesNoType" />
829 <xs:attribute name="Description" use="optional" type="xs:string" />
830 </xs:complexType>
831 </xs:element>
832
833 <xs:element name="ComPlusRoleForMethod">
834 <xs:annotation>
835 <xs:appinfo>
836 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Component" />
837 </xs:appinfo>
838 <xs:documentation>
839 Represents a role assignment to a COM+ method.
840 </xs:documentation>
841 </xs:annotation>
842 <xs:complexType>
843 <xs:attribute name="Id" use="required" type="xs:string">
844 <xs:annotation><xs:documentation>
845 Identifier for the element.
846 </xs:documentation></xs:annotation>
847 </xs:attribute>
848 <xs:attribute name="Method" use="optional" type="xs:string">
849 <xs:annotation><xs:documentation>
850 If the element is not a child of a ComPlusMethod element,
851 this attribute should be provided with the id of a ComPlusMethod element
852 representing the method the role is to be added to.
853 </xs:documentation></xs:annotation>
854 </xs:attribute>
855 <xs:attribute name="ApplicationRole" use="required" type="xs:string">
856 <xs:annotation><xs:documentation>
857 Id of the ComPlusApplicationRole element representing the
858 role that shall be granted access to the method.
859 </xs:documentation></xs:annotation>
860 </xs:attribute>
861 </xs:complexType>
862 </xs:element>
863
864 <xs:element name="ComPlusSubscription">
865 <xs:annotation>
866 <xs:appinfo>
867 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Component" />
868 </xs:appinfo>
869 <xs:documentation>
870 Defines an event subscription for a COM+ component.
871 </xs:documentation>
872 </xs:annotation>
873 <xs:complexType>
874 <xs:attribute name="Id" use="required" type="xs:string">
875 <xs:annotation><xs:documentation>
876 Identifier for the element.
877 </xs:documentation></xs:annotation>
878 </xs:attribute>
879 <xs:attribute name="Component" use="optional" type="xs:string">
880 <xs:annotation><xs:documentation>
881 If the element is not a child of a ComPlusComponent
882 element, this attribute should be provided with the id of a ComPlusComponent
883 element representing the component the subscription is to be created for.
884 </xs:documentation></xs:annotation>
885 </xs:attribute>
886 <xs:attribute name="SubscriptionId" use="optional" type="xs:string">
887 <xs:annotation><xs:documentation>
888 Id of the subscription. If a value is not provided for
889 this attribute, an id will be generated during installation.
890 </xs:documentation></xs:annotation>
891 </xs:attribute>
892 <xs:attribute name="Name" use="required" type="xs:string">
893 <xs:annotation><xs:documentation>
894 Name of the subscription.
895 </xs:documentation></xs:annotation>
896 </xs:attribute>
897 <xs:attribute name="EventCLSID" use="optional" type="xs:string">
898 <xs:annotation><xs:documentation>
899 CLSID of the event class for the subscription. If a value
900 for this attribute is not provided, a value for the PublisherID attribute
901 must be provided.
902 </xs:documentation></xs:annotation>
903 </xs:attribute>
904 <xs:attribute name="PublisherID" use="optional" type="xs:string">
905 <xs:annotation><xs:documentation>
906 Publisher id for the subscription. If a value for this
907 attribute is not provided, a value for the EventCLSID attribute must be
908 provided.
909 </xs:documentation></xs:annotation>
910 </xs:attribute>
911 <xs:attribute name="Description" use="optional" type="xs:string" />
912 <xs:attribute name="Enabled" use="optional" type="YesNoType" />
913 <xs:attribute name="EventClassPartitionID" use="optional" type="xs:string" />
914 <xs:attribute name="FilterCriteria" use="optional" type="xs:string" />
915 <xs:attribute name="InterfaceID" use="optional" type="xs:string" />
916 <xs:attribute name="MachineName" use="optional" type="xs:string" />
917 <xs:attribute name="MethodName" use="optional" type="xs:string" />
918 <xs:attribute name="PerUser" use="optional" type="YesNoType" />
919 <xs:attribute name="Queued" use="optional" type="YesNoType" />
920 <xs:attribute name="SubscriberMoniker" use="optional" type="xs:string" />
921 <xs:attribute name="UserName" use="optional" type="xs:string" />
922 </xs:complexType>
923 </xs:element>
924
925 <xs:simpleType name="YesNoType">
926 <xs:annotation>
927 <xs:documentation>Values of this type will either be "yes" or "no".</xs:documentation>
928 </xs:annotation>
929 <xs:restriction base="xs:NMTOKEN">
930 <xs:enumeration value="no" />
931 <xs:enumeration value="yes" />
932 </xs:restriction>
933 </xs:simpleType>
934
935 <xs:simpleType name="uuid">
936 <xs:annotation>
937 <xs:documentation>Values of this type will look like: "01234567-89AB-CDEF-0123-456789ABCDEF".</xs:documentation>
938 </xs:annotation>
939 <xs:restriction base="xs:string">
940 <xs:pattern value="[0-9A-Fa-f]{8}\-?[0-9A-Fa-f]{4}\-?[0-9A-Fa-f]{4}\-?[0-9A-Fa-f]{4}\-?[0-9A-Fa-f]{12}" />
941 </xs:restriction>
942 </xs:simpleType>
943
944</xs:schema>
diff --git a/src/wixext/messages.xml b/src/wixext/messages.xml
new file mode 100644
index 00000000..66c0a9e6
--- /dev/null
+++ b/src/wixext/messages.xml
@@ -0,0 +1,77 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<Messages Namespace="WixToolset.Extensions" Resources="Data.Messages" xmlns="http://schemas.microsoft.com/genmsgs/2004/07/messages">
6 <Class Name="ComPlusErrors" ContainerName="ComPlusErrorEventArgs" BaseContainerName="MessageEventArgs">
7 <Message Id="IllegalAttributeWithoutComponent" Number="6000">
8 <Instance>
9 The {0}/@{1} attribute cannot be specified unless the element has a component as an ancestor. A {0} that does not have a component ancestor is not installed.
10 <Parameter Type="System.String" Name="elementName" />
11 <Parameter Type="System.String" Name="attributeName" />
12 </Instance>
13 </Message>
14 <Message Id="IllegalElementWithoutComponent" Number="6001">
15 <Instance>
16 The {0} element cannot be specified unless the element has a component as an ancestor. A {0} that does not have a component ancestor is not installed.
17 <Parameter Type="System.String" Name="elementName" />
18 </Instance>
19 </Message>
20 <Message Id="UnexpectedAttributeWithOtherValue" Number="6002">
21 <Instance>
22 The {0}/@{1} attribute cannot coexist with the {2} attribute's value of '{3}'.
23 <Parameter Type="System.String" Name="elementName" />
24 <Parameter Type="System.String" Name="attributeName" />
25 <Parameter Type="System.String" Name="otherAttributeName" />
26 <Parameter Type="System.String" Name="otherValue" />
27 </Instance>
28 <Instance>
29 The {0}/@{1} attribute's value, '{2}', cannot coexist with the {3} attribute's value of '{4}'.
30 <Parameter Type="System.String" Name="elementName" />
31 <Parameter Type="System.String" Name="attributeName" />
32 <Parameter Type="System.String" Name="value" />
33 <Parameter Type="System.String" Name="otherAttributeName" />
34 <Parameter Type="System.String" Name="otherValue" />
35 </Instance>
36 </Message>
37 <Message Id="UnexpectedAttributeWithoutOtherValue" Number="6003">
38 <Instance>
39 The {0}/@{1} cannot be provided unless the {2} attribute is provided with a value of '{3}'.
40 <Parameter Type="System.String" Name="elementName" />
41 <Parameter Type="System.String" Name="attributeName" />
42 <Parameter Type="System.String" Name="otherAttributeName" />
43 <Parameter Type="System.String" Name="otherValue" />
44 </Instance>
45 </Message>
46 <Message Id="RequiredAttributeUnderComponent" Number="6004">
47 <Instance>
48 The {0}/@{1} attribute must be provided when {0} element is nested under a component.
49 <Parameter Type="System.String" Name="elementName" />
50 <Parameter Type="System.String" Name="attributeName" />
51 </Instance>
52 </Message>
53 <Message Id="RequiredAttribute" Number="6005">
54 <Instance>
55 A {0} element must have either a {1} attribute or a {2} attribute, or both set.
56 <Parameter Type="System.String" Name="elementName" />
57 <Parameter Type="System.String" Name="attributeName1" />
58 <Parameter Type="System.String" Name="attributeName2" />
59 </Instance>
60 </Message>
61 <Message Id="RequiredAttributeNotUnderComponent" Number="6006">
62 <Instance>
63 A {0} element not nested under a component must have either a {1} attribute or a {2} attribute, or both set.
64 <Parameter Type="System.String" Name="elementName" />
65 <Parameter Type="System.String" Name="attributeName1" />
66 <Parameter Type="System.String" Name="attributeName2" />
67 </Instance>
68 </Message>
69 </Class>
70 <Class Name="ComPlusWarnings" ContainerName="ComPlusWarningEventArgs" BaseContainerName="MessageEventArgs">
71 <Message Id="MissingComponents" Number="6007">
72 <Instance>The ComPlusAssembly element has a Type attribute with a value of 'native', but the element does not contain any ComPlusComponent elements. All components contained in a native assembly must be listed, or they will not be correctly removed during uninstall.</Instance>
73 </Message>
74 </Class>
75 <Class Name="ComPlusVerboses" ContainerName="ComPlusVerboseEventArgs" BaseContainerName="MessageEventArgs">
76 </Class>
77</Messages>
diff --git a/src/wixext/tables.xml b/src/wixext/tables.xml
new file mode 100644
index 00000000..3c3d1728
--- /dev/null
+++ b/src/wixext/tables.xml
@@ -0,0 +1,250 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4
5<tableDefinitions xmlns="http://wixtoolset.org/schemas/v4/wi/tables">
6 <tableDefinition name="ComPlusPartition" createSymbols="yes">
7 <columnDefinition name="Partition" type="string" length="72" primaryKey="yes" modularize="column"
8 category="identifier" description=""/>
9 <columnDefinition name="Component_" type="string" length="72" nullable="yes" modularize="column"
10 keyTable="Component" keyColumn="1" category="identifier" description=""/>
11 <columnDefinition name="Id" type="string" length="72" nullable="yes" modularize="property"
12 category="formatted" description=""/>
13 <columnDefinition name="Name" type="string" length="255" nullable="yes" modularize="property"
14 category="formatted" description=""/>
15 </tableDefinition>
16 <tableDefinition name="ComPlusPartitionProperty">
17 <columnDefinition name="Partition_" type="string" length="72" primaryKey="yes" modularize="column"
18 keyTable="ComPlusPartition" keyColumn="1" category="identifier" description=""/>
19 <columnDefinition name="Name" type="string" length="72" primaryKey="yes" modularize="property"
20 category="formatted" description=""/>
21 <columnDefinition name="Value" type="string" length="255" modularize="property"
22 category="formatted" description=""/>
23 </tableDefinition>
24 <tableDefinition name="ComPlusPartitionRole" createSymbols="yes">
25 <columnDefinition name="PartitionRole" type="string" length="72" primaryKey="yes" modularize="column"
26 category="identifier" description=""/>
27 <columnDefinition name="Partition_" type="string" length="72" modularize="column"
28 keyTable="ComPlusPartition" keyColumn="1" category="identifier" description=""/>
29 <columnDefinition name="Component_" type="string" length="72" nullable="yes" modularize="column"
30 keyTable="Component" keyColumn="1" category="identifier" description=""/>
31 <columnDefinition name="Name" type="string" length="255" modularize="property"
32 category="formatted" description=""/>
33 </tableDefinition>
34 <tableDefinition name="ComPlusUserInPartitionRole" createSymbols="yes">
35 <columnDefinition name="UserInPartitionRole" type="string" length="72" primaryKey="yes" modularize="column"
36 category="identifier" description=""/>
37 <columnDefinition name="PartitionRole_" type="string" length="72" modularize="column"
38 keyTable="ComPlusPartitionRole" keyColumn="1" category="identifier" description=""/>
39 <columnDefinition name="Component_" type="string" length="72" modularize="column"
40 keyTable="Component" keyColumn="1" category="identifier" description=""/>
41 <columnDefinition name="User_" type="string" length="72" modularize="column"
42 category="identifier" description=""/>
43 </tableDefinition>
44 <tableDefinition name="ComPlusGroupInPartitionRole" createSymbols="yes">
45 <columnDefinition name="GroupInPartitionRole" type="string" length="72" primaryKey="yes" modularize="column"
46 category="identifier" description=""/>
47 <columnDefinition name="PartitionRole_" type="string" length="72" modularize="column"
48 keyTable="ComPlusPartitionRole" keyColumn="1" category="identifier" description=""/>
49 <columnDefinition name="Component_" type="string" length="72" modularize="column"
50 keyTable="Component" keyColumn="1" category="identifier" description=""/>
51 <columnDefinition name="Group_" type="string" length="72" modularize="column"
52 category="identifier" description=""/>
53 </tableDefinition>
54 <tableDefinition name="ComPlusPartitionUser" createSymbols="yes">
55 <columnDefinition name="PartitionUser" type="string" length="72" primaryKey="yes" modularize="column"
56 category="identifier" description=""/>
57 <columnDefinition name="Partition_" type="string" length="72" modularize="column"
58 keyTable="ComPlusPartition" keyColumn="1" category="identifier" description=""/>
59 <columnDefinition name="Component_" type="string" length="72" modularize="column"
60 keyTable="Component" keyColumn="1" category="identifier" description=""/>
61 <columnDefinition name="User_" type="string" length="72" modularize="column"
62 category="identifier" description=""/>
63 </tableDefinition>
64 <tableDefinition name="ComPlusApplication" createSymbols="yes">
65 <columnDefinition name="Application" type="string" length="72" primaryKey="yes" modularize="column"
66 category="identifier" description=""/>
67 <columnDefinition name="Partition_" type="string" length="72" nullable="yes" modularize="column"
68 keyTable="ComPlusPartition" keyColumn="1" category="identifier" description=""/>
69 <columnDefinition name="Component_" type="string" length="72" nullable="yes" modularize="column"
70 keyTable="Component" keyColumn="1" category="identifier" description=""/>
71 <columnDefinition name="Id" type="string" length="72" nullable="yes" modularize="property"
72 category="formatted" description=""/>
73 <columnDefinition name="Name" type="string" length="255" nullable="yes" modularize="property"
74 category="formatted" description=""/>
75 </tableDefinition>
76 <tableDefinition name="ComPlusApplicationProperty">
77 <columnDefinition name="Application_" type="string" length="72" primaryKey="yes" modularize="column"
78 keyTable="ComPlusApplication" keyColumn="1" category="identifier" description=""/>
79 <columnDefinition name="Name" type="string" length="72" primaryKey="yes" modularize="property"
80 category="formatted" description=""/>
81 <columnDefinition name="Value" type="string" length="255" modularize="property"
82 category="formatted" description=""/>
83 </tableDefinition>
84 <tableDefinition name="ComPlusApplicationRole" createSymbols="yes">
85 <columnDefinition name="ApplicationRole" type="string" length="72" primaryKey="yes" modularize="column"
86 category="identifier" description=""/>
87 <columnDefinition name="Application_" type="string" length="72" modularize="column"
88 keyTable="ComPlusApplication" keyColumn="1" category="identifier" description=""/>
89 <columnDefinition name="Component_" type="string" length="72" nullable="yes" modularize="column"
90 keyTable="Component" keyColumn="1" category="identifier" description=""/>
91 <columnDefinition name="Name" type="string" length="255" modularize="property"
92 category="formatted" description=""/>
93 </tableDefinition>
94 <tableDefinition name="ComPlusApplicationRoleProperty">
95 <columnDefinition name="ApplicationRole_" type="string" length="72" primaryKey="yes" modularize="column"
96 keyTable="ComPlusApplicationRole" keyColumn="1" category="identifier" description=""/>
97 <columnDefinition name="Name" type="string" length="72" primaryKey="yes" modularize="property"
98 category="formatted" description=""/>
99 <columnDefinition name="Value" type="string" length="255" modularize="property"
100 category="formatted" description=""/>
101 </tableDefinition>
102 <tableDefinition name="ComPlusUserInApplicationRole" createSymbols="yes">
103 <columnDefinition name="UserInApplicationRole" type="string" length="72" primaryKey="yes" modularize="column"
104 category="identifier" description=""/>
105 <columnDefinition name="ApplicationRole_" type="string" length="72" modularize="column"
106 keyTable="ComPlusApplicationRole" keyColumn="1" category="identifier" description=""/>
107 <columnDefinition name="Component_" type="string" length="72" modularize="column"
108 keyTable="Component" keyColumn="1" category="identifier" description=""/>
109 <columnDefinition name="User_" type="string" length="72" modularize="column"
110 category="identifier" description=""/>
111 </tableDefinition>
112 <tableDefinition name="ComPlusGroupInApplicationRole" createSymbols="yes">
113 <columnDefinition name="GroupInApplicationRole" type="string" length="72" primaryKey="yes" modularize="column"
114 category="identifier" description=""/>
115 <columnDefinition name="ApplicationRole_" type="string" length="72" modularize="column"
116 keyTable="ComPlusApplicationRole" keyColumn="1" category="identifier" description=""/>
117 <columnDefinition name="Component_" type="string" length="72" modularize="column"
118 keyTable="Component" keyColumn="1" category="identifier" description=""/>
119 <columnDefinition name="Group_" type="string" length="72" modularize="column"
120 category="identifier" description=""/>
121 </tableDefinition>
122 <tableDefinition name="ComPlusAssembly" createSymbols="yes">
123 <columnDefinition name="Assembly" type="string" length="72" primaryKey="yes" modularize="column"
124 category="identifier" description=""/>
125 <columnDefinition name="Application_" type="string" length="72" nullable="yes" modularize="column"
126 keyTable="ComPlusApplication" keyColumn="1" category="identifier" description=""/>
127 <columnDefinition name="Component_" type="string" length="72" modularize="column"
128 keyTable="Component" keyColumn="1" category="identifier" description=""/>
129 <columnDefinition name="AssemblyName" type="string" length="255" nullable="yes" modularize="property"
130 category="formatted" description=""/>
131 <columnDefinition name="DllPath" type="string" length="255" nullable="yes" modularize="property"
132 category="formatted" description=""/>
133 <columnDefinition name="TlbPath" type="string" length="255" nullable="yes" modularize="property"
134 category="formatted" description=""/>
135 <columnDefinition name="PSDllPath" type="string" length="255" nullable="yes" modularize="property"
136 category="formatted" description=""/>
137 <columnDefinition name="Attributes" type="number" length="4"
138 description=""/>
139 </tableDefinition>
140 <tableDefinition name="ComPlusAssemblyDependency">
141 <columnDefinition name="Assembly_" type="string" length="72" primaryKey="yes" modularize="column"
142 keyTable="ComPlusAssembly" keyColumn="1" category="identifier" description=""/>
143 <columnDefinition name="RequiredAssembly_" type="string" length="72" primaryKey="yes" modularize="column"
144 keyTable="ComPlusAssembly" keyColumn="1" category="identifier" description=""/>
145 </tableDefinition>
146 <tableDefinition name="ComPlusComponent" createSymbols="yes">
147 <columnDefinition name="ComPlusComponent" type="string" length="72" primaryKey="yes" modularize="column"
148 category="identifier" description=""/>
149 <columnDefinition name="Assembly_" type="string" length="72" modularize="column"
150 keyTable="ComPlusAssembly" keyColumn="1" category="identifier" description=""/>
151 <columnDefinition name="CLSID" type="string" length="72" modularize="property"
152 category="formatted" description=""/>
153 </tableDefinition>
154 <tableDefinition name="ComPlusComponentProperty">
155 <columnDefinition name="ComPlusComponent_" type="string" length="72" primaryKey="yes" modularize="column"
156 keyTable="ComPlusComponent" keyColumn="1" category="identifier" description=""/>
157 <columnDefinition name="Name" type="string" length="72" primaryKey="yes" modularize="property"
158 category="formatted" description=""/>
159 <columnDefinition name="Value" type="string" length="255" modularize="property"
160 category="formatted" description=""/>
161 </tableDefinition>
162 <tableDefinition name="ComPlusRoleForComponent" createSymbols="yes">
163 <columnDefinition name="RoleForComponent" type="string" length="72" primaryKey="yes" modularize="column"
164 category="identifier" description=""/>
165 <columnDefinition name="ComPlusComponent_" type="string" length="72" modularize="column"
166 keyTable="ComPlusComponent" keyColumn="1" category="identifier" description=""/>
167 <columnDefinition name="ApplicationRole_" type="string" length="72" modularize="column"
168 keyTable="ComPlusApplicationRole" keyColumn="1" category="identifier" description=""/>
169 <columnDefinition name="Component_" type="string" length="72" modularize="column"
170 keyTable="Component" keyColumn="1" category="identifier" description=""/>
171 </tableDefinition>
172 <tableDefinition name="ComPlusInterface" createSymbols="yes">
173 <columnDefinition name="Interface" type="string" length="72" primaryKey="yes" modularize="column"
174 category="identifier" description=""/>
175 <columnDefinition name="ComPlusComponent_" type="string" length="72" modularize="column"
176 keyTable="ComPlusComponent" keyColumn="1" category="identifier" description=""/>
177 <columnDefinition name="IID" type="string" length="72" modularize="property"
178 category="formatted" description=""/>
179 </tableDefinition>
180 <tableDefinition name="ComPlusInterfaceProperty">
181 <columnDefinition name="Interface_" type="string" length="72" primaryKey="yes" modularize="column"
182 keyTable="ComPlusInterface" keyColumn="1" category="identifier" description=""/>
183 <columnDefinition name="Name" type="string" length="72" primaryKey="yes" modularize="property"
184 category="formatted" description=""/>
185 <columnDefinition name="Value" type="string" length="255" modularize="property"
186 category="formatted" description=""/>
187 </tableDefinition>
188 <tableDefinition name="ComPlusRoleForInterface" createSymbols="yes">
189 <columnDefinition name="RoleForInterface" type="string" length="72" primaryKey="yes" modularize="column"
190 category="identifier" description=""/>
191 <columnDefinition name="Interface_" type="string" length="72" modularize="column"
192 keyTable="ComPlusInterface" keyColumn="1" category="identifier" description=""/>
193 <columnDefinition name="ApplicationRole_" type="string" length="72" modularize="column"
194 keyTable="ComPlusApplicationRole" keyColumn="1" category="identifier" description=""/>
195 <columnDefinition name="Component_" type="string" length="72" modularize="column"
196 keyTable="Component" keyColumn="1" category="identifier" description=""/>
197 </tableDefinition>
198 <tableDefinition name="ComPlusMethod" createSymbols="yes">
199 <columnDefinition name="Method" type="string" length="72" primaryKey="yes" modularize="column"
200 category="identifier" description=""/>
201 <columnDefinition name="Interface_" type="string" length="72" modularize="column"
202 keyTable="ComPlusInterface" keyColumn="1" category="identifier" description=""/>
203 <columnDefinition name="Index" type="number" length="4" nullable="yes"
204 description=""/>
205 <columnDefinition name="Name" type="string" length="255" nullable="yes" modularize="property"
206 category="formatted" description=""/>
207 </tableDefinition>
208 <tableDefinition name="ComPlusMethodProperty">
209 <columnDefinition name="Method_" type="string" length="72" primaryKey="yes" modularize="column"
210 keyTable="ComPlusMethod" keyColumn="1" category="identifier" description=""/>
211 <columnDefinition name="Name" type="string" length="72" primaryKey="yes" modularize="property"
212 category="formatted" description=""/>
213 <columnDefinition name="Value" type="string" length="255" modularize="property"
214 category="formatted" description=""/>
215 </tableDefinition>
216 <tableDefinition name="ComPlusRoleForMethod" createSymbols="yes">
217 <columnDefinition name="RoleForMethod" type="string" length="72" primaryKey="yes" modularize="column"
218 category="identifier" description=""/>
219 <columnDefinition name="Method_" type="string" length="72" modularize="column"
220 keyTable="ComPlusMethod" keyColumn="1" category="identifier" description=""/>
221 <columnDefinition name="ApplicationRole_" type="string" length="72" modularize="column"
222 keyTable="ComPlusApplicationRole" keyColumn="1" category="identifier" description=""/>
223 <columnDefinition name="Component_" type="string" length="72" modularize="column"
224 keyTable="Component" keyColumn="1" category="identifier" description=""/>
225 </tableDefinition>
226 <tableDefinition name="ComPlusSubscription" createSymbols="yes">
227 <columnDefinition name="Subscription" type="string" length="72" primaryKey="yes" modularize="column"
228 category="identifier" description=""/>
229 <columnDefinition name="ComPlusComponent_" type="string" length="72" primaryKey="yes" modularize="column"
230 keyTable="ComPlusComponent" keyColumn="1" category="identifier" description=""/>
231 <columnDefinition name="Component_" type="string" length="72" modularize="column"
232 keyTable="Component" keyColumn="1" category="identifier" description=""/>
233 <columnDefinition name="Id" type="string" length="72" nullable="yes" modularize="property"
234 category="formatted" description=""/>
235 <columnDefinition name="Name" type="string" length="255" modularize="property"
236 category="formatted" description=""/>
237 <columnDefinition name="EventCLSID" type="string" length="72" nullable="yes" modularize="property"
238 category="formatted" description=""/>
239 <columnDefinition name="PublisherID" type="string" length="72" nullable="yes" modularize="property"
240 category="formatted" description=""/>
241 </tableDefinition>
242 <tableDefinition name="ComPlusSubscriptionProperty">
243 <columnDefinition name="Subscription_" type="string" length="72" primaryKey="yes" modularize="column"
244 keyTable="ComPlusSubscription" keyColumn="1" category="identifier" description=""/>
245 <columnDefinition name="Name" type="string" length="72" primaryKey="yes" modularize="property"
246 category="formatted" description=""/>
247 <columnDefinition name="Value" type="string" length="255" modularize="property"
248 category="formatted" description=""/>
249 </tableDefinition>
250</tableDefinitions>