private static async Task <AppxManifestSummary> FromManifest(Stream manifestStream, ReadMode mode) { var result = new AppxManifestSummary(); Logger.Debug("Loading XML file..."); var xmlDocument = await XDocument.LoadAsync(manifestStream, LoadOptions.None, CancellationToken.None).ConfigureAwait(false); var identity = AppxIdentityReader.GetIdentityFromPackageManifest(xmlDocument); result.Name = identity.Name; result.Version = identity.Version; result.Publisher = identity.Publisher; result.Architectures = identity.Architectures; XNamespace win10Namespace = "http://schemas.microsoft.com/appx/manifest/foundation/windows10"; XNamespace appxNamespace = "http://schemas.microsoft.com/appx/2010/manifest"; XNamespace uapNamespace = "http://schemas.microsoft.com/appx/manifest/uap/windows10"; XNamespace uap3Namespace = "http://schemas.microsoft.com/appx/manifest/uap/windows10/3"; var packageNode = xmlDocument.Element(win10Namespace + "Package") ?? xmlDocument.Element(appxNamespace + "Package"); if (packageNode == null) { throw new ArgumentException("The manifest file does not contain a valid root element (<Package />)."); } if ((mode & ReadMode.Properties) == ReadMode.Properties) { var propertiesNode = packageNode.Element(win10Namespace + "Properties") ?? packageNode.Element(appxNamespace + "Properties"); Logger.Trace("Executing XQuery /*[local-name()='Package']/*[local-name()='Properties'] for a single node..."); if (propertiesNode != null) { foreach (var subNode in propertiesNode.Elements()) { switch (subNode.Name.LocalName) { case "DisplayName": result.DisplayName = subNode.Value; break; case "PublisherDisplayName": result.DisplayPublisher = subNode.Value; break; case "Description": result.Description = subNode.Value; break; case "Logo": result.Logo = subNode.Value; break; case "Framework": result.IsFramework = bool.TryParse(subNode.Value, out var parsed) && parsed; break; } } } var applicationsNode = packageNode.Element(win10Namespace + "Applications") ?? packageNode.Element(appxNamespace + "Applications"); if (applicationsNode != null) { var applicationNode = applicationsNode.Elements(win10Namespace + "Application").Concat(applicationsNode.Elements(appxNamespace + "Application")); var visualElementsNode = applicationNode .SelectMany(e => e.Elements(win10Namespace + "VisualElements") .Concat(e.Elements(appxNamespace + "VisualElements")) .Concat(e.Elements(uap3Namespace + "VisualElements")) .Concat(e.Elements(uapNamespace + "VisualElements"))); var background = visualElementsNode.Select(node => node.Attribute("BackgroundColor")).FirstOrDefault(a => a != null); result.AccentColor = background?.Value ?? "Transparent"; } else { result.AccentColor = "Transparent"; } } if ((mode & ReadMode.Applications) == ReadMode.Applications) { result.PackageType = result.IsFramework ? MsixPackageType.Framework : 0; var applicationsNode = packageNode.Element(win10Namespace + "Applications") ?? packageNode.Element(appxNamespace + "Applications"); if (applicationsNode != null) { var applicationNode = applicationsNode.Elements(win10Namespace + "Application").Concat(applicationsNode.Elements(appxNamespace + "Application")); foreach (var subNode in applicationNode) { var entryPoint = subNode.Attribute("EntryPoint")?.Value; var executable = subNode.Attribute("Executable")?.Value; var startPage = subNode.Attribute("StartPage")?.Value; result.PackageType |= PackageTypeConverter.GetPackageTypeFrom(entryPoint, executable, startPage, result.IsFramework); } } } Logger.Debug("Manifest information parsed."); return(result); }
private static async Task <AppxManifestSummary> FromManifest(Stream manifestStream, AppxManifestSummaryBuilderMode mode) { var result = new AppxManifestSummary(); var xmlDocument = new XmlDocument(); var streamReader = new StreamReader(manifestStream); Logger.Debug("Loading XML file..."); xmlDocument.LoadXml(await streamReader.ReadToEndAsync().ConfigureAwait(false)); if ((mode & AppxManifestSummaryBuilderMode.Identity) == AppxManifestSummaryBuilderMode.Identity) { Logger.Trace("Executing XQuery /*[local-name()='Package']/*[local-name()='Identity'] for a single node..."); var identity = xmlDocument.SelectSingleNode("/*[local-name()='Package']/*[local-name()='Identity']"); result.Name = identity.Attributes["Name"]?.Value; result.Version = identity.Attributes["Version"]?.Value; result.Publisher = identity.Attributes["Publisher"]?.Value; result.ProcessorArchitecture = identity.Attributes["ProcessorArchitecture"]?.Value; } if ((mode & AppxManifestSummaryBuilderMode.Properties) == AppxManifestSummaryBuilderMode.Properties) { Logger.Trace("Executing XQuery /*[local-name()='Package']/*[local-name()='Properties'] for a single node..."); var node = xmlDocument.SelectSingleNode("/*[local-name()='Package']/*[local-name()='Properties']"); foreach (var subNode in node.ChildNodes.OfType <XmlNode>()) { switch (subNode.LocalName) { case "DisplayName": result.DisplayName = subNode.InnerText; break; case "PublisherDisplayName": result.DisplayPublisher = subNode.InnerText; break; case "Description": result.Description = subNode.InnerText; break; case "Logo": result.Logo = subNode.InnerText; break; case "Framework": result.IsFramework = bool.TryParse(subNode?.InnerText ?? "False", out var parsed) && parsed; break; } } Logger.Trace("Executing XQuery /*[local-name()='Package']/*[local-name()='Applications']/*[local-name()='Application']/*[local-name()='VisualElements'] for a single node..."); node = xmlDocument.SelectSingleNode("/*[local-name()='Package']/*[local-name()='Applications']/*[local-name()='Application']/*[local-name()='VisualElements']"); result.AccentColor = node?.Attributes["BackgroundColor"]?.Value ?? "Transparent"; } if ((mode & AppxManifestSummaryBuilderMode.Applications) == AppxManifestSummaryBuilderMode.Applications) { result.PackageType = result.IsFramework ? MsixPackageType.Framework : 0; Logger.Trace("Executing XQuery /*[local-name()='Package']"); var package = xmlDocument.SelectSingleNode("/*[local-name()='Package']"); Logger.Trace("Executing XQuery /*[local-name()='Applications']/*[local-name()='Application']..."); var applications = package.SelectNodes("/*[local-name()='Package']/*[local-name()='Applications']/*[local-name()='Application']"); foreach (var subNode in applications.OfType <XmlNode>()) { var entryPoint = subNode.Attributes["EntryPoint"]?.Value; var executable = subNode.Attributes["Executable"]?.Value; var startPage = subNode.Attributes["StartPage"]?.Value; result.PackageType |= PackageTypeConverter.GetPackageTypeFrom(entryPoint, executable, startPage, result.IsFramework); } } Logger.Debug("Manifest information parsed."); return(result); }