using System; 
 | 
using System.Collections; 
 | 
using System.Collections.Generic; 
 | 
using System.Text; 
 | 
using System.Text.RegularExpressions; 
 | 
using System.IO; 
 | 
  
 | 
// Base classes for section handling 
 | 
  
 | 
#if UNITY_XCODE_API_BUILD 
 | 
namespace UnityEditor.iOS.Xcode.PBX 
 | 
#else 
 | 
namespace UnityEditor.iOS.Xcode.Custom.PBX 
 | 
#endif 
 | 
{ 
 | 
  
 | 
    // common base 
 | 
    internal abstract class SectionBase 
 | 
    { 
 | 
        public abstract void AddObject(string key, PBXElementDict value); 
 | 
        public abstract void WriteSection(StringBuilder sb, GUIDToCommentMap comments); 
 | 
    } 
 | 
  
 | 
    // known section: contains objects that we care about 
 | 
    internal class KnownSectionBase<T> : SectionBase where T : PBXObjectData, new() 
 | 
    { 
 | 
        private Dictionary<string, T> m_Entries = new Dictionary<string, T>(); 
 | 
  
 | 
        private string m_Name; 
 | 
  
 | 
        public KnownSectionBase(string sectionName) 
 | 
        { 
 | 
            m_Name = sectionName; 
 | 
        } 
 | 
  
 | 
        public IEnumerable<KeyValuePair<string, T>> GetEntries() 
 | 
        {  
 | 
            return m_Entries;  
 | 
        } 
 | 
  
 | 
        public IEnumerable<string> GetGuids() 
 | 
        { 
 | 
            return m_Entries.Keys; 
 | 
        } 
 | 
         
 | 
        public IEnumerable<T> GetObjects() 
 | 
        { 
 | 
            return m_Entries.Values; 
 | 
        } 
 | 
  
 | 
        public override void AddObject(string key, PBXElementDict value) 
 | 
        { 
 | 
            T obj = new T(); 
 | 
            obj.guid = key; 
 | 
            obj.SetPropertiesWhenSerializing(value); 
 | 
            obj.UpdateVars(); 
 | 
            m_Entries[obj.guid] = obj; 
 | 
        } 
 | 
  
 | 
        public override void WriteSection(StringBuilder sb, GUIDToCommentMap comments) 
 | 
        { 
 | 
            if (m_Entries.Count == 0) 
 | 
                return;            // do not write empty sections 
 | 
  
 | 
            sb.AppendFormat("\n\n/* Begin {0} section */", m_Name); 
 | 
            var keys = new List<string>(m_Entries.Keys); 
 | 
            keys.Sort(StringComparer.Ordinal); 
 | 
            foreach (string key in keys) 
 | 
            { 
 | 
                T obj = m_Entries[key]; 
 | 
                obj.UpdateProps(); 
 | 
                sb.Append("\n\t\t"); 
 | 
                comments.WriteStringBuilder(sb, obj.guid); 
 | 
                sb.Append(" = "); 
 | 
                Serializer.WriteDict(sb, obj.GetPropertiesWhenSerializing(), 2,  
 | 
                                     obj.shouldCompact, obj.checker, comments); 
 | 
                sb.Append(";"); 
 | 
            } 
 | 
            sb.AppendFormat("\n/* End {0} section */", m_Name); 
 | 
        } 
 | 
  
 | 
        // returns null if not found 
 | 
        public T this[string guid] 
 | 
        { 
 | 
            get { 
 | 
                if (m_Entries.ContainsKey(guid)) 
 | 
                    return m_Entries[guid]; 
 | 
                return null; 
 | 
            } 
 | 
        } 
 | 
         
 | 
        public bool HasEntry(string guid) 
 | 
        { 
 | 
            return m_Entries.ContainsKey(guid); 
 | 
        }       
 | 
  
 | 
        public void AddEntry(T obj) 
 | 
        { 
 | 
            m_Entries[obj.guid] = obj; 
 | 
        } 
 | 
  
 | 
        public void RemoveEntry(string guid) 
 | 
        { 
 | 
            if (m_Entries.ContainsKey(guid)) 
 | 
                m_Entries.Remove(guid); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    // we assume there is only one PBXProject entry 
 | 
    internal class PBXProjectSection : KnownSectionBase<PBXProjectObjectData> 
 | 
    { 
 | 
        public PBXProjectSection() : base("PBXProject") 
 | 
        { 
 | 
        } 
 | 
  
 | 
        public PBXProjectObjectData project 
 | 
        { 
 | 
            get { 
 | 
                foreach (var kv in GetEntries()) 
 | 
                    return kv.Value; 
 | 
                return null; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
} // UnityEditor.iOS.Xcode 
 |