| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 | using System;using System.Globalization;using System.Xml;namespace WinSCP{    internal class ElementLogReader : CustomLogReader    {        public ElementLogReader(CustomLogReader parentReader) :            base(parentReader.Session)        {            _parentReader = parentReader;            if ((NodeType != XmlNodeType.Element) ||                IsEmptyElement)            {                throw Session.Logger.WriteException(new InvalidOperationException("Cannot use ElementLogReader with non-element node or empty element"));            }            _localName = _parentReader.Reader.LocalName;            _depth = _parentReader.Reader.Depth;            _token = _localName + "@" + _depth;            _read = false;        }        public override void Dispose()        {            using (Session.Logger.CreateCallstack(_token))            {                try                {                    ReadToEnd(0);                }                catch (Exception)                {                    // swallow                    Session.Logger.WriteLine("Swallowing exception");                }            }            base.Dispose();        }        public override bool Read(LogReadFlags flags)        {            if (_read)            {                throw Session.Logger.WriteException(                    new InvalidOperationException(                        string.Format(CultureInfo.CurrentCulture, "Element {0} already read to the end", _token)));            }            bool result = _parentReader.Read(flags);            if (result &&                IsEndElement(_localName) &&                (Depth == _depth))            {                result = false;                Session.Logger.WriteLineLevel(1, "Element {0} read to the end", _token);                _read = true;            }            return result;        }        public void ReadToEnd(LogReadFlags flags)        {            using (Session.Logger.CreateCallstack(_token))            {                if (!_read)                {                    while (Read(flags))                    {                    }                }            }        }        internal override XmlReader Reader        {            get { return _parentReader.Reader; }        }        private readonly CustomLogReader _parentReader;        private readonly string _localName;        private readonly int _depth;        protected bool _read;        private string _token;    }}
 |