Chipcard-PCSC
view release on metacpan or search on metacpan
#//
SV *
_ListReaders(hContext, svGroups)
unsigned long hContext
SV* svGroups
PREINIT:
DWORD nBufferSize = 0;
char* szBuffer = NULL;
char* szCurrentToken = NULL;
char* mszGroups;
PPCODE:
/* Before doing anything, we check that we have a valid group. */
if (SvPOK(svGroups)) {
/* TODO : see how this works... multistring stuff with time
*svGroups may become a reference to an array of groups... or undef
*/
mszGroups = SvPV (svGroups, PL_na);
} else {
mszGroups = 0;
}
#// If a problem occurs, it just return the 'undef' value.
SV*
_Connect (hContext, szReader, dwShareMode, dwPreferredProtocols)
unsigned long hContext
const char* szReader
unsigned long dwShareMode
unsigned long dwPreferredProtocols
PREINIT:
SCARDHANDLE hCard = 0;
DWORD dwActiveProtocol = 0;
PPCODE:
gnLastError = hConnect (hContext, szReader, dwShareMode, dwPreferredProtocols, &hCard, &dwActiveProtocol);
/* We return immediately in case of an error */
if (gnLastError != SCARD_S_SUCCESS)
XSRETURN_UNDEF;
/* If anything was successful, push the two scalar values */
XPUSHs (sv_2mortal(newSViv(hCard)));
XPUSHs (sv_2mortal(newSViv(dwActiveProtocol)));
unsigned long cbAtrLen = sizeof(tmpAtr);
#else
char* szReaderName = NULL;
DWORD cchReaderLen = 0;
unsigned char* pbAtr = NULL;
DWORD cbAtrLen = 0;
#endif
DWORD dwState = 0;
DWORD dwProtocol = 0;
AV* aATR = 0;
PPCODE:
/* We call the function with a null cchReaderLen : this should
* gives us the length of the buffer to allocate
*/
gnLastError = hStatus (hCard, szReaderName, &cchReaderLen,
&dwState, &dwProtocol, (BYTE *)pbAtr, &cbAtrLen);
/* Behaviour differs here from PCSC and PCSClite :
* PCSC returns SUCCESS while PCSClite returns an error
*/
if (gnLastError == SCARD_E_INSUFFICIENT_BUFFER || gnLastError == SCARD_S_SUCCESS) {
unsigned long dwProtocol;
SV* psvSendData;
PREINIT:
int nCount = 0;
static char* pbSendBuffer = NULL;
static unsigned char pbRecvBuffer [MAX_BUFFER_SIZE_EXTENDED];
unsigned long cbSendLength = 0;
DWORD cbRecvLength = sizeof (pbRecvBuffer);
SCARD_IO_REQUEST ioSendPci, ioRecvPci;
AV* aRecvBuffer = NULL;
PPCODE:
/* We make sure that the array is sane */
if (psvSendData == NULL) {
gnLastError = SCARD_E_INVALID_PARAMETER;
warn ("psvSendData is a NULL pointer at %s line %d\n\t",
__FILE__, __LINE__);
XSRETURN_UNDEF;
}
/* Should the second parameter not be a reference, we return the
* SCARD_E_INVALID_PARAMETER error code.
unsigned long hCard;
unsigned long dwControlCode;
SV* psvSendData;
PREINIT:
int nCount = 0;
static char* pbSendBuffer = NULL;
static unsigned char pbRecvBuffer [MAX_BUFFER_SIZE];
unsigned long cbSendLength = 0;
DWORD cbRecvLength = sizeof (pbRecvBuffer);
AV* aRecvBuffer = NULL;
PPCODE:
/* We make sure that the array is sane */
if (psvSendData == NULL) {
gnLastError = SCARD_E_INVALID_PARAMETER;
warn ("psvSendData is a NULL pointer at %s line %d\n\t",
__FILE__, __LINE__);
XSRETURN_UNDEF;
}
/* Should the second parameter not be a reference, we return the
* SCARD_E_INVALID_PARAMETER error code.
unsigned long hContext;
unsigned long dwTimeout;
SV* psvReaderStates;
PREINIT:
static SCARD_READERSTATE *rgReaderStates_t = NULL;
unsigned int nCount = 0;
unsigned int nATRCount = 0;
unsigned int nReaders = 0;
AV* aRecvBuffer = NULL;
PPCODE:
if (psvReaderStates == NULL) {
gnLastError = SCARD_E_INVALID_PARAMETER;
warn ("psvReaderStates is a NULL pointer at %s line %d\n\t",
__FILE__, __LINE__);
XSRETURN_NO;
}
/* Should the second parameter not be a reference, we return the
* SCARD_E_INVALID_PARAMETER error code.
*/
( run in 1.793 second using v1.01-cache-2.11-cpan-71847e10f99 )