예제 #1
0
        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);
        }
예제 #2
0
        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);
        }