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) {} } |