/// <summary> /// Reads the tags.dat file. /// </summary> /// <param name="reader">The stream to read from.</param> /// <param name="names">The dictionary of tag instance names.</param> private void Load(BinaryReader reader, Dictionary <int, string> names) { // 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; } string name = null; if (names.ContainsKey(i)) { name = names[i]; } var tag = new CachedTagInstance(i, name) { 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, CachedTagInstance 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)); }