/// <summary> /// Reads the tags.dat file. /// </summary> /// <param name="reader">The stream to read from.</param> private void Load(BinaryReader reader) { // Read file header reader.BaseStream.Position = 0x4; var tagListOffset = reader.ReadInt32(); // 0x4 uint32 offset table offset var tagCount = reader.ReadInt32(); // 0x8 uint32 number of tags reader.BaseStream.Position = 0x10; Timestamp = reader.ReadInt64(); // 0x10 FILETIME timestamp // Read tag offset list var headerOffsets = new uint[tagCount]; reader.BaseStream.Position = tagListOffset; for (var i = 0; i < tagCount; i++) headerOffsets[i] = reader.ReadUInt32(); // Read each tag for (var i = 0; i < tagCount; i++) { if (headerOffsets[i] == 0) { // Offset of 0 = null tag _tags.Add(null); continue; } var tag = new TagInstance(i) { HeaderOffset = headerOffsets[i] }; _tags.Add(tag); reader.BaseStream.Position = tag.HeaderOffset; tag.ReadHeader(reader); } }
/// <summary> /// Overwrites a tag's raw data, including its header. /// </summary> /// <param name="stream">The stream to write to.</param> /// <param name="tag">The tag to overwrite.</param> /// <param name="data">The data to overwrite the tag with.</param> /// <exception cref="System.ArgumentNullException">tag</exception> public void SetTagDataRaw(Stream stream, TagInstance tag, byte[] data) { if (tag == null) throw new ArgumentNullException(nameof(tag)); // Ensure the data fits if (tag.HeaderOffset < 0) tag.HeaderOffset = GetNewTagOffset(tag.Index); ResizeBlock(stream, tag, tag.HeaderOffset, tag.TotalSize, data.Length); tag.TotalSize = data.Length; // Write the data stream.Position = tag.HeaderOffset; stream.Write(data, 0, data.Length); // Re-parse it stream.Position = tag.HeaderOffset; tag.ReadHeader(new BinaryReader(stream)); UpdateTagOffsets(new BinaryWriter(stream)); }