using System;
using System.Threading;
using System.Threading.Tasks;
using Vinno.IUS.Common.Log;
using Vinno.vCloud.Common.FIS.Helper;
using Vinno.vCloud.FIS.CrossPlatform.Common;
using Vinno.vCloud.FIS.CrossPlatform.Common.Enum;
using WingInterfaceLibrary.DTO.ServerInfo;
using WingInterfaceLibrary.Interface;
namespace Vinno.vCloud.Common.FIS
{
internal class ConnectionCheckerV2
{
private readonly IVinnoServerService _vinnoServerService;
private readonly ManualResetEvent _waitEvent = new ManualResetEvent(false);
///
///get or set connection check cycle
///
private readonly int _connectionCheckCycle;
private bool _defaultStatus;
private bool _checkLoginStatus;
public event EventHandler Offlined;
public ConnectionCheckerV2(IVinnoServerService vinnoServerService, int connectionCheckCycle)
{
_vinnoServerService = vinnoServerService;
_connectionCheckCycle = connectionCheckCycle;
_defaultStatus = false;
_checkLoginStatus = false;
}
///
/// Start the Heartrate to keep the session available.
///
public void Start(bool defaultStatus)
{
_defaultStatus = defaultStatus;
_checkLoginStatus = defaultStatus;
Task.Run(() =>
{
while (!_waitEvent.WaitOne(TimeSpan.FromSeconds(_connectionCheckCycle)))
{
DoCheck();
}
});
}
///
/// Stop the Heartrate
///
public void Stop()
{
_waitEvent.Set();
}
private void DoCheck()
{
try
{
if (_defaultStatus)
{
if (!Check(true))
{
OnOfflined();
}
}
else
{
OnOfflined();
}
}
catch (Exception ex)
{
Logger.WriteLineError($"ConnectionCheckerV2 do check failed:{ex}");
}
}
public bool Check(bool doubleCheck = true)
{
try
{
if (_checkLoginStatus)
{
if (CommonParameter.Instance.DeviceStatus == EnumDeviceStatus.Offline || CommonParameter.Instance.DeviceStatus == EnumDeviceStatus.LoginFailed)//说明连接失败
{
return false;
}
else if (CommonParameter.Instance.DeviceStatus != EnumDeviceStatus.Logoning && CommonParameter.Instance.DeviceStatus != EnumDeviceStatus.Reconnecting && CommonParameter.Instance.DeviceStatus != EnumDeviceStatus.Online)//说明还在连接,未失败也未成功,下次仍需检查
{
_checkLoginStatus = false;
}
}
EchoResult result = JsonRpcHelper.Echo(_vinnoServerService);
if (result == null || result.Code != 0)
{
if (doubleCheck)
{
result = JsonRpcHelper.Echo(_vinnoServerService);
if (result == null || result.Code != 0)
{
return false;
}
else
{
return true;
}
}
else
{
return false;
}
}
else
{
return true;
}
}
catch (Exception ex)
{
Logger.WriteLineError($"ConnectionCheckerV2 check error:{ex}");
return false;
}
}
private void OnOfflined()
{
Offlined?.Invoke(this, EventArgs.Empty);
}
}
}