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; }
/// <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; }