inital
This commit is contained in:
192
FasdDesktopUi/Basics/Helper/DirectConnectionHelper.cs
Normal file
192
FasdDesktopUi/Basics/Helper/DirectConnectionHelper.cs
Normal file
@@ -0,0 +1,192 @@
|
||||
using C4IT.FASD.Base;
|
||||
using C4IT.FASD.Cockpit.Communication;
|
||||
using C4IT.Logging;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using static C4IT.Logging.cLogManager;
|
||||
|
||||
namespace FasdDesktopUi.Basics.Helper
|
||||
{
|
||||
public class cDirectConnectionHelper
|
||||
{
|
||||
#region Properties and Fields
|
||||
|
||||
private int? isTryingToConnectToDevice = null;
|
||||
|
||||
private readonly cSupportCaseDataProvider dataProvider;
|
||||
|
||||
private Guid directConnectionId = Guid.Empty;
|
||||
|
||||
private readonly System.Timers.Timer directConnectionRenewTimer = new System.Timers.Timer();
|
||||
|
||||
public bool IsDirectConnectionActive { get => directConnectionId.Equals(Guid.Empty) is false; }
|
||||
|
||||
#endregion
|
||||
|
||||
public event EventHandler DirectConnectionChanged;
|
||||
|
||||
public cDirectConnectionHelper(cSupportCaseDataProvider dataProvider)
|
||||
{
|
||||
try
|
||||
{
|
||||
this.dataProvider = dataProvider;
|
||||
|
||||
directConnectionRenewTimer.Interval = 1000 * 60 * 3;
|
||||
directConnectionRenewTimer.Elapsed += async (sender, e) => await DirectConnectionExtendDurationAsync(60 * 5);
|
||||
}
|
||||
catch (Exception E)
|
||||
{
|
||||
LogException(E);
|
||||
}
|
||||
}
|
||||
|
||||
public void Reset()
|
||||
{
|
||||
try
|
||||
{
|
||||
directConnectionId = Guid.Empty;
|
||||
isTryingToConnectToDevice = null;
|
||||
DirectConnectionChanged?.Invoke(this, EventArgs.Empty);
|
||||
}
|
||||
catch (Exception E)
|
||||
{
|
||||
LogException(E);
|
||||
}
|
||||
}
|
||||
|
||||
public async Task DirectConnectionStartAsync()
|
||||
{
|
||||
var CM = MethodBase.GetCurrentMethod();
|
||||
LogMethodBegin(CM);
|
||||
try
|
||||
{
|
||||
const int maxRetries = 60;
|
||||
int retryCount = 0;
|
||||
|
||||
bool shouldTryStartDirectConnection = true;
|
||||
while (shouldTryStartDirectConnection && retryCount < maxRetries)
|
||||
{
|
||||
shouldTryStartDirectConnection = !(await CouldStartDirectConnectionAsync());
|
||||
|
||||
if (shouldTryStartDirectConnection)
|
||||
await Task.Delay(1000 * 5);
|
||||
|
||||
retryCount++;
|
||||
}
|
||||
}
|
||||
catch (Exception E)
|
||||
{
|
||||
LogException(E);
|
||||
}
|
||||
finally
|
||||
{
|
||||
LogMethodEnd(CM);
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<bool> CouldStartDirectConnectionAsync()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (dataProvider.Identities.Any(identity => identity.Class == enumFasdInformationClass.Computer) is false)
|
||||
{
|
||||
LogEntry("Direct Connection - There was no information class of type computer found.", LogLevels.Error);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!dataProvider.NamedParameterEntries.TryGetValue("AgentDeviceId", out var agentDeviceIdParameter))
|
||||
{
|
||||
LogEntry("Direct Connection - NamedParameter 'AgentDeviceId' could not be found.", LogLevels.Error);
|
||||
}
|
||||
if (agentDeviceIdParameter == null || !int.TryParse(agentDeviceIdParameter.GetValue(), out int agentDeviceId))
|
||||
{
|
||||
LogEntry("Direct Connection - There was no valid AgentDeviceId found.", LogLevels.Error);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (isTryingToConnectToDevice == agentDeviceId)
|
||||
return true;
|
||||
|
||||
isTryingToConnectToDevice = agentDeviceId;
|
||||
|
||||
var tempConnectionId = await cFasdCockpitCommunicationBase.Instance.TryActivateDirectConnection(agentDeviceId);
|
||||
|
||||
if (tempConnectionId is null)
|
||||
{
|
||||
LogEntry("Direct Connection - Failed to receive connection status.", LogLevels.Error);
|
||||
isTryingToConnectToDevice = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
directConnectionId = tempConnectionId.Value;
|
||||
|
||||
if (isTryingToConnectToDevice != agentDeviceId)
|
||||
return true;
|
||||
|
||||
isTryingToConnectToDevice = null;
|
||||
await DirectConnectionExtendDurationAsync(60 * 5);
|
||||
directConnectionRenewTimer.Start();
|
||||
DirectConnectionChanged?.Invoke(this, EventArgs.Empty);
|
||||
return true;
|
||||
}
|
||||
catch (Exception E)
|
||||
{
|
||||
LogException(E);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public async Task DirectConnectionStopAsync()
|
||||
{
|
||||
|
||||
var CM = MethodBase.GetCurrentMethod();
|
||||
LogMethodBegin(CM);
|
||||
|
||||
try
|
||||
{
|
||||
directConnectionRenewTimer.Stop();
|
||||
|
||||
if (directConnectionId.Equals(Guid.Empty))
|
||||
return;
|
||||
|
||||
await cFasdCockpitCommunicationBase.Instance.StopDirectConnection(directConnectionId);
|
||||
Reset();
|
||||
}
|
||||
catch (Exception E)
|
||||
{
|
||||
LogException(E);
|
||||
}
|
||||
finally
|
||||
{
|
||||
LogMethodEnd(CM);
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<bool> DirectConnectionExtendDurationAsync(int durationInSeconds)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (directConnectionId.Equals(Guid.Empty))
|
||||
return false;
|
||||
|
||||
var output = await cFasdCockpitCommunicationBase.Instance.DirectConnectionExtendDuration(directConnectionId, durationInSeconds);
|
||||
|
||||
if (output is false)
|
||||
Reset();
|
||||
|
||||
return output;
|
||||
}
|
||||
catch (Exception E)
|
||||
{
|
||||
LogException(E);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user