ElementLogReader.cs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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 new InvalidOperationException("Cannot use ElementLogReader with non-element node or empty element");
  15. }
  16. _localName = _parentReader.Reader.LocalName;
  17. _depth = _parentReader.Reader.Depth;
  18. _read = false;
  19. }
  20. public override void Dispose()
  21. {
  22. using (Session.Logger.CreateCallstack())
  23. {
  24. try
  25. {
  26. ReadToEnd(0);
  27. }
  28. catch (Exception)
  29. {
  30. // swallow
  31. Session.Logger.WriteLine("Swallowing exception");
  32. }
  33. }
  34. base.Dispose();
  35. }
  36. public override bool Read(LogReadFlags flags)
  37. {
  38. if (_read)
  39. {
  40. throw new InvalidOperationException("Element already read to the end");
  41. }
  42. bool result = _parentReader.Read(flags);
  43. if (result &&
  44. IsEndElement(_localName) &&
  45. (Depth == _depth))
  46. {
  47. result = false;
  48. _read = true;
  49. }
  50. return result;
  51. }
  52. public void ReadToEnd(LogReadFlags flags)
  53. {
  54. using (Session.Logger.CreateCallstack())
  55. {
  56. if (!_read)
  57. {
  58. while (Read(flags))
  59. {
  60. }
  61. }
  62. }
  63. }
  64. internal override XmlReader Reader
  65. {
  66. get { return _parentReader.Reader; }
  67. }
  68. private readonly CustomLogReader _parentReader;
  69. private readonly string _localName;
  70. private readonly int _depth;
  71. protected bool _read;
  72. }
  73. }