SessionRemoteException.cs 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Runtime.InteropServices;
  4. using System.Xml;
  5. namespace WinSCP
  6. {
  7. [Guid("0E8BBC73-AF4D-4E7E-995C-EB89D0BFDE9A")]
  8. [ClassInterface(Constants.ClassInterface)]
  9. [ComVisible(true)]
  10. public sealed class SessionRemoteException : SessionException
  11. {
  12. internal SessionRemoteException(Session session, string message) :
  13. base(session, message)
  14. {
  15. }
  16. internal SessionRemoteException(Session session, string message, Exception innerException) :
  17. base(session, message, innerException)
  18. {
  19. }
  20. internal static bool IsResult(CustomLogReader reader)
  21. {
  22. return reader.IsNonEmptyElement("result");
  23. }
  24. internal static SessionRemoteException ReadResult(CustomLogReader areader)
  25. {
  26. SessionRemoteException e = null;
  27. if (areader.GetAttribute("success") == "false")
  28. {
  29. e = ReadMessages(areader);
  30. }
  31. return e;
  32. }
  33. internal static SessionRemoteException ReadFailure(CustomLogReader reader)
  34. {
  35. return ReadMessages(reader);
  36. }
  37. private static SessionRemoteException ReadMessages(CustomLogReader areader)
  38. {
  39. using (ElementLogReader reader = new ElementLogReader(areader))
  40. {
  41. string error = null;
  42. string message = null;
  43. List<string> messages = new List<string>();
  44. bool inMessage = false;
  45. while (reader.Read(0))
  46. {
  47. if (reader.IsNonEmptyElement("message"))
  48. {
  49. inMessage = true;
  50. message = null;
  51. }
  52. else if (inMessage &&
  53. (reader.NodeType == XmlNodeType.Text))
  54. {
  55. message += reader.Value;
  56. }
  57. else if (inMessage &&
  58. reader.IsEndElement("message"))
  59. {
  60. if (error == null)
  61. {
  62. error = message;
  63. }
  64. else
  65. {
  66. messages.Add(message);
  67. }
  68. message = null;
  69. inMessage = false;
  70. }
  71. }
  72. Exception inner = null;
  73. if (messages.Count > 0)
  74. {
  75. inner = new SessionRemoteException(reader.Session, string.Join(Environment.NewLine, messages.ToArray()));
  76. }
  77. return new SessionRemoteException(reader.Session, error, inner);
  78. }
  79. }
  80. }
  81. }