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; } } }
/// <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; } }