public void ReadXml(XmlReader reader) { reader.ReadStartElement("plist"); this.Root = PListElementFactory.Instance.Create(reader.LocalName); this.Root.ReadXml(reader); reader.ReadEndElement(); }
internal int WriteInternal(IPListElement element) { int count = this.Offsets.Count; if (element.IsBinaryUnique && element is IEquatable<IPListElement>) { if (!this.m_UniqueElements.ContainsKey(element.TypeCode)) this.m_UniqueElements.Add(element.TypeCode, new Dictionary<IPListElement, int>()); if (!this.m_UniqueElements[element.TypeCode].ContainsKey(element)) { this.m_UniqueElements[element.TypeCode][element] = count; } else { if (!(element is PListBool)) return this.m_UniqueElements[element.TypeCode][element]; count = this.m_UniqueElements[element.TypeCode][element]; } } this.Offsets.Add((int) this.BaseStream.Position); int plistElementLength = element.GetPListElementLength(); this.BaseStream.WriteByte((byte) ((int) element.TypeCode << 4 | (plistElementLength < 15 ? plistElementLength : 15))); if (plistElementLength >= 15) { IPListElement lengthElement = PListElementFactory.Instance.CreateLengthElement(plistElementLength); this.BaseStream.WriteByte((byte) ((int) lengthElement.TypeCode << 4 | lengthElement.GetPListElementLength())); lengthElement.WriteBinary(this); } element.WriteBinary(this); return count; }
public static void Send(IntPtr fd, IPListElement plist) { PListRoot root = new PListRoot(); root.Root = plist; byte[] buffer; using (MemoryStream stream = new MemoryStream()) { root.Save(stream, PListFormat.Xml); buffer = stream.ToArray(); } var be_length = IPAddress.HostToNetworkOrder(buffer.Length); var be_buffer = BitConverter.GetBytes(be_length); int sent; sent = send(fd, be_buffer, 4, 0); if (sent != 4) { throw new PlistServiceException("发送数据边界失败"); } sent = send(fd, buffer, buffer.Length, 0); if (sent != buffer.Length) { throw new PlistServiceException("发送数据失败"); } }
internal IPListElement ReadInternal() { byte[] buffer = new byte[1]; if (this.BaseStream.Read(buffer, 0, buffer.Length) != 1) { throw new PListFormatException("Didn't read type Byte"); } int length = (int)buffer[0] & 15; byte typeCode = (byte)((int)buffer[0] >> 4 & 15); if ((int)typeCode != 0 && length == 15) { IPListElement plistElement = this.ReadInternal(); if (!(plistElement is PListInteger)) { throw new PListFormatException("Element Len is no Integer"); } length = (int)((PListElement <long>)plistElement).Value; } IPListElement plistElement1 = PListElementFactory.Instance.Create(typeCode, length); byte currentElementTypeCode = this.CurrentElementTypeCode; int currentElementLength = this.CurrentElementLength; this.CurrentElementTypeCode = typeCode; this.CurrentElementLength = length; plistElement1.ReadBinary(this); this.CurrentElementTypeCode = currentElementTypeCode; this.CurrentElementLength = currentElementLength; return(plistElement1); }
protected void DrawElement(IPListElement element) { if (element is PListDictionary) { DrawDictionary(element as PListDictionary); } else if (element is PListArray) { DrawArray(element as PListArray); } else if (element is PListBoolean) { DrawBool(element as PListBoolean); } else if (element is PListInteger) { DrawInt(element as PListInteger); } else if (element is PListReal) { DrawReal(element as PListReal); } else if (element is PListString) { DrawString(element as PListString); } else if (element is PListDate) { DrawDate(element as PListDate); } else if (element is PListData) { DrawData(element as PListData); } }
/// <summary> /// Appends the key value. /// </summary> /// <param name="dict">The dictionary.</param> /// <param name="keyString">The key string.</param> /// <param name="data">The data.</param> private void AppendKeyValue(XmlElement dict, string keyString, IPListElement data) { var doc = dict.OwnerDocument; var key = doc.CreateElement("key"); key.InnerText = keyString; dict.AppendChild(key); data.SaveToXml(dict); }
public static string ToXmlString(this IPListElement plist) { StringBuilder builder = new StringBuilder(); var writer = System.Xml.XmlWriter.Create(builder); plist.WriteXml(writer); writer.Flush(); return(builder.ToString()); }
public static void ShowIPListElement(IPListElement plist) { PListRoot r = new PListRoot(); r.Format = PListFormat.Xml; r.Root = plist; var xml = System.IO.Path.GetTempPath() + ".xml"; r.Save(xml); Process.Start("IEXPLORE.EXE", xml); }
PListArray ParseArray(IEnumerable <XElement> elements) { PListArray arrayElement = new PListArray(); foreach (XElement e in elements) { IPListElement value = ParseValue(e); if (value != null) { arrayElement.Add(value); } } return(arrayElement); }
/// <summary> /// Writers a <see cref="T:CE.iPhone.IPListElemnet"/> to the current stream position /// </summary> /// <param name="element">The element.</param> /// <returns>The Inx of the written element</returns> internal int WriteInternal(IPListElement element) { int elementIdx = Offsets.Count; if (element.IsBinaryUnique && element is IEquatable <IPListElement> ) { if (!m_UniqueElements.ContainsKey(element.TypeCode)) { m_UniqueElements.Add(element.TypeCode, new Dictionary <IPListElement, int>()); } if (!m_UniqueElements[element.TypeCode].ContainsKey(element)) { m_UniqueElements[element.TypeCode][element] = elementIdx; } else { if (element is PListBool) { elementIdx = m_UniqueElements[element.TypeCode][element]; } else { return(m_UniqueElements[element.TypeCode][element]); } } } int offset = (int)BaseStream.Position; Offsets.Add(offset); int len = element.GetPListElementLength(); Byte typeCode = (Byte)(element.TypeCode << 4 | (len < 0x0F ? len : 0x0F)); BaseStream.WriteByte(typeCode); if (len >= 0x0F) { IPListElement extLen = PListElementFactory.Instance.CreateLengthElement(len); Byte extLenTypeCode = (Byte)(extLen.TypeCode << 4 | extLen.GetPListElementLength()); BaseStream.WriteByte(extLenTypeCode); extLen.WriteBinary(this); } element.WriteBinary(this); return(elementIdx); }
protected bool DrawFoldout(IPListElement element) { bool open = true; if (element is PListDictionary || element is PListArray) { GUILayout.Space(-INDENT_AMOUNT + 2); if (!_foldouts.TryGetValue(element.GetHashCode(), out open)) { open = true; } _foldouts[element.GetHashCode()] = EditorGUILayout.Foldout(open, "", Style.EmptyFoldout()); GUILayout.Space(-36); } return(open); }
public void Write(Stream stream, IPListElement element) { this.BaseStream = stream; this.Offsets = new List<int>(); this.BaseStream.Write(PListBinaryWriter.s_PListHeader, 0, PListBinaryWriter.s_PListHeader.Length); int plistElementCount = element.GetPListElementCount(); this.ElementIdxSize = plistElementCount > (int) byte.MaxValue ? (plistElementCount > (int) short.MaxValue ? (byte) 4 : (byte) 2) : (byte) 1; int host = this.WriteInternal(element); int count = this.Offsets.Count; int position = (int) this.BaseStream.Position; byte num = position > (int) byte.MaxValue ? (position > (int) short.MaxValue ? (byte) 4 : (byte) 2) : (byte) 1; for (int index = 0; index < this.Offsets.Count; ++index) { byte[] buffer = (byte[]) null; switch (num) { case 1: buffer = new byte[1] { (byte) this.Offsets[index] }; break; case 2: buffer = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short) this.Offsets[index])); break; case 4: buffer = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(this.Offsets[index])); break; } this.BaseStream.Write(buffer, 0, buffer.Length); } byte[] buffer1 = new byte[32]; buffer1[6] = num; buffer1[7] = this.ElementIdxSize; BitConverter.GetBytes(IPAddress.HostToNetworkOrder(count)).CopyTo((Array) buffer1, 12); BitConverter.GetBytes(IPAddress.HostToNetworkOrder(host)).CopyTo((Array) buffer1, 20); BitConverter.GetBytes(IPAddress.HostToNetworkOrder(position)).CopyTo((Array) buffer1, 28); this.BaseStream.Write(buffer1, 0, buffer1.Length); }
void TypeSelector(IPListElement element) { string type = ""; if (element is PListDictionary) { type = "Dictionary"; } else if (element is PListArray) { type = "Array"; } else if (element is PListBoolean) { type = "Boolean"; } else if (element is PListInteger) { type = "Integer"; } else if (element is PListReal) { type = "Real"; } else if (element is PListString) { type = "String"; } else if (element is PListDate) { type = "Date"; } else if (element is PListData) { type = "Data"; } Style.FixedWidthLabel(type, TYPE_WIDTH); }
/// <summary> /// Reads the <see cref="T:CE.iPhone.IPListElemnet"/> at the current stream position. /// </summary> /// <returns>The <see cref="T:CE.iPhone.IPListElemnet"/> at the current stream position.</returns> internal IPListElement ReadInternal() { Byte[] buf = new Byte[1]; if (BaseStream.Read(buf, 0, buf.Length) != 1) { throw new PListFormatException("Didn't read type Byte"); } Int32 objLen = buf[0] & 0x0F; Byte typeCode = (Byte)((buf[0] >> 4) & 0x0F); if (typeCode != 0 && objLen == 0x0F) { IPListElement lenElem = ReadInternal(); if (!(lenElem is PListInteger)) { throw new PListFormatException("Element Len is no Integer"); } objLen = (Int32)((PListInteger)lenElem).Value; } IPListElement elem = PListElementFactory.Instance.Create(typeCode, objLen); Byte tempElementTypeCode = CurrentElementTypeCode; Int32 tempElementLength = CurrentElementLength; CurrentElementTypeCode = typeCode; CurrentElementLength = objLen; elem.ReadBinary(this); CurrentElementTypeCode = tempElementTypeCode; CurrentElementLength = tempElementLength; return(elem); }
/// <summary> /// Writers a <see cref="T:CE.iPhone.IPListElemnet"/> to the specified stream. /// </summary> /// <param name="stream">The stream.</param> /// <param name="element">The element.</param> public void Write(Stream stream, IPListElement element) { BaseStream = stream; Offsets = new List <int>(); BaseStream.Write(s_PListHeader, 0, s_PListHeader.Length); int elemCnt = element.GetPListElementCount(); if (elemCnt <= Byte.MaxValue) { ElementIdxSize = sizeof(Byte); } else if (elemCnt <= Int16.MaxValue) { ElementIdxSize = sizeof(Int16); } else { ElementIdxSize = sizeof(Int32); } int topOffestIdx = WriteInternal(element); elemCnt = Offsets.Count; int offsetTableOffset = (int)BaseStream.Position; Byte offsetSize = 0; if (offsetTableOffset <= Byte.MaxValue) { offsetSize = sizeof(Byte); } else if (offsetTableOffset <= Int16.MaxValue) { offsetSize = sizeof(Int16); } else { offsetSize = sizeof(Int32); } for (int i = 0; i < Offsets.Count; i++) { Byte[] buf = null; switch (offsetSize) { case 1: buf = new Byte[] { (Byte)Offsets[i] }; break; case 2: buf = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((Int16)Offsets[i])); break; case 4: buf = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((Int32)Offsets[i])); break; } BaseStream.Write(buf, 0, buf.Length); } //BaseStream.Write(s_PListHeader, 0, s_PListHeader.Length); Byte[] header = new Byte[32]; header[6] = offsetSize; header[7] = ElementIdxSize; BitConverter.GetBytes(IPAddress.HostToNetworkOrder(elemCnt)).CopyTo(header, 12); BitConverter.GetBytes(IPAddress.HostToNetworkOrder(topOffestIdx)).CopyTo(header, 20); BitConverter.GetBytes(IPAddress.HostToNetworkOrder(offsetTableOffset)).CopyTo(header, 28); BaseStream.Write(header, 0, header.Length); }
public bool Equals(IPListElement other) { return(other is PListElement <T> && this.Value.Equals((object)((PListElement <T>)other).Value)); }
IPListElement TypeSelector(IPListElement element) { ElementType type = ElementType.String; if (element is PListDictionary) { type = ElementType.Dictionary; } else if (element is PListArray) { type = ElementType.Array; } else if (element is PListBoolean) { type = ElementType.Bool; } else if (element is PListInteger) { type = ElementType.Int; } else if (element is PListReal) { type = ElementType.Real; } else if (element is PListString) { type = ElementType.String; } else if (element is PListDate) { type = ElementType.Date; } else if (element is PListData) { type = ElementType.Data; } EditorGUI.BeginChangeCheck(); type = (ElementType)EditorGUILayout.EnumPopup(type, GUILayout.MinWidth(TYPE_WIDTH), GUILayout.MaxWidth(TYPE_WIDTH)); if (EditorGUI.EndChangeCheck()) { switch (type) { case ElementType.Array: return(new PListArray()); case ElementType.Dictionary: return(new PListDictionary()); case ElementType.Bool: return(new PListBoolean()); case ElementType.Data: return(new PListData()); case ElementType.Date: return(new PListDate()); case ElementType.Int: return(new PListInteger()); case ElementType.Real: return(new PListReal()); case ElementType.String: return(new PListString()); default: break; } } return(element); }
IPListElement[] ArrayContainsElement(PListArray original, IPListElement element) { if (element is PListString) { var strings = original.Where(o => o is PListString).ToArray(); if (strings != null) { var e = element as PListString; var selected = strings.Where(o => o.Equals(e)); if (selected != null && selected.Count() > 0) { return(selected.ToArray()); } } } else if (element is PListInteger) { var ints = original.Where(o => o is PListInteger).ToArray(); if (ints != null) { var e = element as PListInteger; var selected = ints.Where(o => o.Equals(e)); if (selected != null && selected.Count() > 0) { return(selected.ToArray()); } } } else if (element is PListBoolean) { var bools = original.Where(o => o is PListBoolean).ToArray(); if (bools != null) { var e = element as PListBoolean; var selected = bools.Where(o => o.Equals(e)); if (selected != null && selected.Count() > 0) { return(selected.ToArray()); } } } else if (element is PListReal) { var reals = original.Where(o => o is PListReal).ToArray(); if (reals != null) { var e = element as PListReal; var selected = reals.Where(o => o.Equals(e)); if (selected != null && selected.Count() > 0) { return(selected.ToArray()); } } } else if (element is PListData) { var datas = original.Where(o => o is PListData).ToArray(); if (datas != null) { var e = element as PListData; var selected = datas.Where(o => o.Equals(e)); if (selected != null && selected.Count() > 0) { return(selected.ToArray()); } } } else if (element is PListDate) { var dates = original.Where(o => o is PListDate).ToArray(); if (dates != null) { var e = element as PListDate; var selected = dates.Where(o => o.Equals(e)); if (selected != null && selected.Count() > 0) { return(selected.ToArray()); } } } return(null); }
void MergeDictionaries(PListDictionary original, PListDictionary toMerge, bool keepEmpty, bool forceReplace) { foreach (var kvp in toMerge) { IPListElement toMergeElement = kvp.Value; if (toMergeElement is PListDictionary) { var toMergeDic = toMergeElement as PListDictionary; var originalDic = original.Element <PListDictionary>(kvp.Key); if (originalDic == null) { originalDic = new PListDictionary(); original[kvp.Key] = originalDic; } if (forceReplace) { original [kvp.Key] = toMergeDic.Copy(); originalDic = original.Element <PListDictionary> (kvp.Key); } else { MergeDictionaries(originalDic, toMergeDic, keepEmpty, forceReplace); } if (!keepEmpty && originalDic.Count <= 0) { original.Remove(kvp.Key); } } else if (toMergeElement is PListArray) { var toMergeArray = toMergeElement as PListArray; var originalArray = original.Element <PListArray>(kvp.Key); if (originalArray == null) { originalArray = new PListArray(); original[kvp.Key] = originalArray; } if (forceReplace) { original [kvp.Key] = toMergeArray.Copy(); originalArray = original.Element <PListArray> (kvp.Key); } else { MergeArrays(originalArray, toMergeArray, keepEmpty); } if (!keepEmpty && originalArray.Count <= 0) { original.Remove(kvp.Key); } } else { //skip empty entries //TODO should add empty string? if (string.IsNullOrEmpty(toMergeElement.ToString())) { continue; } //add or overwrite existing value original[kvp.Key] = kvp.Value.Copy(); } } }
private void plistList_SelectedIndexChanged(object sender, EventArgs e) { IPListElement element = plistList.FocusedItem.Tag as IPListElement; }
/// <summary> /// Writers a <see cref="T:CE.iPhone.IPListElemnet"/> to the current stream position /// </summary> /// <param name="element">The element.</param> /// <returns>The Inx of the written element</returns> internal int WriteInternal(IPListElement element) { int elementIdx = Offsets.Count; if (element.IsBinaryUnique && element is IEquatable<IPListElement>) { if (!m_UniqueElements.ContainsKey(element.TypeCode)) m_UniqueElements.Add(element.TypeCode, new Dictionary<IPListElement, int>()); if (!m_UniqueElements[element.TypeCode].ContainsKey(element)) m_UniqueElements[element.TypeCode][element] = elementIdx; else { if (element is PListBool) elementIdx = m_UniqueElements[element.TypeCode][element]; else return m_UniqueElements[element.TypeCode][element]; } } int offset = (int)BaseStream.Position; Offsets.Add(offset); int len = element.GetPListElementLength(); Byte typeCode = (Byte)(element.TypeCode << 4 | (len < 0x0F ? len : 0x0F)); BaseStream.WriteByte(typeCode); if (len >= 0x0F) { IPListElement extLen = PListElementFactory.Instance.CreateLengthElement(len); Byte extLenTypeCode = (Byte)(extLen.TypeCode << 4 | extLen.GetPListElementLength()); BaseStream.WriteByte(extLenTypeCode); extLen.WriteBinary(this); } element.WriteBinary(this); return elementIdx; }
/// <summary> /// Writers a <see cref="T:CE.iPhone.IPListElemnet"/> to the specified stream. /// </summary> /// <param name="stream">The stream.</param> /// <param name="element">The element.</param> public void Write(Stream stream, IPListElement element) { BaseStream = stream; Offsets = new List<int>(); BaseStream.Write(s_PListHeader, 0, s_PListHeader.Length); int elemCnt = element.GetPListElementCount(); if (elemCnt <= Byte.MaxValue) ElementIdxSize = sizeof(Byte); else if (elemCnt <= Int16.MaxValue) ElementIdxSize = sizeof(Int16); else ElementIdxSize = sizeof(Int32); int topOffestIdx = WriteInternal(element); elemCnt = Offsets.Count; int offsetTableOffset = (int)BaseStream.Position; Byte offsetSize = 0; if (offsetTableOffset <= Byte.MaxValue) offsetSize = sizeof(Byte); else if (offsetTableOffset <= Int16.MaxValue) offsetSize = sizeof(Int16); else offsetSize = sizeof(Int32); for (int i = 0; i < Offsets.Count; i++) { Byte[] buf = null; switch (offsetSize) { case 1: buf = new Byte[] { (Byte)Offsets[i] }; break; case 2: buf = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((Int16)Offsets[i])); break; case 4: buf = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((Int32)Offsets[i])); break; } BaseStream.Write(buf, 0, buf.Length); } //BaseStream.Write(s_PListHeader, 0, s_PListHeader.Length); Byte[] header = new Byte[32]; header[6] = offsetSize; header[7] = ElementIdxSize; BitConverter.GetBytes(IPAddress.HostToNetworkOrder(elemCnt)).CopyTo(header, 12); BitConverter.GetBytes(IPAddress.HostToNetworkOrder(topOffestIdx)).CopyTo(header, 20); BitConverter.GetBytes(IPAddress.HostToNetworkOrder(offsetTableOffset)).CopyTo(header, 28); BaseStream.Write(header, 0, header.Length); }
void DrawArrayContent(PListArray array) { int entryToRemove = -1; _indentLevel++; Color original = GUI.color; for (int ii = 0; ii < array.Count; ++ii) { var element = array[ii]; Style.IndentedHorizontalLine(Styling.ROW_COLOR, _indentLevel * INDENT_AMOUNT); EditorGUILayout.BeginHorizontal(); GUILayout.Space(_indentLevel * INDENT_AMOUNT); bool open = DrawFoldout(element); //item number string name = "Item " + ii; EditorGUILayout.LabelField(name, GUILayout.MinWidth(KEY_WIDTH), GUILayout.MaxWidth(KEY_WIDTH)); //type IPListElement value = TypeSelector(element); if (value != element) { RemoveFoldoutEntry(element); array[ii] = value; element = array[ii]; IsDirty = true; } //draw the value if (element is PListDictionary) { var d = element as PListDictionary; Style.MinWidthLabel("(" + d.Count + (d.Count == 1 ? " item)" : " items)"), 20); EditorGUILayout.Space(); } else if (element is PListArray) { var a = element as PListArray; Style.MinWidthLabel("(" + a.Count + (a.Count == 1 ? " item)" : " items)"), 20); EditorGUILayout.Space(); } else { DrawElement(element); } if (RemoveElement(name)) { entryToRemove = ii; IsDirty = true; } EditorGUILayout.EndHorizontal(); if (!open) { continue; } //if element is a dictionary or an array, draw its entries if (element is PListDictionary) { DrawDictionaryCommon(element as PListDictionary); } else if (element is PListArray) { DrawArrayContent(element as PListArray); } } GUI.color = original; if (AddElement()) { array.Add(new PListString()); IsDirty = true; } if (entryToRemove >= 0) { RemoveFoldoutEntry(array[entryToRemove]); array.RemoveAt(entryToRemove); } _indentLevel--; }
protected void RemoveFoldoutEntry(IPListElement element) { _foldouts.Remove(element.GetHashCode()); }
public void device_link_service_send(IPListElement plist) { PropertyListService.Send(this.sd, plist); }
/// <summary> /// Generates an object from its XML representation. /// </summary> /// <param name="reader">The <see cref="T:System.Xml.XmlReader"/> stream from which the object is deserialized.</param> public void ReadXml(XmlReader reader) { reader.ReadStartElement("plist"); Root = PListElementFactory.Instance.Create(reader.LocalName); Root.ReadXml(reader); reader.ReadEndElement(); }
public static string TypeName(this IPListElement element) { return(element.GetType().Name); }
/// <summary> /// Indicates whether the current object is equal to another object of the same type. /// </summary> /// <param name="other">An object to compare with this object.</param> /// <returns> /// true if the current object is equal to the <paramref name="other"/> parameter; otherwise, false. /// </returns> public bool Equals(IPListElement other) { return((other is PListElement <T>) && (Value.Equals(((PListElement <T>)other).Value))); }
protected override void DrawDictionaryCommon(PListDictionary dic) { _indentLevel++; string entryToRemove = ""; string keyToUpdate = ""; string newKeyValue = ""; string valueToUpdateKey = ""; IPListElement valueToUpdate = null; Color original = GUI.color; foreach (var kvp in dic) { Style.IndentedHorizontalLine(Styling.ROW_COLOR, _indentLevel * INDENT_AMOUNT); EditorGUILayout.BeginHorizontal(); GUILayout.Space(_indentLevel * INDENT_AMOUNT); bool open = DrawFoldout(kvp.Value); try { //draw the key EditorGUI.BeginChangeCheck(); string key = EditorGUILayout.TextField(kvp.Key, GUILayout.MinWidth(KEY_WIDTH), GUILayout.MaxWidth(KEY_WIDTH)); if (EditorGUI.EndChangeCheck()) { keyToUpdate = kvp.Key; newKeyValue = key; IsDirty = true; } //draw type selector IPListElement value = TypeSelector(kvp.Value); if (value != kvp.Value) { valueToUpdateKey = key; valueToUpdate = value; IsDirty = true; } } catch { Debug.LogError("EgoXproject: Failed to update key: " + kvp.Key); } //draw the value DrawElement(kvp.Value); if (RemoveElement(kvp.Key)) { entryToRemove = kvp.Key; IsDirty = true; } EditorGUILayout.EndHorizontal(); if (!open) { continue; } //if element is a dictionary or an array, draw its entries if (kvp.Value is PListDictionary) { DrawDictionaryCommon(kvp.Value as PListDictionary); } else if (kvp.Value is PListArray) { DrawArrayContent(kvp.Value as PListArray); } } GUI.color = original; //perform dictionary maintenance if (!string.IsNullOrEmpty(keyToUpdate)) { UpdateDictionaryKey(dic, keyToUpdate, newKeyValue); } if (!string.IsNullOrEmpty(valueToUpdateKey)) { RemoveFoldoutEntry(dic [valueToUpdateKey]); dic [valueToUpdateKey] = valueToUpdate; } if (!string.IsNullOrEmpty(entryToRemove)) { RemoveFoldoutEntry(dic [entryToRemove]); dic.Remove(entryToRemove); } if (AddElement()) { string newKeyName = "New Key"; int count = 1; while (dic.ContainsKey(newKeyName)) { newKeyName = "New Key " + count; count++; } dic.Add(newKeyName, new PListString()); IsDirty = true; } _indentLevel--; }