Пример #1
0
 public void ReadXml(XmlReader reader)
 {
     reader.ReadStartElement("plist");
     this.Root = PListElementFactory.Instance.Create(reader.LocalName);
     this.Root.ReadXml(reader);
     reader.ReadEndElement();
 }
Пример #2
0
 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;
 }
Пример #3
0
        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("发送数据失败");
            }
        }
Пример #4
0
        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);
        }
Пример #5
0
 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);
     }
 }
Пример #6
0
        /// <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);
        }
Пример #7
0
        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());
        }
Пример #8
0
        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);
        }
Пример #9
0
        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);
        }
Пример #10
0
        /// <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);
        }
Пример #11
0
        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);
        }
Пример #12
0
 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);
 }
Пример #13
0
        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);
        }
Пример #14
0
        /// <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);
        }
Пример #15
0
        /// <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);
        }
Пример #16
0
 public bool Equals(IPListElement other)
 {
     return(other is PListElement <T> && this.Value.Equals((object)((PListElement <T>)other).Value));
 }
Пример #17
0
        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);
        }
Пример #18
0
        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);
        }
Пример #19
0
        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;
 }
Пример #21
0
        /// <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;
        }
Пример #22
0
        /// <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);
        }
Пример #23
0
        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--;
        }
Пример #24
0
 protected void RemoveFoldoutEntry(IPListElement element)
 {
     _foldouts.Remove(element.GetHashCode());
 }
Пример #25
0
 public void device_link_service_send(IPListElement plist)
 {
     PropertyListService.Send(this.sd, plist);
 }
Пример #26
0
        /// <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);
 }
Пример #28
0
 /// <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)));
 }
Пример #29
0
        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--;
        }