[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