private static void SAMFinder(object args)
{
bool stopThread = false;
string readerName = ((InfoHolder)args).readerName;
ABnoteSAMFinder sam = ((InfoHolder)args).sam;
SCARD_READERSTATE stat = Smart.GetStatusChangeEx(readerName, 10, SCardState.SCARD_STATE_UNAWARE);
while (!stopThread)
{
if ((stat.dwEventState & SCardState.SCARD_STATE_UNKNOWN) == SCardState.SCARD_STATE_UNKNOWN)
{
// reader removed?
return;
}
if (((stat.dwEventState & SCardState.SCARD_STATE_PRESENT) == SCardState.SCARD_STATE_PRESENT) &&
!((stat.dwEventState & SCardState.SCARD_STATE_INUSE) == SCardState.SCARD_STATE_INUSE))
{
// Card inserted - check for SAM applet
ABnoteSAM card = new ABnoteSAM(Smart.Connect(readerName), new RelaxedStatusWordFilter());
string resp = "";
try
{
resp = card.SelectApplet();
}
catch (Exception) { }
if (resp.EndsWith("9000"))
{
sam.ReaderName = readerName;
sam.OnSAMFound(card);
}
else if (sam.FindAnyCard)
{
sam.ReaderName = readerName;
sam.OnSAMFound(card);
}
}
lock (stateLock)
{
stopThread = sam.StopFinder;
}
try
{
stat = Smart.GetStatusChangeEx((string)readerName, -1, stat.dwEventState);
}
catch (Exception) {
break;
}
}
}