using C4IT.F4SD.DisplayFormatting; using C4IT.FASD.Base; using C4IT.MultiLanguage; using FasdCockpitBase.Models.RemoteDesktopConnection; using FasdCockpitCommunication.RemoteDesktopCommunication; using FasdDesktopUi.Basics.Models; using FasdDesktopUi.Basics.Services.RemoteDesktop; using FasdDesktopUi.Basics.UserControls; using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using static C4IT.Logging.cLogManager; namespace FasdDesktopUi.Basics.UiActions.NativeActions { internal class RemoteConnectionAction { internal const string NativeActionName = "StartAgentRemoteConnection"; internal static void UpdatePrerequesites(FasdNativeQuickAction nativeQuickAction) { nativeQuickAction.CheckFilePath = AgentRemoteDesktopService.GetViewerPath(); } internal static cDataCanvasDataModel GetQuickActionData(cFasdQuickAction quickActionConfig, cQuickActionStatusMonitorModel.RunQuickActionDelegate quickAction) { var detailedDataQuickActionHistory = new cDetailedDataModel() { Heading = cMultiLanguageSupport.GetItem("DetailsPage.History"), FullDetailedData = new List() { new List() { "Status", cMultiLanguageSupport.GetItem("QuickAction.Revision.ExecutionTime") } } }; return new cDataCanvasDataModel() { RecommendationData = null, QuickActionStatusMonitorData = new cQuickActionStatusMonitorModel() { ActionName = quickActionConfig.Names.GetValue(), ActionSteps = new List() { new cQuickActionStatusMonitorModel.cQuickActionStep(cMultiLanguageSupport.GetItem("QuickAction.Remote.UserAcceptance"), quickActionConfig.Name, cQuickActionStatusMonitorModel.cQuickActionStep.enumActionStepType.waitingForUserAcceptance), new cQuickActionStatusMonitorModel.cQuickActionStep(cMultiLanguageSupport.GetItem("QuickAction.Phoenix.StartViewer"), quickActionConfig.Name, cQuickActionStatusMonitorModel.cQuickActionStep.enumActionStepType.running) }, QuickActionDefinition = quickActionConfig, RunQuickAction = quickAction }, DetailedData = detailedDataQuickActionHistory, }; } private static bool TryGetNamedParameterValue(cNamedParameterList namedParameters, string namedParameterName, string quickActionName, QuickActionStatusMonitor statusMonitor, out int namedParameterValue) { namedParameterValue = -1; bool hasNamedParameterValue = true; if (!namedParameters.TryGetValue(namedParameterName, out var namedParameter)) { cQuickActionStatusMonitorModel.cQuickActionStep.CancelRemainingQuickActionSteps(statusMonitor.QuickActionData.ActionSteps); statusMonitor.QuickActionOutputs.Add(new cF4sdQuickActionRevision.cOutput() { Values = $"Named parameter \"{namedParameterName}\" is missing. Try to refresh data." }); hasNamedParameterValue = false; } if (!int.TryParse(namedParameter.GetValue(), out namedParameterValue)) { cQuickActionStatusMonitorModel.cQuickActionStep.CancelRemainingQuickActionSteps(statusMonitor.QuickActionData.ActionSteps); statusMonitor.QuickActionOutputs.Add(new cF4sdQuickActionRevision.cOutput() { Values = $"Named parameter \"{namedParameterName}\" is missing. Try to refresh data." }); hasNamedParameterValue = false; } return hasNamedParameterValue; } private static bool TryGetClientInfo(string quickActionName, QuickActionStatusMonitor statusMonitor, cNamedParameterList namedParameters, out AgentRemoteClientInfo clientInfo) { clientInfo = null; try { bool hasClientInfo = true; if (!TryGetNamedParameterValue(namedParameters, "AgentUserId", quickActionName, statusMonitor, out var userId)) hasClientInfo = false; if (!TryGetNamedParameterValue(namedParameters, "AgentDeviceId", quickActionName, statusMonitor, out var deviceId)) hasClientInfo = false; int? organizationId = cCockpitConfiguration.Instance?.agentApiConfiguration?.OrganizationCode; if (organizationId is null) { cQuickActionStatusMonitorModel.cQuickActionStep.CancelRemainingQuickActionSteps(statusMonitor.QuickActionData.ActionSteps); hasClientInfo = false; } clientInfo = new AgentRemoteClientInfo() { AccountCode = userId, DeviceCode = deviceId, OrganisationCode = organizationId.Value }; return hasClientInfo; } catch (Exception ex) { LogException(ex); return false; } } internal static async Task> RunQuickAction(string quickActionName, QuickActionStatusMonitor statusMonitor, cNamedParameterList namedParameters, CancellationToken token) { try { statusMonitor.QuickActionOutputs.Clear(); var errorOutput = new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedWithError"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; if (!TryGetClientInfo(quickActionName, statusMonitor, namedParameters, out var clientInfo)) return errorOutput; AgentRemoteDesktopService.RemoteConnetionStatusChanged += HandleConnectionStatusChanged; RemoteDesktopConnectionStatusResult connectionStatus = await AgentRemoteDesktopService.StartRemoteDesktopConnectionAsync(clientInfo, true, token); switch (connectionStatus.Status) { case RemoteDesktopConnectionStatus.Accepted: case RemoteDesktopConnectionStatus.Connected: case RemoteDesktopConnectionStatus.Finished: cQuickActionStatusMonitorModel.cQuickActionStep.SetQuickActionStepStatuses(statusMonitor?.QuickActionData?.ActionSteps, quickActionName, cQuickActionStatusMonitorModel.cQuickActionStep.enumActionStepType.waitingForUserAcceptance, enumQuickActionRevisionStatus.finishedSuccessfull); return new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedSuccessfull"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; case RemoteDesktopConnectionStatus.Canceled: cQuickActionStatusMonitorModel.cQuickActionStep.CancelRemainingQuickActionSteps(statusMonitor?.QuickActionData?.ActionSteps); return new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.Canceled"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; case RemoteDesktopConnectionStatus.Error: foreach (var error in connectionStatus.Errors) { var quickactionOutput = new cF4sdQuickActionRevision.cOutput() { Values = error }; statusMonitor.QuickActionOutputs.Add(quickactionOutput); } cQuickActionStatusMonitorModel.cQuickActionStep.SetQuickActionStepStatuses(statusMonitor?.QuickActionData?.ActionSteps, quickActionName, cQuickActionStatusMonitorModel.cQuickActionStep.enumActionStepType.waitingForUserAcceptance, enumQuickActionRevisionStatus.finishedWithError); return new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedWithError"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; default: cQuickActionStatusMonitorModel.cQuickActionStep.SetQuickActionStepStatuses(statusMonitor?.QuickActionData?.ActionSteps, quickActionName, cQuickActionStatusMonitorModel.cQuickActionStep.enumActionStepType.waitingForUserAcceptance, enumQuickActionRevisionStatus.finishedWithError); return errorOutput; } } finally { AgentRemoteDesktopService.RemoteConnetionStatusChanged -= HandleConnectionStatusChanged; } void HandleConnectionStatusChanged(object sender, RemoteDesktopConnectionStatus e) { switch (e) { case RemoteDesktopConnectionStatus.Accepted: cQuickActionStatusMonitorModel.cQuickActionStep.SetQuickActionStepStatuses(statusMonitor?.QuickActionData?.ActionSteps, quickActionName, cQuickActionStatusMonitorModel.cQuickActionStep.enumActionStepType.waitingForUserAcceptance, enumQuickActionRevisionStatus.finishedSuccessfull); break; case RemoteDesktopConnectionStatus.Connected: cQuickActionStatusMonitorModel.cQuickActionStep.SetQuickActionStepStatuses(statusMonitor?.QuickActionData?.ActionSteps, quickActionName, cQuickActionStatusMonitorModel.cQuickActionStep.enumActionStepType.running, enumQuickActionRevisionStatus.finishedSuccessfull); break; case RemoteDesktopConnectionStatus.Canceled: cQuickActionStatusMonitorModel.cQuickActionStep.CancelRemainingQuickActionSteps(statusMonitor?.QuickActionData?.ActionSteps); break; default: break; } } } } }