ElementLogReader.cs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. using System;
  2. using System.Xml;
  3. namespace WinSCP
  4. {
  5. internal class ElementLogReader : CustomLogReader
  6. {
  7. public ElementLogReader(CustomLogReader parentReader) :
  8. base(parentReader.Session)
  9. {
  10. _parentReader = parentReader;
  11. if ((NodeType != XmlNodeType.Element) ||
  12. IsEmptyElement)
  13. {
  14. throw Session.Logger.WriteException(new InvalidOperationException("Cannot use ElementLogReader with non-element node or empty element"));
  15. }
  16. _localName = _parentReader.Reader.LocalName;
  17. _depth = _parentReader.Reader.Depth;
  18. _token = _localName + "@" + _depth;
  19. _read = false;
  20. }
  21. public override void Dispose()
  22. {
  23. using (Session.Logger.CreateCallstack(_token))
  24. {
  25. try
  26. {
  27. ReadToEnd(0);
  28. }
  29. catch (Exception)
  30. {
  31. // swallow
  32. Session.Logger.WriteLine("Swallowing exception");
  33. }
  34. }
  35. base.Dispose();
  36. }
  37. public override bool Read(LogReadFlags flags)
  38. {
  39. if (_read)
  40. {
  41. throw Session.Logger.WriteException(new InvalidOperationException("Element already read to the end"));
  42. }
  43. bool result = _parentReader.Read(flags);
  44. if (result &&
  45. IsEndElement(_localName) &&
  46. (Depth == _depth))
  47. {
  48. result = false;
  49. Session.Logger.WriteLineLevel(1, "Element {0} read to the end", _token);
  50. _read = true;
  51. }
  52. return result;
  53. }
  54. public void ReadToEnd(LogReadFlags flags)
  55. {
  56. using (Session.Logger.CreateCallstack(_token))
  57. {
  58. if (!_read)
  59. {
  60. while (Read(flags))
  61. {
  62. }
  63. }
  64. }
  65. }
  66. internal override XmlReader Reader
  67. {
  68. get { return _parentReader.Reader; }
  69. }
  70. private readonly CustomLogReader _parentReader;
  71. private readonly string _localName;
  72. private readonly int _depth;
  73. protected bool _read;
  74. private string _token;
  75. }
  76. }