Set service so that it will always start, not exit early if there is no card reader attached.

WIP #90
This commit is contained in:
Chris.Watts90@outlook.com 2018-03-06 14:31:31 +00:00
parent 5639724390
commit 7ec0db9ebb

View File

@ -12,9 +12,8 @@ namespace CardReaderService
{
private Thread _mainWorkThread;
private bool _stopMainWorkerThread;
private AutoResetEvent _mainWorkerTerminationSignal;
private string _readerName = "";
//private SCardReader _reader;
private SCardMonitor _cardMonitor;
public Service1()
@ -26,27 +25,25 @@ namespace CardReaderService
{
OnStart(new string[] { });
}
//
protected override void OnStart(string[] args)
{
Console.WriteLine("Starting.. Getting available readers");
var ctxFactory = ContextFactory.Instance;
using(var context = ctxFactory.Establish(SCardScope.System))
{
var readerNames = context.GetReaders();
if (NoReaderAvailable(readerNames))
{
Console.WriteLine("No Card Reader is available, Exiting..");
return;
}
Console.WriteLine("Choosing first available reader: " + readerNames.First());
_readerName = readerNames.First();
_cardMonitor = new SCardMonitor(ctxFactory, SCardScope.System);
_cardMonitor.CardInserted += _cardMonitor_CardInserted;
_cardMonitor.Start(_readerName);
StartWorkerThread();
}
private bool WeHaveValidCardReader()
{
if (_cardMonitor == null)
{
return false;
}
if (_cardMonitor.GetCurrentState(0) == SCRState.Unknown ||
_cardMonitor.GetCurrentState(0) == SCRState.Unavailable ||
_cardMonitor.GetCurrentState(0) == SCRState.Unaware)
{
return false;
}
return true;
}
public void Stop()
@ -57,14 +54,11 @@ namespace CardReaderService
protected override void OnStop()
{
_stopMainWorkerThread = true;
_mainWorkerTerminationSignal.Set();
if (_mainWorkThread != null && _mainWorkThread.IsAlive)
{
_mainWorkThread.Join(3000);
if (_mainWorkThread.IsAlive)
{
_mainWorkThread.Interrupt();
}
}
if (_cardMonitor != null)
{
_cardMonitor.Cancel();
@ -81,6 +75,7 @@ namespace CardReaderService
Name = "CardServiceMainThread",
IsBackground = false
};
_mainWorkerTerminationSignal = new AutoResetEvent(false);
_mainWorkThread.Start();
}
@ -130,14 +125,37 @@ namespace CardReaderService
{
while (!_stopMainWorkerThread)
{
//dont actually need to do anything.. but cannot exit right away?
Thread.Sleep(3000);
if (!WeHaveValidCardReader())
{ //only do this if we don't have a valid card reader
Console.WriteLine("Starting.. Getting available readers");
var ctxFactory = ContextFactory.Instance;
using (var context = ctxFactory.Establish(SCardScope.System))
{
var readerNames = context.GetReaders();
if (!NoReaderAvailable(readerNames))
{
//we have a reader available, so initialise!
Console.WriteLine("Choosing first available reader: " + readerNames.First());
_readerName = readerNames.First();
_cardMonitor = new SCardMonitor(ctxFactory, SCardScope.System);
_cardMonitor.CardInserted += _cardMonitor_CardInserted;
_cardMonitor.Start(_readerName);
StartWorkerThread();
}
else
{
Console.WriteLine("No Card Reader is available..");
}
}
}
_mainWorkerTerminationSignal.WaitOne(3000);
}
}
private string ConvertByteUIDToString(byte[] uid)
{
StringBuilder sb = new StringBuilder();
var sb = new StringBuilder();
foreach (var b in uid)
{