1
0
mirror of https://github.com/winscp/winscp.git synced 2026-10-24 02:28:55 +03:00
Files
winscp/dotnet/internal/ElementLogReader.cs
Martin Prikryl 4e798aa1c4 Applying some code analyzer suggestions
Source commit: 2236553766f964d4e7580e5576822f423596e337
2020-11-28 00:55:55 +01:00

92 lines
2.6 KiB
C#

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 readonly string _token;
}
}