12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- 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 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("Element already read to the end"));
- }
- 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;
- }
- }
|