Classes/Public/TMCPsHost.cs

using System;
using System.Globalization;
using System.Management.Automation;
using System.Management.Automation.Runspaces;
using System.Management.Automation.Host;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.ObjectModel;
 
public class TMCPSHost : PSHost
{
    private readonly Guid _id = Guid.NewGuid();
    private readonly PSHostUserInterface _ui;
 
    public static ConcurrentQueue<Hashtable> OutputQueue = new ConcurrentQueue<Hashtable>();
 
    public static System.Threading.AsyncLocal<string> CurrentTMTaskId = new System.Threading.AsyncLocal<string>();
 
    public TMCPSHost()
    {
        _ui = new TMCHostUI(this);
    }
 
    public override Guid InstanceId => _id;
    public override string Name => "TMCPSHost";
    public override Version Version => new Version(1,0);
    public override PSHostUserInterface UI => _ui;
    public override CultureInfo CurrentCulture => CultureInfo.InvariantCulture;
    public override CultureInfo CurrentUICulture => CultureInfo.InvariantCulture;
 
    public override void SetShouldExit(int exitCode) {}
    public override void EnterNestedPrompt() {}
    public override void ExitNestedPrompt() {}
    public override void NotifyBeginApplication() {}
    public override void NotifyEndApplication() {}
}
 
public class TMCHostUI : PSHostUserInterface
{
    private readonly TMCPSHost _parentHost;
    private readonly PSHostRawUserInterface _rawui = new TMCHostRawUI();
 
    public TMCHostUI(TMCPSHost host)
    {
        _parentHost = host;
    }
 
    // private void EnqueueRecord(string type, object messageData)
    // {
    //
    // var record = new System.Collections.Hashtable();
    // record["Type"] = type;
    // record["Message"] = messageData;
    //
    // TMCPSHost.OutputQueue.Enqueue(record);
    // }
 
    public override PSHostRawUserInterface RawUI => _rawui;
 
    // Write value with unspecified colors, NoNewLine
    public override void Write(string value) {
        this.Write(ConsoleColor.White, ConsoleColor.Black, value);
    }
    public override void Write(ConsoleColor foregroundColor, ConsoleColor backgroundColor, string value) {
        object tmTaskId = TMCPSHost.CurrentTMTaskId.Value;
         
        var message = new System.Collections.Hashtable();
        message["Message"] = value;
        message["NoNewLine"] = true;
        message["ForegroundColor"] = foregroundColor;
        message["BackgroundColor"] = backgroundColor;
         
        var record = new System.Collections.Hashtable();
        record["TMTaskId"] = tmTaskId;
        record["From"] = "PSHost";
        record["Type"] = "Information";
        record["Message"] = message;
         
        TMCPSHost.OutputQueue.Enqueue(record);
    }
 
    // Write a Terminating Line (not -NoNewLine)
    public override void WriteLine(string value) {
        this.WriteLine(ConsoleColor.White, ConsoleColor.Black, value);
    }
    public override void WriteLine(ConsoleColor foregroundColor, ConsoleColor backgroundColor, string value) {
        object tmTaskId = TMCPSHost.CurrentTMTaskId.Value;
         
        var message = new System.Collections.Hashtable();
        message["Message"] = value;
        message["NoNewLine"] = false;
        message["ForegroundColor"] = foregroundColor;
        message["BackgroundColor"] = backgroundColor;
         
        var record = new System.Collections.Hashtable();
        record["TMTaskId"] = tmTaskId;
        record["From"] = "PSHost";
        record["Type"] = "Information";
        record["Message"] = message;
         
        TMCPSHost.OutputQueue.Enqueue(record);
    }
    public override void WriteWarningLine(string value) {
        this.WriteLine(ConsoleColor.Yellow, ConsoleColor.Black, "WARNING: " + value);
    }
    public override void WriteDebugLine(string value) {
        this.WriteLine(ConsoleColor.Yellow, ConsoleColor.Black, "DEBUG: " + value);
    }
    public override void WriteVerboseLine(string value) {
        this.WriteLine(ConsoleColor.Yellow, ConsoleColor.Black, "VERBOSE: " + value);
    }
    public override void WriteErrorLine(string value) { }
 
     
    public override void WriteProgress(long sourceId, ProgressRecord record) {
     
        // Some progress items are omitted
        if(record.Activity == "Reading web response stream") {
            return;
        }
 
        // object tmTaskId = TMCPSHost.CurrentTMTaskId.Value;
        var progressRecord = new System.Collections.Hashtable();
        progressRecord["TMTaskId"] = TMCPSHost.CurrentTMTaskId.Value;
        progressRecord["From"] = "PSHost";
        progressRecord["Type"] = "Progress";
        progressRecord["Message"] = record;
         
        TMCPSHost.OutputQueue.Enqueue(progressRecord);
    }
 
    public override string ReadLine() => "";
    public override System.Security.SecureString ReadLineAsSecureString() => new System.Security.SecureString();
 
    public override Dictionary<string, PSObject> Prompt(
        string caption, string message, Collection<FieldDescription> descriptions)
    {
        return new Dictionary<string, PSObject>();
    }
 
    public override int PromptForChoice(string caption, string message,
        Collection<ChoiceDescription> choices, int defaultChoice)
    {
        return defaultChoice;
    }
 
    public override PSCredential PromptForCredential(
        string caption, string message, string userName, string targetName)
    {
        return null;
    }
 
    public override PSCredential PromptForCredential(
        string caption, string message, string userName, string targetName,
        PSCredentialTypes allowedCredentialTypes, PSCredentialUIOptions options)
    {
        return null;
    }
}
 
public class TMCHostRawUI : PSHostRawUserInterface
{
    public override ConsoleColor BackgroundColor { get; set; } = ConsoleColor.Black;
    public override ConsoleColor ForegroundColor { get; set; } = ConsoleColor.Gray;
     
    public override Size BufferSize { get; set; }
    public override Coordinates CursorPosition { get; set; }
    public override int CursorSize { get; set; }
    public override bool KeyAvailable => false;
    public override Size MaxPhysicalWindowSize => new Size(120, 40);
    public override Size MaxWindowSize => new Size(120, 40);
    public override Coordinates WindowPosition { get; set; }
    public override Size WindowSize { get; set; }
    public override string WindowTitle { get; set; }
 
    public override void FlushInputBuffer() {}
    public override BufferCell[,] GetBufferContents(Rectangle rectangle) => new BufferCell[0,0];
    public override KeyInfo ReadKey(ReadKeyOptions options) => new KeyInfo();
    public override void ScrollBufferContents(Rectangle src, Coordinates dest, Rectangle clip, BufferCell fill) {}
    public override void SetBufferContents(Coordinates origin, BufferCell[,] contents) {}
    public override void SetBufferContents(Rectangle rectangle, BufferCell fill) {}
}