using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Tango.Console; using Tango.Console.Network; using Tango.Core; using Tango.Core.DI; using Tango.Integration.ExternalBridge; using Tango.PPC.Common.ExternalBridge; using Tango.Transport; namespace Tango.PPC.Common.Console { /// /// Represents the default implementation /// which listens to incoming console request by registering as a external bridge request handler. /// /// /// [TangoCreateWhenRegistered] public class DefaultConsoleEngineService : ExtendedObject, IConsoleEngineService, IExternalBridgeRequestHandler { /// /// Gets or sets a value indicating whether this is enabled. /// public bool Enabled { get; set; } = true; /// /// Initializes a new instance of the class. /// /// The external bridge service instance. public DefaultConsoleEngineService(IPPCExternalBridgeService externalBridge) { externalBridge.RegisterRequestHandler(this); } /// /// Handles requests. /// /// The request. /// The token. /// The transporter. [ExternalBridgeRequestHandlerMethod(typeof(GetCurrentDirectoryRequest), RequestHandlerLoggingMode.LogRequestName)] public async Task OnGetCurrentDirectoryRequest(GetCurrentDirectoryRequest request, String token, ITransporter transporter) { this.ThrowIfDisabled(); await transporter.SendGenericResponse(new GetCurrentDirectoryResponse() { CurrentDirectory = Environment.CurrentDirectory, Suggestions = ConsoleExecutionEngine.GetSuggestions(Environment.CurrentDirectory) }, token); } /// /// Handles requests. /// /// The request. /// The token. /// The transporter. [ExternalBridgeRequestHandlerMethod(typeof(ConsoleCommandRequest), RequestHandlerLoggingMode.LogRequestNameAndContent)] public async Task OnConsoleCommandRequest(ConsoleCommandRequest request, String token, ITransporter transporter) { this.ThrowIfDisabled(); LogManager.Log($"{nameof(ConsoleCommandRequest)} received with command '{request.Command}'. Executing..."); ConsoleExecutionEngine engine = new ConsoleExecutionEngine(); var result = await engine.Execute(request); LogManager.Log("Console command executed successfully."); await transporter.SendGenericResponse(new ConsoleCommandResponse() { Output = result.Output, Suggestions = result.Suggestions, WorkingFolder = result.WorkingFolder }, token); } /// /// Called when any of the external bridge clients (receivers) has disconnected. /// /// The receiver. public void OnReceiverDisconnected(ExternalBridgeReceiver receiver) { //Do nothing. } } }