static PDictionary CreateIndex() { var plist = new PDictionary(); var profiles = new PArray(); if (Directory.Exists(MobileProvision.ProfileDirectory)) { foreach (var fileName in Directory.EnumerateFiles(MobileProvision.ProfileDirectory)) { if (!fileName.EndsWith(".mobileprovision", StringComparison.Ordinal) && !fileName.EndsWith(".provisionprofile", StringComparison.Ordinal)) { continue; } try { var profile = CreateIndexRecord(fileName); profiles.Add(profile); } catch (Exception ex) { LoggingService.LogWarning("Error reading provisioning profile '{0}': {1}", fileName, ex); } } profiles.Sort(CreationDateComparer); } else { Directory.CreateDirectory(MobileProvision.ProfileDirectory); } plist.Add("Version", new PNumber(IndexVersion)); plist.Add("LastModified", new PDate(Directory.GetLastWriteTimeUtc(MobileProvision.ProfileDirectory))); plist.Add("ProvisioningProfiles", profiles); Save(plist); return(plist); }
void Init() { string currentLocation = IsInstalled ? MmpPath : null; IsInstalled = false; versions = null; FrameworkDirectory = "/Library/Frameworks/Xamarin.Mac.framework/Versions/Current"; var envFrameworkDir = Environment.GetEnvironmentVariable("XAMMAC_FRAMEWORK_PATH"); if (envFrameworkDir != null && Directory.Exists(envFrameworkDir)) { FrameworkDirectory = envFrameworkDir; } var versionPath = Path.Combine(FrameworkDirectory, "Version"); if (File.Exists(versionPath)) { Version = ReadVersion(versionPath); lastWriteTimes [versionPath] = File.GetLastWriteTimeUtc(versionPath); var path = Path.Combine(FrameworkDirectory, "Versions.plist"); if (File.Exists(path)) { try { versions = PDictionary.FromFile(path); } catch { LoggingService.LogWarning("Xamarin.Mac installation is corrupt: invalid Versions.plist at {0}.", path); } } if (versions == null) { versions = CreateDefaultVersionsPlist(Version); } } else { NotInstalled(versionPath, error: false); AnalyticsService.ReportSdkVersion("XS.Core.SDK.Mac.Version", string.Empty); return; } var paths = Version >= new MacOSXSdkVersion(1, 9, 0) ? Detect2x() : Detect1x(); foreach (var path in paths) { if (!File.Exists(path)) { NotInstalled(path); return; } lastWriteTimes [path] = File.GetLastWriteTimeUtc(path); } IsInstalled = true; LoggingService.LogInfo("Found Xamarin.Mac, version {0}.", Version); AnalyticsService.ReportSdkVersion("XS.Core.SDK.Mac.Version", Version.ToString()); if (Changed != null && currentLocation != MmpPath) { Changed(this, EventArgs.Empty); } }
static PDictionary OpenIndex() { PDictionary plist; try { plist = PDictionary.FromFile(IndexFileName); if (Directory.Exists(MobileProvision.ProfileDirectory)) { var mtime = Directory.GetLastWriteTimeUtc(MobileProvision.ProfileDirectory); if (VersionChanged(plist, IndexVersion)) { plist = CreateIndex(); } else if (LastModifiedChanged(plist, mtime)) { var table = new Dictionary <string, PDictionary> (); PArray profiles; if (plist.TryGetValue("ProvisioningProfiles", out profiles)) { foreach (var profile in profiles.OfType <PDictionary> ()) { PString fileName; if (!profile.TryGetValue("FileName", out fileName)) { continue; } table[fileName.Value] = profile; } } else { plist.Add("ProvisioningProfiles", profiles = new PArray()); } foreach (var fileName in Directory.EnumerateFiles(MobileProvision.ProfileDirectory)) { if (!fileName.EndsWith(".mobileprovision", StringComparison.Ordinal) && !fileName.EndsWith(".provisionprofile", StringComparison.Ordinal)) { continue; } bool unknown = false; PDictionary profile; if (table.TryGetValue(Path.GetFileName(fileName), out profile)) { // remove from our lookup table (any leftover key/valie pairs will be used to determine deleted files) table.Remove(Path.GetFileName(fileName)); // check if the file has changed since our last resync mtime = File.GetLastWriteTimeUtc(fileName); if (LastModifiedChanged(profile, mtime)) { // remove the old record profile.Remove(); // treat this provisioning profile as if it is unknown unknown = true; } } else { unknown = true; } if (unknown) { // unknown provisioning profile; add it to our ProvisioningProfiles array try { profile = CreateIndexRecord(fileName); profiles.Add(profile); } catch (Exception ex) { LoggingService.LogWarning("Error reading provisioning profile '{0}': {1}", fileName, ex); } } } // remove provisioning profiles which have been deleted from the file system foreach (var record in table) { record.Value.Remove(); } plist["LastModified"] = new PDate(Directory.GetLastWriteTimeUtc(MobileProvision.ProfileDirectory)); plist["Version"] = new PNumber(IndexVersion); profiles.Sort(CreationDateComparer); Save(plist); } } else { try { File.Delete(IndexFileName); } catch (Exception ex) { LoggingService.LogWarning("Failed to delete stale index '{0}': {1}", IndexFileName, ex); } plist.Clear(); } } catch { plist = CreateIndex(); } return(plist); }
void Init() { string currentLocation = IsInstalled ? Path.Combine(BinDir, "mtouch") : null; IsInstalled = false; versions = null; if (string.IsNullOrEmpty(SdkDir)) { foreach (var loc in DefaultLocations) { if (IsInstalled = ValidateSdkLocation(loc, out hasUsrSubdir)) { SdkDir = loc; break; } } } else { IsInstalled = ValidateSdkLocation(SdkDir, out hasUsrSubdir); } string mtouch = null; if (IsInstalled) { mtouch = Path.Combine(BinDir, "mtouch"); lastMTExeWrite = File.GetLastWriteTime(mtouch); Version = ReadVersion(); // Note: We require 10.4 for the bundled mlaunch (and Versions.plist, although we have a handy fallback if that file is missing) if (Version.CompareTo(IPhoneSdkVersion.V10_4) >= 0) { LoggingService.LogInfo("Found Xamarin.iOS, version {0}.", Version); var path = Path.Combine(SdkDir, "Versions.plist"); if (File.Exists(path)) { try { versions = PDictionary.FromFile(path); } catch { LoggingService.LogWarning("Xamarin.iOS installation is corrupt: invalid Versions.plist."); } } if (versions == null) { versions = CreateDefaultVersionsPlist(); } } else { LoggingService.LogInfo("Found unsupported Xamarin.iOS, version {0}.", Version); Version = new IPhoneSdkVersion(); versions = new PDictionary(); IsInstalled = false; } AnalyticsService.ReportContextProperty("XS.Core.SDK.iOS.Version", Version.ToString()); } else { lastMTExeWrite = DateTime.MinValue; Version = new IPhoneSdkVersion(); versions = new PDictionary(); LoggingService.LogInfo("Xamarin.iOS not installed. Can't find mtouch."); AnalyticsService.ReportContextProperty("XS.Core.SDK.iOS.Version", string.Empty); } if (Changed != null && currentLocation != mtouch) { Changed(this, EventArgs.Empty); } }
/// <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); }
public static MobileProvisionIndex OpenIndex(string profilesDir, string indexName) { MobileProvisionIndex index; try { index = Load(indexName); if (Directory.Exists(profilesDir)) { var mtime = Directory.GetLastWriteTimeUtc(profilesDir); if (index.Version != IndexVersion) { index = CreateIndex(profilesDir, indexName); } else if (index.LastModified < mtime) { var table = new Dictionary <string, ProvisioningProfile> (); foreach (var profile in index.ProvisioningProfiles) { table[profile.FileName] = profile; } foreach (var fileName in Directory.EnumerateFiles(profilesDir)) { if (!fileName.EndsWith(".mobileprovision", StringComparison.Ordinal) && !fileName.EndsWith(".provisionprofile", StringComparison.Ordinal)) { continue; } ProvisioningProfile profile; bool unknown = false; if (table.TryGetValue(Path.GetFileName(fileName), out profile)) { // remove from our lookup table (any leftover key/valie pairs will be used to determine deleted files) table.Remove(Path.GetFileName(fileName)); // check if the file has changed since our last resync mtime = File.GetLastWriteTimeUtc(fileName); if (profile.LastModified < mtime) { // remove the old record index.ProvisioningProfiles.Remove(profile); // treat this provisioning profile as if it is unknown unknown = true; } } else { unknown = true; } if (unknown) { // unknown provisioning profile; add it to our ProvisioningProfiles array try { profile = ProvisioningProfile.Load(fileName); index.ProvisioningProfiles.Add(profile); } catch (Exception ex) { LoggingService.LogWarning("Error reading provisioning profile '{0}': {1}", fileName, ex); } } } // remove provisioning profiles which have been deleted from the file system foreach (var item in table) { index.ProvisioningProfiles.Remove(item.Value); } index.LastModified = Directory.GetLastWriteTimeUtc(profilesDir); index.Version = IndexVersion; index.ProvisioningProfiles.Sort(CreationDateComparer); index.Save(indexName); } } else { try { File.Delete(indexName); } catch (Exception ex) { LoggingService.LogWarning("Failed to delete stale index '{0}': {1}", indexName, ex); } index.ProvisioningProfiles.Clear(); } } catch { index = CreateIndex(profilesDir, indexName); } return(index); }
void Init() { string currentLocation = IsInstalled ? Path.Combine(BinDir, "mtouch") : null; IsInstalled = false; versions = null; if (string.IsNullOrEmpty(SdkDir)) { foreach (var loc in DefaultLocations) { if (IsInstalled = ValidateSdkLocation(loc, out hasUsrSubdir)) { SdkDir = loc; break; } } } else { IsInstalled = ValidateSdkLocation(SdkDir, out hasUsrSubdir); } string mtouch = null; if (IsInstalled) { mtouch = Path.Combine(BinDir, "mtouch"); lastMTExeWrite = File.GetLastWriteTimeUtc(mtouch); Version = ReadVersion(); if (Version.CompareTo(requiredXI) >= 0) { LoggingService.LogInfo("Found Xamarin.iOS, version {0}.", Version); var path = Path.Combine(SdkDir, "Versions.plist"); if (File.Exists(path)) { try { versions = PDictionary.FromFile(path); } catch { LoggingService.LogWarning("Xamarin.iOS installation is corrupt: invalid Versions.plist at {0}.", path); } } if (versions == null) { versions = CreateDefaultVersionsPlist(); } } else { SdkNotInstalledReason = string.Format("Found unsupported Xamarin.iOS, version {0}.\nYou need Xamarin.iOS {1} or above.", Version, requiredXI.ToString()); LoggingService.LogWarning(SdkNotInstalledReason); Version = new IPhoneSdkVersion(); versions = new PDictionary(); IsInstalled = false; } AnalyticsService.ReportSdkVersion("XS.Core.SDK.iOS.Version", Version.ToString()); } else { lastMTExeWrite = DateTime.MinValue; Version = new IPhoneSdkVersion(); versions = new PDictionary(); SdkNotInstalledReason = string.Format("Xamarin.iOS not installed.\nCan't find mtouch or the Version file at {0}.", SdkDir); LoggingService.LogInfo(SdkNotInstalledReason); AnalyticsService.ReportSdkVersion("XS.Core.SDK.iOS.Version", string.Empty); } if (Changed != null && currentLocation != mtouch) { Changed(this, EventArgs.Empty); } }