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;
 }
Example #2
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);
        }
        /// <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;
        }