private void ReadStructs(BinaryReader reader) { var entriesOffset = reader.ReadUInt32(); var entriesCount = reader.ReadUInt32(); if (entriesCount == 0) { return; } reader.BaseStream.Position += entriesOffset - 8; // offset minus 2 ints we just read for (var i = 0; i < entriesCount; i++) { var diskStruct = new ResourceDiskStruct(); diskStruct.IntrospectionVersion = reader.ReadUInt32(); diskStruct.Id = reader.ReadUInt32(); diskStruct.Name = reader.ReadOffsetString(Encoding.UTF8); diskStruct.DiskCrc = reader.ReadUInt32(); diskStruct.UserVersion = reader.ReadInt32(); diskStruct.DiskSize = reader.ReadUInt16(); diskStruct.Alignment = reader.ReadUInt16(); diskStruct.BaseStructId = reader.ReadUInt32(); var fieldsOffset = reader.ReadUInt32(); var fieldsSize = reader.ReadUInt32(); // jump to fields if (fieldsSize > 0) { var prev = reader.BaseStream.Position; reader.BaseStream.Position += fieldsOffset - 8; // offset minus 2 ints we just read for (var y = 0; y < fieldsSize; y++) { var field = new ResourceDiskStruct.Field(); field.FieldName = reader.ReadOffsetString(Encoding.UTF8); field.Count = reader.ReadInt16(); field.OnDiskOffset = reader.ReadInt16(); var indirectionOffset = reader.ReadUInt32(); var indirectionSize = reader.ReadUInt32(); if (indirectionSize > 0) { // jump to indirections var prev2 = reader.BaseStream.Position; reader.BaseStream.Position += indirectionOffset - 8; // offset minus 2 ints we just read for (var x = 0; x < indirectionSize; x++) { field.Indirections.Add(reader.ReadByte()); } reader.BaseStream.Position = prev2; } field.TypeData = reader.ReadUInt32(); field.Type = (DataType)reader.ReadInt16(); reader.ReadBytes(2); // TODO: ???? diskStruct.FieldIntrospection.Add(field); } reader.BaseStream.Position = prev; } diskStruct.StructFlags = reader.ReadByte(); reader.ReadBytes(3); // TODO: ???? ReferencedStructs.Add(diskStruct); } }
private void ReadStructs(BinaryReader reader) { var entriesOffset = reader.ReadUInt32(); var entriesCount = reader.ReadUInt32(); if (entriesCount == 0) { return; } reader.BaseStream.Position += entriesOffset - 8; // offset minus 2 ints we just read for (var i = 0; i < entriesCount; i++) { var diskStruct = new ResourceDiskStruct(); diskStruct.IntrospectionVersion = reader.ReadUInt32(); diskStruct.Id = reader.ReadUInt32(); diskStruct.Name = reader.ReadOffsetString(Encoding.UTF8); diskStruct.DiskCrc = reader.ReadUInt32(); diskStruct.UserVersion = reader.ReadInt32(); diskStruct.DiskSize = reader.ReadUInt16(); diskStruct.Alignment = reader.ReadUInt16(); diskStruct.BaseStructId = reader.ReadUInt32(); var fieldsOffset = reader.ReadUInt32(); var fieldsSize = reader.ReadUInt32(); // jump to fields if (fieldsSize > 0) { var prev = reader.BaseStream.Position; reader.BaseStream.Position += fieldsOffset - 8; // offset minus 2 ints we just read for (var y = 0; y < fieldsSize; y++) { var field = new ResourceDiskStruct.Field(); field.FieldName = reader.ReadOffsetString(Encoding.UTF8); field.Count = reader.ReadInt16(); field.OnDiskOffset = reader.ReadInt16(); var indirectionOffset = reader.ReadUInt32(); var indirectionSize = reader.ReadUInt32(); if (indirectionSize > 0) { // jump to indirections var prev2 = reader.BaseStream.Position; reader.BaseStream.Position += indirectionOffset - 8; // offset minus 2 ints we just read for (var x = 0; x < indirectionSize; x++) { field.Indirections.Add(reader.ReadByte()); } reader.BaseStream.Position = prev2; } field.TypeData = reader.ReadUInt32(); field.Type = (DataType)reader.ReadInt16(); reader.ReadBytes(2); // TODO: ???? diskStruct.FieldIntrospection.Add(field); } reader.BaseStream.Position = prev; } diskStruct.StructFlags = reader.ReadByte(); reader.ReadBytes(3); // TODO: ???? ReferencedStructs.Add(diskStruct); } }