private void VerifyBAFunctions(IntermediateSection section)
        {
            WixBalBAFunctionsSymbol baFunctionsSymbol = null;

            foreach (var symbol in section.Symbols.OfType <WixBalBAFunctionsSymbol>())
            {
                if (null == baFunctionsSymbol)
                {
                    baFunctionsSymbol = symbol;
                }
                else
                {
                    this.Messaging.Write(BalErrors.MultipleBAFunctions(symbol.SourceLineNumbers));
                }
            }

            var payloadPropertiesSymbols = section.Symbols.OfType <WixBundlePayloadSymbol>().ToList();

            if (null == baFunctionsSymbol)
            {
                foreach (var payloadPropertiesSymbol in payloadPropertiesSymbols)
                {
                    if (string.Equals(payloadPropertiesSymbol.Name, "bafunctions.dll", StringComparison.OrdinalIgnoreCase) &&
                        BurnConstants.BurnUXContainerName == payloadPropertiesSymbol.ContainerRef)
                    {
                        this.Messaging.Write(BalWarnings.UnmarkedBAFunctionsDLL(payloadPropertiesSymbol.SourceLineNumbers));
                    }
                }
            }
            else
            {
                var payloadId           = baFunctionsSymbol.Id;
                var bundlePayloadSymbol = payloadPropertiesSymbols.Single(x => payloadId == x.Id);
                if (BurnConstants.BurnUXContainerName != bundlePayloadSymbol.ContainerRef)
                {
                    this.Messaging.Write(BalErrors.BAFunctionsPayloadRequiredInUXContainer(baFunctionsSymbol.SourceLineNumbers));
                }
            }
        }
        private void VerifyPrereqPackages(IntermediateSection section, bool isDNC)
        {
            var prereqInfoSymbols = section.Symbols.OfType <WixMbaPrereqInformationSymbol>().ToList();

            if (prereqInfoSymbols.Count == 0)
            {
                var message = isDNC ? BalErrors.MissingDNCPrereq() : BalErrors.MissingMBAPrereq();
                this.Messaging.Write(message);
                return;
            }

            var foundLicenseFile = false;
            var foundLicenseUrl  = false;

            foreach (var prereqInfoSymbol in prereqInfoSymbols)
            {
                if (null != prereqInfoSymbol.LicenseFile)
                {
                    if (foundLicenseFile || foundLicenseUrl)
                    {
                        this.Messaging.Write(BalErrors.MultiplePrereqLicenses(prereqInfoSymbol.SourceLineNumbers));
                        return;
                    }

                    foundLicenseFile = true;
                }

                if (null != prereqInfoSymbol.LicenseUrl)
                {
                    if (foundLicenseFile || foundLicenseUrl)
                    {
                        this.Messaging.Write(BalErrors.MultiplePrereqLicenses(prereqInfoSymbol.SourceLineNumbers));
                        return;
                    }

                    foundLicenseUrl = true;
                }
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Processes an attribute for the Compiler.
        /// </summary>
        /// <param name="sourceLineNumbers">Source line number for the parent element.</param>
        /// <param name="parentElement">Parent element of element to process.</param>
        /// <param name="attribute">Attribute to process.</param>
        /// <param name="context">Extra information about the context in which this element is being parsed.</param>
        public override void ParseAttribute(Intermediate intermediate, IntermediateSection section, XElement parentElement, XAttribute attribute, IDictionary <string, string> context)
        {
            var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(parentElement);
            WixMbaPrereqInformationSymbol prereqInfo;

            switch (parentElement.Name.LocalName)
            {
            case "ExePackage":
            case "MsiPackage":
            case "MspPackage":
            case "MsuPackage":
                string packageId;
                if (!context.TryGetValue("PackageId", out packageId) || String.IsNullOrEmpty(packageId))
                {
                    this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, parentElement.Name.LocalName, "Id", attribute.Name.LocalName));
                }
                else
                {
                    switch (attribute.Name.LocalName)
                    {
                    case "DisplayInternalUICondition":
                        switch (parentElement.Name.LocalName)
                        {
                        case "MsiPackage":
                        case "MspPackage":
                            var displayInternalUICondition = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attribute);
                            section.AddSymbol(new WixBalPackageInfoSymbol(sourceLineNumbers, new Identifier(AccessModifier.Public, packageId))
                            {
                                PackageId = packageId,
                                DisplayInternalUICondition = displayInternalUICondition,
                            });
                            break;

                        default:
                            this.ParseHelper.UnexpectedAttribute(parentElement, attribute);
                            break;
                        }
                        break;

                    case "PrereqLicenseFile":

                        if (!this.prereqInfoSymbolsByPackageId.TryGetValue(packageId, out prereqInfo))
                        {
                            // at the time the extension attribute is parsed, the compiler might not yet have
                            // parsed the PrereqPackage attribute, so we need to get it directly from the parent element.
                            var prereqPackage = parentElement.Attribute(this.Namespace + "PrereqPackage");

                            if (null != prereqPackage && YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, prereqPackage))
                            {
                                prereqInfo = section.AddSymbol(new WixMbaPrereqInformationSymbol(sourceLineNumbers)
                                {
                                    PackageId = packageId,
                                });

                                this.prereqInfoSymbolsByPackageId.Add(packageId, prereqInfo);
                            }
                            else
                            {
                                this.Messaging.Write(BalErrors.AttributeRequiresPrereqPackage(sourceLineNumbers, parentElement.Name.LocalName, "PrereqLicenseFile"));
                                break;
                            }
                        }

                        if (null != prereqInfo.LicenseUrl)
                        {
                            this.Messaging.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(sourceLineNumbers, parentElement.Name.LocalName, "PrereqLicenseFile", "PrereqLicenseUrl"));
                        }
                        else
                        {
                            prereqInfo.LicenseFile = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attribute);
                        }
                        break;

                    case "PrereqLicenseUrl":

                        if (!this.prereqInfoSymbolsByPackageId.TryGetValue(packageId, out prereqInfo))
                        {
                            // at the time the extension attribute is parsed, the compiler might not yet have
                            // parsed the PrereqPackage attribute, so we need to get it directly from the parent element.
                            var prereqPackage = parentElement.Attribute(this.Namespace + "PrereqPackage");

                            if (null != prereqPackage && YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, prereqPackage))
                            {
                                prereqInfo = section.AddSymbol(new WixMbaPrereqInformationSymbol(sourceLineNumbers)
                                {
                                    PackageId = packageId,
                                });

                                this.prereqInfoSymbolsByPackageId.Add(packageId, prereqInfo);
                            }
                            else
                            {
                                this.Messaging.Write(BalErrors.AttributeRequiresPrereqPackage(sourceLineNumbers, parentElement.Name.LocalName, "PrereqLicenseUrl"));
                                break;
                            }
                        }

                        if (null != prereqInfo.LicenseFile)
                        {
                            this.Messaging.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(sourceLineNumbers, parentElement.Name.LocalName, "PrereqLicenseUrl", "PrereqLicenseFile"));
                        }
                        else
                        {
                            prereqInfo.LicenseUrl = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attribute);
                        }
                        break;

                    case "PrereqPackage":
                        if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attribute))
                        {
                            if (!this.prereqInfoSymbolsByPackageId.TryGetValue(packageId, out prereqInfo))
                            {
                                prereqInfo = section.AddSymbol(new WixMbaPrereqInformationSymbol(sourceLineNumbers)
                                {
                                    PackageId = packageId,
                                });

                                this.prereqInfoSymbolsByPackageId.Add(packageId, prereqInfo);
                            }
                        }
                        break;

                    default:
                        this.ParseHelper.UnexpectedAttribute(parentElement, attribute);
                        break;
                    }
                }
                break;

            case "Payload":
                string payloadId;
                if (!context.TryGetValue("Id", out payloadId) || String.IsNullOrEmpty(payloadId))
                {
                    this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, parentElement.Name.LocalName, "Id", attribute.Name.LocalName));
                }
                else
                {
                    switch (attribute.Name.LocalName)
                    {
                    case "BAFactoryAssembly":
                        if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attribute))
                        {
                            // There can only be one.
                            var id = new Identifier(AccessModifier.Public, "TheBAFactoryAssembly");
                            section.AddSymbol(new WixBalBAFactoryAssemblySymbol(sourceLineNumbers, id)
                            {
                                PayloadId = payloadId,
                            });
                        }
                        break;

                    case "BAFunctions":
                        if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attribute))
                        {
                            section.AddSymbol(new WixBalBAFunctionsSymbol(sourceLineNumbers)
                            {
                                PayloadId = payloadId,
                            });
                        }
                        break;

                    default:
                        this.ParseHelper.UnexpectedAttribute(parentElement, attribute);
                        break;
                    }
                }
                break;

            case "Variable":
                // at the time the extension attribute is parsed, the compiler might not yet have
                // parsed the Name attribute, so we need to get it directly from the parent element.
                var variableName = parentElement.Attribute("Name");
                if (null == variableName)
                {
                    this.Messaging.Write(ErrorMessages.ExpectedParentWithAttribute(sourceLineNumbers, "Variable", "Overridable", "Name"));
                }
                else
                {
                    switch (attribute.Name.LocalName)
                    {
                    case "Overridable":
                        if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attribute))
                        {
                            section.AddSymbol(new WixStdbaOverridableVariableSymbol(sourceLineNumbers)
                            {
                                Name = variableName.Value,
                            });
                        }
                        break;

                    default:
                        this.ParseHelper.UnexpectedAttribute(parentElement, attribute);
                        break;
                    }
                }
                break;
            }
        }