public IDisposable Subscribe(IPSObserver <T> observer)
 {
     return(_action.Invoke(observer));
 }
        public IDisposable Subscribe(IPSObserver <TOutput> observer)
        {
            lock (_sync)
            {
                foreach (var item in _outputCache)
                {
                    switch (item.Stream)
                    {
                    case PowerShellStreamType.Output:
                        observer.OnOutput(item.Output);
                        break;

                    case PowerShellStreamType.Error:
                        observer.OnError(item.Error !);
                        break;

                    case PowerShellStreamType.Debug:
                        observer.OnDebug(item.Debug !.Message);
                        break;

                    case PowerShellStreamType.Warning:
                        observer.OnWarning(item.Warning !.Message);
                        break;

                    case PowerShellStreamType.Verbose:
                        observer.OnVerbose(item.Verbose !.Message);
                        break;

                    case PowerShellStreamType.Progress:
                        observer.OnProgress(item.Progress !);
                        break;

                    case PowerShellStreamType.Information:
                        observer.OnInformation(item.Information !);
                        break;
                    }
                }
                if (_exception != null)
                {
                    var terminal = _powerShell.Streams.Error.Where(e => e.Exception == _exception).FirstOrDefault()
                                   ?? new ErrorRecord(_exception, "PowerShellError", ErrorCategory.NotSpecified, _powerShell);
                    observer.OnFailed(terminal);
                    return(ActionRegistration.None);
                }
                if (_isCompleted)
                {
                    observer.OnCompleted();
                    return(ActionRegistration.None);
                }
                _psObservers.Add(observer);
                return(new ActionRegistration(() =>
                {
                    lock (_sync)
                    {
                        if (_psObservers.Contains(observer))
                        {
                            _psObservers.Remove(observer);
                        }
                    }
                }));
            }
        }
Beispiel #3
0
        IDisposable IPSObservable <PSObject> .Subscribe(IPSObserver <PSObject> observer)
        {
            lock (_observationSync)
            {
                foreach (var item in _output)
                {
                    switch (item.Stream)
                    {
                    case PowerShellStreamType.Output:
                        observer.OnOutput(item.Output !);
                        break;

                    case PowerShellStreamType.Error:
                        observer.OnError(item.Error !);
                        break;

                    case PowerShellStreamType.Warning:
                        observer.OnWarning(item.Warning !.Message);
                        break;

                    case PowerShellStreamType.Verbose:
                        observer.OnVerbose(item.Verbose !.Message);
                        break;

                    case PowerShellStreamType.Debug:
                        observer.OnDebug(item.Debug !.Message);
                        break;

                    case PowerShellStreamType.Progress:
                        observer.OnProgress(item.Progress !);
                        break;

                    case PowerShellStreamType.Information:
                        observer.OnInformation(item.Information !);
                        break;
                    }
                }
                if (IsFinished)
                {
                    if (JobStateInfo.State == JobState.Stopped)
                    {
                        observer.OnFailed(new ErrorRecord(new OperationCanceledException(), "JobStopped", ErrorCategory.OperationStopped, this));
                    }
                    if (JobStateInfo.State == JobState.Failed)
                    {
                        _output.TryPeek(out var r);
                        observer.OnFailed(r.Error ?? new ErrorRecord(new JobFailedException(), "JobFailed", ErrorCategory.NotSpecified, this));
                    }
                    if (JobStateInfo.State == JobState.Completed)
                    {
                        observer.OnCompleted();
                    }
                    return(ActionRegistration.None);
                }
                else
                {
                    _psObservers.Add(observer);
                    return(new ActionRegistration(() =>
                    {
                        lock (_observationSync)
                        {
                            if (_psObservers.Contains(observer))
                            {
                                _psObservers.Remove(observer);
                            }
                        }
                    }));
                }
            }
        }