[Pcsclite-cvs-commit] r5301 - /trunk/PCSC/src/winscard.c

rousseau at users.alioth.debian.org rousseau at users.alioth.debian.org
Tue Oct 12 09:51:56 UTC 2010


Author: rousseau
Date: Tue Oct 12 09:51:55 2010
New Revision: 5301

URL: http://svn.debian.org/wsvn/pcsclite/?sc=1&rev=5301
Log:
SCardReconnect(): Reorganize the code to manage ATR and readerState
after a power up. Remove a call to IFDStatusICC() to know if a card is
present or not since IFDPowerICC() already gives us this information.

SCardDisconnect(): Use the same code as above

Modified:
    trunk/PCSC/src/winscard.c

Modified: trunk/PCSC/src/winscard.c
URL: http://svn.debian.org/wsvn/pcsclite/trunk/PCSC/src/winscard.c?rev=5301&op=diff
==============================================================================
--- trunk/PCSC/src/winscard.c (original)
+++ trunk/PCSC/src/winscard.c Tue Oct 12 09:51:55 2010
@@ -597,28 +597,10 @@
 		 */
 		if (rv == SCARD_S_SUCCESS)
 		{
-			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->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;
-		}
-
-		if (rContext->readerState->cardAtrLength > 0)
-		{
+			rContext->readerState->cardAtrLength = dwAtrLen;
+			rContext->readerState->readerState =
+				SCARD_PRESENT | SCARD_POWERED | SCARD_NEGOTIABLE;
+
 			Log1(PCSC_LOG_DEBUG, "Reset complete.");
 			LogXxd(PCSC_LOG_DEBUG, "Card ATR: ",
 				rContext->readerState->cardAtr,
@@ -626,15 +608,20 @@
 		}
 		else
 		{
-			DWORD dwStatus, dwAtrLen2;
-			UCHAR ucAtr[MAX_ATR_SIZE];
-
+			rContext->readerState->cardAtrLength = 0;
 			Log1(PCSC_LOG_ERROR, "Error resetting card.");
-			(void)IFDStatusICC(rContext, &dwStatus, ucAtr, &dwAtrLen2);
-			if (dwStatus & SCARD_PRESENT)
+
+			if (rv == SCARD_W_REMOVED_CARD)
+			{
+				rContext->readerState->readerState = SCARD_ABSENT;
+				return SCARD_E_NO_SMARTCARD;
+			}
+			else
+			{
+				rContext->readerState->readerState =
+					SCARD_PRESENT | SCARD_SWALLOWED;
 				return SCARD_W_UNRESPONSIVE_CARD;
-			else
-				return SCARD_E_NO_SMARTCARD;
+			}
 		}
 	}
 	else
@@ -871,7 +858,6 @@
 				rContext->readerState->cardAtr,
 				&dwAtrLen);
 		}
-		rContext->readerState->cardAtrLength = dwAtrLen;
 
 		/* the protocol is unset after a power on */
 		rContext->readerState->cardProtocol = SCARD_PROTOCOL_UNDEFINED;
@@ -881,33 +867,26 @@
 		 */
 		if (rv == SCARD_S_SUCCESS)
 		{
-			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->readerState->readerState & SCARD_ABSENT)
-				rContext->readerState->readerState &= ~SCARD_PRESENT;
+			rContext->readerState->cardAtrLength = dwAtrLen;
+			rContext->readerState->readerState =
+				SCARD_PRESENT | SCARD_POWERED | SCARD_NEGOTIABLE;
+
+			Log1(PCSC_LOG_DEBUG, "Reset complete.");
+			LogXxd(PCSC_LOG_DEBUG, "Card ATR: ",
+				rContext->readerState->cardAtr,
+				rContext->readerState->cardAtrLength);
+		}
+		else
+		{
+			rContext->readerState->cardAtrLength = 0;
+			Log1(PCSC_LOG_ERROR, "Error resetting card.");
+
+			if (rv == SCARD_W_REMOVED_CARD)
+				rContext->readerState->readerState = SCARD_ABSENT;
 			else
-				rContext->readerState->readerState |= SCARD_PRESENT;
-			/* SCARD_ABSENT flag is already set */
-			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;
-		}
-
-		if (rContext->readerState->cardAtrLength > 0)
-			Log1(PCSC_LOG_DEBUG, "Reset complete.");
-		else
-			Log1(PCSC_LOG_ERROR, "Error resetting card.");
+				rContext->readerState->readerState =
+					SCARD_PRESENT | SCARD_SWALLOWED;
+		}
 	}
 	else if (dwDisposition == SCARD_EJECT_CARD)
 	{




More information about the Pcsclite-cvs-commit mailing list