private void ReadTagReference(DataBlock block, uint offset, bool withClass) { SeekToOffset(block, offset); DatumIndex index; int fixupOffset; bool valid; if (withClass) { // Class info - do a flexible structure read to get the index StructureValueCollection values = StructureReader.ReadStructure(_reader, _tagRefLayout); var classMagic = (int)values.GetInteger("class magic"); index = new DatumIndex(values.GetInteger("datum index")); fixupOffset = (int)offset + _tagRefLayout.GetFieldOffset("datum index"); valid = _cacheFile.Tags.IsValidIndex(index, classMagic); } else { // No tag class - the datum index is at the offset index = new DatumIndex(_reader.ReadUInt32()); fixupOffset = (int)offset; valid = _cacheFile.Tags.IsValidIndex(index); } if (valid) { // Add the tagref fixup to the block var fixup = new DataBlockTagFixup(index, fixupOffset); block.TagFixups.Add(fixup); ReferencedTags.Add(index); } }
private void ReadTagReference(DataBlock block, uint offset, bool withClass) { SeekToOffset(block, offset); DatumIndex index; int fixupOffset; bool valid; if (withClass) { // Class info - do a flexible structure read to get the index var values = StructureReader.ReadStructure(_reader, _tagRefLayout); var classMagic = (int) values.GetInteger("class magic"); index = new DatumIndex(values.GetInteger("datum index")); fixupOffset = (int) offset + _tagRefLayout.GetFieldOffset("datum index"); valid = _cacheFile.Tags.IsValidIndex(index); } else { // No tag class - the datum index is at the offset index = new DatumIndex(_reader.ReadUInt32()); fixupOffset = (int) offset; valid = _cacheFile.Tags.IsValidIndex(index); } if (!valid) return; // Add the tagref fixup to the block var fixup = new DataBlockTagFixup(index, fixupOffset); block.TagFixups.Add(fixup); ReferencedTags.Add(index); }