[Pcsclite-cvs-commit] r2496 - trunk/PCSC/src
Ludovic Rousseau
rousseau at alioth.debian.org
Wed Mar 28 09:20:59 CET 2007
Author: rousseau
Date: 2007-03-28 08:20:59 +0000 (Wed, 28 Mar 2007)
New Revision: 2496
Modified:
trunk/PCSC/src/eventhandler.c
trunk/PCSC/src/winscard_clnt.c
Log:
SCardGetStatusChange(): add a counter in the upper word of dwEventState
so it is possible to detect a card movement betweeen two calls to
SCardGetStatusChange()
Thanks to Matheus Ribeiro for the patch
Modified: trunk/PCSC/src/eventhandler.c
===================================================================
--- trunk/PCSC/src/eventhandler.c 2007-03-27 12:21:38 UTC (rev 2495)
+++ trunk/PCSC/src/eventhandler.c 2007-03-28 08:20:59 UTC (rev 2496)
@@ -200,6 +200,16 @@
return SCARD_E_NO_MEMORY;
}
+static void incrementEventCounter(struct pubReaderStatesList *readerState)
+{
+ int counter;
+
+ counter = (readerState -> readerState >> 16) & 0xFFFF;
+ counter++;
+ readerState -> readerState = (readerState -> readerState & 0xFFFF)
+ + (counter << 16);
+}
+
void EHStatusHandlerThread(PREADER_CONTEXT rContext)
{
LONG rv;
@@ -364,6 +374,8 @@
rContext->readerState->readerState &= ~SCARD_SPECIFIC;
dwCurrentState = SCARD_ABSENT;
+ incrementEventCounter(rContext->readerState);
+
SYS_MMapSynchronize((void *) rContext->readerState, pageSize);
}
@@ -414,6 +426,8 @@
dwCurrentState = SCARD_PRESENT;
+ incrementEventCounter(rContext->readerState);
+
SYS_MMapSynchronize((void *) rContext->readerState, pageSize);
Log2(PCSC_LOG_INFO, "Card inserted into %s", lpcReader);
Modified: trunk/PCSC/src/winscard_clnt.c
===================================================================
--- trunk/PCSC/src/winscard_clnt.c 2007-03-27 12:21:38 UTC (rev 2495)
+++ trunk/PCSC/src/winscard_clnt.c 2007-03-28 08:20:59 UTC (rev 2496)
@@ -1863,7 +1863,22 @@
* Now we check all the Reader States
*/
dwState = rContext->readerState;
+ {
+ int currentCounter, stateCounter;
+ stateCounter = (dwState >> 16) & 0xFFFF;
+ currentCounter = (currReader->dwCurrentState >> 16) & 0xFFFF;
+
+ /* has the event counter changed since the last call? */
+ if (stateCounter != currentCounter)
+ currReader->dwEventState |= SCARD_STATE_CHANGED;
+
+ /* add an event counter in the upper word of dwEventState */
+ currReader->dwEventState =
+ ((currReader->dwEventState & 0xffff )
+ | (stateCounter << 16));
+ }
+
/*********** Check if the reader is in the correct state ********/
if (dwState & SCARD_UNKNOWN)
{
More information about the Pcsclite-cvs-commit
mailing list