// 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.Mba.Core { using System; using System.Collections.Generic; using System.IO; using System.Xml; using System.Xml.XPath; /// /// Default implementation of . /// public class BundleInfo : IBundleInfo { /// public bool PerMachine { get; internal set; } /// public string Name { get; internal set; } /// public string LogVariable { get; internal set; } /// public IOverridableVariables OverridableVariables { get; internal set; } /// public IDictionary Packages { get; internal set; } internal BundleInfo() { this.Packages = new Dictionary(); } /// public IPackageInfo AddRelatedBundleAsPackage(DetectRelatedBundleEventArgs e) { var package = PackageInfo.GetRelatedBundleAsPackage(e.ProductCode, e.RelationType, e.PerMachine, e.Version); this.Packages.Add(package.Id, package); return package; } /// public IPackageInfo AddUpdateBundleAsPackage(SetUpdateCompleteEventArgs e) { var package = PackageInfo.GetUpdateBundleAsPackage(e.NewPackageId); this.Packages.Add(package.Id, package); return package; } /// /// Parses BA manifest from the given stream. /// /// /// public static IBundleInfo ParseBundleFromStream(Stream stream) { XPathDocument manifest = new XPathDocument(stream); XPathNavigator root = manifest.CreateNavigator(); return ParseBundleFromXml(root); } /// /// Parses BA manifest from the given . /// /// The root of the BA manifest. /// public static IBundleInfo ParseBundleFromXml(XPathNavigator root) { BundleInfo bundle = new BundleInfo(); XmlNamespaceManager namespaceManager = new XmlNamespaceManager(root.NameTable); namespaceManager.AddNamespace("p", BootstrapperApplicationData.XMLNamespace); XPathNavigator bundleNode = root.SelectSingleNode("/p:BootstrapperApplicationData/p:WixBundleProperties", namespaceManager); if (bundleNode == null) { throw new Exception("Failed to select bundle information."); } bool? perMachine = BootstrapperApplicationData.GetYesNoAttribute(bundleNode, "PerMachine"); if (perMachine.HasValue) { bundle.PerMachine = perMachine.Value; } bundle.Name = BootstrapperApplicationData.GetAttribute(bundleNode, "DisplayName"); bundle.LogVariable = BootstrapperApplicationData.GetAttribute(bundleNode, "LogPathVariable"); bundle.OverridableVariables = OverridableVariablesInfo.ParseFromXml(root); bundle.Packages = PackageInfo.ParsePackagesFromXml(root); return bundle; } } }