[Pcsclite-cvs-commit] PCSC/src eventhandler.c,1.21,1.22 prothandler.c,1.10,1.11 readerfactory.c,1.54,1.55 winscard.c,1.31,1.32

rousseau@haydn.debian.org rousseau@haydn.debian.org


Update of /cvsroot/pcsclite/PCSC/src
In directory haydn:/tmp/cvs-serv26254/src

Modified Files:
	eventhandler.c prothandler.c readerfactory.c winscard.c 
Log Message:
update the code to use the new READER_CONTEXT structure with the
struct pubReaderStatesList *readerState field


Index: eventhandler.c
===================================================================
RCS file: /cvsroot/pcsclite/PCSC/src/eventhandler.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -d -r1.21 -r1.22
--- eventhandler.c	17 Jun 2004 07:44:03 -0000	1.21
+++ eventhandler.c	18 Jun 2004 08:44:31 -0000	1.22
@@ -96,15 +96,7 @@
 
 LONG EHDestroyEventHandler(PREADER_CONTEXT rContext)
 {
-	LONG rv;
-	int i;
-
-	i = 0;
-	rv = 0;
-
-
-	i = rContext->dwPublicID;
-	if ((readerStates[i])->readerName[0] == 0)
+	if (rContext->readerState && rContext->readerState->readerName[0] == '\0')
 	{
 		DebugLogA("Thread already stomped.");
 		return SCARD_S_SUCCESS;
@@ -130,14 +122,16 @@
 	 * used again 
 	 */
 
-	memset((readerStates[i])->readerName, 0, MAX_READERNAME);
-	memset((readerStates[i])->cardAtr, 0, MAX_ATR_SIZE);
-	(readerStates[i])->readerID = 0;
-	(readerStates[i])->readerState = 0;
-	(readerStates[i])->lockState = 0;
-	(readerStates[i])->readerSharing = 0;
-	(readerStates[i])->cardAtrLength = 0;
-	(readerStates[i])->cardProtocol = 0;
+	memset(rContext->readerState->readerName, 0,
+		sizeof(rContext->readerState->readerName));
+	memset(rContext->readerState->cardAtr, 0,
+		sizeof(rContext->readerState->cardAtr));
+	rContext->readerState->readerID = 0;
+	rContext->readerState->readerState = 0;
+	rContext->readerState->lockState = 0;
+	rContext->readerState->readerSharing = 0;
+	rContext->readerState->cardAtrLength = 0;
+	rContext->readerState->cardProtocol = 0;
 
 	/* Zero the thread */
 	rContext->pthThread = 0;
@@ -150,27 +144,15 @@
 LONG EHSpawnEventHandler(PREADER_CONTEXT rContext)
 {
 	LONG rv;
-	LPCTSTR lpcReader;
-	DWORD dwStatus, dwProtocol;
+	DWORD dwStatus = 0;
 	int i;
+	UCHAR ucAtr[MAX_ATR_SIZE];
+	DWORD dwAtrLen = 0;
 
-	/*
-	 * Zero out everything 
-	 */
-	rv = 0;
-	lpcReader = 0;
-	dwStatus = 0;
-	dwProtocol = 0;
-	i = 0;
-
-	lpcReader = rContext->lpcReader;
-
-	rv = IFDStatusICC(rContext, &dwStatus,
-		&dwProtocol, rContext->ucAtr, &rContext->dwAtrLen);
-
+	rv = IFDStatusICC(rContext, &dwStatus, ucAtr, &dwAtrLen);
 	if (rv != SCARD_S_SUCCESS)
 	{
-		DebugLogB("Initial Check Failed on %s", lpcReader);
+		DebugLogB("Initial Check Failed on %s", rContext->lpcReader);
 		return SCARD_F_UNKNOWN_ERROR;
 	}
 
@@ -189,18 +171,14 @@
 	/*
 	 * Set all the attributes to this reader 
 	 */
-	strcpy((readerStates[i])->readerName, rContext->lpcReader);
-	memcpy((readerStates[i])->cardAtr, rContext->ucAtr,
-		rContext->dwAtrLen);
-	(readerStates[i])->readerID = i + 100;
-	(readerStates[i])->readerState = rContext->dwStatus;
-	(readerStates[i])->readerSharing = rContext->dwContexts;
-	(readerStates[i])->cardAtrLength = rContext->dwAtrLen;
-	(readerStates[i])->cardProtocol = rContext->dwProtocol;
-	/*
-	 * So the thread can access this array indice 
-	 */
-	rContext->dwPublicID = i;
+	rContext->readerState = readerStates[i];
+	strcpy(rContext->readerState->readerName, rContext->lpcReader);
+	memcpy(rContext->readerState->cardAtr, ucAtr, dwAtrLen);
+	rContext->readerState->readerID = i + 100;
+	rContext->readerState->readerState = dwStatus;
+	rContext->readerState->readerSharing = rContext->dwContexts;
+	rContext->readerState->cardAtrLength = dwAtrLen;
+	rContext->readerState->cardProtocol = 0;
 
 	rv = SYS_ThreadCreate(&rContext->pthThread, NULL,
 		(PCSCLITE_THREAD_FUNCTION( ))EHStatusHandlerThread, (LPVOID) rContext);
@@ -214,97 +192,97 @@
 {
 	LONG rv;
 	LPCTSTR lpcReader;
-	DWORD dwStatus, dwProtocol, dwReaderSharing;
-	DWORD dwErrorCount, dwCurrentState;
-	int i, pageSize;
+	DWORD dwStatus, dwReaderSharing;
+	DWORD dwCurrentState;
+	int pageSize;
 
 	/*
 	 * Zero out everything 
 	 */
-	rv = 0;
-	lpcReader = 0;
 	dwStatus = 0;
-	dwProtocol = 0;
 	dwReaderSharing = 0;
 	dwCurrentState = 0;
-	dwErrorCount = 0;
-	i = 0;
-	pageSize = 0;
 
 	lpcReader = rContext->lpcReader;
-	i = rContext->dwPublicID;
 
 	pageSize = SYS_GetPageSize();
 
-	rv = IFDStatusICC(rContext, &dwStatus,
-		&dwProtocol, rContext->ucAtr, &rContext->dwAtrLen);
-
+	rv = IFDStatusICC(rContext, &dwStatus, rContext->readerState->cardAtr,
+			&rContext->readerState->cardAtrLength);
 	if (dwStatus & SCARD_PRESENT)
 	{
 		rv = IFDPowerICC(rContext, IFD_POWER_UP,
-			rContext->ucAtr, &rContext->dwAtrLen);
+			rContext->readerState->cardAtr,
+			&rContext->readerState->cardAtrLength);
 
 		if (rv == IFD_SUCCESS)
 		{
-			rContext->dwProtocol = PHGetDefaultProtocol(rContext->ucAtr,
-				rContext->dwAtrLen);
-			rContext->dwStatus |= SCARD_PRESENT;
-			rContext->dwStatus &= ~SCARD_ABSENT;
-			rContext->dwStatus |= SCARD_POWERED;
-			rContext->dwStatus |= SCARD_NEGOTIABLE;
-			rContext->dwStatus &= ~SCARD_SPECIFIC;
-			rContext->dwStatus &= ~SCARD_SWALLOWED;
-			rContext->dwStatus &= ~SCARD_UNKNOWN;
+			rContext->readerState->cardProtocol =
+				PHGetDefaultProtocol(rContext->readerState->cardAtr,
+				rContext->readerState->cardAtrLength);
+
+			dwStatus |= SCARD_PRESENT;
+			dwStatus &= ~SCARD_ABSENT;
+			dwStatus |= SCARD_POWERED;
+			dwStatus |= SCARD_NEGOTIABLE;
+			dwStatus &= ~SCARD_SPECIFIC;
+			dwStatus &= ~SCARD_SWALLOWED;
+			dwStatus &= ~SCARD_UNKNOWN;
+
+			if (rContext->readerState->cardAtrLength > 0)
+			{
+				DebugXxd("Card ATR: ",
+					rContext->readerState->cardAtr,
+					rContext->readerState->cardAtrLength);
+			}
+			else
+				DebugLogA("Card ATR: (NULL)");
 		}
 		else
 		{
-			rContext->dwStatus |= SCARD_PRESENT;
-			rContext->dwStatus &= ~SCARD_ABSENT;
-			rContext->dwStatus |= SCARD_SWALLOWED;
-			rContext->dwStatus &= ~SCARD_POWERED;
-			rContext->dwStatus &= ~SCARD_NEGOTIABLE;
-			rContext->dwStatus &= ~SCARD_SPECIFIC;
-			rContext->dwStatus &= ~SCARD_UNKNOWN;
-			rContext->dwProtocol = 0;
-			rContext->dwAtrLen = 0;
+			dwStatus |= SCARD_PRESENT;
+			dwStatus &= ~SCARD_ABSENT;
+			dwStatus |= SCARD_SWALLOWED;
+			dwStatus &= ~SCARD_POWERED;
+			dwStatus &= ~SCARD_NEGOTIABLE;
+			dwStatus &= ~SCARD_SPECIFIC;
+			dwStatus &= ~SCARD_UNKNOWN;
+			DebugLogA("Error powering up card.");
 		}
 
 		dwCurrentState = SCARD_PRESENT;
-
 	}
 	else
 	{
+		dwStatus |= SCARD_ABSENT;
+		dwStatus &= ~SCARD_PRESENT;
+		dwStatus &= ~SCARD_POWERED;
+		dwStatus &= ~SCARD_NEGOTIABLE;
+		dwStatus &= ~SCARD_SPECIFIC;
+		dwStatus &= ~SCARD_SWALLOWED;
+		dwStatus &= ~SCARD_UNKNOWN;
+		rContext->readerState->cardAtrLength = 0;
+		rContext->readerState->cardProtocol = 0;
+
 		dwCurrentState = SCARD_ABSENT;
-		rContext->dwStatus |= SCARD_ABSENT;
-		rContext->dwStatus &= ~SCARD_PRESENT;
-		rContext->dwStatus &= ~SCARD_POWERED;
-		rContext->dwStatus &= ~SCARD_NEGOTIABLE;
-		rContext->dwStatus &= ~SCARD_SPECIFIC;
-		rContext->dwStatus &= ~SCARD_SWALLOWED;
-		rContext->dwStatus &= ~SCARD_UNKNOWN;
-		rContext->dwAtrLen = 0;
-		rContext->dwProtocol = 0;
 	}
 
 	/*
 	 * Set all the public attributes to this reader 
 	 */
-	(readerStates[i])->readerState = rContext->dwStatus;
-	(readerStates[i])->cardAtrLength = rContext->dwAtrLen;
-	(readerStates[i])->cardProtocol = rContext->dwProtocol;
-	(readerStates[i])->readerSharing = dwReaderSharing =
+	rContext->readerState->readerState = dwStatus;
+	rContext->readerState->readerSharing = dwReaderSharing =
 		rContext->dwContexts;
-	memcpy((readerStates[i])->cardAtr, rContext->ucAtr,
-		rContext->dwAtrLen);
 
-	SYS_MMapSynchronize((void *) readerStates[i], pageSize);
+	SYS_MMapSynchronize((void *) rContext->readerState, pageSize);
 
 	while (1)
 	{
 		dwStatus = 0;
 
 		rv = IFDStatusICC(rContext, &dwStatus,
-			&dwProtocol, rContext->ucAtr, &rContext->dwAtrLen);
+			rContext->readerState->cardAtr,
+			&rContext->readerState->cardAtrLength);
 
 		if (rv != SCARD_S_SUCCESS)
 		{
@@ -314,28 +292,19 @@
 			 * Set error status on this reader while errors occur 
 			 */
 
-			rContext->dwStatus &= ~SCARD_ABSENT;
-			rContext->dwStatus &= ~SCARD_PRESENT;
-			rContext->dwStatus &= ~SCARD_POWERED;
-			rContext->dwStatus &= ~SCARD_NEGOTIABLE;
-			rContext->dwStatus &= ~SCARD_SPECIFIC;
-			rContext->dwStatus &= ~SCARD_SWALLOWED;
-			rContext->dwStatus |= SCARD_UNKNOWN;
-			rContext->dwAtrLen = 0;
-			rContext->dwProtocol = 0;
+			rContext->readerState->readerState &= ~SCARD_ABSENT;
+			rContext->readerState->readerState &= ~SCARD_PRESENT;
+			rContext->readerState->readerState &= ~SCARD_POWERED;
+			rContext->readerState->readerState &= ~SCARD_NEGOTIABLE;
+			rContext->readerState->readerState &= ~SCARD_SPECIFIC;
+			rContext->readerState->readerState &= ~SCARD_SWALLOWED;
+			rContext->readerState->readerState |= SCARD_UNKNOWN;
+			rContext->readerState->cardAtrLength = 0;
+			rContext->readerState->cardProtocol = 0;
 
 			dwCurrentState = SCARD_UNKNOWN;
 
-			/*
-			 * Set all the public attributes to this reader 
-			 */
-			(readerStates[i])->readerState = rContext->dwStatus;
-			(readerStates[i])->cardAtrLength = rContext->dwAtrLen;
-			(readerStates[i])->cardProtocol = rContext->dwProtocol;
-			memcpy((readerStates[i])->cardAtr, rContext->ucAtr,
-				rContext->dwAtrLen);
-
-			SYS_MMapSynchronize((void *) readerStates[i], pageSize);
+			SYS_MMapSynchronize((void *) rContext->readerState, pageSize);
 
 			/*
 			 * This code causes race conditions on G4's with USB
@@ -372,27 +341,18 @@
 				 */
 				RFSetReaderEventState(rContext, SCARD_REMOVED);
 
-				rContext->dwAtrLen = 0;
-				rContext->dwProtocol = 0;
-				rContext->dwStatus |= SCARD_ABSENT;
-				rContext->dwStatus &= ~SCARD_UNKNOWN;
-				rContext->dwStatus &= ~SCARD_PRESENT;
-				rContext->dwStatus &= ~SCARD_POWERED;
-				rContext->dwStatus &= ~SCARD_NEGOTIABLE;
-				rContext->dwStatus &= ~SCARD_SWALLOWED;
-				rContext->dwStatus &= ~SCARD_SPECIFIC;
+				rContext->readerState->cardAtrLength = 0;
+				rContext->readerState->cardProtocol = 0;
+				rContext->readerState->readerState |= SCARD_ABSENT;
+				rContext->readerState->readerState &= ~SCARD_UNKNOWN;
+				rContext->readerState->readerState &= ~SCARD_PRESENT;
+				rContext->readerState->readerState &= ~SCARD_POWERED;
+				rContext->readerState->readerState &= ~SCARD_NEGOTIABLE;
+				rContext->readerState->readerState &= ~SCARD_SWALLOWED;
+				rContext->readerState->readerState &= ~SCARD_SPECIFIC;
 				dwCurrentState = SCARD_ABSENT;
 
-				/*
-				 * Set all the public attributes to this reader 
-				 */
-				(readerStates[i])->readerState = rContext->dwStatus;
-				(readerStates[i])->cardAtrLength = rContext->dwAtrLen;
-				(readerStates[i])->cardProtocol = rContext->dwProtocol;
-				memcpy((readerStates[i])->cardAtr, rContext->ucAtr,
-					rContext->dwAtrLen);
-
-				SYS_MMapSynchronize((void *) readerStates[i], pageSize);
+				SYS_MMapSynchronize((void *) rContext->readerState, pageSize);
 			}
 
 		}
@@ -406,20 +366,21 @@
 				 */
 				SYS_USleep(PCSCLITE_STATUS_WAIT);
 				rv = IFDPowerICC(rContext, IFD_POWER_UP,
-					rContext->ucAtr, &rContext->dwAtrLen);
+					rContext->readerState->cardAtr,
+					&rContext->readerState->cardAtrLength);
 
 				if (rv == IFD_SUCCESS)
 				{
-					rContext->dwProtocol =
-						PHGetDefaultProtocol(rContext->ucAtr,
-						rContext->dwAtrLen);
-					rContext->dwStatus |= SCARD_PRESENT;
-					rContext->dwStatus &= ~SCARD_ABSENT;
-					rContext->dwStatus |= SCARD_POWERED;
-					rContext->dwStatus |= SCARD_NEGOTIABLE;
-					rContext->dwStatus &= ~SCARD_SPECIFIC;
-					rContext->dwStatus &= ~SCARD_UNKNOWN;
-					rContext->dwStatus &= ~SCARD_SWALLOWED;
+					rContext->readerState->cardProtocol =
+						PHGetDefaultProtocol(rContext->readerState->cardAtr,
+						rContext->readerState->cardAtrLength);
+					rContext->readerState->readerState |= SCARD_PRESENT;
+					rContext->readerState->readerState &= ~SCARD_ABSENT;
+					rContext->readerState->readerState |= SCARD_POWERED;
+					rContext->readerState->readerState |= SCARD_NEGOTIABLE;
+					rContext->readerState->readerState &= ~SCARD_SPECIFIC;
+					rContext->readerState->readerState &= ~SCARD_UNKNOWN;
+					rContext->readerState->readerState &= ~SCARD_SWALLOWED;
 
 					/*
 					 * Notify the card has been reset 
@@ -430,38 +391,30 @@
 				}
 				else
 				{
-					rContext->dwStatus |= SCARD_PRESENT;
-					rContext->dwStatus &= ~SCARD_ABSENT;
-					rContext->dwStatus |= SCARD_SWALLOWED;
-					rContext->dwStatus &= ~SCARD_POWERED;
-					rContext->dwStatus &= ~SCARD_NEGOTIABLE;
-					rContext->dwStatus &= ~SCARD_SPECIFIC;
-					rContext->dwStatus &= ~SCARD_UNKNOWN;
-					rContext->dwAtrLen = 0;
-					rContext->dwProtocol = 0;
+					rContext->readerState->readerState |= SCARD_PRESENT;
+					rContext->readerState->readerState &= ~SCARD_ABSENT;
+					rContext->readerState->readerState |= SCARD_SWALLOWED;
+					rContext->readerState->readerState &= ~SCARD_POWERED;
+					rContext->readerState->readerState &= ~SCARD_NEGOTIABLE;
+					rContext->readerState->readerState &= ~SCARD_SPECIFIC;
+					rContext->readerState->readerState &= ~SCARD_UNKNOWN;
+					rContext->readerState->cardAtrLength = 0;
+					rContext->readerState->cardProtocol = 0;
 				}
 
 				dwCurrentState = SCARD_PRESENT;
 
-				/*
-				 * Set all the public attributes to this reader 
-				 */
-				(readerStates[i])->readerState = rContext->dwStatus;
-				(readerStates[i])->cardAtrLength = rContext->dwAtrLen;
-				(readerStates[i])->cardProtocol = rContext->dwProtocol;
-				memcpy((readerStates[i])->cardAtr, rContext->ucAtr,
-					rContext->dwAtrLen);
-
-				SYS_MMapSynchronize((void *) readerStates[i], pageSize);
+				SYS_MMapSynchronize((void *) rContext->readerState, pageSize);
 
 				DebugLogB("Card inserted into %s", lpcReader);
 
 				if (rv == IFD_SUCCESS)
 				{
-					if (rContext->dwAtrLen > 0)
+					if (rContext->readerState->cardAtrLength > 0)
 					{
 						DebugXxd("Card ATR: ",
-							rContext->ucAtr, rContext->dwAtrLen);
+							rContext->readerState->cardAtr,
+							rContext->readerState->cardAtrLength);
 					}
 					else
 						DebugLogA("Card ATR: (NULL)");
@@ -488,8 +441,8 @@
 		if (dwReaderSharing != rContext->dwContexts)
 		{
 			dwReaderSharing = rContext->dwContexts;
-			(readerStates[i])->readerSharing = dwReaderSharing;
-			SYS_MMapSynchronize((void *) readerStates[i], pageSize);
+			rContext->readerState->readerSharing = dwReaderSharing;
+			SYS_MMapSynchronize((void *) rContext->readerState, pageSize);
 		}
 
 		SYS_USleep(PCSCLITE_STATUS_POLL_RATE);
@@ -498,5 +451,5 @@
 
 void EHSetSharingEvent(PREADER_CONTEXT rContext, DWORD dwValue)
 {
-	(readerStates[rContext->dwPublicID])->lockState = dwValue;
+	rContext->readerState->lockState = dwValue;
 }

Index: prothandler.c
===================================================================
RCS file: /cvsroot/pcsclite/PCSC/src/prothandler.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -d -r1.10 -r1.11
--- prothandler.c	16 Jun 2004 14:03:45 -0000	1.10
+++ prothandler.c	18 Jun 2004 08:44:31 -0000	1.11
@@ -21,6 +21,7 @@
 #include "prothandler.h"
 #include "atrhandler.h"
 #include "ifdwrapper.h"
+#include "eventhandler.h"
 
 /*
  * Function: PHGetDefaultProtocol Purpose : To get the default protocol
@@ -76,7 +77,7 @@
 	DWORD dwPreferred, UCHAR ucAvailable)
 {
 	LONG rv;
-	DWORD protocol = rContext->dwProtocol;
+	DWORD protocol = rContext->readerState->cardProtocol;
 
 	if (dwPreferred == 0)
 	{
@@ -86,7 +87,7 @@
 		return -1;
 	}
 
-	if ((rContext->dwProtocol == SCARD_PROTOCOL_T1) &&
+	if ((protocol == SCARD_PROTOCOL_T1) &&
 		((dwPreferred & SCARD_PROTOCOL_T1) == 0) &&
 		(dwPreferred & SCARD_PROTOCOL_T0))
 	{
@@ -116,7 +117,7 @@
 			return -1;
 		}
 
-	} else if ((rContext->dwProtocol == SCARD_PROTOCOL_T0) &&
+	} else if ((protocol == SCARD_PROTOCOL_T0) &&
 		((dwPreferred & SCARD_PROTOCOL_T0) == 0) &&
 		(dwPreferred & SCARD_PROTOCOL_T1))
 	{

Index: readerfactory.c
===================================================================
RCS file: /cvsroot/pcsclite/PCSC/src/readerfactory.c,v
retrieving revision 1.54
retrieving revision 1.55
diff -u -d -r1.54 -r1.55
--- readerfactory.c	17 Jun 2004 08:41:04 -0000	1.54
+++ readerfactory.c	18 Jun 2004 08:44:31 -0000	1.55
@@ -51,6 +51,7 @@
 	{
 		sReadersContexts[i] = (PREADER_CONTEXT) malloc(sizeof(READER_CONTEXT));
 		(sReadersContexts[i])->vHandle = NULL;
+		(sReadersContexts[i])->readerState = NULL;
 	}
 
 	/*
@@ -139,16 +140,15 @@
 	(sReadersContexts[dwContext])->dwVersion = 0;
 	(sReadersContexts[dwContext])->dwPort = dwPort;
 	(sReadersContexts[dwContext])->mMutex = 0;
-	(sReadersContexts[dwContext])->dwStatus = 0;
 	(sReadersContexts[dwContext])->dwBlockStatus = 0;
 	(sReadersContexts[dwContext])->dwContexts = 0;
 	(sReadersContexts[dwContext])->pthThread = 0;
 	(sReadersContexts[dwContext])->dwLockId = 0;
 	(sReadersContexts[dwContext])->vHandle = 0;
-	(sReadersContexts[dwContext])->dwPublicID = 0;
 	(sReadersContexts[dwContext])->pdwFeeds = 0;
 	(sReadersContexts[dwContext])->dwIdentity =
 		(dwContext + 1) << (sizeof(DWORD) / 2) * 8;
+	(sReadersContexts[dwContext])->readerState = NULL;
 
 	for (i = 0; i < PCSCLITE_MAX_READER_CONTEXT_CHANNELS; i++)
 		(sReadersContexts[dwContext])->psHandles[i].hCard = 0;
@@ -229,7 +229,7 @@
 		(sReadersContexts[dwContext])->dwVersion = 0;
 		(sReadersContexts[dwContext])->dwPort = 0;
 		(sReadersContexts[dwContext])->vHandle = 0;
-		(sReadersContexts[dwContext])->dwPublicID = 0;
+		(sReadersContexts[dwContext])->readerState = NULL;
 		(sReadersContexts[dwContext])->dwIdentity = 0;
 
 		/*
@@ -352,11 +352,10 @@
 		/* Added by Dave for multiple slots */
 		*(sReadersContexts[dwContextB])->pdwFeeds += 1;
 
-		(sReadersContexts[dwContextB])->dwStatus = 0;
 		(sReadersContexts[dwContextB])->dwBlockStatus = 0;
 		(sReadersContexts[dwContextB])->dwContexts = 0;
 		(sReadersContexts[dwContextB])->dwLockId = 0;
-		(sReadersContexts[dwContextB])->dwPublicID = 0;
+		(sReadersContexts[dwContextB])->readerState = NULL;
 		(sReadersContexts[dwContextB])->dwIdentity =
 			(dwContextB + 1) << (sizeof(DWORD) / 2) * 8;
 
@@ -400,7 +399,7 @@
 			(sReadersContexts[dwContextB])->dwVersion = 0;
 			(sReadersContexts[dwContextB])->dwPort = 0;
 			(sReadersContexts[dwContextB])->vHandle = 0;
-			(sReadersContexts[dwContextB])->dwPublicID = 0;
+			(sReadersContexts[dwContextB])->readerState = NULL;
 			(sReadersContexts[dwContextB])->dwIdentity = 0;
 
 			/*
@@ -498,14 +497,13 @@
 		sContext->dwVersion = 0;
 		sContext->dwPort = 0;
 		sContext->mMutex = 0;
-		sContext->dwStatus = 0;
 		sContext->dwBlockStatus = 0;
 		sContext->dwContexts = 0;
 		sContext->dwSlot = 0;
 		sContext->dwLockId = 0;
 		sContext->vHandle = 0;
 		sContext->dwIdentity = 0;
-		sContext->dwPublicID = 0;
+		sContext->readerState = NULL;
 
 		for (i = 0; i < PCSCLITE_MAX_READER_CONTEXT_CHANNELS; i++)
 			sContext->psHandles[i].hCard = 0;
@@ -1503,7 +1501,8 @@
 
 LONG RFCheckReaderStatus(PREADER_CONTEXT rContext)
 {
-	if (rContext->dwStatus & SCARD_UNKNOWN)
+	if ((rContext->readerState == NULL)
+		|| (rContext->readerState->readerState & SCARD_UNKNOWN))
 		return SCARD_E_READER_UNAVAILABLE;
 	else
 		return SCARD_S_SUCCESS;

Index: winscard.c
===================================================================
RCS file: /cvsroot/pcsclite/PCSC/src/winscard.c,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -d -r1.31 -r1.32
--- winscard.c	16 Jun 2004 12:44:05 -0000	1.31
+++ winscard.c	18 Jun 2004 08:44:31 -0000	1.32
@@ -26,6 +26,7 @@
 #include "atrhandler.h"
 #include "configfile.h"
 #include "sys_generic.h"
+#include "eventhandler.h"
 
 /*
  * Some defines for context stack
@@ -177,7 +178,7 @@
 	 * presence of a card or not
 	 *
 	 *******************************************/
-	dwStatus = rContext->dwStatus;
+	dwStatus = rContext->readerState->readerState;
 
 	if (dwShareMode != SCARD_SHARE_DIRECT)
 	{
@@ -195,17 +196,19 @@
 	 *
 	 *******************************************/
 	if (dwPreferredProtocols & SCARD_PROTOCOL_RAW)
-		rContext->dwProtocol = -1;
+		rContext->readerState->cardProtocol = -1;
 	else
 	{
 		if (dwShareMode != SCARD_SHARE_DIRECT)
 		{
-			memcpy(pucAtr, rContext->ucAtr, rContext->dwAtrLen);
-			dwAtrLength = rContext->dwAtrLen;
-			if (rContext->dwAtrLen > 0)
-				DebugXxd("Card ATR: ", rContext->ucAtr, rContext->dwAtrLen);
+			memcpy(pucAtr, rContext->readerState->cardAtr,
+				rContext->readerState->cardAtrLength);
+			dwAtrLength = rContext->readerState->cardAtrLength;
+			if (rContext->readerState->cardAtrLength > 0)
+				DebugXxd("Card ATR: ", rContext->readerState->cardAtr,
+					rContext->readerState->cardAtrLength);
 
-			rContext->dwProtocol =
+			rContext->readerState->cardProtocol =
 				PHGetDefaultProtocol(pucAtr, dwAtrLength);
 			ucAvailable = PHGetAvailableProtocols(pucAtr, dwAtrLength);
 
@@ -214,15 +217,15 @@
 			 */
 			if (dwPreferredProtocols & SCARD_PROTOCOL_ANY)
 			{
-				rContext->dwProtocol = PHSetProtocol(rContext, ucAvailable,
-					ucAvailable);
+				rContext->readerState->cardProtocol = PHSetProtocol(rContext,
+						ucAvailable, ucAvailable);
 			}
 			else
 			{
-				rContext->dwProtocol =
+				rContext->readerState->cardProtocol =
 					PHSetProtocol(rContext, dwPreferredProtocols,
 					ucAvailable);
-				if (rContext->dwProtocol == -1)
+				if (rContext->readerState->cardProtocol == -1)
 				{
 					return SCARD_E_PROTO_MISMATCH;
 				}
@@ -230,7 +233,7 @@
 		}
 	}
 
-	*pdwActiveProtocol = rContext->dwProtocol;
+	*pdwActiveProtocol = rContext->readerState->cardProtocol;
 
 	if ((*pdwActiveProtocol != SCARD_PROTOCOL_T0)
 		&& (*pdwActiveProtocol != SCARD_PROTOCOL_T1))
@@ -386,14 +389,17 @@
 		 * Currently pcsc-lite keeps the card powered constantly
 		 */
 		if (SCARD_RESET_CARD == dwInitialization)
-			rv = IFDPowerICC(rContext, IFD_RESET, rContext->ucAtr,
-				&rContext->dwAtrLen);
+			rv = IFDPowerICC(rContext, IFD_RESET,
+				rContext->readerState->cardAtr,
+				&rContext->readerState->cardAtrLength);
 		else
 		{
-			rv = IFDPowerICC(rContext, IFD_POWER_DOWN, rContext->ucAtr,
-				&rContext->dwAtrLen);
-			rv = IFDPowerICC(rContext, IFD_POWER_UP, rContext->ucAtr,
-				&rContext->dwAtrLen);
+			rv = IFDPowerICC(rContext, IFD_POWER_DOWN,
+				rContext->readerState->cardAtr,
+				&rContext->readerState->cardAtrLength);
+			rv = IFDPowerICC(rContext, IFD_POWER_UP,
+				rContext->readerState->cardAtr,
+				&rContext->readerState->cardAtrLength);
 		}
 
 		/*
@@ -432,31 +438,32 @@
 				 */
 				if (rv == SCARD_S_SUCCESS)
 				{
-					rContext->dwStatus |= SCARD_PRESENT;
-					rContext->dwStatus &= ~SCARD_ABSENT;
-					rContext->dwStatus |= SCARD_POWERED;
-					rContext->dwStatus |= SCARD_NEGOTIABLE;
-					rContext->dwStatus &= ~SCARD_SPECIFIC;
-					rContext->dwStatus &= ~SCARD_SWALLOWED;
-					rContext->dwStatus &= ~SCARD_UNKNOWN;
+					rContext->readerState->readerState |= SCARD_PRESENT;
+					rContext->readerState->readerState &= ~SCARD_ABSENT;
+					rContext->readerState->readerState |= SCARD_POWERED;
+					rContext->readerState->readerState |= SCARD_NEGOTIABLE;
+					rContext->readerState->readerState &= ~SCARD_SPECIFIC;
+					rContext->readerState->readerState &= ~SCARD_SWALLOWED;
+					rContext->readerState->readerState &= ~SCARD_UNKNOWN;
 				}
 				else
 				{
-					rContext->dwStatus |= SCARD_PRESENT;
-					rContext->dwStatus &= ~SCARD_ABSENT;
-					rContext->dwStatus |= SCARD_SWALLOWED;
-					rContext->dwStatus &= ~SCARD_POWERED;
-					rContext->dwStatus &= ~SCARD_NEGOTIABLE;
-					rContext->dwStatus &= ~SCARD_SPECIFIC;
-					rContext->dwStatus &= ~SCARD_UNKNOWN;
-					rContext->dwProtocol = 0;
-					rContext->dwAtrLen = 0;
+					rContext->readerState->readerState |= SCARD_PRESENT;
+					rContext->readerState->readerState &= ~SCARD_ABSENT;
+					rContext->readerState->readerState |= SCARD_SWALLOWED;
+					rContext->readerState->readerState &= ~SCARD_POWERED;
+					rContext->readerState->readerState &= ~SCARD_NEGOTIABLE;
+					rContext->readerState->readerState &= ~SCARD_SPECIFIC;
+					rContext->readerState->readerState &= ~SCARD_UNKNOWN;
+					rContext->readerState->cardProtocol = 0;
+					rContext->readerState->cardAtrLength = 0;
 				}
 
-				if (rContext->dwAtrLen > 0)
+				if (rContext->readerState->cardAtrLength > 0)
 				{
 					DebugLogA("Reset complete.");
-					DebugXxd("Card ATR: ", rContext->ucAtr, rContext->dwAtrLen);
+					DebugXxd("Card ATR: ", rContext->readerState->cardAtr,
+						rContext->readerState->cardAtrLength);
 				}
 				else
 					DebugLogA("Error resetting card.");
@@ -482,16 +489,16 @@
 	 */
 	if (dwPreferredProtocols & SCARD_PROTOCOL_RAW)
 	{
-		rContext->dwProtocol = -1;
+		rContext->readerState->cardProtocol = -1;
 	}
 	else
 	{
 		if (dwShareMode != SCARD_SHARE_DIRECT)
 		{
-			memcpy(pucAtr, rContext->ucAtr, rContext->dwAtrLen);
-			dwAtrLength = rContext->dwAtrLen;
+			dwAtrLength = rContext->readerState->cardAtrLength;
+			memcpy(pucAtr, rContext->readerState->cardAtr, dwAtrLength);
 
-			rContext->dwProtocol =
+			rContext->readerState->cardProtocol =
 				PHGetDefaultProtocol(pucAtr, dwAtrLength);
 			ucAvailable = PHGetAvailableProtocols(pucAtr, dwAtrLength);
 
@@ -500,17 +507,17 @@
 			 */
 			if (dwPreferredProtocols & SCARD_PROTOCOL_ANY)
 			{
-				rContext->dwProtocol =
+				rContext->readerState->cardProtocol =
 					PHSetProtocol(rContext,
 					SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, ucAvailable);
 			}
 			else
 			{
-				rContext->dwProtocol =
+				rContext->readerState->cardProtocol =
 					PHSetProtocol(rContext, dwPreferredProtocols,
 					ucAvailable);
 
-				if (rContext->dwProtocol == -1)
+				if (rContext->readerState->cardProtocol == -1)
 				{
 					return SCARD_E_PROTO_MISMATCH;
 				}
@@ -518,7 +525,7 @@
 		}
 	}
 
-	*pdwActiveProtocol = rContext->dwProtocol;
+	*pdwActiveProtocol = rContext->readerState->cardProtocol;
 
 	if (dwShareMode == SCARD_SHARE_EXCLUSIVE)
 	{
@@ -632,14 +639,17 @@
 		 * Currently pcsc-lite keeps the card powered constantly
 		 */
 		if (SCARD_RESET_CARD == dwDisposition)
-			rv = IFDPowerICC(rContext, IFD_RESET, rContext->ucAtr,
-				&rContext->dwAtrLen);
+			rv = IFDPowerICC(rContext, IFD_RESET,
+				rContext->readerState->cardAtr,
+				&rContext->readerState->cardAtrLength);
 		else
 		{
-			rv = IFDPowerICC(rContext, IFD_POWER_DOWN, rContext->ucAtr,
-				&rContext->dwAtrLen);
-			rv = IFDPowerICC(rContext, IFD_POWER_UP, rContext->ucAtr,
-				&rContext->dwAtrLen);
+			rv = IFDPowerICC(rContext, IFD_POWER_DOWN,
+				rContext->readerState->cardAtr,
+				&rContext->readerState->cardAtrLength);
+			rv = IFDPowerICC(rContext, IFD_POWER_UP,
+				rContext->readerState->cardAtr,
+				&rContext->readerState->cardAtrLength);
 		}
 
 		/*
@@ -652,31 +662,31 @@
 		 */
 		if (rv == SCARD_S_SUCCESS)
 		{
-			rContext->dwStatus |= SCARD_PRESENT;
-			rContext->dwStatus &= ~SCARD_ABSENT;
-			rContext->dwStatus |= SCARD_POWERED;
-			rContext->dwStatus |= SCARD_NEGOTIABLE;
-			rContext->dwStatus &= ~SCARD_SPECIFIC;
-			rContext->dwStatus &= ~SCARD_SWALLOWED;
-			rContext->dwStatus &= ~SCARD_UNKNOWN;
+			rContext->readerState->readerState |= SCARD_PRESENT;
+			rContext->readerState->readerState &= ~SCARD_ABSENT;
+			rContext->readerState->readerState |= SCARD_POWERED;
+			rContext->readerState->readerState |= SCARD_NEGOTIABLE;
+			rContext->readerState->readerState &= ~SCARD_SPECIFIC;
+			rContext->readerState->readerState &= ~SCARD_SWALLOWED;
+			rContext->readerState->readerState &= ~SCARD_UNKNOWN;
 		}
 		else
 		{
-			if (rContext->dwStatus & SCARD_ABSENT)
-				rContext->dwStatus &= ~SCARD_PRESENT;
+			if (rContext->readerState->readerState & SCARD_ABSENT)
+				rContext->readerState->readerState &= ~SCARD_PRESENT;
 			else
-				rContext->dwStatus |= SCARD_PRESENT;
+				rContext->readerState->readerState |= SCARD_PRESENT;
 			/* SCARD_ABSENT flag is already set */
-			rContext->dwStatus |= SCARD_SWALLOWED;
-			rContext->dwStatus &= ~SCARD_POWERED;
-			rContext->dwStatus &= ~SCARD_NEGOTIABLE;
-			rContext->dwStatus &= ~SCARD_SPECIFIC;
-			rContext->dwStatus &= ~SCARD_UNKNOWN;
-			rContext->dwProtocol = 0;
-			rContext->dwAtrLen = 0;
+			rContext->readerState->readerState |= SCARD_SWALLOWED;
+			rContext->readerState->readerState &= ~SCARD_POWERED;
+			rContext->readerState->readerState &= ~SCARD_NEGOTIABLE;
+			rContext->readerState->readerState &= ~SCARD_SPECIFIC;
+			rContext->readerState->readerState &= ~SCARD_UNKNOWN;
+			rContext->readerState->cardProtocol = 0;
+			rContext->readerState->cardAtrLength = 0;
 		}
 
-		if (rContext->dwAtrLen > 0)
+		if (rContext->readerState->cardAtrLength > 0)
 			DebugLogA("Reset complete.");
 		else
 			DebugLogA("Error resetting card.");
@@ -847,14 +857,17 @@
 		 * Currently pcsc-lite keeps the card always powered
 		 */
 		if (SCARD_RESET_CARD == dwDisposition)
-			rv = IFDPowerICC(rContext, IFD_RESET, rContext->ucAtr,
-				&rContext->dwAtrLen);
+			rv = IFDPowerICC(rContext, IFD_RESET,
+				rContext->readerState->cardAtr,
+				&rContext->readerState->cardAtrLength);
 		else
 		{
-			rv = IFDPowerICC(rContext, IFD_POWER_DOWN, rContext->ucAtr,
-				&rContext->dwAtrLen);
-			rv = IFDPowerICC(rContext, IFD_POWER_UP, rContext->ucAtr,
-				&rContext->dwAtrLen);
+			rv = IFDPowerICC(rContext, IFD_POWER_DOWN,
+				rContext->readerState->cardAtr,
+				&rContext->readerState->cardAtrLength);
+			rv = IFDPowerICC(rContext, IFD_POWER_UP,
+				rContext->readerState->cardAtr,
+				&rContext->readerState->cardAtrLength);
 		}
 
 		/*
@@ -867,31 +880,31 @@
 		 */
 		if (rv == SCARD_S_SUCCESS)
 		{
-			rContext->dwStatus |= SCARD_PRESENT;
-			rContext->dwStatus &= ~SCARD_ABSENT;
-			rContext->dwStatus |= SCARD_POWERED;
-			rContext->dwStatus |= SCARD_NEGOTIABLE;
-			rContext->dwStatus &= ~SCARD_SPECIFIC;
-			rContext->dwStatus &= ~SCARD_SWALLOWED;
-			rContext->dwStatus &= ~SCARD_UNKNOWN;
+			rContext->readerState->readerState |= SCARD_PRESENT;
+			rContext->readerState->readerState &= ~SCARD_ABSENT;
+			rContext->readerState->readerState |= SCARD_POWERED;
+			rContext->readerState->readerState |= SCARD_NEGOTIABLE;
+			rContext->readerState->readerState &= ~SCARD_SPECIFIC;
+			rContext->readerState->readerState &= ~SCARD_SWALLOWED;
+			rContext->readerState->readerState &= ~SCARD_UNKNOWN;
 		}
 		else
 		{
-			if (rContext->dwStatus & SCARD_ABSENT)
-				rContext->dwStatus &= ~SCARD_PRESENT;
+			if (rContext->readerState->readerState & SCARD_ABSENT)
+				rContext->readerState->readerState &= ~SCARD_PRESENT;
 			else
-				rContext->dwStatus |= SCARD_PRESENT;
+				rContext->readerState->readerState |= SCARD_PRESENT;
 			/* SCARD_ABSENT flag is already set */
-			rContext->dwStatus |= SCARD_SWALLOWED;
-			rContext->dwStatus &= ~SCARD_POWERED;
-			rContext->dwStatus &= ~SCARD_NEGOTIABLE;
-			rContext->dwStatus &= ~SCARD_SPECIFIC;
-			rContext->dwStatus &= ~SCARD_UNKNOWN;
-			rContext->dwProtocol = 0;
-			rContext->dwAtrLen = 0;
+			rContext->readerState->readerState |= SCARD_SWALLOWED;
+			rContext->readerState->readerState &= ~SCARD_POWERED;
+			rContext->readerState->readerState &= ~SCARD_NEGOTIABLE;
+			rContext->readerState->readerState &= ~SCARD_SPECIFIC;
+			rContext->readerState->readerState &= ~SCARD_UNKNOWN;
+			rContext->readerState->cardProtocol = 0;
+			rContext->readerState->cardAtrLength = 0;
 		}
 
-		if (rContext->dwAtrLen > 0)
+		if (rContext->readerState->cardAtrLength > 0)
 			DebugLogA("Reset complete.");
 		else
 			DebugLogA("Error resetting card.");
@@ -1008,7 +1021,8 @@
 		return rv;
 
 	if (strlen(rContext->lpcReader) > MAX_BUFFER_SIZE
-			|| rContext->dwAtrLen > MAX_ATR_SIZE || rContext->dwAtrLen < 0)
+			|| rContext->readerState->cardAtrLength > MAX_ATR_SIZE
+			|| rContext->readerState->cardAtrLength < 0)
 		return SCARD_F_INTERNAL_ERROR;
 
 	/*
@@ -1063,23 +1077,24 @@
 	}
 
 	if (pdwState)
-		*pdwState = rContext->dwStatus;
+		*pdwState = rContext->readerState->readerState;
 
 	if (pdwProtocol)
-		*pdwProtocol = rContext->dwProtocol;
+		*pdwProtocol = rContext->readerState->cardProtocol;
 
 	if (pbAtr)
 	{  /* want ATR */
 		if (pcbAtrLen)
 		{ /* & present ATR length */
-			if (*pcbAtrLen >= rContext->dwAtrLen)
+			if (*pcbAtrLen >= rContext->readerState->cardAtrLength)
 			{ /* & enough room */
-				*pcbAtrLen = rContext->dwAtrLen;
-				memcpy(pbAtr, rContext->ucAtr, rContext->dwAtrLen);
+				*pcbAtrLen = rContext->readerState->cardAtrLength;
+				memcpy(pbAtr, rContext->readerState->cardAtr,
+					rContext->readerState->cardAtrLength);
 			}
 			else
 			{ /* may report only ATR len */
-				*pcbAtrLen = rContext->dwAtrLen;
+				*pcbAtrLen = rContext->readerState->cardAtrLength;
 				rv = SCARD_E_INSUFFICIENT_BUFFER;
 			}
 		}
@@ -1092,7 +1107,7 @@
 	{
 		if (pcbAtrLen)
 		{ /* want ATR len only */
-			*pcbAtrLen = rContext->dwAtrLen;
+			*pcbAtrLen = rContext->readerState->cardAtrLength;
 		}
 		else
 		{
@@ -1340,7 +1355,7 @@
 	 */
 	if (pioSendPci->dwProtocol != SCARD_PROTOCOL_RAW)
 	{
-		if (rContext->dwStatus & SCARD_ABSENT)
+		if (rContext->readerState->readerState & SCARD_ABSENT)
 		{
 			return SCARD_E_NO_SMARTCARD;
 		}
@@ -1350,7 +1365,7 @@
 	{
 		if (pioSendPci->dwProtocol != SCARD_PROTOCOL_ANY)
 		{
-			if (pioSendPci->dwProtocol != rContext->dwProtocol)
+			if (pioSendPci->dwProtocol != rContext->readerState->cardProtocol)
 			{
 				return SCARD_E_PROTO_MISMATCH;
 			}
@@ -1388,7 +1403,7 @@
 	{
 	  /* Fix by Amira (Athena) */
 		unsigned long i;
-		unsigned long prot = rContext->dwProtocol;
+		unsigned long prot = rContext->readerState->cardProtocol;
 
 		for (i = 0 ; prot != 1 ; i++)
 			prot >>= 1;