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:
parent
5639724390
commit
7ec0db9ebb
@ -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)
|
||||
{
|
||||
|
||||
Loading…
Reference in New Issue
Block a user