File: System\IO\Packaging\XmlWrappingReader.cs
Web Access
Project: src\src\libraries\System.IO.Packaging\src\System.IO.Packaging.csproj (System.IO.Packaging)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Xml;
using System.Xml.Schema;
 
namespace System.IO.Packaging
{
    internal class XmlWrappingReader : XmlReader, IXmlLineInfo, IXmlNamespaceResolver
    {
        protected XmlReader _reader;
        protected IXmlLineInfo? _readerAsIXmlLineInfo;
        protected IXmlNamespaceResolver? _readerAsResolver;
 
        internal XmlWrappingReader(XmlReader baseReader)
        {
            Debug.Assert(baseReader != null);
            Reader = baseReader;
        }
 
        public override XmlReaderSettings? Settings { get { return _reader.Settings; } }
        public override XmlNodeType NodeType { get { return _reader.NodeType; } }
        public override string Name { get { return _reader.Name; } }
        public override string LocalName { get { return _reader.LocalName; } }
        public override string NamespaceURI { get { return _reader.NamespaceURI; } }
        public override string Prefix { get { return _reader.Prefix; } }
        public override bool HasValue { get { return _reader.HasValue; } }
        public override string Value { get { return _reader.Value; } }
        public override int Depth { get { return _reader.Depth; } }
        public override string BaseURI { get { return _reader.BaseURI; } }
        public override bool IsEmptyElement { get { return _reader.IsEmptyElement; } }
        public override bool IsDefault { get { return _reader.IsDefault; } }
        public override XmlSpace XmlSpace { get { return _reader.XmlSpace; } }
        public override string XmlLang { get { return _reader.XmlLang; } }
        public override System.Type ValueType { get { return _reader.ValueType; } }
        public override int AttributeCount { get { return _reader.AttributeCount; } }
        public override string this[int i] { get { return _reader[i]; } }
        public override string? this[string name] { get { return _reader[name]; } }
        public override string? this[string name, string? namespaceURI] { get { return _reader[name, namespaceURI]; } }
        public override bool CanResolveEntity { get { return _reader.CanResolveEntity; } }
        public override bool EOF { get { return _reader.EOF; } }
        public override ReadState ReadState { get { return _reader.ReadState; } }
        public override bool HasAttributes { get { return _reader.HasAttributes; } }
        public override XmlNameTable NameTable { get { return _reader.NameTable; } }
 
        public override string? GetAttribute(string name)
        {
            return _reader.GetAttribute(name);
        }
 
        public override string? GetAttribute(string name, string? namespaceURI)
        {
            return _reader.GetAttribute(name, namespaceURI);
        }
 
        public override string GetAttribute(int i)
        {
            return _reader.GetAttribute(i);
        }
 
        public override bool MoveToAttribute(string name)
        {
            return _reader.MoveToAttribute(name);
        }
 
        public override bool MoveToAttribute(string name, string? ns)
        {
            return _reader.MoveToAttribute(name, ns);
        }
 
        public override void MoveToAttribute(int i)
        {
            _reader.MoveToAttribute(i);
        }
 
        public override bool MoveToFirstAttribute()
        {
            return _reader.MoveToFirstAttribute();
        }
 
        public override bool MoveToNextAttribute()
        {
            return _reader.MoveToNextAttribute();
        }
 
        public override bool MoveToElement()
        {
            return _reader.MoveToElement();
        }
 
        public override bool Read()
        {
            return _reader.Read();
        }
 
        public override void Skip()
        {
            _reader.Skip();
        }
 
        public override string? LookupNamespace(string prefix)
        {
            return _reader.LookupNamespace(prefix);
        }
 
        string? IXmlNamespaceResolver.LookupPrefix(string namespaceName)
        {
            return _readerAsResolver?.LookupPrefix(namespaceName);
        }
 
        IDictionary<string, string> IXmlNamespaceResolver.GetNamespacesInScope(XmlNamespaceScope scope)
        {
            return _readerAsResolver?.GetNamespacesInScope(scope)!;
        }
 
        public override void ResolveEntity()
        {
            _reader.ResolveEntity();
        }
 
        public override bool ReadAttributeValue()
        {
            return _reader.ReadAttributeValue();
        }
 
        //
        // IDisposable interface
        //
        protected override void Dispose(bool disposing)
        {
            try
            {
                if (disposing)
                {
                    ((IDisposable)_reader).Dispose();
                }
            }
            finally
            {
                base.Dispose(disposing);
            }
        }
 
        //
        // IXmlLineInfo members
        //
        public virtual bool HasLineInfo()
        {
            return (_readerAsIXmlLineInfo == null) ? false : _readerAsIXmlLineInfo.HasLineInfo();
        }
 
        public virtual int LineNumber
        {
            get
            {
                return (_readerAsIXmlLineInfo == null) ? 0 : _readerAsIXmlLineInfo.LineNumber;
            }
        }
 
        public virtual int LinePosition
        {
            get
            {
                return (_readerAsIXmlLineInfo == null) ? 0 : _readerAsIXmlLineInfo.LinePosition;
            }
        }
 
        protected XmlReader Reader
        {
            get
            {
                return _reader;
            }
            [MemberNotNull(nameof(_reader))]
            set
            {
                _reader = value;
                _readerAsIXmlLineInfo = value as IXmlLineInfo;
                _readerAsResolver = value as IXmlNamespaceResolver;
            }
        }
    }
}