Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
            }
        }