ChannelRequestMessage.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. namespace Renci.SshNet.Messages.Connection
  2. {
  3. /// <summary>
  4. /// Represents SSH_MSG_CHANNEL_REQUEST message.
  5. /// </summary>
  6. [Message("SSH_MSG_CHANNEL_REQUEST", 98)]
  7. public class ChannelRequestMessage : ChannelMessage
  8. {
  9. private string _requestName;
  10. private byte[] _requestNameBytes;
  11. /// <summary>
  12. /// Gets the name of the request.
  13. /// </summary>
  14. /// <value>
  15. /// The name of the request.
  16. /// </value>
  17. public string RequestName
  18. {
  19. get
  20. {
  21. return _requestName;
  22. }
  23. private set
  24. {
  25. _requestName = value;
  26. _requestNameBytes = Ascii.GetBytes(value);
  27. }
  28. }
  29. /// <summary>
  30. /// Gets channel request data.
  31. /// </summary>
  32. public byte[] RequestData { get; private set; }
  33. /// <summary>
  34. /// Gets the size of the message in bytes.
  35. /// </summary>
  36. /// <value>
  37. /// The size of the messages in bytes.
  38. /// </value>
  39. protected override int BufferCapacity
  40. {
  41. get
  42. {
  43. var capacity = base.BufferCapacity;
  44. capacity += 4; // RequestName length
  45. capacity += _requestNameBytes.Length; // RequestName
  46. capacity += RequestData.Length; // RequestData
  47. return capacity;
  48. }
  49. }
  50. /// <summary>
  51. /// Initializes a new instance of the <see cref="ChannelRequestMessage"/> class.
  52. /// </summary>
  53. public ChannelRequestMessage()
  54. {
  55. // Required for dynamically loading request type when it comes from the server
  56. }
  57. /// <summary>
  58. /// Initializes a new instance of the <see cref="ChannelRequestMessage"/> class.
  59. /// </summary>
  60. /// <param name="localChannelNumber">The local channel number.</param>
  61. /// <param name="info">The info.</param>
  62. public ChannelRequestMessage(uint localChannelNumber, RequestInfo info)
  63. : base(localChannelNumber)
  64. {
  65. RequestName = info.RequestName;
  66. RequestData = info.GetBytes();
  67. }
  68. /// <summary>
  69. /// Called when type specific data need to be loaded.
  70. /// </summary>
  71. protected override void LoadData()
  72. {
  73. base.LoadData();
  74. _requestNameBytes = ReadBinary();
  75. _requestName = Ascii.GetString(_requestNameBytes, 0, _requestNameBytes.Length);
  76. RequestData = ReadBytes();
  77. }
  78. /// <summary>
  79. /// Called when type specific data need to be saved.
  80. /// </summary>
  81. protected override void SaveData()
  82. {
  83. base.SaveData();
  84. WriteBinaryString(_requestNameBytes);
  85. Write(RequestData);
  86. }
  87. internal override void Process(Session session)
  88. {
  89. session.OnChannelRequestReceived(this);
  90. }
  91. }
  92. }