[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;