// 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. namespace WixToolset.ComPlus { using System; using System.Collections; using System.Collections.Generic; using System.Globalization; using System.Text; using System.Xml.Linq; using WixToolset.Data; using WixToolset.Extensibility; using WixToolset.Extensibility.Data; /// /// The compiler for the WiX Toolset COM+ Extension. /// public sealed class ComPlusCompiler : BaseCompilerExtension { /// /// /// public enum CpiAssemblyAttributes { EventClass = (1 << 0), DotNetAssembly = (1 << 1), DllPathFromGAC = (1 << 2), RegisterInCommit = (1 << 3) } public override XNamespace Namespace => "http://wixtoolset.org/schemas/v4/wxs/complus"; /// /// Processes an element for the Compiler. /// /// Source line number for the parent element. /// Parent element of element to process. /// Element to process. /// Extra information about the context in which this element is being parsed. public override void ParseElement(Intermediate intermediate, IntermediateSection section, XElement parentElement, XElement element, IDictionary context) { switch (parentElement.Name.LocalName) { case "Component": string componentId = context["ComponentId"]; string directoryId = context["DirectoryId"]; bool win64 = Boolean.Parse(context["Win64"]); switch (element.Name.LocalName) { case "ComPlusPartition": this.ParseComPlusPartitionElement(intermediate, section, element, componentId, win64); break; case "ComPlusPartitionRole": this.ParseComPlusPartitionRoleElement(intermediate, section, element, componentId, null); break; case "ComPlusUserInPartitionRole": this.ParseComPlusUserInPartitionRoleElement(intermediate, section, element, componentId, null); break; case "ComPlusGroupInPartitionRole": this.ParseComPlusGroupInPartitionRoleElement(intermediate, section, element, componentId, null); break; case "ComPlusPartitionUser": this.ParseComPlusPartitionUserElement(intermediate, section, element, componentId, null); break; case "ComPlusApplication": this.ParseComPlusApplicationElement(intermediate, section, element, componentId, win64, null); break; case "ComPlusApplicationRole": this.ParseComPlusApplicationRoleElement(intermediate, section, element, componentId, null); break; case "ComPlusUserInApplicationRole": this.ParseComPlusUserInApplicationRoleElement(intermediate, section, element, componentId, null); break; case "ComPlusGroupInApplicationRole": this.ParseComPlusGroupInApplicationRoleElement(intermediate, section, element, componentId, null); break; case "ComPlusAssembly": this.ParseComPlusAssemblyElement(intermediate, section, element, componentId, win64, null); break; case "ComPlusRoleForComponent": this.ParseComPlusRoleForComponentElement(intermediate, section, element, componentId, null); break; case "ComPlusRoleForInterface": this.ParseComPlusRoleForInterfaceElement(intermediate, section, element, componentId, null); break; case "ComPlusRoleForMethod": this.ParseComPlusRoleForMethodElement(intermediate, section, element, componentId, null); break; case "ComPlusSubscription": this.ParseComPlusSubscriptionElement(intermediate, section, element, componentId, null); break; default: this.ParseHelper.UnexpectedElement(parentElement, element); break; } break; case "Fragment": case "Module": case "Product": switch (element.Name.LocalName) { case "ComPlusPartition": this.ParseComPlusPartitionElement(intermediate, section, element, null, false); break; case "ComPlusPartitionRole": this.ParseComPlusPartitionRoleElement(intermediate, section, element, null, null); break; case "ComPlusApplication": this.ParseComPlusApplicationElement(intermediate, section, element, null, false, null); break; case "ComPlusApplicationRole": this.ParseComPlusApplicationRoleElement(intermediate, section, element, null, null); break; default: this.ParseHelper.UnexpectedElement(parentElement, element); break; } break; default: this.ParseHelper.UnexpectedElement(parentElement, element); break; } } /// /// Parses a COM+ partition element. /// /// Element to parse. /// Identifier of parent component. private void ParseComPlusPartitionElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, bool win64) { SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node); string key = null; string id = null; string name = null; Hashtable properties = new Hashtable(); foreach (XAttribute attrib in node.Attributes()) { if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) { switch (attrib.Name.LocalName) { case "Id": key = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); break; case "PartitionId": id = this.TryFormatGuidValue(this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib)); break; case "Name": name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "Changeable": this.Messaging.Write(WarningMessages.DeprecatedAttribute(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); break; case "Deleteable": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["Deleteable"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "Description": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["Description"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; default: this.ParseHelper.UnexpectedAttribute(node, attrib); break; } } else { this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib); } } if (null != componentKey && null == name) { this.Messaging.Write(ComPlusErrors.RequiredAttributeUnderComponent(sourceLineNumbers, node.Name.LocalName, "Name")); } if (null == componentKey && null == id && null == name) { this.Messaging.Write(ComPlusErrors.RequiredAttributeNotUnderComponent(sourceLineNumbers, node.Name.LocalName, "Id", "Name")); } foreach (XElement child in node.Elements()) { if (this.Namespace == child.Name.Namespace) { switch (child.Name.LocalName) { case "ComPlusPartitionRole": this.ParseComPlusPartitionRoleElement(intermediate, section, child, componentKey, key); break; case "ComPlusPartitionUser": this.ParseComPlusPartitionUserElement(intermediate, section, child, componentKey, key); break; case "ComPlusApplication": this.ParseComPlusApplicationElement(intermediate, section, child, componentKey, win64, key); break; default: this.ParseHelper.UnexpectedElement(node, child); break; } } else { this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, node, child); } } var row = this.ParseHelper.CreateRow(section, sourceLineNumbers, "ComPlusPartition"); row.Set(0, key); row.Set(1, componentKey); row.Set(2, id); row.Set(3, name); IDictionaryEnumerator propertiesEnumerator = properties.GetEnumerator(); while (propertiesEnumerator.MoveNext()) { var propertyRow = this.ParseHelper.CreateRow(section, sourceLineNumbers, "ComPlusPartitionProperty"); propertyRow.Set(0, key); propertyRow.Set(1, (string)propertiesEnumerator.Key); propertyRow.Set(2, (string)propertiesEnumerator.Value); } if (componentKey != null) { if (win64) { if (this.Context.Platform == Platform.IA64) { this.Messaging.Write(ErrorMessages.UnsupportedPlatformForElement(sourceLineNumbers, "ia64", node.Name.LocalName)); } else { this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "CustomAction", "ConfigureComPlusInstall_x64"); this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "CustomAction", "ConfigureComPlusUninstall_x64"); } } else { this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "CustomAction", "ConfigureComPlusInstall"); this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "CustomAction", "ConfigureComPlusUninstall"); } } } /// /// Parses a COM+ partition role element. /// /// Element to parse. /// Identifier of parent component. /// Optional identifier of parent application. private void ParseComPlusPartitionRoleElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, string partitionKey) { SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node); string key = null; string name = null; foreach (XAttribute attrib in node.Attributes()) { if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) { switch (attrib.Name.LocalName) { case "Id": key = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); break; case "Partition": if (null != partitionKey) { this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName)); } partitionKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "ComPlusPartition", partitionKey); break; case "Name": name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; default: this.ParseHelper.UnexpectedAttribute(node, attrib); break; } } else { this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib); } } if (null == partitionKey) { this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Partition")); } foreach (XElement child in node.Elements()) { if (this.Namespace == child.Name.Namespace) { switch (child.Name.LocalName) { case "ComPlusUserInPartitionRole": this.ParseComPlusUserInPartitionRoleElement(intermediate, section, child, componentKey, key); break; case "ComPlusGroupInPartitionRole": this.ParseComPlusGroupInPartitionRoleElement(intermediate, section, child, componentKey, key); break; default: this.ParseHelper.UnexpectedElement(node, child); break; } } else { this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, node, child); } } // add table row var row = this.ParseHelper.CreateRow(section, sourceLineNumbers, "ComPlusPartitionRole"); row.Set(0, key); row.Set(1, partitionKey); row.Set(3, name); } /// /// Parses a COM+ partition role user element. /// /// Element to parse. /// Identifier of parent component. /// Optional identifier of parent application role. private void ParseComPlusUserInPartitionRoleElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, string partitionRoleKey) { SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node); string key = null; string user = null; foreach (XAttribute attrib in node.Attributes()) { if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) { switch (attrib.Name.LocalName) { case "Id": key = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); break; case "PartitionRole": if (null != partitionRoleKey) { this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName)); } partitionRoleKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "ComPlusPartitionRole", partitionRoleKey); break; case "User": user = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "User", user); break; default: this.ParseHelper.UnexpectedAttribute(node, attrib); break; } } else { this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib); } } if (null == partitionRoleKey) { this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "PartitionRole")); } var row = this.ParseHelper.CreateRow(section, sourceLineNumbers, "ComPlusUserInPartitionRole"); row.Set(0, key); row.Set(1, partitionRoleKey); row.Set(2, componentKey); row.Set(3, user); } /// /// Parses a COM+ partition role user element. /// /// Element to parse. /// Identifier of parent component. /// Optional identifier of parent application role. private void ParseComPlusGroupInPartitionRoleElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, string partitionRoleKey) { SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node); string key = null; string group = null; foreach (XAttribute attrib in node.Attributes()) { if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) { switch (attrib.Name.LocalName) { case "Id": key = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); break; case "PartitionRole": if (null != partitionRoleKey) { this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName)); } partitionRoleKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "ComPlusPartitionRole", partitionRoleKey); break; case "Group": group = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "Group", group); break; default: this.ParseHelper.UnexpectedAttribute(node, attrib); break; } } else { this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib); } } if (null == partitionRoleKey) { this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "PartitionRole")); } var row = this.ParseHelper.CreateRow(section, sourceLineNumbers, "ComPlusGroupInPartitionRole"); row.Set(0, key); row.Set(1, partitionRoleKey); row.Set(2, componentKey); row.Set(3, group); } /// /// Parses a COM+ partition element. /// /// Element to parse. /// Identifier of parent component. private void ParseComPlusPartitionUserElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, string partitionKey) { SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node); string key = null; string user = null; foreach (XAttribute attrib in node.Attributes()) { if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) { switch (attrib.Name.LocalName) { case "Id": key = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); break; case "Partition": if (null != partitionKey) { this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName)); } partitionKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "ComPlusPartition", partitionKey); break; case "User": user = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "User", user); break; default: this.ParseHelper.UnexpectedAttribute(node, attrib); break; } } else { this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib); } } if (null == partitionKey) { this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Partition")); } var row = this.ParseHelper.CreateRow(section, sourceLineNumbers, "ComPlusPartitionUser"); row.Set(0, key); row.Set(1, partitionKey); row.Set(2, componentKey); row.Set(3, user); } /// /// Parses a COM+ application element. /// /// Element to parse. /// Identifier of parent component. /// Optional identifier of parent partition. private void ParseComPlusApplicationElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, bool win64, string partitionKey) { SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node); string key = null; string id = null; string name = null; Hashtable properties = new Hashtable(); foreach (XAttribute attrib in node.Attributes()) { if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) { switch (attrib.Name.LocalName) { case "Id": key = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); break; case "Partition": if (null != partitionKey) { this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName)); } partitionKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "ComPlusPartition", partitionKey); break; case "ApplicationId": id = this.TryFormatGuidValue(this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib)); break; case "Name": name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "ThreeGigSupportEnabled": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["3GigSupportEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "AccessChecksLevel": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } string accessChecksLevelValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); switch (accessChecksLevelValue) { case "applicationLevel": properties["AccessChecksLevel"] = "0"; break; case "applicationComponentLevel": properties["AccessChecksLevel"] = "1"; break; default: this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, "ComPlusApplication", "AccessChecksLevel", accessChecksLevelValue, "applicationLevel", "applicationComponentLevel")); break; } break; case "Activation": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } string activationValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); switch (activationValue) { case "inproc": properties["Activation"] = "Inproc"; break; case "local": properties["Activation"] = "Local"; break; default: this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, "ComPlusApplication", "Activation", activationValue, "inproc", "local")); break; } break; case "ApplicationAccessChecksEnabled": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["ApplicationAccessChecksEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "ApplicationDirectory": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["ApplicationDirectory"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "Authentication": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } string authenticationValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); switch (authenticationValue) { case "default": properties["Authentication"] = "0"; break; case "none": properties["Authentication"] = "1"; break; case "connect": properties["Authentication"] = "2"; break; case "call": properties["Authentication"] = "3"; break; case "packet": properties["Authentication"] = "4"; break; case "integrity": properties["Authentication"] = "5"; break; case "privacy": properties["Authentication"] = "6"; break; default: this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, "ComPlusApplication", "Authentication", authenticationValue, "default", "none", "connect", "call", "packet", "integrity", "privacy")); break; } break; case "AuthenticationCapability": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } string authenticationCapabilityValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); switch (authenticationCapabilityValue) { case "none": properties["AuthenticationCapability"] = "0"; break; case "secureReference": properties["AuthenticationCapability"] = "2"; break; case "staticCloaking": properties["AuthenticationCapability"] = "32"; break; case "dynamicCloaking": properties["AuthenticationCapability"] = "64"; break; default: this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, "ComPlusApplication", "AuthenticationCapability", authenticationCapabilityValue, "none", "secureReference", "staticCloaking", "dynamicCloaking")); break; } break; case "Changeable": this.Messaging.Write(WarningMessages.DeprecatedAttribute(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); break; case "CommandLine": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["CommandLine"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "ConcurrentApps": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["ConcurrentApps"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "CreatedBy": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["CreatedBy"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "CRMEnabled": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["CRMEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "CRMLogFile": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["CRMLogFile"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "Deleteable": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["Deleteable"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "Description": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["Description"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "DumpEnabled": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["DumpEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "DumpOnException": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["DumpOnException"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "DumpOnFailfast": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["DumpOnFailfast"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "DumpPath": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["DumpPath"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "EventsEnabled": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["EventsEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "Identity": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["Identity"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "ImpersonationLevel": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } string impersonationLevelValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); switch (impersonationLevelValue) { case "anonymous": properties["ImpersonationLevel"] = "1"; break; case "identify": properties["ImpersonationLevel"] = "2"; break; case "impersonate": properties["ImpersonationLevel"] = "3"; break; case "delegate": properties["ImpersonationLevel"] = "4"; break; default: this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, "ComPlusApplication", "ImpersonationLevel", impersonationLevelValue, "anonymous", "identify", "impersonate", "delegate")); break; } break; case "IsEnabled": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["IsEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "MaxDumpCount": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["MaxDumpCount"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "Password": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["Password"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "QCAuthenticateMsgs": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } string qcAuthenticateMsgsValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); switch (qcAuthenticateMsgsValue) { case "secureApps": properties["QCAuthenticateMsgs"] = "0"; break; case "off": properties["QCAuthenticateMsgs"] = "1"; break; case "on": properties["QCAuthenticateMsgs"] = "2"; break; default: this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, "ComPlusApplication", "QCAuthenticateMsgs", qcAuthenticateMsgsValue, "secureApps", "off", "on")); break; } break; case "QCListenerMaxThreads": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["QCListenerMaxThreads"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "QueueListenerEnabled": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["QueueListenerEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "QueuingEnabled": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["QueuingEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "RecycleActivationLimit": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["RecycleActivationLimit"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "RecycleCallLimit": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["RecycleCallLimit"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "RecycleExpirationTimeout": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["RecycleExpirationTimeout"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "RecycleLifetimeLimit": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["RecycleLifetimeLimit"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "RecycleMemoryLimit": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["RecycleMemoryLimit"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "Replicable": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["Replicable"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "RunForever": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["RunForever"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "ShutdownAfter": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["ShutdownAfter"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "SoapActivated": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["SoapActivated"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "SoapBaseUrl": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["SoapBaseUrl"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "SoapMailTo": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["SoapMailTo"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "SoapVRoot": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["SoapVRoot"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "SRPEnabled": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["SRPEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "SRPTrustLevel": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } string srpTrustLevelValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); switch (srpTrustLevelValue) { case "disallowed": properties["SRPTrustLevel"] = "0"; break; case "fullyTrusted": properties["SRPTrustLevel"] = "262144"; break; default: this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, "ComPlusApplication", "SRPTrustLevel", srpTrustLevelValue, "disallowed", "fullyTrusted")); break; } break; default: this.ParseHelper.UnexpectedAttribute(node, attrib); break; } } else { this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib); } } if (null != componentKey && null == name) { this.Messaging.Write(ComPlusErrors.RequiredAttributeUnderComponent(sourceLineNumbers, node.Name.LocalName, "Name")); } if (null == componentKey && null == id && null == name) { this.Messaging.Write(ComPlusErrors.RequiredAttributeNotUnderComponent(sourceLineNumbers, node.Name.LocalName, "Id", "Name")); } foreach (XElement child in node.Elements()) { if (this.Namespace == child.Name.Namespace) { switch (child.Name.LocalName) { case "ComPlusApplicationRole": this.ParseComPlusApplicationRoleElement(intermediate, section, child, componentKey, key); break; case "ComPlusAssembly": this.ParseComPlusAssemblyElement(intermediate, section, child, componentKey, win64, key); break; default: this.ParseHelper.UnexpectedElement(node, child); break; } } else { this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, node, child); } } var row = this.ParseHelper.CreateRow(section, sourceLineNumbers, "ComPlusApplication"); row.Set(0, key); row.Set(1, partitionKey); row.Set(2, componentKey); row.Set(3, id); row.Set(4, name); IDictionaryEnumerator propertiesEnumerator = properties.GetEnumerator(); while (propertiesEnumerator.MoveNext()) { var propertyRow = this.ParseHelper.CreateRow(section, sourceLineNumbers, "ComPlusApplicationProperty"); propertyRow.Set(0, key); propertyRow.Set(1, (string)propertiesEnumerator.Key); propertyRow.Set(2, (string)propertiesEnumerator.Value); } if (componentKey != null) { if (win64) { if (this.Context.Platform == Platform.IA64) { this.Messaging.Write(ErrorMessages.UnsupportedPlatformForElement(sourceLineNumbers, "ia64", node.Name.LocalName)); } else { this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "CustomAction", "ConfigureComPlusInstall_x64"); this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "CustomAction", "ConfigureComPlusUninstall_x64"); } } else { this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "CustomAction", "ConfigureComPlusInstall"); this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "CustomAction", "ConfigureComPlusUninstall"); } } } /// /// Parses a COM+ application role element. /// /// Element to parse. /// Identifier of parent component. /// Optional identifier of parent application. private void ParseComPlusApplicationRoleElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, string applicationKey) { SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node); string key = null; string name = null; Hashtable properties = new Hashtable(); foreach (XAttribute attrib in node.Attributes()) { if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) { switch (attrib.Name.LocalName) { case "Id": key = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); break; case "Application": if (null != applicationKey) { this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName)); } applicationKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "ComPlusApplication", applicationKey); break; case "Name": name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "Description": if (null == componentKey) { this.Messaging.Write(ComPlusErrors.IllegalAttributeWithoutComponent(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName)); } properties["Description"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; default: this.ParseHelper.UnexpectedAttribute(node, attrib); break; } } else { this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib); } } if (null == applicationKey) { this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Application")); } foreach (XElement child in node.Elements()) { if (this.Namespace == child.Name.Namespace) { switch (child.Name.LocalName) { case "ComPlusUserInApplicationRole": this.ParseComPlusUserInApplicationRoleElement(intermediate, section, child, componentKey, key); break; case "ComPlusGroupInApplicationRole": this.ParseComPlusGroupInApplicationRoleElement(intermediate, section, child, componentKey, key); break; default: this.ParseHelper.UnexpectedElement(node, child); break; } } else { this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, node, child); } } var row = this.ParseHelper.CreateRow(section, sourceLineNumbers, "ComPlusApplicationRole"); row.Set(0, key); row.Set(1, applicationKey); row.Set(2, componentKey); row.Set(3, name); IDictionaryEnumerator propertiesEnumerator = properties.GetEnumerator(); while (propertiesEnumerator.MoveNext()) { var propertyRow = this.ParseHelper.CreateRow(section, sourceLineNumbers, "ComPlusApplicationRoleProperty"); propertyRow.Set(0, key); propertyRow.Set(1, (string)propertiesEnumerator.Key); propertyRow.Set(2, (string)propertiesEnumerator.Value); } } /// /// Parses a COM+ application role user element. /// /// Element to parse. /// Identifier of parent component. /// Optional identifier of parent application role. private void ParseComPlusUserInApplicationRoleElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, string applicationRoleKey) { SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node); string key = null; string user = null; foreach (XAttribute attrib in node.Attributes()) { if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) { switch (attrib.Name.LocalName) { case "Id": key = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); break; case "ApplicationRole": if (null != applicationRoleKey) { this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName)); } applicationRoleKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "ComPlusApplicationRole", applicationRoleKey); break; case "User": user = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "User", user); break; default: this.ParseHelper.UnexpectedAttribute(node, attrib); break; } } else { this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib); } } if (null == applicationRoleKey) { this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "ApplicationRole")); } var row = this.ParseHelper.CreateRow(section, sourceLineNumbers, "ComPlusUserInApplicationRole"); row.Set(0, key); row.Set(1, applicationRoleKey); row.Set(2, componentKey); row.Set(3, user); } /// /// Parses a COM+ application role group element. /// /// Element to parse. /// Identifier of parent component. /// Optional identifier of parent application role. private void ParseComPlusGroupInApplicationRoleElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, string applicationRoleKey) { SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node); string key = null; string group = null; foreach (XAttribute attrib in node.Attributes()) { if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) { switch (attrib.Name.LocalName) { case "Id": key = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); break; case "ApplicationRole": if (null != applicationRoleKey) { this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName)); } applicationRoleKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "ComPlusApplicationRole", applicationRoleKey); break; case "Group": group = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "Group", group); break; default: this.ParseHelper.UnexpectedAttribute(node, attrib); break; } } else { this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib); } } if (null == applicationRoleKey) { this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "ApplicationRole")); } var row = this.ParseHelper.CreateRow(section, sourceLineNumbers, "ComPlusGroupInApplicationRole"); row.Set(0, key); row.Set(1, applicationRoleKey); row.Set(2, componentKey); row.Set(3, group); } /// /// Parses a COM+ assembly element. /// /// Element to parse. /// Identifier of parent component. /// Optional identifier of parent application. private void ParseComPlusAssemblyElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, bool win64, string applicationKey) { SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node); string key = null; string assemblyName = null; string dllPath = null; string tlbPath = null; string psDllPath = null; int attributes = 0; bool hasComponents = false; foreach (XAttribute attrib in node.Attributes()) { if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) { switch (attrib.Name.LocalName) { case "Id": key = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); break; case "Application": if (null != applicationKey) { this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName)); } applicationKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "ComPlusApplication", applicationKey); break; case "AssemblyName": assemblyName = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "DllPath": dllPath = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "TlbPath": tlbPath = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "PSDllPath": psDllPath = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "Type": string typeValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); switch (typeValue) { case ".net": attributes |= (int)CpiAssemblyAttributes.DotNetAssembly; break; case "native": attributes &= ~(int)CpiAssemblyAttributes.DotNetAssembly; break; default: this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, "ComPlusAssembly", "Type", typeValue, ".net", "native")); break; } break; case "EventClass": if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib)) { attributes |= (int)CpiAssemblyAttributes.EventClass; } else { attributes &= ~(int)CpiAssemblyAttributes.EventClass; } break; case "DllPathFromGAC": if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib)) { attributes |= (int)CpiAssemblyAttributes.DllPathFromGAC; } else { attributes &= ~(int)CpiAssemblyAttributes.DllPathFromGAC; } break; case "RegisterInCommit": if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib)) { attributes |= (int)CpiAssemblyAttributes.RegisterInCommit; } else { attributes &= ~(int)CpiAssemblyAttributes.RegisterInCommit; } break; default: this.ParseHelper.UnexpectedAttribute(node, attrib); break; } } else { this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib); } } if (null == applicationKey && 0 == (attributes & (int)CpiAssemblyAttributes.DotNetAssembly)) { this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Application", "Type", "native")); } if (null != assemblyName && 0 == (attributes & (int)CpiAssemblyAttributes.DllPathFromGAC)) { this.Messaging.Write(ComPlusErrors.UnexpectedAttributeWithoutOtherValue(sourceLineNumbers, node.Name.LocalName, "AssemblyName", "DllPathFromGAC", "no")); } if (null == tlbPath && 0 != (attributes & (int)CpiAssemblyAttributes.DotNetAssembly)) { this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "TlbPath", "Type", ".net")); } if (null != psDllPath && 0 != (attributes & (int)CpiAssemblyAttributes.DotNetAssembly)) { this.Messaging.Write(ComPlusErrors.UnexpectedAttributeWithOtherValue(sourceLineNumbers, node.Name.LocalName, "PSDllPath", "Type", ".net")); } if (0 != (attributes & (int)CpiAssemblyAttributes.EventClass) && 0 != (attributes & (int)CpiAssemblyAttributes.DotNetAssembly)) { this.Messaging.Write(ComPlusErrors.UnexpectedAttributeWithOtherValue(sourceLineNumbers, node.Name.LocalName, "EventClass", "yes", "Type", ".net")); } foreach (XElement child in node.Elements()) { if (this.Namespace == child.Name.Namespace) { switch (child.Name.LocalName) { case "ComPlusAssemblyDependency": this.ParseComPlusAssemblyDependencyElement(intermediate, section, child, key); break; case "ComPlusComponent": this.ParseComPlusComponentElement(intermediate, section, child, componentKey, key); hasComponents = true; break; default: this.ParseHelper.UnexpectedElement(node, child); break; } } else { this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, node, child); } } if (0 == (attributes & (int)CpiAssemblyAttributes.DotNetAssembly) && !hasComponents) { this.Messaging.Write(ComPlusWarnings.MissingComponents(sourceLineNumbers)); } var row = this.ParseHelper.CreateRow(section, sourceLineNumbers, "ComPlusAssembly"); row.Set(0, key); row.Set(1, applicationKey); row.Set(2, componentKey); row.Set(3, assemblyName); row.Set(4, dllPath); row.Set(5, tlbPath); row.Set(6, psDllPath); row.Set(7, attributes); if (win64) { if (this.Context.Platform == Platform.IA64) { this.Messaging.Write(ErrorMessages.UnsupportedPlatformForElement(sourceLineNumbers, "ia64", node.Name.LocalName)); } else { this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "CustomAction", "ConfigureComPlusInstall_x64"); this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "CustomAction", "ConfigureComPlusUninstall_x64"); } } else { this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "CustomAction", "ConfigureComPlusInstall"); this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "CustomAction", "ConfigureComPlusUninstall"); } } /// /// Parses a COM+ assembly dependency element. /// /// Element to parse. /// Identifier of parent assembly. private void ParseComPlusAssemblyDependencyElement(Intermediate intermediate, IntermediateSection section, XElement node, string assemblyKey) { SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node); string requiredAssemblyKey = null; foreach (XAttribute attrib in node.Attributes()) { if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) { switch (attrib.Name.LocalName) { case "RequiredAssembly": requiredAssemblyKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; default: this.ParseHelper.UnexpectedAttribute(node, attrib); break; } } else { this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib); } } var row = this.ParseHelper.CreateRow(section, sourceLineNumbers, "ComPlusAssemblyDependency"); row.Set(0, assemblyKey); row.Set(1, requiredAssemblyKey); } /// /// Parses a COM+ component element. /// /// Element to parse. /// Identifier of parent component. /// Identifier of parent assembly. private void ParseComPlusComponentElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, string assemblyKey) { SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node); string key = null; string clsid = null; Hashtable properties = new Hashtable(); foreach (XAttribute attrib in node.Attributes()) { if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) { switch (attrib.Name.LocalName) { case "Id": key = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); break; case "CLSID": clsid = "{" + this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib) + "}"; break; case "AllowInprocSubscribers": properties["AllowInprocSubscribers"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "ComponentAccessChecksEnabled": properties["ComponentAccessChecksEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "ComponentTransactionTimeout": properties["ComponentTransactionTimeout"] = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, 3600).ToString(); break; case "ComponentTransactionTimeoutEnabled": properties["ComponentTransactionTimeoutEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "COMTIIntrinsics": properties["COMTIIntrinsics"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "ConstructionEnabled": properties["ConstructionEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "ConstructorString": properties["ConstructorString"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "CreationTimeout": properties["CreationTimeout"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "Description": properties["Description"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "EventTrackingEnabled": properties["EventTrackingEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "ExceptionClass": properties["ExceptionClass"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "FireInParallel": properties["FireInParallel"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "IISIntrinsics": properties["IISIntrinsics"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "InitializesServerApplication": properties["InitializesServerApplication"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "IsEnabled": properties["IsEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "IsPrivateComponent": properties["IsPrivateComponent"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "JustInTimeActivation": properties["JustInTimeActivation"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "LoadBalancingSupported": properties["LoadBalancingSupported"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "MaxPoolSize": properties["MaxPoolSize"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "MinPoolSize": properties["MinPoolSize"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "MultiInterfacePublisherFilterCLSID": properties["MultiInterfacePublisherFilterCLSID"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "MustRunInClientContext": properties["MustRunInClientContext"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "MustRunInDefaultContext": properties["MustRunInDefaultContext"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "ObjectPoolingEnabled": properties["ObjectPoolingEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "PublisherID": properties["PublisherID"] = this.TryFormatGuidValue(this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib)); break; case "SoapAssemblyName": properties["SoapAssemblyName"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "SoapTypeName": properties["SoapTypeName"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "Synchronization": string synchronizationValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); switch (synchronizationValue) { case "ignored": properties["Synchronization"] = "0"; break; case "none": properties["Synchronization"] = "1"; break; case "supported": properties["Synchronization"] = "2"; break; case "required": properties["Synchronization"] = "3"; break; case "requiresNew": properties["Synchronization"] = "4"; break; default: this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, "ComPlusComponent", "Synchronization", synchronizationValue, "ignored", "none", "supported", "required", "requiresNew")); break; } break; case "Transaction": string transactionValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); switch (transactionValue) { case "ignored": properties["Transaction"] = "0"; break; case "none": properties["Transaction"] = "1"; break; case "supported": properties["Transaction"] = "2"; break; case "required": properties["Transaction"] = "3"; break; case "requiresNew": properties["Transaction"] = "4"; break; default: this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, "ComPlusComponent", "Transaction", transactionValue, "ignored", "none", "supported", "required", "requiresNew")); break; } break; case "TxIsolationLevel": string txIsolationLevelValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); switch (txIsolationLevelValue) { case "any": properties["TxIsolationLevel"] = "0"; break; case "readUnCommitted": properties["TxIsolationLevel"] = "1"; break; case "readCommitted": properties["TxIsolationLevel"] = "2"; break; case "repeatableRead": properties["TxIsolationLevel"] = "3"; break; case "serializable": properties["TxIsolationLevel"] = "4"; break; default: this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, "ComPlusComponent", "TxIsolationLevel", txIsolationLevelValue, "any", "readUnCommitted", "readCommitted", "repeatableRead", "serializable")); break; } break; default: this.ParseHelper.UnexpectedAttribute(node, attrib); break; } } else { this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib); } } foreach (XElement child in node.Elements()) { if (this.Namespace == child.Name.Namespace) { switch (child.Name.LocalName) { case "ComPlusRoleForComponent": this.ParseComPlusRoleForComponentElement(intermediate, section, child, componentKey, key); break; case "ComPlusInterface": this.ParseComPlusInterfaceElement(intermediate, section, child, componentKey, key); break; case "ComPlusSubscription": this.ParseComPlusSubscriptionElement(intermediate, section, child, componentKey, key); break; default: this.ParseHelper.UnexpectedElement(node, child); break; } } else { this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, node, child); } } var row = this.ParseHelper.CreateRow(section, sourceLineNumbers, "ComPlusComponent"); row.Set(0, key); row.Set(1, assemblyKey); row.Set(2, clsid); IDictionaryEnumerator propertiesEnumerator = properties.GetEnumerator(); while (propertiesEnumerator.MoveNext()) { var propertyRow = this.ParseHelper.CreateRow(section, sourceLineNumbers, "ComPlusComponentProperty"); propertyRow.Set(0, key); propertyRow.Set(1, (string)propertiesEnumerator.Key); propertyRow.Set(2, (string)propertiesEnumerator.Value); } } /// /// Parses a COM+ application role for component element. /// /// Element to parse. /// Identifier of parent component. /// Identifier of parent COM+ component. private void ParseComPlusRoleForComponentElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, string cpcomponentKey) { SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node); string key = null; string applicationRoleKey = null; foreach (XAttribute attrib in node.Attributes()) { if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) { switch (attrib.Name.LocalName) { case "Id": key = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); break; case "Component": if (null != cpcomponentKey) { this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName)); } cpcomponentKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "ComPlusComponent", cpcomponentKey); break; case "ApplicationRole": applicationRoleKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; default: this.ParseHelper.UnexpectedAttribute(node, attrib); break; } } else { this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib); } } if (null == cpcomponentKey) { this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Component")); } var row = this.ParseHelper.CreateRow(section, sourceLineNumbers, "ComPlusRoleForComponent"); row.Set(0, key); row.Set(1, cpcomponentKey); row.Set(2, applicationRoleKey); row.Set(3, componentKey); } /// /// Parses a COM+ interface element. /// /// Element to parse. /// Identifier of parent component. /// Identifier of parent COM+ component. private void ParseComPlusInterfaceElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, string cpcomponentKey) { SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node); // parse attributes string key = null; string iid = null; Hashtable properties = new Hashtable(); foreach (XAttribute attrib in node.Attributes()) { if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) { switch (attrib.Name.LocalName) { case "Id": key = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); break; case "IID": iid = "{" + this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib) + "}"; break; case "Description": properties["Description"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "QueuingEnabled": properties["QueuingEnabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; default: this.ParseHelper.UnexpectedAttribute(node, attrib); break; } } else { this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib); } } foreach (XElement child in node.Elements()) { if (this.Namespace == child.Name.Namespace) { switch (child.Name.LocalName) { case "ComPlusRoleForInterface": this.ParseComPlusRoleForInterfaceElement(intermediate, section, child, componentKey, key); break; case "ComPlusMethod": this.ParseComPlusMethodElement(intermediate, section, child, componentKey, key); break; default: this.ParseHelper.UnexpectedElement(node, child); break; } } else { this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, node, child); } } var row = this.ParseHelper.CreateRow(section, sourceLineNumbers, "ComPlusInterface"); row.Set(0, key); row.Set(1, cpcomponentKey); row.Set(2, iid); IDictionaryEnumerator propertiesEnumerator = properties.GetEnumerator(); while (propertiesEnumerator.MoveNext()) { var propertyRow = this.ParseHelper.CreateRow(section, sourceLineNumbers, "ComPlusInterfaceProperty"); propertyRow.Set(0, key); propertyRow.Set(1, (string)propertiesEnumerator.Key); propertyRow.Set(2, (string)propertiesEnumerator.Value); } } /// /// Parses a COM+ application role for interface element. /// /// Element to parse. /// Identifier of parent component. /// Identifier of parent interface. private void ParseComPlusRoleForInterfaceElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, string interfaceKey) { SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node); string key = null; string applicationRoleKey = null; foreach (XAttribute attrib in node.Attributes()) { if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) { switch (attrib.Name.LocalName) { case "Id": key = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); break; case "Interface": if (null != interfaceKey) { this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName)); } interfaceKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "ComPlusInterface", interfaceKey); break; case "ApplicationRole": applicationRoleKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; default: this.ParseHelper.UnexpectedAttribute(node, attrib); break; } } else { this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib); } } if (null == interfaceKey) { this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Interface")); } var row = this.ParseHelper.CreateRow(section, sourceLineNumbers, "ComPlusRoleForInterface"); row.Set(0, key); row.Set(1, interfaceKey); row.Set(2, applicationRoleKey); row.Set(3, componentKey); } /// /// Parses a COM+ method element. /// /// Element to parse. /// Identifier of parent component. /// Identifier of parent interface. private void ParseComPlusMethodElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, string interfaceKey) { SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node); string key = null; int index = CompilerConstants.IntegerNotSet; string name = null; Hashtable properties = new Hashtable(); foreach (XAttribute attrib in node.Attributes()) { if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) { switch (attrib.Name.LocalName) { case "Id": key = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); break; case "Index": index = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, int.MaxValue); break; case "Name": name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "AutoComplete": properties["AutoComplete"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "Description": properties["Description"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; default: this.ParseHelper.UnexpectedAttribute(node, attrib); break; } } else { this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib); } } foreach (XElement child in node.Elements()) { if (this.Namespace == child.Name.Namespace) { switch (child.Name.LocalName) { case "ComPlusRoleForMethod": this.ParseComPlusRoleForMethodElement(intermediate, section, child, componentKey, key); break; default: this.ParseHelper.UnexpectedElement(node, child); break; } } else { this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, node, child); } } if (CompilerConstants.IntegerNotSet == index && null == name) { this.Messaging.Write(ComPlusErrors.RequiredAttribute(sourceLineNumbers, node.Name.LocalName, "Index", "Name")); } var row = this.ParseHelper.CreateRow(section, sourceLineNumbers, "ComPlusMethod"); row.Set(0, key); row.Set(1, interfaceKey); if (CompilerConstants.IntegerNotSet != index) { row.Set(2, index); } row.Set(3, name); IDictionaryEnumerator propertiesEnumerator = properties.GetEnumerator(); while (propertiesEnumerator.MoveNext()) { var propertyRow = this.ParseHelper.CreateRow(section, sourceLineNumbers, "ComPlusMethodProperty"); propertyRow.Set(0, key); propertyRow.Set(1, (string)propertiesEnumerator.Key); propertyRow.Set(2, (string)propertiesEnumerator.Value); } } /// /// Parses a COM+ application role for method element. /// /// Element to parse. /// Identifier of parent component. /// Identifier of parent method. private void ParseComPlusRoleForMethodElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, string methodKey) { SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node); string key = null; string applicationRoleKey = null; foreach (XAttribute attrib in node.Attributes()) { if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) { switch (attrib.Name.LocalName) { case "Id": key = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); break; case "Method": if (null != methodKey) { this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName)); } methodKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "ComPlusMethod", methodKey); break; case "ApplicationRole": applicationRoleKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; default: this.ParseHelper.UnexpectedAttribute(node, attrib); break; } } else { this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib); } } if (null == methodKey) { this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Method")); } var row = this.ParseHelper.CreateRow(section, sourceLineNumbers, "ComPlusRoleForMethod"); row.Set(0, key); row.Set(1, methodKey); row.Set(2, applicationRoleKey); row.Set(3, componentKey); } /// /// Parses a COM+ event subscription element. /// /// Element to parse. /// Identifier of parent component. /// Identifier of parent COM+ component. private void ParseComPlusSubscriptionElement(Intermediate intermediate, IntermediateSection section, XElement node, string componentKey, string cpcomponentKey) { SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node); string key = null; string id = null; string name = null; string eventCLSID = null; string publisherID = null; Hashtable properties = new Hashtable(); foreach (XAttribute attrib in node.Attributes()) { if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) { switch (attrib.Name.LocalName) { case "Id": key = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); break; case "Component": if (null != cpcomponentKey) { this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, node.Parent.Name.LocalName)); } cpcomponentKey = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "ComPlusComponent", cpcomponentKey); break; case "SubscriptionId": id = this.TryFormatGuidValue(this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib)); break; case "Name": name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "EventCLSID": eventCLSID = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "PublisherID": publisherID = this.TryFormatGuidValue(this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib)); break; case "Description": properties["Description"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "Enabled": properties["Enabled"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "EventClassPartitionID": properties["EventClassPartitionID"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "FilterCriteria": properties["FilterCriteria"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "InterfaceID": properties["InterfaceID"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "MachineName": properties["MachineName"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "MethodName": properties["MethodName"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "PerUser": properties["PerUser"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "Queued": properties["Queued"] = YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) ? "1" : "0"; break; case "SubscriberMoniker": properties["SubscriberMoniker"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; case "UserName": properties["UserName"] = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; default: this.ParseHelper.UnexpectedAttribute(node, attrib); break; } } else { this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib); } } if (null == cpcomponentKey) { this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Component")); } this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, node); var row = this.ParseHelper.CreateRow(section, sourceLineNumbers, "ComPlusSubscription"); row.Set(0, key); row.Set(1, cpcomponentKey); row.Set(2, componentKey); row.Set(3, id); row.Set(4, name); row.Set(5, eventCLSID); row.Set(6, publisherID); IDictionaryEnumerator propertiesEnumerator = properties.GetEnumerator(); while (propertiesEnumerator.MoveNext()) { var propertyRow = this.ParseHelper.CreateRow(section, sourceLineNumbers, "ComPlusSubscriptionProperty"); propertyRow.Set(0, key); propertyRow.Set(1, (string)propertiesEnumerator.Key); propertyRow.Set(2, (string)propertiesEnumerator.Value); } } /// /// Attempts to parse the input value as a GUID, and in case the value is a valid /// GUID returnes it in the format "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}". /// /// /// string TryFormatGuidValue(string val) { try { Guid guid = new Guid(val); return guid.ToString("B").ToUpper(); } catch (FormatException) { return val; } catch (OverflowException) { return val; } } } }