public static MobileProvision LoadFromFile(string fileName)
        {
            var data = File.ReadAllBytes(fileName);
            var m    = new MobileProvision();

            m.Load(PDictionary.FromBinaryXml(data));
            m.Data = data;

            if (m.Platforms == null)
            {
                switch (Path.GetExtension(fileName).ToLowerInvariant())
                {
                case ".provisionprofile":
                    m.Platforms    = new MobileProvisionPlatform[1];
                    m.Platforms[0] = MobileProvisionPlatform.MacOS;
                    break;

                case ".mobileprovision":
                    m.Platforms    = new MobileProvisionPlatform[1];
                    m.Platforms[0] = MobileProvisionPlatform.iOS;
                    break;
                }
            }

            return(m);
        }
        public static MobileProvision LoadFromData(byte[] data)
        {
            var m = new MobileProvision();

            m.Load(PDictionary.FromBinaryXml(data));
            m.Data = data;
            return(m);
        }
        /// <summary>
        /// All installed provisioning profiles, sorted by newest first.
        /// </summary>
        public static IList <MobileProvision> GetAllInstalledProvisions(MobileProvisionPlatform platform, bool includeExpired)
        {
            if (!Directory.Exists(ProfileDirectory))
            {
                return(new MobileProvision[0]);
            }

            var    uuids = new Dictionary <string, MobileProvision> ();
            var    list  = new List <MobileProvision> ();
            var    now   = DateTime.Now;
            string pattern;

            switch (platform)
            {
            case MobileProvisionPlatform.MacOS:
                pattern = "*.provisionprofile";
                break;

            case MobileProvisionPlatform.tvOS:
            case MobileProvisionPlatform.iOS:
                pattern = "*.mobileprovision";
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(platform));
            }

            foreach (var file in Directory.EnumerateFiles(ProfileDirectory, pattern))
            {
                try {
                    var data = File.ReadAllBytes(file);

                    var m = new MobileProvision();
                    m.Load(PDictionary.FromBinaryXml(data));
                    m.Data = data;

                    if (includeExpired || m.ExpirationDate > now)
                    {
                        if (uuids.ContainsKey(m.Uuid))
                        {
                            // we always want the most recently created/updated provision
                            if (m.CreationDate > uuids[m.Uuid].CreationDate)
                            {
                                int index = list.IndexOf(uuids[m.Uuid]);
                                uuids[m.Uuid] = m;
                                list[index]   = m;
                            }
                        }
                        else
                        {
                            uuids.Add(m.Uuid, m);
                            list.Add(m);
                        }
                    }
                } catch (Exception ex) {
                    LoggingService.LogWarning("Error reading " + platform + " provision file '" + file + "'", ex);
                }
            }

            //newest first
            list.Sort((x, y) => y.CreationDate.CompareTo(x.CreationDate));

            return(list);
        }