Exemple #1
0
        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);
		}