using System; using Renci.SshNet.Common; using Renci.SshNet.Messages.Connection; namespace Renci.SshNet.Channels { internal abstract class ClientChannel : Channel { /// /// Occurs when message is received. /// public event EventHandler OpenConfirmed; /// /// Occurs when message received /// public event EventHandler OpenFailed; /// /// Initializes the channel. /// /// The session. /// Size of the window. /// Size of the packet. internal override void Initialize(ISession session, uint localWindowSize, uint localPacketSize) { base.Initialize(session, localWindowSize, localPacketSize); Session.ChannelOpenConfirmationReceived += OnChannelOpenConfirmation; Session.ChannelOpenFailureReceived += OnChannelOpenFailure; } /// /// Called when channel is opened by the server. /// /// The remote channel number. /// Initial size of the window. /// Maximum size of the packet. protected virtual void OnOpenConfirmation(uint remoteChannelNumber, uint initialWindowSize, uint maximumPacketSize) { InitializeRemoteInfo(remoteChannelNumber, initialWindowSize, maximumPacketSize); // Channel is consider to be open when confirmation message was received this.IsOpen = true; var openConfirmed = OpenConfirmed; if (openConfirmed != null) openConfirmed(this, new ChannelOpenConfirmedEventArgs(remoteChannelNumber, initialWindowSize, maximumPacketSize)); } /// /// Send message to open a channel. /// /// Message to send protected void SendMessage(ChannelOpenMessage message) { Session.SendMessage(message); } /// /// Called when channel failed to open. /// /// The reason code. /// The description. /// The language. protected virtual void OnOpenFailure(uint reasonCode, string description, string language) { var openFailed = OpenFailed; if (openFailed != null) openFailed(this, new ChannelOpenFailedEventArgs(LocalChannelNumber, reasonCode, description, language)); } private void OnChannelOpenConfirmation(object sender, MessageEventArgs e) { if (e.Message.LocalChannelNumber == this.LocalChannelNumber) { this.OnOpenConfirmation(e.Message.RemoteChannelNumber, e.Message.InitialWindowSize, e.Message.MaximumPacketSize); } } private void OnChannelOpenFailure(object sender, MessageEventArgs e) { if (e.Message.LocalChannelNumber == this.LocalChannelNumber) { this.OnOpenFailure(e.Message.ReasonCode, e.Message.Description, e.Message.Language); } } protected override void Dispose(bool disposing) { if (disposing) { var session = Session; if (session != null) { session.ChannelOpenConfirmationReceived -= OnChannelOpenConfirmation; session.ChannelOpenFailureReceived -= OnChannelOpenFailure; } } base.Dispose(disposing); } } }