/// <summary> /// Write the data of this chunk. /// </summary> protected override void WriteData(ResWriter writer) { // Create offset marks var offsetMarks = new List <Mark.Int32>(); foreach (var entry in parent.Entries) { var mark = writer.MarkInt32(); offsetMarks.Add(mark); EntryInstance instance; if (!entry.TryGetInstance(this, out instance)) { mark.Value = NO_ENTRY; } } // Write entries, update offset marks while we go. var startPosition = writer.Position; for (var i = 0; i < parent.EntryCount; i++) { var entry = parent.GetEntry(i); EntryInstance instance; if (!entry.TryGetInstance(this, out instance)) { continue; } // Update mark offsetMarks[i].Value = writer.Position - startPosition; instance.Write(writer); } }
/// <summary> /// Write the data of this chunk. /// </summary> protected override void WriteData(ResWriter writer) { base.WriteData(writer); var flags = entries.Select(x => x.Flags).ToArray(); writer.WriteIntArray(flags.ToArray()); }
/// <summary> /// Write the header of this chunk. /// Always call the base method first. /// </summary> protected sealed override void WriteHeader(ResWriter writer) { base.WriteHeader(writer); writer.WriteInt32(LineNumber); StringPoolRef.Write(writer, tree.StringPool, Comment); // Extended data (in derived types) is not part of the header }
/// <summary> /// Write this chunk. /// </summary> public void Write(ResWriter writer) { // Prepare PrepareForWrite(); // First pass var position = writer.Stream.Position; WriteHeader(writer); headerSize = (int)(writer.Stream.Position - position); WriteData(writer); var endPosition = writer.Stream.Position; size = (int)(endPosition - position); if ((size & 0x03) != 0) { } // Update header writer.Stream.Position = position + 2; writer.WriteUInt16(headerSize); writer.WriteInt32(size); writer.Stream.Position = endPosition; }
/// <summary> /// Write the data of this chunk. /// </summary> protected override void WriteData(ResWriter writer) { base.WriteData(writer); strings.Write(writer); resourceMap.Write(writer); nodes.ForEach(x => x.Write(writer)); }
/// <summary> /// Write the data of this chunk. /// </summary> protected override void WriteData(ResWriter writer) { byte[] data; int[] offsets; BuildStringsData(list, IsUtf8, writer, out offsets, out data); writer.WriteIntArray(offsets); writer.WriteByteArray(data); }
/// <summary> /// Write the header of this chunk. /// Always call the base method first. /// </summary> protected override void WriteHeader(ResWriter writer) { base.WriteHeader(writer); writer.WriteByte(id); writer.WriteByte(0); // res0 writer.WriteUInt16(0); // res1 writer.WriteInt32(entries.Count); // entryCount }
/// <summary> /// Encode a length in charsize=1 mode /// </summary> private static void EncodeLength8(ResWriter writer, int length) { if (length > 0x7F) { // use 2 bytes writer.WriteByte(0x80 | ((length >> 8) & 0x7F)); } writer.WriteByte(length & 0x7F); }
/// <summary> /// Encode a length in charsize=3 mode /// </summary> private static void EncodeLength16(ResWriter writer, int length) { if (length > 0x7FFF) { // use 2 chars writer.WriteUInt16(0x8000 | ((length >> 16) & 0x7FFF)); } writer.WriteUInt16(length & 0x7FFF); }
/// <summary> /// Write this chunk. /// </summary> public void Write(ResWriter writer) { var size = 8; writer.WriteUInt16(size); writer.Fill(1); // res0 writer.WriteByte((int)type); writer.WriteInt32(data); }
/// <summary> /// Write this attribute. /// </summary> internal void Write(ResWriter writer) { StringPoolRef.Write(writer, tree.StringPool, Namespace); StringPoolRef.Write(writer, tree.StringPool, Name, resourceId); StringPoolRef.Write(writer, tree.StringPool, RawValue); var value = TypedValue ?? new Value(Value.Types.TYPE_STRING, tree.StringPool.Get(RawValue, -1)); value.Write(writer); }
/// <summary> /// Write the header of this chunk. /// Always call the base method first. /// </summary> protected override void WriteHeader(ResWriter writer) { headerStartPosition = writer.Position; base.WriteHeader(writer); writer.WriteInt32(id); writer.WriteFixedLenghtUnicodeString(name, 128); typeStringsMark = writer.MarkInt32(); writer.WriteInt32(typeStrings.Count); keyStringsMark = writer.MarkInt32(); writer.WriteInt32(KeyStrings.Count); }
/// <summary> /// Write the data of this chunk. /// </summary> protected override void WriteData(ResWriter writer) { base.WriteData(writer); writer.WriteUInt16(20); // attributeStart writer.WriteUInt16(20); // attributeSize writer.WriteUInt16(attributes.Count); // attributeCount writer.WriteUInt16(IndexOf("id")); writer.WriteUInt16(IndexOf("class")); writer.WriteUInt16(IndexOf("style")); foreach (var attr in attributes) { attr.Write(writer); } }
/// <summary> /// Write the header of this chunk. /// Always call the base method first. /// </summary> protected override void WriteHeader(ResWriter writer) { base.WriteHeader(writer); // header writer.WriteInt32(Count); // stringCount writer.WriteInt32(0); // styleCount var flags = (StringPoolFlags)0; if (IsUtf8) { flags |= StringPoolFlags.UTF8_FLAG; } writer.WriteInt32((int)flags); // flags writer.WriteInt32(28 + Count * 4); // stringsStart writer.WriteInt32(0); // stylesStart }
/// <summary> /// Write the header of this chunk. /// Always call the base method first. /// </summary> protected override void WriteHeader(ResWriter writer) { var startPosition = writer.Position; base.WriteHeader(writer); writer.WriteByte(parent.Id); writer.WriteByte(0); // res0 writer.WriteUInt16(0); // res1 writer.WriteInt32(parent.EntryCount); // entryCount var entriesStartMark = writer.MarkInt32(); // entriesStart configuration.Write(writer); // Patch entriesStart entriesStartMark.Value = (writer.Position - startPosition) + (parent.EntryCount * 4); }
/// <summary> /// Write the data of this chunk. /// </summary> protected override void WriteData(ResWriter writer) { base.WriteData(writer); typeStringsMark.Value = writer.Position - headerStartPosition; typeStrings.Write(writer); keyStringsMark.Value = writer.Position - headerStartPosition; keyStrings.Write(writer); // Write typeSpecs and types foreach (var typeSpec in typeSpecs) { typeSpec.Write(writer); foreach (var typeAndFlags in typeSpec.Types) { typeAndFlags.Write(writer); } } }
/// <summary> /// Encode a string data array. /// </summary> private static void BuildStringsData(List <Entry> list, bool isUtf8, ResWriter writer, out int[] offsets, out byte[] data) { // Build offsets offsets = new int[list.Count]; // Build data var dataStream = new MemoryStream(); var dataWriter = new ResWriter(dataStream, writer.BigEndian); for (var i = 0; i < list.Count; i++) { var s = list[i].Value; offsets[i] = (int)dataStream.Position; if (isUtf8) { EncodeLength8(dataWriter, s.Length); // u16 length var encoded = AndroidEncodings.UTF8.GetBytes(s); EncodeLength8(dataWriter, encoded.Length); dataStream.Write(encoded, 0, encoded.Length); } else { EncodeLength16(dataWriter, s.Length); foreach (var ch in s) { dataWriter.WriteUInt16(ch); } dataWriter.WriteUInt16(0); // Pad with '\0' } } // Pad with '0' to end on 4 byte boundary dataWriter.PadAlign(4); // Return actual data data = dataStream.ToArray(); }
/// <summary> /// Write the header of this chunk. /// Always call the base method first. /// </summary> protected virtual void WriteHeader(ResWriter writer) { writer.WriteUInt16((int)type); writer.WriteUInt16(0); // Header size will be updated later writer.WriteInt32(0); // Size will be updated later }
/// <summary> /// Write the data of this chunk. /// </summary> protected override void WriteData(ResWriter writer) { base.WriteData(writer); StringPoolRef.Write(writer, Tree.StringPool, Data); TypedData.Write(writer); }
/// <summary> /// Write this entry. /// </summary> internal override void Write(ResWriter writer) { base.Write(writer); value.Write(writer); }
/// <summary> /// Write this entry. /// </summary> internal virtual void Write(ResWriter writer) { writer.WriteUInt16(IsComplex ? 16 : 8); writer.WriteUInt16((int)flags); StringPoolRef.Write(writer, parent.TypeSpec.Package.KeyStrings, key); }
/// <summary> /// Write the header of this chunk. /// Always call the base method first. /// </summary> protected override void WriteHeader(ResWriter writer) { base.WriteHeader(writer); writer.WriteInt32(packages.Count); // packageCount }
/// <summary> /// Write the data of this chunk. /// </summary> protected override void WriteData(ResWriter writer) { base.WriteData(writer); strings.Write(writer); packages.ForEach(x => x.Write(writer)); }
/// <summary> /// Write the data of this chunk. /// </summary> protected virtual void WriteData(ResWriter writer) { // Override me }
/// <summary> /// Read a 32-bit unsigned int from the given offset. /// </summary> private void SetInt32(int offset, int value) { ResWriter.EncodeInt32(data, offset, value, UseBigEndian); }
/// <summary> /// Save to given writer /// </summary> internal void Write(ResWriter writer) { writer.WriteInt32(data.Length + 4); writer.WriteByteArray(data); }
/// <summary> /// Write the data of this chunk. /// </summary> protected override void WriteData(ResWriter writer) { base.WriteData(writer); writer.WriteIntArray(resourceIds.ToArray()); }