DisconnectMessage.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. namespace Renci.SshNet.Messages.Transport
  2. {
  3. /// <summary>
  4. /// Represents SSH_MSG_DISCONNECT message.
  5. /// </summary>
  6. [Message("SSH_MSG_DISCONNECT", 1)]
  7. public class DisconnectMessage : Message, IKeyExchangedAllowed
  8. {
  9. private byte[] _description;
  10. private byte[] _language;
  11. /// <summary>
  12. /// Gets disconnect reason code.
  13. /// </summary>
  14. public DisconnectReason ReasonCode { get; private set; }
  15. /// <summary>
  16. /// Gets disconnect description.
  17. /// </summary>
  18. public string Description
  19. {
  20. get { return Utf8.GetString(_description, 0, _description.Length); }
  21. private set { _description = Utf8.GetBytes(value); }
  22. }
  23. /// <summary>
  24. /// Gets message language.
  25. /// </summary>
  26. public string Language
  27. {
  28. get { return Utf8.GetString(_language, 0, _language.Length); }
  29. private set { _language = Utf8.GetBytes(value); }
  30. }
  31. /// <summary>
  32. /// Gets the size of the message in bytes.
  33. /// </summary>
  34. /// <value>
  35. /// The size of the messages in bytes.
  36. /// </value>
  37. protected override int BufferCapacity
  38. {
  39. get
  40. {
  41. var capacity = base.BufferCapacity;
  42. capacity += 4; // ReasonCode
  43. capacity += 4; // Description length
  44. capacity += _description.Length; // Description
  45. capacity += 4; // Language length
  46. capacity += _language.Length; // Language
  47. return capacity;
  48. }
  49. }
  50. /// <summary>
  51. /// Initializes a new instance of the <see cref="DisconnectMessage"/> class.
  52. /// </summary>
  53. public DisconnectMessage()
  54. {
  55. }
  56. /// <summary>
  57. /// Initializes a new instance of the <see cref="DisconnectMessage"/> class.
  58. /// </summary>
  59. /// <param name="reasonCode">The reason code.</param>
  60. /// <param name="message">The message.</param>
  61. public DisconnectMessage(DisconnectReason reasonCode, string message)
  62. {
  63. ReasonCode = reasonCode;
  64. Description = message;
  65. Language = "en";
  66. }
  67. /// <summary>
  68. /// Called when type specific data need to be loaded.
  69. /// </summary>
  70. protected override void LoadData()
  71. {
  72. ReasonCode = (DisconnectReason) ReadUInt32();
  73. _description = ReadBinary();
  74. _language = ReadBinary();
  75. }
  76. /// <summary>
  77. /// Called when type specific data need to be saved.
  78. /// </summary>
  79. protected override void SaveData()
  80. {
  81. Write((uint) ReasonCode);
  82. WriteBinaryString(_description);
  83. WriteBinaryString(_language);
  84. }
  85. internal override void Process(Session session)
  86. {
  87. session.OnDisconnectReceived(this);
  88. }
  89. }
  90. }