/// <summary> /// Waits for the pending asynchronous command execution to complete. /// </summary> /// <param name="asyncResult">The reference to the pending asynchronous request to finish.</param> /// <returns>Command execution result.</returns> /// <example> /// <code source="..\..\Renci.SshNet.Tests\Classes\SshCommandTest.cs" region="Example SshCommand CreateCommand BeginExecute IsCompleted EndExecute" language="C#" title="Asynchronous Command Execution" /> /// </example> /// <exception cref="System.ArgumentException">Either the IAsyncResult object did not come from the corresponding async method on this type, or EndExecute was called multiple times with the same IAsyncResult.</exception> /// <exception cref="ArgumentException">Either the IAsyncResult object did not come from the corresponding async method on this type, or EndExecute was called multiple times with the same IAsyncResult.</exception> public string EndExecute(IAsyncResult asyncResult) { if (this._asyncResult == asyncResult && this._asyncResult != null) { lock (this._endExecuteLock) { if (this._asyncResult != null) { // Make sure that operation completed if not wait for it to finish this.WaitHandle(this._asyncResult.AsyncWaitHandle); if (this._channel.IsOpen) { this._channel.SendEof(); this._channel.Close(); } this._channel = null; this._asyncResult = null; return(this.Result); } } } throw new ArgumentException("Either the IAsyncResult object did not come from the corresponding async method on this type, or EndExecute was called multiple times with the same IAsyncResult."); }
/// <summary> /// Begins an asynchronous command execution. /// </summary> /// <param name="callback">An optional asynchronous callback, to be called when the command execution is complete.</param> /// <param name="state">A user-provided object that distinguishes this particular asynchronous read request from other requests.</param> /// <returns> /// An <see cref="IAsyncResult" /> that represents the asynchronous command execution, which could still be pending. /// </returns> /// <exception cref="InvalidOperationException">Asynchronous operation is already in progress.</exception> /// <exception cref="SshException">Invalid operation.</exception> /// <exception cref="ArgumentException">CommandText property is empty.</exception> /// <exception cref="SshConnectionException">Client is not connected.</exception> /// <exception cref="SshOperationTimeoutException">Operation has timed out.</exception> /// <exception cref="InvalidOperationException">Asynchronous operation is already in progress.</exception> /// <exception cref="ArgumentException">CommandText property is empty.</exception> public IAsyncResult BeginExecute(AsyncCallback callback, object state) { // Prevent from executing BeginExecute before calling EndExecute if (_asyncResult != null && !_asyncResult.EndCalled) { throw new InvalidOperationException("Asynchronous operation is already in progress."); } // Create new AsyncResult object _asyncResult = new CommandAsyncResult { AsyncWaitHandle = new ManualResetEvent(false), IsCompleted = false, AsyncState = state, }; // When command re-executed again, create a new channel if (_channel != null) { throw new SshException("Invalid operation."); } if (string.IsNullOrEmpty(CommandText)) { throw new ArgumentException("CommandText property is empty."); } var outputStream = OutputStream; if (outputStream != null) { outputStream.Dispose(); OutputStream = null; } var extendedOutputStream = ExtendedOutputStream; if (extendedOutputStream != null) { extendedOutputStream.Dispose(); ExtendedOutputStream = null; } // Initialize output streams OutputStream = new PipeStream(); ExtendedOutputStream = new PipeStream(); _result = null; _error = null; _callback = callback; _channel = CreateChannel(); _channel.Open(); _channel.SendExecRequest(CommandText); return(_asyncResult); }
public void BytesSentTest() { SshCommand command = null; // TODO: Initialize to an appropriate value CommandAsyncResult target = new CommandAsyncResult(command); // TODO: Initialize to an appropriate value int expected = 0; // TODO: Initialize to an appropriate value int actual; target.BytesSent = expected; actual = target.BytesSent; Assert.AreEqual(expected, actual); Assert.Inconclusive("Verify the correctness of this test method."); }
/// <summary> /// Begins an asynchronous command execution. /// </summary> /// <param name="callback">An optional asynchronous callback, to be called when the command execution is complete.</param> /// <param name="state">A user-provided object that distinguishes this particular asynchronous read request from other requests.</param> /// <returns> /// An <see cref="System.IAsyncResult" /> that represents the asynchronous command execution, which could still be pending. /// </returns> /// <exception cref="System.InvalidOperationException">Asynchronous operation is already in progress.</exception> /// <exception cref="SshException">Invalid operation.</exception> /// <exception cref="System.ArgumentException">CommandText property is empty.</exception> /// <exception cref="Renci.SshNet.Common.SshConnectionException">Client is not connected.</exception> /// <exception cref="Renci.SshNet.Common.SshOperationTimeoutException">Operation has timed out.</exception> /// <exception cref="InvalidOperationException">Asynchronous operation is already in progress.</exception> /// <exception cref="ArgumentException">CommandText property is empty.</exception> public IAsyncResult BeginExecute(AsyncCallback callback, object state) { // Prevent from executing BeginExecute before calling EndExecute if (this._asyncResult != null) { throw new InvalidOperationException("Asynchronous operation is already in progress."); } // Create new AsyncResult object this._asyncResult = new CommandAsyncResult(this) { AsyncWaitHandle = new ManualResetEvent(false), IsCompleted = false, AsyncState = state, }; // When command re-executed again, create a new channel if (this._channel != null) { throw new SshException("Invalid operation."); } this.CreateChannel(); if (string.IsNullOrEmpty(this.CommandText)) { throw new ArgumentException("CommandText property is empty."); } this._callback = callback; this._channel.Open(); // Send channel command request this._channel.SendExecRequest(this.CommandText); return(_asyncResult); }
/// <summary> /// Waits for the pending asynchronous command execution to complete. /// </summary> /// <param name="asyncResult">The reference to the pending asynchronous request to finish.</param> /// <returns>Command execution result.</returns> /// <example> /// <code source="..\..\Renci.SshNet.Tests\Classes\SshCommandTest.cs" region="Example SshCommand CreateCommand BeginExecute IsCompleted EndExecute" language="C#" title="Asynchronous Command Execution" /> /// </example> /// <exception cref="ArgumentException">Either the IAsyncResult object did not come from the corresponding async method on this type, or EndExecute was called multiple times with the same IAsyncResult.</exception> public string EndExecute(IAsyncResult asyncResult) { if (this._asyncResult == asyncResult && this._asyncResult != null) { lock (this._endExecuteLock) { if (this._asyncResult != null) { // Make sure that operation completed if not wait for it to finish this.WaitOnHandle(this._asyncResult.AsyncWaitHandle); if (_channel.IsOpen) { _channel.Close(); } UnsubscribeFromEventsAndDisposeChannel(); _channel = null; _asyncResult = null; return this.Result; } } } throw new ArgumentException("Either the IAsyncResult object did not come from the corresponding async method on this type, or EndExecute was called multiple times with the same IAsyncResult."); }
/// <summary> /// Begins an asynchronous command execution. /// </summary> /// <param name="callback">An optional asynchronous callback, to be called when the command execution is complete.</param> /// <param name="state">A user-provided object that distinguishes this particular asynchronous read request from other requests.</param> /// <returns> /// An <see cref="System.IAsyncResult" /> that represents the asynchronous command execution, which could still be pending. /// </returns> /// <exception cref="System.InvalidOperationException">Asynchronous operation is already in progress.</exception> /// <exception cref="SshException">Invalid operation.</exception> /// <exception cref="System.ArgumentException">CommandText property is empty.</exception> /// <exception cref="Renci.SshNet.Common.SshConnectionException">Client is not connected.</exception> /// <exception cref="Renci.SshNet.Common.SshOperationTimeoutException">Operation has timed out.</exception> /// <exception cref="InvalidOperationException">Asynchronous operation is already in progress.</exception> /// <exception cref="ArgumentException">CommandText property is empty.</exception> public IAsyncResult BeginExecute(AsyncCallback callback, object state) { // Prevent from executing BeginExecute before calling EndExecute if (this._asyncResult != null) { throw new InvalidOperationException("Asynchronous operation is already in progress."); } // Create new AsyncResult object this._asyncResult = new CommandAsyncResult { AsyncWaitHandle = new ManualResetEvent(false), IsCompleted = false, AsyncState = state, }; // When command re-executed again, create a new channel if (this._channel != null) { throw new SshException("Invalid operation."); } this.CreateChannel(); if (string.IsNullOrEmpty(this.CommandText)) throw new ArgumentException("CommandText property is empty."); this._callback = callback; this._channel.Open(); // Send channel command request this._channel.SendExecRequest(this.CommandText); return _asyncResult; }
/// <summary> /// Begins an asynchronous command execution. /// </summary> /// <param name="callback">An optional asynchronous callback, to be called when the command execution is complete.</param> /// <param name="state">A user-provided object that distinguishes this particular asynchronous read request from other requests.</param> /// <returns> /// An <see cref="IAsyncResult" /> that represents the asynchronous command execution, which could still be pending. /// </returns> /// <exception cref="InvalidOperationException">Asynchronous operation is already in progress.</exception> /// <exception cref="SshException">Invalid operation.</exception> /// <exception cref="ArgumentException">CommandText property is empty.</exception> /// <exception cref="SshConnectionException">Client is not connected.</exception> /// <exception cref="SshOperationTimeoutException">Operation has timed out.</exception> /// <exception cref="InvalidOperationException">Asynchronous operation is already in progress.</exception> /// <exception cref="ArgumentException">CommandText property is empty.</exception> public IAsyncResult BeginExecute(AsyncCallback callback, object state) { // Prevent from executing BeginExecute before calling EndExecute if (_asyncResult != null && !_asyncResult.EndCalled) { throw new InvalidOperationException("Asynchronous operation is already in progress."); } // Create new AsyncResult object _asyncResult = new CommandAsyncResult { AsyncWaitHandle = new ManualResetEvent(false), IsCompleted = false, AsyncState = state, }; // When command re-executed again, create a new channel if (_channel != null) { throw new SshException("Invalid operation."); } if (string.IsNullOrEmpty(CommandText)) throw new ArgumentException("CommandText property is empty."); var outputStream = OutputStream; if (outputStream != null) { outputStream.Dispose(); OutputStream = null; } var extendedOutputStream = ExtendedOutputStream; if (extendedOutputStream != null) { extendedOutputStream.Dispose(); ExtendedOutputStream = null; } // Initialize output streams OutputStream = new PipeStream(); ExtendedOutputStream = new PipeStream(); _result = null; _error = null; _callback = callback; _channel = CreateChannel(); _channel.Open(); _channel.SendExecRequest(CommandText); return _asyncResult; }
/// <summary> /// Initialise command execution /// </summary> public void Init() { this.command_result = this.command.BeginExecute() as CommandAsyncResult; }