You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

100 lines
3.0 KiB
C#

namespace Renci.SshNet.Messages.Transport
{
/// <summary>
/// Represents SSH_MSG_DISCONNECT message.
/// </summary>
[Message("SSH_MSG_DISCONNECT", 1)]
public class DisconnectMessage : Message, IKeyExchangedAllowed
{
private byte[] _description;
private byte[] _language;
/// <summary>
/// Gets disconnect reason code.
/// </summary>
public DisconnectReason ReasonCode { get; private set; }
/// <summary>
/// Gets disconnect description.
/// </summary>
public string Description
{
get { return Utf8.GetString(_description, 0, _description.Length); }
private set { _description = Utf8.GetBytes(value); }
}
/// <summary>
/// Gets message language.
/// </summary>
public string Language
{
get { return Utf8.GetString(_language, 0, _language.Length); }
private set { _language = Utf8.GetBytes(value); }
}
/// <summary>
/// Gets the size of the message in bytes.
/// </summary>
/// <value>
/// The size of the messages in bytes.
/// </value>
protected override int BufferCapacity
{
get
{
var capacity = base.BufferCapacity;
capacity += 4; // ReasonCode
capacity += 4; // Description length
capacity += _description.Length; // Description
capacity += 4; // Language length
capacity += _language.Length; // Language
return capacity;
}
}
/// <summary>
/// Initializes a new instance of the <see cref="DisconnectMessage"/> class.
/// </summary>
public DisconnectMessage()
{
}
/// <summary>
/// Initializes a new instance of the <see cref="DisconnectMessage"/> class.
/// </summary>
/// <param name="reasonCode">The reason code.</param>
/// <param name="message">The message.</param>
public DisconnectMessage(DisconnectReason reasonCode, string message)
{
ReasonCode = reasonCode;
Description = message;
Language = "en";
}
/// <summary>
/// Called when type specific data need to be loaded.
/// </summary>
protected override void LoadData()
{
ReasonCode = (DisconnectReason) ReadUInt32();
_description = ReadBinary();
_language = ReadBinary();
}
/// <summary>
/// Called when type specific data need to be saved.
/// </summary>
protected override void SaveData()
{
Write((uint) ReasonCode);
WriteBinaryString(_description);
WriteBinaryString(_language);
}
internal override void Process(Session session)
{
session.OnDisconnectReceived(this);
}
}
}