This commit is contained in:
Meik
2025-11-11 11:03:42 +01:00
commit dc3e8a2e4c
582 changed files with 191465 additions and 0 deletions

View File

@@ -0,0 +1,542 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using C4IT.Configuration;
using C4IT.FASD.Base;
using C4IT.FASD.Cockpit.Communication;
using C4IT.Logging;
using C4IT.XML;
using FasdDesktopUi.Basics.Enums;
using FasdDesktopUi.Config;
using static C4IT.Logging.cLogManager;
namespace FasdDesktopUi
{
public enum enumM42AuthenticationMethod
{
passthrough = 0,
basic,
token,
forms
}
public enum enumM42AuthenticationControl
{
auto = 0,
never,
always
}
public class cFasdCockpitConfig
{
public const string constRegPathConfig = @"Software\Consulting4IT GmbH\First Aid Service Desk\Cockpit";
public const string constRegPathGlobal = "CockpitPreferences";
[RegConfig]
public string SelectedLanguage;
[RegConfig]
public enumAppColorMode DetailsPageColorMode = enumAppColorMode.LightMode;
[RegConfig]
public bool ShowSearchResultDetails = true;
[RegConfig]
public Int32 SlimPageZoom { get; private set; } = 100;
[RegConfig]
public Int32 DetailsPageZoom { get; private set; } = 100;
[RegConfig]
public string HighlightColorVisibility = "";
[RegConfig]
public string DetailsPageMaxGeometry = "";
[RegConfig]
public bool IsHistoryQuickActionSelectorVisible = false;
[RegConfig]
public bool IsCustomizableQuickActionSelectorVisible = true;
[RegConfig]
public bool IsNotepadVisibleDocked = false;
[RegConfig]
public bool IsNotepadVisibleUndocked = false;
[RegConfig]
public string LastDownloadPath = "";
[RegConfigSubItem]
public cFasdCockpitConfigPhoneSupport PhoneSupport = new cFasdCockpitConfigPhoneSupport();
[RegConfigSubItem]
public cF4sdCockpitConfigM42 M42Config { get; set; } = new cF4sdCockpitConfigM42();
[RegConfigSubItem(RegName: constRegPathGlobal)]
public cF4sdGlobalConfigOld GlobalConfigOld = new cF4sdGlobalConfigOld();
public cF4sdGlobalConfig Global = new cF4sdGlobalConfig(constRegPathConfig + @"\" + constRegPathGlobal);
[RegConfigMetaInformation]
private object ConfigMetaInformation = null;
public static cFasdCockpitConfig Instance;
public event EventHandler UiSettingsChanged;
public cF4SDCockpitXmlConfig XmlConfig { get; private set; } = new cF4SDCockpitXmlConfig();
public static bool IsAnalyticsActive = false;
public static Guid SessionId = Guid.NewGuid();
static cFasdCockpitConfig()
{
Instance = new cFasdCockpitConfig();
Instance.Load();
Instance.Save();
}
public void Load()
{
if (ConfigMetaInformation == null) { } // to avoid compiler warning
cConfigRegistryHelper.Load(constRegPathConfig, this);
Global.Load();
// migrate old settings of SmallViewPosition
if (cConfigRegistryHelper.IsPropertySetByUser("GlobalConfigOld\\SmallViewPosition", this))
if (!cConfigRegistryHelper.IsPropertySetByUser("SmallViewAlignment", Global))
{
var SmallViewAlignment = cF4sdGlobalConfig.ConvertPositionToHorizontalAlignment(GlobalConfigOld.SmallViewPosition, enumF4sdHorizontalAlignment.Right);
Global.SmallViewAlignment = SmallViewAlignment;
Global.Save("SmallViewAlignment");
}
// migrate old settings of FavouriteBarPosition
if (cConfigRegistryHelper.IsPropertySetByUser("GlobalConfigOld\\FavouriteBarPosition", this))
if (!cConfigRegistryHelper.IsPropertySetByUser("FavouriteBarAlignment", Global))
{
var FavouriteBarAlignment = cF4sdGlobalConfig.ConvertPositionToHorizontalAlignment(GlobalConfigOld.FavouriteBarPosition, enumF4sdHorizontalAlignment.Right);
Global.FavouriteBarAlignment = FavouriteBarAlignment;
Global.Save("FavouriteBarAlignment");
}
}
public void Save(string fullPropertyName = null)
{
cConfigRegistryHelper.Save(constRegPathConfig, this, fullPropertyName);
}
public void OnUiSettingsChanged()
{
UiSettingsChanged?.Invoke(this, EventArgs.Empty);
}
public void SetDetailsPageZoom(int zoom)
{
if (zoom == cFasdCockpitConfig.Instance.DetailsPageZoom)
return;
cFasdCockpitConfig.Instance.DetailsPageZoom = zoom;
cFasdCockpitConfig.Instance.Save("DetailsPageZoom");
OnUiSettingsChanged();
}
public void SetSlimPageZoom(int zoom)
{
if (zoom == cFasdCockpitConfig.Instance.SlimPageZoom)
return;
cFasdCockpitConfig.Instance.SlimPageZoom = zoom;
cFasdCockpitConfig.Instance.Save("SlimPageZoom");
OnUiSettingsChanged();
}
private void SetMenuItems()
{
try
{
if (cF4SDCockpitXmlConfig.Instance.MenuSectionConfig?.Sections?.MenuSections != null)
{
foreach (var menuSection in cF4SDCockpitXmlConfig.Instance.MenuSectionConfig?.Sections?.MenuSections)
{
InsertMenuItem(menuSection.Key, menuSection.Value);
}
}
if (cF4SDCockpitXmlConfig.Instance.QuickActionConfig?.F4SDQuickActions?.QuickActions != null)
{
foreach (var quickAction in cF4SDCockpitXmlConfig.Instance.QuickActionConfig?.F4SDQuickActions?.QuickActions)
{
InsertMenuItem(quickAction.Key, quickAction.Value);
}
}
if (cF4SDCockpitXmlConfig.Instance.QuickActionConfig?.F4SDQuickTips?.QuickTips != null)
{
foreach (var quickTip in cF4SDCockpitXmlConfig.Instance.QuickActionConfig?.F4SDQuickTips?.QuickTips)
{
InsertMenuItem(quickTip.Key, quickTip.Value);
}
}
if (cF4SDCockpitXmlConfig.Instance.CopyTemplateConfig?.CopyTemplates?.CopyTemplates != null)
{
foreach (var copyTemplate in cF4SDCockpitXmlConfig.Instance.CopyTemplateConfig?.CopyTemplates?.CopyTemplates)
{
InsertMenuItem(copyTemplate.Key, copyTemplate.Value);
}
}
}
catch (Exception E)
{
LogException(E);
}
void InsertMenuItem(string key, cFasdBaseConfigMenuItem menuItem)
{
if (cF4SDCockpitXmlConfig.Instance.MenuItems.ContainsKey(key))
LogEntry($"There was already a Menu Item with name '{key}'.", LogLevels.Warning);
else
cF4SDCockpitXmlConfig.Instance.MenuItems.Add(key, menuItem);
}
}
private void SetGlobalTranslations()
{
try
{
foreach (var healthcardTranslation in cF4SDCockpitXmlConfig.Instance.HealthCardConfig.Prerequisites.Translations)
{
if (cF4SDCockpitXmlConfig.Instance.Translations.ContainsKey(healthcardTranslation.Key))
LogEntry($"There was allready an Global Translation with name '{healthcardTranslation.Key}'.", LogLevels.Warning);
else
cF4SDCockpitXmlConfig.Instance.Translations.Add(healthcardTranslation.Key, healthcardTranslation.Value);
}
foreach (var quickActionTranslation in cF4SDCockpitXmlConfig.Instance.QuickActionConfig.Translations)
{
if (cF4SDCockpitXmlConfig.Instance.Translations.ContainsKey(quickActionTranslation.Key))
LogEntry($"There was allready an Global Translation with name '{quickActionTranslation.Key}'.", LogLevels.Warning);
else
cF4SDCockpitXmlConfig.Instance.Translations.Add(quickActionTranslation.Key, quickActionTranslation.Value);
}
}
catch (Exception E)
{
LogException(E);
}
}
public async Task<bool> LoadConfigFilesAsync(cFasdCockpitCommunicationBase cockpitCommunication)
{
var CM = MethodBase.GetCurrentMethod();
LogMethodBegin(CM);
try
{
cF4SDCockpitXmlConfig.Instance = new cF4SDCockpitXmlConfig();
List<Task> tasks = new List<Task>();
//Has to run first, because the other configs run a icon validation.
cF4SDCockpitXmlConfig.Instance.HealthCardConfig = (cF4SDHealthCardConfig)await cockpitCommunication.GetConfiguration(enumFasdConfigurationType.healthCard);
if (cF4SDCockpitXmlConfig.Instance.HealthCardConfig?.IsValid == true)
cF4SDCockpitXmlConfig.Instance.HealthCardConfig.ParentNode = cF4SDCockpitXmlConfig.Instance;
else
{
cF4SDCockpitXmlConfig.Instance = null;
LogEntry("LoadConfigFilesAsync: Premature exit because no valid health card configuration exists.");
return false;
}
tasks.Add(Task.Run(async () => cF4SDCockpitXmlConfig.Instance.MenuSectionConfig = (cFasdMenuSectionConfiguration)await cockpitCommunication.GetConfiguration(enumFasdConfigurationType.menuSections)));
tasks.Add(Task.Run(async () => cF4SDCockpitXmlConfig.Instance.QuickActionConfig = (cFasdQuickActionConfig)await cockpitCommunication.GetConfiguration(enumFasdConfigurationType.quickActions)));
tasks.Add(Task.Run(async () => cF4SDCockpitXmlConfig.Instance.CopyTemplateConfig = (cFasdCopyTemplateConfiguration)await cockpitCommunication.GetConfiguration(enumFasdConfigurationType.copyTemplates)));
await Task.WhenAll(tasks);
if (cF4SDCockpitXmlConfig.Instance.QuickActionConfig != null)
{
cF4SDCockpitXmlConfig.Instance.QuickActionConfig.ParentNode = cF4SDCockpitXmlConfig.Instance;
SetGlobalTranslations();
}
SetMenuItems();
if (cF4SDCockpitXmlConfig.Instance.MenuSectionConfig?.IsValid == true &&
cF4SDCockpitXmlConfig.Instance.QuickActionConfig?.IsValid == true &&
cF4SDCockpitXmlConfig.Instance.CopyTemplateConfig?.IsValid == true
)
return true;
}
catch (Exception E)
{
LogException(E);
}
finally
{
LogMethodEnd(CM);
}
LogEntry("LoadConfigFilesAsync: Invalid exit because at least one of the configuration files is not valid.");
cF4SDCockpitXmlConfig.Instance = null;
return false;
}
public async Task<bool> GetCockpitConfigurationAsync()
{
try
{
var _res = await cFasdCockpitCommunicationBase.Instance.GetCockpitConfiguration();
if (!_res)
_res = await cFasdCockpitCommunicationBase.Instance.GetAgentApiAccessInfo();
return _res;
}
catch (Exception E)
{
LogException(E);
}
return false;
}
public async Task InstantiateAnalyticsAsync(Guid SessionId)
{
try
{
IsAnalyticsActive = await cFasdCockpitCommunicationBase.Instance.IsAnalyticsModuleActive();
if (IsAnalyticsActive)
{
cF4sdUserInfo userInfo = null;
lock (cFasdCockpitCommunicationBase.CockpitUserInfoLock)
{
userInfo = cFasdCockpitCommunicationBase.CockpitUserInfo;
}
if (userInfo?.Id.Equals(Guid.Empty) is false)
{
await Task.Run(async () =>
{
try
{
var sessionParameter = new cF4SDUserSessionParameters() { SessionId = SessionId, UserId = userInfo.Id, SessionDate = DateTime.UtcNow };
var couldCreateUserSession = await cFasdCockpitCommunicationBase.Instance.CreateUserSession(sessionParameter);
if (couldCreateUserSession is false)
{
LogEntry($"Could not create session '{SessionId}' for cockpit user '{userInfo.Id}'.", LogLevels.Warning);
IsAnalyticsActive = false;
return;
}
System.Timers.Timer sessionAliveTimer = new System.Timers.Timer(1000 * 60 * 10);
sessionAliveTimer.Start();
sessionAliveTimer.Elapsed += (async (sender, e) => { await cFasdCockpitCommunicationBase.Instance.KeepAliveSession(SessionId); });
}
catch (Exception E)
{
LogException(E);
}
});
}
}
else
LogEntry("Analytics - Analytics is not active.", LogLevels.Info);
}
catch (Exception E)
{
LogException(E);
}
}
public async Task<bool> CheckAgentScriptAvailabilityAsync()
{
try
{
if (cCockpitConfiguration.Instance.agentApiConfiguration.OrganizationCode == null)
return false;
var apiResult = await cFasdCockpitCommunicationBase.Instance.GetQuickActionsOfAgent();
List<string> quickActionsToRemove = new List<string>();
foreach (var quickActionKeyValuePair in cF4SDCockpitXmlConfig.Instance?.QuickActionConfig?.F4SDQuickActions.QuickActions)
{
var quickAction = quickActionKeyValuePair.Value;
if (!(quickAction is cF4sdQuickActionRemote remoteQuickAction))
continue;
if (apiResult.Any(script => script.Id == remoteQuickAction.AgentScriptId))
{
var tempQuickAction = apiResult.First(script => script.Id == remoteQuickAction.AgentScriptId);
remoteQuickAction.ScriptName = tempQuickAction.Name;
remoteQuickAction.InformationClasses.Clear();
switch (tempQuickAction.Type)
{
case FasdCockpitBase.Models.enumAgentScriptType.computer:
remoteQuickAction.InformationClasses.Add(enumFasdInformationClass.Computer);
break;
case FasdCockpitBase.Models.enumAgentScriptType.user:
remoteQuickAction.InformationClasses.Add(enumFasdInformationClass.Computer);
remoteQuickAction.InformationClasses.Add(enumFasdInformationClass.User);
break;
default:
remoteQuickAction.InformationClasses.Add(enumFasdInformationClass.Unknown);
break;
}
continue;
}
if (remoteQuickAction.AgentScriptId == int.MinValue)
{
var tempQuickAction = apiResult.FirstOrDefault(script => script.Name == remoteQuickAction.ScriptName);
if (tempQuickAction != null)
{
remoteQuickAction.AgentScriptId = tempQuickAction.Id;
remoteQuickAction.InformationClasses.Clear();
switch (tempQuickAction.Type)
{
case FasdCockpitBase.Models.enumAgentScriptType.computer:
remoteQuickAction.InformationClasses.Add(enumFasdInformationClass.Computer);
break;
case FasdCockpitBase.Models.enumAgentScriptType.user:
remoteQuickAction.InformationClasses.Add(enumFasdInformationClass.Computer);
remoteQuickAction.InformationClasses.Add(enumFasdInformationClass.User);
break;
default:
remoteQuickAction.InformationClasses.Add(enumFasdInformationClass.Unknown);
break;
}
continue;
}
}
quickActionsToRemove.Add(quickActionKeyValuePair.Key);
}
foreach (var quickAction in quickActionsToRemove)
{
cF4SDCockpitXmlConfig.Instance?.QuickActionConfig?.F4SDQuickActions.QuickActions.Remove(quickAction);
cF4SDCockpitXmlConfig.Instance?.MenuItems?.Remove(quickAction);
}
return true;
}
catch (Exception E)
{
LogException(E);
}
return false;
}
public async Task<bool> CheckServerQuickActionAvailabilityAsync()
{
try
{
var apiResult = await cFasdCockpitCommunicationBase.Instance.GetQuickActionsOfServer();
List<string> quickActionsToRemove = new List<string>();
foreach (var quickActionKeyValuePair in cF4SDCockpitXmlConfig.Instance?.QuickActionConfig?.F4SDQuickActions.QuickActions)
{
var quickAction = quickActionKeyValuePair.Value;
if (!(quickAction is cF4sdQuickActionServer serverQuickAction))
continue;
if (!apiResult.Contains(quickAction.Name))
{
quickActionsToRemove.Add(quickActionKeyValuePair.Key);
}
}
foreach (var quickAction in quickActionsToRemove)
{
cF4SDCockpitXmlConfig.Instance?.QuickActionConfig?.F4SDQuickActions.QuickActions.Remove(quickAction);
cF4SDCockpitXmlConfig.Instance?.MenuItems?.Remove(quickAction);
}
return true;
}
catch (Exception E)
{
LogException(E);
}
return false;
}
}
public class cF4sdGlobalConfigOld
{
[RegConfig(ReadOnly: true)]
public int SmallViewPosition { get; set; }
[RegConfig(ReadOnly: true)]
public int FavouriteBarPosition { get; set; }
}
public class cFasdCockpitConfigPhoneSupport
{
[RegConfig]
public bool DisablePhoneSupport = false;
[RegConfig]
public bool PreferSwyxitNative = true;
[RegConfig]
public string PreferedTapiLine = null;
[RegConfig]
public bool UseTapi32Bit = false;
[RegConfig]
public bool SignalOutgoingCalls = false;
[RegConfig]
public string ExternalCallPrefix = null;
[RegConfig]
public bool ShowUnresolvedPhoneNumbers = false;
}
public class cF4sdCockpitConfigM42
{
[RegConfig]
public enumM42AuthenticationMethod Method = enumM42AuthenticationMethod.passthrough;
[RegConfig]
public enumM42AuthenticationControl Control = enumM42AuthenticationControl.auto;
[RegConfig]
public string BasicUser = null;
[RegConfig]
public string BasicPassword = null;
[RegConfig]
public string ApiToken = null;
}
}