123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- using System;
- using System.Xml;
- namespace WinSCP
- {
- internal class ElementLogReader : CustomLogReader
- {
- public ElementLogReader(CustomLogReader parentReader) :
- base(parentReader.Session)
- {
- _parentReader = parentReader;
- if ((NodeType != XmlNodeType.Element) ||
- IsEmptyElement)
- {
- throw 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 new InvalidOperationException("Element already read to the end");
- }
- bool result = _parentReader.Read(flags);
- if (result &&
- IsEndElement(_localName) &&
- (Depth == _depth))
- {
- result = false;
- _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;
- }
- }
|