[Pcsclite-cvs-commit] PCSC/src winscard.c,1.41,1.42

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


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

Modified Files:
	winscard.c 
Log Message:
perform a PPS (PHSetProtocol()) only if the current protocol is
SCARD_PROTOCOL_UNSET otherwise only check that the requested protocol is
available.

This will avoid generating a PPS request that would not be just after a
power up. The previous code worked only when the card was reseted at
SCardDisconnect() but not when SCARD_LEAVE_CARD was used.


Index: winscard.c
===================================================================
RCS file: /cvsroot/pcsclite/PCSC/src/winscard.c,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -d -r1.41 -r1.42
--- winscard.c	2 Aug 2004 20:12:44 -0000	1.41
+++ winscard.c	2 Aug 2004 20:21:10 -0000	1.42
@@ -179,29 +179,38 @@
 	{
 		if (dwShareMode != SCARD_SHARE_DIRECT)
 		{
-			UCHAR ucAvailable, ucDefault;
+			/* the protocol is not yet set (no PPS yet) */
+			if (SCARD_PROTOCOL_UNSET == rContext->readerState->cardProtocol)
+			{
+				UCHAR ucAvailable, ucDefault;
 
-			ucDefault = PHGetDefaultProtocol(rContext->readerState->cardAtr,
-				rContext->readerState->cardAtrLength);
-			ucAvailable =
-				PHGetAvailableProtocols(rContext->readerState->cardAtr,
-						rContext->readerState->cardAtrLength);
+				ucDefault = PHGetDefaultProtocol(rContext->readerState->cardAtr,
+					rContext->readerState->cardAtrLength);
+				ucAvailable =
+					PHGetAvailableProtocols(rContext->readerState->cardAtr,
+							rContext->readerState->cardAtrLength);
 
-			/*
-			 * If it is set to ANY let it do any of the protocols
-			 */
-			if (dwPreferredProtocols & SCARD_PROTOCOL_ANY)
-				dwPreferredProtocols = SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1;
+				/*
+				 * If it is set to ANY let it do any of the protocols
+				 */
+				if (dwPreferredProtocols & SCARD_PROTOCOL_ANY)
+					dwPreferredProtocols = SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1;
 
-			rContext->readerState->cardProtocol =
-				PHSetProtocol(rContext, dwPreferredProtocols,
-				ucAvailable, ucDefault);
+				rContext->readerState->cardProtocol =
+					PHSetProtocol(rContext, dwPreferredProtocols,
+					ucAvailable, ucDefault);
 
-			if (SET_PROTOCOL_PPS_FAILED == rContext->readerState->cardProtocol)
-				return SCARD_W_UNRESPONSIVE_CARD;
+				if (SET_PROTOCOL_PPS_FAILED == rContext->readerState->cardProtocol)
+					return SCARD_W_UNRESPONSIVE_CARD;
 
-			if (SET_PROTOCOL_WRONG_ARGUMENT == rContext->readerState->cardProtocol)
-				return SCARD_E_PROTO_MISMATCH;
+				if (SET_PROTOCOL_WRONG_ARGUMENT == rContext->readerState->cardProtocol)
+					return SCARD_E_PROTO_MISMATCH;
+			}
+			else
+			{
+				if (! (dwPreferredProtocols & rContext->readerState->cardProtocol))
+					return SCARD_E_PROTO_MISMATCH;
+			}
 		}
 	}
 
@@ -469,27 +478,36 @@
 	{
 		if (dwShareMode != SCARD_SHARE_DIRECT)
 		{
-			UCHAR ucAvailable, ucDefault;
+			/* the protocol is not yet set (no PPS yet) */
+			if (SCARD_PROTOCOL_UNSET == rContext->readerState->cardProtocol)
+			{
+				UCHAR ucAvailable, ucDefault;
 
-			ucDefault = PHGetDefaultProtocol(rContext->readerState->cardAtr,
-				rContext->readerState->cardAtrLength);
-			ucAvailable =
-				PHGetAvailableProtocols(rContext->readerState->cardAtr,
-						rContext->readerState->cardAtrLength);
+				ucDefault = PHGetDefaultProtocol(rContext->readerState->cardAtr,
+					rContext->readerState->cardAtrLength);
+				ucAvailable =
+					PHGetAvailableProtocols(rContext->readerState->cardAtr,
+							rContext->readerState->cardAtrLength);
 
-			/* If it is set to ANY let it do any of the protocols */
-			if (dwPreferredProtocols & SCARD_PROTOCOL_ANY)
-				dwPreferredProtocols = SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1;
+				/* If it is set to ANY let it do any of the protocols */
+				if (dwPreferredProtocols & SCARD_PROTOCOL_ANY)
+					dwPreferredProtocols = SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1;
 
-			rContext->readerState->cardProtocol =
-				PHSetProtocol(rContext, dwPreferredProtocols,
-				ucAvailable, ucDefault);
+				rContext->readerState->cardProtocol =
+					PHSetProtocol(rContext, dwPreferredProtocols,
+					ucAvailable, ucDefault);
 
-			if (SET_PROTOCOL_PPS_FAILED == rContext->readerState->cardProtocol)
-				return SCARD_W_UNRESPONSIVE_CARD;
+				if (SET_PROTOCOL_PPS_FAILED == rContext->readerState->cardProtocol)
+					return SCARD_W_UNRESPONSIVE_CARD;
 
-			if (SET_PROTOCOL_WRONG_ARGUMENT == rContext->readerState->cardProtocol)
-				return SCARD_E_PROTO_MISMATCH;
+				if (SET_PROTOCOL_WRONG_ARGUMENT == rContext->readerState->cardProtocol)
+					return SCARD_E_PROTO_MISMATCH;
+			}
+			else
+			{
+				if (! (dwPreferredProtocols & rContext->readerState->cardProtocol))
+					return SCARD_E_PROTO_MISMATCH;
+			}
 		}
 	}