Exemple #1
0
        internal static AppxIdentity GetIdentityFromPackageManifest(XDocument document, CancellationToken cancellationToken = default)
        {
            /*
             * <Package
             *    xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10">
             *    <Identity Name="MSIXHero" Version="2.0.46.0" Publisher="CN=abc" ProcessorArchitecture="neutral" />
             */

            XNamespace windows10Namespace = "http://schemas.microsoft.com/appx/manifest/foundation/windows10";
            XNamespace appxNamespace      = "http://schemas.microsoft.com/appx/2010/manifest";

            var root = document.Element(windows10Namespace + "Package") ?? document.Element(appxNamespace + "Package");

            if (root == null)
            {
                throw new InvalidDataException("Not a valid package manifest. Missing root element <Package />.");
            }

            var identity = root.Element(windows10Namespace + "Identity") ?? root.Element(appxNamespace + "Identity");

            if (identity == null)
            {
                throw new InvalidDataException("Not a valid bundle manifest. Missing child element <Identity />.");
            }

            var version      = identity.Attribute("Version");
            var publisher    = identity.Attribute("Publisher");
            var name         = identity.Attribute("Name");
            var architecture = identity.Attribute("ProcessorArchitecture");

            var appxIdentity = new AppxIdentity
            {
                Name      = name?.Value,
                Publisher = publisher?.Value,
                Version   = version?.Value
            };

            if (architecture != null)
            {
                if (Enum.TryParse(architecture.Value, true, out AppxPackageArchitecture architectureValue))
                {
                    appxIdentity.Architectures = new[] { architectureValue };
                }
                else
                {
                    Logger.Warn("Could not parse the value " + architecture.Value + " to one of known enums.");
                }
            }

            return(appxIdentity);
        }
Exemple #2
0
        internal static AppxIdentity GetIdentityFromBundleManifest(XDocument document, CancellationToken cancellationToken = default)
        {
            /*
             *<?xml version="1.0" encoding="UTF-8"?>
             * <Bundle xmlns:b4="http://schemas.microsoft.com/appx/2018/bundle" xmlns="http://schemas.microsoft.com/appx/2013/bundle"
             */
            XNamespace bundleManifest = "http://schemas.microsoft.com/appx/2013/bundle";

            var root = document.Element(bundleManifest + "Bundle");

            if (root == null)
            {
                throw new InvalidDataException("Not a valid bundle manifest. Missing root element <Bundle />.");
            }

            var identity = root.Element(bundleManifest + "Identity");

            if (identity == null)
            {
                throw new InvalidDataException("Not a valid bundle manifest. Missing child element <Identity />.");
            }

            var version   = identity.Attribute("Version");
            var publisher = identity.Attribute("Publisher");
            var name      = identity.Attribute("Name");

            var packagesNode = root.Element(bundleManifest + "Packages");
            var packages     = packagesNode?.Elements(bundleManifest + "Package");

            var appxIdentity = new AppxIdentity
            {
                Name      = name?.Value,
                Publisher = publisher?.Value,
                Version   = version?.Value
            };

            if (packages != null)
            {
                var architectures = new HashSet <AppxPackageArchitecture>();

                foreach (var package in packages)
                {
                    var architecture = package.Attribute("Architecture");
                    if (architecture == null)
                    {
                        continue;
                    }

                    if (Enum.TryParse(architecture.Value, true, out AppxPackageArchitecture architectureValue))
                    {
                        architectures.Add(architectureValue);
                    }
                    else
                    {
                        Logger.Warn("Could not parse the value " + architecture.Value + " to one of known enums.");
                    }
                }

                appxIdentity.Architectures = architectures.ToArray();
            }

            return(appxIdentity);
        }