/// <summary> /// Handles process record event /// </summary> /// <param name="sender"></param> /// <param name="args"></param> private void HandleProcessRecord(object sender, PSEventArgs args) { ServerSteppablePipelineDriverEventArg driverArg = (object)args.SourceEventArgs as ServerSteppablePipelineDriverEventArg; ServerSteppablePipelineDriver driver = driverArg.SteppableDriver; lock (driver.SyncObject) { // Make sure start event handler was called if (driver.SteppablePipeline == null) { return; } // make sure only one thread does the processing if (driver.ProcessingInput) { return; } driver.ProcessingInput = true; driver.Pulsed = false; } bool shouldDoComplete = false; Exception exceptionOccurred = null; try { using (ExecutionContextForStepping ctxt = ExecutionContextForStepping.PrepareExecutionContext( driver.LocalPowerShell.GetContextFromTLS(), driver.LocalPowerShell.InformationalBuffers, driver.RemoteHost)) { bool isProcessCalled = false; while (true) { if (driver.PipelineState != PSInvocationState.Running) { driver.SetState(driver.PipelineState, null); return; } if (!driver.InputEnumerator.MoveNext()) { shouldDoComplete = true; if (!driver.NoInput || isProcessCalled) { // if there is noInput then we // need to call process atleast once break; } } isProcessCalled = true; Array output; if (driver.NoInput) { output = driver.SteppablePipeline.Process(); } else { output = driver.SteppablePipeline.Process(driver.InputEnumerator.Current); } foreach (object o in output) { if (driver.PipelineState != PSInvocationState.Running) { driver.SetState(driver.PipelineState, null); return; } // send the output data to the client driver.DataStructureHandler.SendOutputDataToClient(PSObject.AsPSObject(o)); } lock (driver.SyncObject) { driver.TotalObjectsProcessed++; if (driver.TotalObjectsProcessed >= driver.Input.Count) { break; } } } } } catch (Exception e) { exceptionOccurred = e; } finally { lock (driver.SyncObject) { driver.ProcessingInput = false; driver.CheckAndPulseForProcessing(false); } // Check if should perform stop if (driver.PipelineState == PSInvocationState.Stopping) { driver.PerformStop(); } } if (shouldDoComplete) { try { using (ExecutionContextForStepping ctxt = ExecutionContextForStepping.PrepareExecutionContext( driver.LocalPowerShell.GetContextFromTLS(), driver.LocalPowerShell.InformationalBuffers, driver.RemoteHost)) { Array output = driver.SteppablePipeline.End(); foreach (object o in output) { if (driver.PipelineState != PSInvocationState.Running) { driver.SetState(driver.PipelineState, null); return; } // send the output data to the client driver.DataStructureHandler.SendOutputDataToClient(PSObject.AsPSObject(o)); } driver.SetState(PSInvocationState.Completed, null); return; } } catch (Exception e) { exceptionOccurred = e; } finally { // Check if should perform stop if (driver.PipelineState == PSInvocationState.Stopping) { driver.PerformStop(); } } } if (exceptionOccurred != null) { driver.SetState(PSInvocationState.Failed, exceptionOccurred); } }
private void HandleProcessRecord(object sender, PSEventArgs args) { ServerSteppablePipelineDriverEventArg sourceEventArgs = args.SourceEventArgs as ServerSteppablePipelineDriverEventArg; ServerSteppablePipelineDriver steppableDriver = sourceEventArgs.SteppableDriver; lock (steppableDriver.SyncObject) { if ((steppableDriver.SteppablePipeline == null) || steppableDriver.ProcessingInput) { return; } steppableDriver.ProcessingInput = true; steppableDriver.Pulsed = false; } bool flag = false; Exception reason = null; try { using (ExecutionContextForStepping.PrepareExecutionContext(steppableDriver.LocalPowerShell.GetContextFromTLS(), steppableDriver.LocalPowerShell.InformationalBuffers, steppableDriver.RemoteHost)) { bool flag2 = false; Label_0086: if (steppableDriver.PipelineState != PSInvocationState.Running) { steppableDriver.SetState(steppableDriver.PipelineState, null); return; } if (!steppableDriver.InputEnumerator.MoveNext()) { flag = true; if (!steppableDriver.NoInput || flag2) { goto Label_0203; } } flag2 = true; Array array = new int[0]; if (steppableDriver.NoInput) { array = steppableDriver.SteppablePipeline.Process(); } else { array = steppableDriver.SteppablePipeline.Process(steppableDriver.InputEnumerator.Current); } foreach (object obj2 in array) { if (steppableDriver.PipelineState != PSInvocationState.Running) { steppableDriver.SetState(steppableDriver.PipelineState, null); return; } steppableDriver.DataStructureHandler.SendOutputDataToClient(PSObject.AsPSObject(obj2)); } lock (steppableDriver.SyncObject) { steppableDriver.TotalObjectsProcessed++; if (steppableDriver.TotalObjectsProcessed < steppableDriver.Input.Count) { goto Label_0086; } } } } catch (Exception exception2) { CommandProcessorBase.CheckForSevereException(exception2); reason = exception2; } finally { lock (steppableDriver.SyncObject) { steppableDriver.ProcessingInput = false; steppableDriver.CheckAndPulseForProcessing(false); } if (steppableDriver.PipelineState == PSInvocationState.Stopping) { steppableDriver.PerformStop(); } } Label_0203: if (flag) { try { using (ExecutionContextForStepping.PrepareExecutionContext(steppableDriver.LocalPowerShell.GetContextFromTLS(), steppableDriver.LocalPowerShell.InformationalBuffers, steppableDriver.RemoteHost)) { foreach (object obj3 in steppableDriver.SteppablePipeline.End()) { if (steppableDriver.PipelineState != PSInvocationState.Running) { steppableDriver.SetState(steppableDriver.PipelineState, null); return; } steppableDriver.DataStructureHandler.SendOutputDataToClient(PSObject.AsPSObject(obj3)); } steppableDriver.SetState(PSInvocationState.Completed, null); return; } } catch (Exception exception3) { CommandProcessorBase.CheckForSevereException(exception3); reason = exception3; } finally { if (steppableDriver.PipelineState == PSInvocationState.Stopping) { steppableDriver.PerformStop(); } } } if (reason != null) { steppableDriver.SetState(PSInvocationState.Failed, reason); } }