public Attribute(long recordPosition, BinaryReader dataStream, ChunkInfo chunk) { var l = LogManager.GetLogger("Attribute"); RecordPosition = recordPosition; //we need the size of the attribute dataStream.BaseStream.Seek(-5, SeekOrigin.Current); Size = dataStream.ReadInt32(); var op = dataStream.ReadByte(); Trace.Assert(op == 6 || op == 0x46, $"op is 0x{op:X}"); var nameOffset = dataStream.ReadUInt32(); var nameElement = chunk.GetStringTableEntry(nameOffset); Name = nameElement.Value; if (nameOffset > recordPosition) { dataStream.BaseStream.Seek(nameElement.Size, SeekOrigin.Current); } AttributeInfo = TagBuilder.BuildTag(recordPosition, dataStream, chunk); switch (AttributeInfo) { case NormalSubstitution nsv: case OptionalSubstitution osv: //this will be substituted when actually populating the record with record data break; case Value vv: Value = vv.ValueData; break; default: throw new Exception( $"Unknown attribute info ({AttributeInfo.GetType()})! Please send the file to [email protected]"); } l.Trace(this); }
public OpenStartElementTag(long recordPosition, BinaryReader dataStream, ChunkInfo chunk, bool hasAttribute) { var l = LogManager.GetLogger("BuildTag"); _chunk = chunk; RecordPosition = recordPosition; Nodes = new List <IBinXml>(); Attributes = new List <Attribute>(); SubstitutionSlot = dataStream.ReadInt16(); Size = dataStream.ReadInt32(); var startPos = dataStream.BaseStream.Position; var elementOffset = dataStream.ReadUInt32(); Name = chunk.GetStringTableEntry(elementOffset); var subinfo = string.Empty; if (SubstitutionSlot > -1) { subinfo = $", Substitution Slot: {SubstitutionSlot}"; } if (elementOffset > recordPosition + startPos) { dataStream.BaseStream.Seek(Name.Size, SeekOrigin.Current); } if (hasAttribute) { var attrSize = dataStream.ReadInt32(); var attrStartPos = dataStream.BaseStream.Position; while (dataStream.BaseStream.Position < attrStartPos + attrSize) { var attrTag = TagBuilder.BuildTag(recordPosition, dataStream, chunk); if (attrTag is Attribute attribute) { Attributes.Add(attribute); } } } var i = TagBuilder.BuildTag(recordPosition, dataStream, chunk); if (i is EndOfBXmlStream) { l.Warn($"Unexpected data at offset 0x{(chunk.AbsoluteOffset+recordPosition+dataStream.BaseStream.Position):X}! This usually means the record is corrupt or incomplete!"); return; } Trace.Assert(i is CloseStartElementTag || i is CloseEmptyElementTag, $"I didn't get a CloseStartElementTag: {i.GetType()}"); Nodes.Add(i); var att = string.Empty; if (Attributes.Count > 0) { att = $", attributes: {string.Join(" | ", Attributes)}"; } l.Trace($"Name: {Name.Value}{subinfo}{att}"); while (dataStream.BaseStream.Position < startPos + Size) { var n = TagBuilder.BuildTag(recordPosition, dataStream, chunk); Nodes.Add(n); } }