SessionRemoteException.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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 static bool IsResult(CustomLogReader reader)
  17. {
  18. return reader.IsNonEmptyElement("result");
  19. }
  20. internal static SessionRemoteException ReadResult(CustomLogReader areader)
  21. {
  22. SessionRemoteException e = null;
  23. if (areader.GetAttribute("success") == "false")
  24. {
  25. e = ReadMessages(areader);
  26. }
  27. return e;
  28. }
  29. internal static SessionRemoteException ReadFailure(CustomLogReader reader)
  30. {
  31. return ReadMessages(reader);
  32. }
  33. private static SessionRemoteException ReadMessages(CustomLogReader areader)
  34. {
  35. using (ElementLogReader reader = new ElementLogReader(areader))
  36. {
  37. string message = null;
  38. List<string> messages = new List<string>();
  39. bool inMessage = false;
  40. while (reader.Read(0))
  41. {
  42. if (reader.IsNonEmptyElement("message"))
  43. {
  44. inMessage = true;
  45. message = null;
  46. }
  47. else if (inMessage &&
  48. (reader.NodeType == XmlNodeType.Text))
  49. {
  50. message += reader.Value;
  51. }
  52. else if (inMessage &&
  53. reader.IsEndElement("message"))
  54. {
  55. messages.Add(message);
  56. message = null;
  57. inMessage = false;
  58. }
  59. }
  60. string error = string.Join(Environment.NewLine, messages.ToArray());
  61. return new SessionRemoteException(reader.Session, error);
  62. }
  63. }
  64. }
  65. }