ClientChannel.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. using System;
  2. using Renci.SshNet.Common;
  3. using Renci.SshNet.Messages.Connection;
  4. namespace Renci.SshNet.Channels
  5. {
  6. internal abstract class ClientChannel : Channel
  7. {
  8. /// <summary>
  9. /// Occurs when <see cref="ChannelOpenConfirmationMessage"/> message is received.
  10. /// </summary>
  11. public event EventHandler<ChannelOpenConfirmedEventArgs> OpenConfirmed;
  12. /// <summary>
  13. /// Occurs when <see cref="ChannelOpenFailureMessage"/> message received
  14. /// </summary>
  15. public event EventHandler<ChannelOpenFailedEventArgs> OpenFailed;
  16. /// <summary>
  17. /// Initializes the channel.
  18. /// </summary>
  19. /// <param name="session">The session.</param>
  20. /// <param name="localWindowSize">Size of the window.</param>
  21. /// <param name="localPacketSize">Size of the packet.</param>
  22. internal override void Initialize(ISession session, uint localWindowSize, uint localPacketSize)
  23. {
  24. base.Initialize(session, localWindowSize, localPacketSize);
  25. Session.ChannelOpenConfirmationReceived += OnChannelOpenConfirmation;
  26. Session.ChannelOpenFailureReceived += OnChannelOpenFailure;
  27. }
  28. /// <summary>
  29. /// Called when channel is opened by the server.
  30. /// </summary>
  31. /// <param name="remoteChannelNumber">The remote channel number.</param>
  32. /// <param name="initialWindowSize">Initial size of the window.</param>
  33. /// <param name="maximumPacketSize">Maximum size of the packet.</param>
  34. protected virtual void OnOpenConfirmation(uint remoteChannelNumber, uint initialWindowSize, uint maximumPacketSize)
  35. {
  36. InitializeRemoteInfo(remoteChannelNumber, initialWindowSize, maximumPacketSize);
  37. // Channel is consider to be open when confirmation message was received
  38. this.IsOpen = true;
  39. var openConfirmed = OpenConfirmed;
  40. if (openConfirmed != null)
  41. openConfirmed(this, new ChannelOpenConfirmedEventArgs(remoteChannelNumber, initialWindowSize, maximumPacketSize));
  42. }
  43. /// <summary>
  44. /// Send message to open a channel.
  45. /// </summary>
  46. /// <param name="message">Message to send</param>
  47. protected void SendMessage(ChannelOpenMessage message)
  48. {
  49. Session.SendMessage(message);
  50. }
  51. /// <summary>
  52. /// Called when channel failed to open.
  53. /// </summary>
  54. /// <param name="reasonCode">The reason code.</param>
  55. /// <param name="description">The description.</param>
  56. /// <param name="language">The language.</param>
  57. protected virtual void OnOpenFailure(uint reasonCode, string description, string language)
  58. {
  59. var openFailed = OpenFailed;
  60. if (openFailed != null)
  61. openFailed(this, new ChannelOpenFailedEventArgs(LocalChannelNumber, reasonCode, description, language));
  62. }
  63. private void OnChannelOpenConfirmation(object sender, MessageEventArgs<ChannelOpenConfirmationMessage> e)
  64. {
  65. if (e.Message.LocalChannelNumber == this.LocalChannelNumber)
  66. {
  67. this.OnOpenConfirmation(e.Message.RemoteChannelNumber, e.Message.InitialWindowSize, e.Message.MaximumPacketSize);
  68. }
  69. }
  70. private void OnChannelOpenFailure(object sender, MessageEventArgs<ChannelOpenFailureMessage> e)
  71. {
  72. if (e.Message.LocalChannelNumber == this.LocalChannelNumber)
  73. {
  74. this.OnOpenFailure(e.Message.ReasonCode, e.Message.Description, e.Message.Language);
  75. }
  76. }
  77. protected override void Dispose(bool disposing)
  78. {
  79. if (disposing)
  80. {
  81. var session = Session;
  82. if (session != null)
  83. {
  84. session.ChannelOpenConfirmationReceived -= OnChannelOpenConfirmation;
  85. session.ChannelOpenFailureReceived -= OnChannelOpenFailure;
  86. }
  87. }
  88. base.Dispose(disposing);
  89. }
  90. }
  91. }