static BuildResult GenXcent (IProgressMonitor monitor, IPhoneProject proj, IPhoneProjectConfiguration conf, IPhoneAppIdentity identity, out string xcentName) { xcentName = conf.CompiledOutputName.ChangeExtension (".xcent"); monitor.BeginTask (GettextCatalog.GetString ("Processing entitlements file"), 0); string srcFile; if (!string.IsNullOrEmpty (conf.CodesignEntitlements)) { if (!File.Exists (conf.CodesignEntitlements)) return BuildError ("Entitlements file \"" + conf.CodesignEntitlements + "\" not found."); srcFile = conf.CodesignEntitlements; } else { srcFile = "/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS" + conf.MtouchSdkVersion + ".sdk/Entitlements.plist"; } var doc = new PlistDocument (); try { doc.LoadFromXmlFile (srcFile); } catch (Exception ex) { monitor.Log.WriteLine (ex.ToString ()); return BuildError ("Error loading entitlements source file '" + srcFile +"'."); } //insert the app ID into the plist at the beginning var oldDict = doc.Root as PlistDictionary; var newDict = new PlistDictionary (); doc.Root = newDict; newDict["application-identifier"] = identity.AppID; var keychainGroups = new PlistArray (new [] { identity.AppID } ); newDict["keychain-access-groups"] = keychainGroups; //merge in the user's values foreach (var item in oldDict) { //FIXME: we currently ignore these items, and write our own, but maybe we should do substitutes //i.e. $(AppIdentifierPrefix)$(CFBundleIdentifier) if (item.Key == "application-identifier") { var str = item.Value as PlistString; if (str == null || string.IsNullOrEmpty (str.Value) || str.Value.Contains ('$')) continue; } else if (item.Key == "keychain-access-groups") { //special handling, merge into the array var keyArr = item.Value as PlistArray; foreach (var key in keyArr) { var str = key as PlistString; if (str != null && !string.IsNullOrEmpty (str.Value) && !str.Value.Contains ('$')) { keychainGroups.Add (str.Value); } } continue; } newDict[item.Key] = item.Value; } //merge in the settings from the provisioning profile, skipping some foreach (var item in identity.Profile.Entitlements) if (item.Key != "application-identifier" && item.Key != "keychain-access-groups") newDict[item.Key] = item.Value; try { WriteXcent (doc, xcentName); } catch (Exception ex) { monitor.Log.WriteLine (ex.ToString ()); return BuildError ("Error writing entitlements file '" + xcentName +"'."); } monitor.EndTask (); return null; }
static BuildResult CreateMergedPlist (IProgressMonitor monitor, IPhoneProjectConfiguration conf, ProjectFile template, string outPath, Func<IPhoneProjectConfiguration, PlistDocument,BuildResult> merge) { var result = new BuildResult (); var doc = new PlistDocument (); if (template != null) { try { doc.LoadFromXmlFile (template.FilePath); } catch (Exception ex) { if (ex is XmlException) result.AddError (template.FilePath, ((XmlException)ex).LineNumber, ((XmlException)ex).LinePosition, null, ex.Message); else result.AddError (template.FilePath, 0, 0, null, ex.Message); monitor.ReportError (GettextCatalog.GetString ("Could not load file '{0}': {1}", template.FilePath, ex.Message), null); return result; } } if (result.Append (merge (conf, doc)).ErrorCount > 0) return result; try { EnsureDirectoryForFile (outPath); using (XmlTextWriter writer = new XmlTextWriter (outPath, Encoding.UTF8)) { writer.Formatting = Formatting.Indented; doc.Write (writer); } } catch (Exception ex) { result.AddError (outPath, 0, 0, null, ex.Message); monitor.ReportError (GettextCatalog.GetString ("Could not write file '{0}'", outPath), ex); } return result; }