[Pcsclite-cvs-commit] r2215 - in tags/pycsc: . rel-0.0.4

Ludovic Rousseau rousseau at alioth.debian.org
Thu Nov 16 14:25:53 CET 2006


Author: rousseau
Date: 2006-11-16 14:25:53 +0100 (Thu, 16 Nov 2006)
New Revision: 2215

Added:
   tags/pycsc/rel-0.0.4/
   tags/pycsc/rel-0.0.4/CHANGELOG
   tags/pycsc/rel-0.0.4/pycsc.c
Removed:
   tags/pycsc/rel-0.0.4/CHANGELOG
   tags/pycsc/rel-0.0.4/pycsc.c
Log:
release 0.0.4


Copied: tags/pycsc/rel-0.0.4 (from rev 2211, trunk/pycsc)

Deleted: tags/pycsc/rel-0.0.4/CHANGELOG
===================================================================
--- trunk/pycsc/CHANGELOG	2006-11-16 13:13:40 UTC (rev 2211)
+++ tags/pycsc/rel-0.0.4/CHANGELOG	2006-11-16 13:25:53 UTC (rev 2215)
@@ -1,10 +0,0 @@
-
-ChangeLog for Pycsc:
-
-v 0.3:
------
-- Implements getStatusChange
-- one setup.py for all platforms
-- added minimal pcsc_stringify_error for Win32 (thanks to Arah Leonard)
-- calling constructor with no args or "" is now similar (thanks to Arah Leonard)
-- defined more constants (thanks to Arah Leonard)

Copied: tags/pycsc/rel-0.0.4/CHANGELOG (from rev 2214, trunk/pycsc/CHANGELOG)

Deleted: tags/pycsc/rel-0.0.4/pycsc.c
===================================================================
--- trunk/pycsc/pycsc.c	2006-11-16 13:13:40 UTC (rev 2211)
+++ tags/pycsc/rel-0.0.4/pycsc.c	2006-11-16 13:25:53 UTC (rev 2215)
@@ -1,985 +0,0 @@
-/***********************************************************
-*        Title: pycsc.c
-*       Author: Jean-Luc Giraud <jlgiraud at mac.com>
-*     Compiler: gcc
-*     Platform: Mac OS X, Linux and Windows2000
-*      Purpose: Python class to communicate with smart cards
-*      License: See file COPYING
-*          $Id: pycsc.c,v 1.4 2004-06-21 00:54:29 giraud Exp $
-*
-*      Copyright (c) 2003 - Jean-Luc Giraud.
-*
-************************************************************/
-
-#include <Python.h>
-
-/* Include the header files */
-
-#ifdef __APPLE__
-#include <wintypes.h>
-#include <PCSC/winscard.h>
-#else
-#include <winscard.h>
-#endif
-
-/* Internal tool */
-static LONG getReaderList(SCARDCONTEXT hContext, LPSTR* pmszReaders, 
-                          DWORD *pdwReaders);
-
-#ifdef _WINDOWS_
-/* Windows does not provide the pcsc_stringify_error function */
-char ErrorString[200];
-char *pcsc_stringify_error(LONG rv)
-{
-	char strErrorCode[50];
-	switch(rv) 
-	{
-		case SCARD_E_CANCELLED:
-			strcpy(strErrorCode, "SCARD_E_CANCELLED");
-			break;
-		case SCARD_E_CANT_DISPOSE:
-			strcpy(strErrorCode, "SCARD_E_CANT_DISPOSE");
-			break;
-		case SCARD_E_CARD_UNSUPPORTED:
-			strcpy(strErrorCode, "SCARD_E_CARD_UNSUPPORTED");
-			break;
-		case SCARD_E_DUPLICATE_READER:
-			strcpy(strErrorCode, "SCARD_E_DUPLICATE_READER");
-			break;
-		case SCARD_E_INSUFFICIENT_BUFFER:
-			strcpy(strErrorCode, "SCARD_E_INSUFFICIENT_BUFFER");
-			break;
-		case SCARD_E_INVALID_ATR:
-			strcpy(strErrorCode, "SCARD_E_INVALID_ATR");
-			break;
-		case SCARD_E_INVALID_HANDLE:
-			strcpy(strErrorCode, "SCARD_E_INVALID_HANDLE");
-			break;
-		case SCARD_E_INVALID_PARAMETER:
-			strcpy(strErrorCode, "SCARD_E_INVALID_PARAMETER");
-			break;
-		case SCARD_E_INVALID_TARGET:
-			strcpy(strErrorCode, "SCARD_E_INVALID_TARGET");
-			break;
-		case SCARD_E_INVALID_VALUE:
-			strcpy(strErrorCode, "SCARD_E_INVALID_VALUE");
-			break;
-		case SCARD_E_NOT_READY:
-			strcpy(strErrorCode, "SCARD_E_NOT_READY");
-			break;
-		case SCARD_E_NOT_TRANSACTED:
-			strcpy(strErrorCode, "SCARD_E_NOT_TRANSACTED");
-			break;
-		case SCARD_E_NO_MEMORY:
-			strcpy(strErrorCode, "SCARD_E_NO_MEMORY");
-			break;
-		case SCARD_E_NO_SERVICE:
-			strcpy(strErrorCode, "SCARD_E_NO_SERVICE");
-			break;
-		case SCARD_E_NO_SMARTCARD:
-			strcpy(strErrorCode, "SCARD_E_NO_SMARTCARD");
-			break;
-		case SCARD_E_PCI_TOO_SMALL:
-			strcpy(strErrorCode, "SCARD_E_PCI_TOO_SMALL");
-			break;
-		case SCARD_E_PROTO_MISMATCH:
-			strcpy(strErrorCode, "SCARD_E_PROTO_MISMATCH");
-			break;
-		case SCARD_E_READER_UNAVAILABLE:
-			strcpy(strErrorCode, "SCARD_E_READER_UNAVAILABLE");
-			break;
-		case SCARD_E_READER_UNSUPPORTED:
-			strcpy(strErrorCode, "SCARD_E_READER_UNSUPPORTED");
-			break;
-		case SCARD_E_SERVICE_STOPPED:
-			strcpy(strErrorCode, "SCARD_E_SERVICE_STOPPED");
-			break;
-		case SCARD_E_SHARING_VIOLATION:
-			strcpy(strErrorCode, "SCARD_E_SHARING_VIOLATION");
-			break;
-		case SCARD_E_SYSTEM_CANCELLED:
-			strcpy(strErrorCode, "SCARD_E_SYSTEM_CANCELLED");
-			break;
-		case SCARD_E_TIMEOUT:
-			strcpy(strErrorCode, "SCARD_E_TIMEOUT");
-			break;
-		case SCARD_E_UNKNOWN_CARD:
-			strcpy(strErrorCode, "SCARD_E_UNKNOWN_CARD");
-			break;
-		case SCARD_E_UNKNOWN_READER:
-			strcpy(strErrorCode, "SCARD_E_UNKNOWN_READER");
-			break;
-		case SCARD_F_COMM_ERROR:
-			strcpy(strErrorCode, "SCARD_F_COMM_ERROR");
-			break;
-		case SCARD_F_INTERNAL_ERROR:
-			strcpy(strErrorCode, "SCARD_F_INTERNAL_ERROR");
-			break;
-		case SCARD_F_UNKNOWN_ERROR:
-			strcpy(strErrorCode, "SCARD_F_UNKNOWN_ERROR");
-			break;
-		case SCARD_F_WAITED_TOO_LONG:
-			strcpy(strErrorCode, "SCARD_F_WAITED_TOO_LONG");
-			break;
-		case SCARD_S_SUCCESS:
-			strcpy(strErrorCode, "SCARD_S_SUCCESS");
-			break;
-		case SCARD_W_REMOVED_CARD:
-			strcpy(strErrorCode, "SCARD_W_REMOVED_CARD");
-			break;
-		case SCARD_W_RESET_CARD:
-			strcpy(strErrorCode, "SCARD_W_RESET_CARD");
-			break;
-		case SCARD_W_UNPOWERED_CARD:
-			strcpy(strErrorCode, "SCARD_W_UNPOWERED_CARD");
-			break;
-		case SCARD_W_UNRESPONSIVE_CARD:
-			strcpy(strErrorCode, "SCARD_W_UNRESPONSIVE_CARD");
-			break;
-		case SCARD_W_UNSUPPORTED_CARD:
-			strcpy(strErrorCode, "SCARD_W_UNSUPPORTED_CARD");
-			break;
-		default:
-			strcpy(strErrorCode, "Unknown");
-	}
-    sprintf(ErrorString, "Error returned by PCSC: 0x%08X (%s)", rv, strErrorCode);
-    return ErrorString;
-}
-#endif
-
-/* define MAX_ATR_SIZE for all platforms */
-#ifndef MAX_ATR_SIZE
-#define MAX_ATR_SIZE 300
-#endif
-
-
-/***********************************************************
- * pycsc object structure
- ***********************************************************/
-typedef struct 
-{
-  PyObject_HEAD
-  SCARDHANDLE  hCard;
-  SCARDCONTEXT hContext; 
-  DWORD sMode;
-  DWORD dwProtocol;
-} pycscobject;
-
-/* Exception used by this object  */
-static PyObject *PycscException;
-
-/* Forward declaration of type descriptor */
-staticforward PyTypeObject PycscType;
-
-/***********************************************************
- * Intance methods:
- *
- * reconnect()
- * disconnect()
- * status()
- * control()
- * transmit()
- * cancel()
- * beginTransaction()
- * endTransaction()
- * cancelTransaction()
- *
- ***********************************************************/
-static PyObject * pycsc_reconnect( PyObject *self,  PyObject *args,  PyObject *keywds)
-{
-  pycscobject *object = (pycscobject *)self;
-  LONG rv;
-  DWORD dwPreferredProtocol = SCARD_PROTOCOL_T0;
-  DWORD dwInitialization    = SCARD_LEAVE_CARD;
-  DWORD pdwActiveProtocol;
-
-  static char *kwlist[] = {"smode", "protocol", "init", NULL};
-
-  object->sMode = SCARD_SHARE_SHARED; /* default value */
-
-  if (!PyArg_ParseTupleAndKeywords(args, keywds, "|lll", kwlist,
-                   &object->sMode, &dwPreferredProtocol,
-                   &dwInitialization))
-    return NULL;
-
-#ifdef DEBUG
-  printf("sMode = %ld\n",object->sMode);
-  printf("pProt = %ld\n",dwPreferredProtocol);
-  printf("init = %ld\n",dwInitialization);
-#endif
-  rv = SCardReconnect(object->hCard, object->sMode, dwPreferredProtocol,
-              dwInitialization, &pdwActiveProtocol);
-
-  if ( rv != SCARD_S_SUCCESS )
-    {
-      PyErr_SetString(PycscException, pcsc_stringify_error(rv));
-      return NULL;
-    }
-
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-static PyObject * pycsc_disconnect(PyObject *self, PyObject * args)
-{
-  pycscobject *object = (pycscobject *)self;
-  DWORD dwDisposition = SCARD_LEAVE_CARD;
-  LONG  rv;
-
-  if (!PyArg_ParseTuple(args,"|l", &dwDisposition))
-    return NULL;
-
-  rv = SCardDisconnect(object->hCard, dwDisposition);
-
-  if ( rv != SCARD_S_SUCCESS )
-    {
-      PyErr_SetString(PycscException, pcsc_stringify_error(rv));
-      return NULL;
-    }
-#ifdef DEBUG
-  printf("pycsc_disconnect : OK\n");
-#endif
-
-  Py_INCREF(Py_None);
-  return Py_None;
-}
-
-/* Returns a dictionary with keys as follows:
-                            "ReaderName"
-                            "State"
-                            "Protocol"
-                            "ATR"
-*/
-static PyObject * pycsc_status(PyObject *self, PyObject * args)
-{
-  pycscobject *object = (pycscobject *)self;
-  BYTE  pbAtr[MAX_ATR_SIZE];
-  DWORD dwAtrLen, dwProt=0, dwState=0;
-  DWORD dwReaderLen;
-  LPSTR pcReaders;
-  LONG  rv;
-  PyObject *ret_value;
-
-  dwReaderLen = 10000;
-  dwAtrLen = 0;
-  /* Dry run to get the length of the reader name */ 
-  rv = SCardStatus( object->hCard, (LPSTR) NULL, &dwReaderLen, 
-            &dwState, &dwProt, NULL, &dwAtrLen );
-
-  if ( rv != SCARD_S_SUCCESS )
-    {
-      PyErr_SetString(PycscException, pcsc_stringify_error(rv));
-      return NULL;
-    }
-
-#ifdef DEBUG
-  printf("SCardStatus dry run returned dwReaderLen= %ld, dwAtrLen= %ld\n",
-         dwReaderLen, dwAtrLen);
-#endif
-  pcReaders = (char *)PyMem_Malloc(sizeof(char)*dwReaderLen);
-  if (!pcReaders)
-    {
-      return PyErr_NoMemory();
-    }
-
-  /* Get values */
-  dwAtrLen = sizeof(pbAtr);
-  rv = SCardStatus( object->hCard, pcReaders, &dwReaderLen,
-            &dwState, &dwProt, pbAtr, &dwAtrLen );
-
-  if ( rv != SCARD_S_SUCCESS )
-    {
-      PyErr_SetString(PycscException, pcsc_stringify_error(rv));
-      PyMem_Free((void *)pcReaders);
-      return NULL;
-    }
-
-#ifdef DEBUG
-  printf("pycsc_status : OK up to build value\n");
-#endif
-  ret_value = Py_BuildValue("{s:s, s:i, s:i, s:s#}",
-                "ReaderName", pcReaders,
-                "State", dwState,
-                "Protocol", dwProt,
-                "ATR", pbAtr, dwAtrLen);
-
-#ifdef DEBUG
-  printf("pycsc_status : OK\n");
-#endif
-  PyMem_Free((void *)pcReaders);
-  return ret_value;
-}
-
-static PyObject * pycsc_control(PyObject *self, PyObject * args)
-{
-  PyErr_SetString(PycscException, "Not implemented");
-  return NULL;
-}
-
-
-/* Retrieve SCARD_PCI_XX address from SCARD_PROTOCOL_XX constant */
-static SCARD_IO_REQUEST *protocoltoPCI(DWORD dwProtocol)
-{
-  switch (dwProtocol)
-  {
-    case SCARD_PROTOCOL_T0:
-      return (SCARD_IO_REQUEST *)SCARD_PCI_T0;
-    case SCARD_PROTOCOL_T1:
-      return (SCARD_IO_REQUEST *)SCARD_PCI_T1;
-    case SCARD_PROTOCOL_RAW:
-      return (SCARD_IO_REQUEST *)SCARD_PCI_RAW;
-    default:
-      PyErr_SetString(PycscException, "Unknow value of io request");
-      return NULL;
-  }
-}
-
-/* args : a string representing data to send */
-static PyObject * pycsc_transmit(PyObject *self, PyObject * args, 
-                                 PyObject *keywds)
-{  
-  pycscobject *object = (pycscobject *)self;
-  LONG rv;
-  unsigned long len;
-  unsigned char *sendBuffer;
-  DWORD bSendPci;
-  SCARD_IO_REQUEST *pioSendPci;
-  BYTE  resparray[1024];
-  DWORD resplength = sizeof(resparray);
-  static char *kwlist[] = {"com","sendPCI", NULL};
-
-  /* Default values */
-  bSendPci = object->dwProtocol;
-
-  if (!PyArg_ParseTupleAndKeywords(args, keywds, "s#|l", kwlist,
-                                   &sendBuffer, &len, &bSendPci))
-    return NULL;
-
-  pioSendPci = protocoltoPCI(bSendPci);
-  if (pioSendPci == NULL)
-    return NULL;
-
-  rv = SCardTransmit( object->hCard, pioSendPci, sendBuffer, len, 
-                     NULL, resparray, &resplength);
-  if ( rv != SCARD_S_SUCCESS )
-  {
-    PyErr_SetString(PycscException, pcsc_stringify_error(rv));
-    return NULL;
-  }
-
-  return Py_BuildValue("s#", resparray, resplength);
-}
-
-static PyObject * pycsc_cancel(PyObject *self, PyObject * args)
-{
-  PyErr_SetString(PycscException, "Not implemented");
-  return NULL;
-}
-
-static PyObject * pycsc_beginTransaction(PyObject *self, PyObject * args)
-{
-  PyErr_SetString(PycscException, "Not implemented");
-  return NULL;
-}
-
-static PyObject * pycsc_endTransaction(PyObject *self, PyObject * args)
-{
-  PyErr_SetString(PycscException, "Not implemented");
-  return NULL;
-}
-
-static PyObject * pycsc_cancelTransaction(PyObject *self, PyObject * args)
-{
-  PyErr_SetString(PycscException, "Not implemented");
-  return NULL;
-}
-
-
-/* Declaration of methods */
-static struct PyMethodDef pycsc_methods[] =
-{
- {"reconnect",(PyCFunction)pycsc_reconnect,     METH_VARARGS|METH_KEYWORDS},
- {"disconnect",        pycsc_disconnect,        METH_VARARGS},
- {"status",            pycsc_status,            METH_VARARGS},
- {"control",           pycsc_control,           METH_VARARGS},
- {"transmit",(PyCFunction)pycsc_transmit,       METH_VARARGS|METH_KEYWORDS},
- {"cancel",            pycsc_cancel,            METH_VARARGS},
- {"beginTransaction",  pycsc_beginTransaction,  METH_VARARGS},
- {"endTransaction",    pycsc_endTransaction,    METH_VARARGS},
- {"cancelTransaction", pycsc_cancelTransaction, METH_VARARGS},
- {NULL,                NULL}
-};
-
-
-/***********************************************************
- * Type methods
- *
- * dealloc() (Destructor)
- * getattr()
- * repr()
- * 
- ***********************************************************/
-static void pycsc_dealloc(PyObject *self)
-{
-  pycscobject *object = (pycscobject *)self;
-#ifdef DEBUG
-  SCARDCONTEXT  hContext;
-  SCARDHANDLE   hCard;
-  hContext = ((pycscobject *)self)->hContext;
-  hCard    = ((pycscobject *)self)->hCard;
-#endif
-
-
-  //+ Disconnect leaving card untouched, any better idea?
-  SCardDisconnect( object->hCard, SCARD_LEAVE_CARD );
-  SCardReleaseContext( object->hContext );
-  PyObject_Del(object);
-#ifdef DEBUG
-  printf("pycsc_dealloc successful for hContext = %08X, hCard = %08X\n",
-         hContext, hCard);
-#endif
-
-}
-
-static PyObject * pycsc_getattr(PyObject *self, char* name)
-{
-  pycscobject *object = (pycscobject *)self;
-
-  return Py_FindMethod(pycsc_methods,  (PyObject *) object, name);
-}
-
-static PyObject * pycsc_repr(PyObject *self)
-{
-  pycscobject *object = (pycscobject *)self;
-  char buffer[1024];
-
-  snprintf(buffer, sizeof(buffer), 
-       "< pycsc, hContext = 0x%08lX, hCard = 0x%08lX at %lx >",
-       object->hContext, object->hCard, (LONG) object);
-  return PyString_FromString(buffer);
-}
-
-statichere PyTypeObject PycscType =
-{
-    PyObject_HEAD_INIT(NULL)
-    0,                          /* ob_size */
-    "pycsc",                    /* tp_name */
-    sizeof(pycscobject),        /* tp_basicsize */
-    0,                          /* tp_itemsize */
-    /* methods */
-    pycsc_dealloc,              /* tp_dealloc */
-    0,                          /* tp_print */
-    (getattrfunc) pycsc_getattr,/* tp_getattr */
-    0,                          /* tp_setattr */
-    0,                          /* tp_compare */
-    (reprfunc) pycsc_repr,      /* tp_repr */
-    0,                          /* tp_as_number */
-    0,                          /* tp_as_sequence */
-    0,                          /* tp_as_mapping */
-    (hashfunc) 0,               /* tp_hash */
-    0,                          /* tp_call */
-    (reprfunc) 0,               /* tp_str */
-};
-
-
-
-
-/***********************************************************
- * Class methods
- *
- * pycsc()
- * listReader()
- * listReaderGroups()
- * getStatusChange()
- * 
- ***********************************************************/
-
-
-/* This is the "creator" for a new pycsc object */
-static PyObject * pycscobject_pycsc(PyObject *self, PyObject * args, PyObject *keywds)
-{
-  /* No reader name in args, connect to the first reader */
-  LPSTR mszReaders = NULL;
-  LPSTR szRequestedReader = "";
-  DWORD dwReaders;
-  DWORD dwMode = SCARD_SHARE_SHARED;
-  DWORD eProtocol;   /* effective protocol */
-  DWORD dwPreferredProtocol = SCARD_PROTOCOL_T0;
-  SCARDCONTEXT  hContext;
-  SCARDHANDLE   hCard;
-  LONG rv;
-  pycscobject *newself;
-  static char *kwlist[] = {"reader", "mode", "protocol", NULL};
-
-  if (!PyArg_ParseTupleAndKeywords(args, keywds, "|s#ll", kwlist,
-                                   &szRequestedReader, &dwReaders,
-                                   &dwMode,
-                                   &dwPreferredProtocol))
-    return NULL;
-
-#ifdef DEBUG
-  printf("pycsc called with: ");
-  if (szRequestedReader)
-    printf("Reader name: %s\n", szRequestedReader);
-  else
-    printf("Reader name not specified\n");
-  printf("Mode: %ld\n", dwMode);
-  printf("Preferred protocol: %ld\n", dwPreferredProtocol);
-#endif  
-
-
-  /* Initialise context */
-  rv = SCardEstablishContext( SCARD_SCOPE_SYSTEM, NULL, NULL,
-                  &hContext);
-  if ( rv != SCARD_S_SUCCESS )
-  {
-      PyErr_SetString(PycscException, pcsc_stringify_error(rv));
-      return NULL;
-  }
-
-#ifdef DEBUG
-  printf("SCardEstablishContext successful\n");
-#endif
-  if (strlen(szRequestedReader) > 0)
-  {
-    // malloc a buffer to copy the reader name to have the same behiaviour
-    // as when selecting the first one
-    mszReaders = (char *)PyMem_Malloc(sizeof(char)*
-                                      (strlen(szRequestedReader)+1));
-
-    if (!mszReaders)
-    {
-      SCardReleaseContext( hContext );
-      return PyErr_NoMemory();
-    }
-    strncpy(mszReaders, szRequestedReader, strlen(szRequestedReader)+1);
-  }
-  else
-  {
-    // No reader specified, need to locate the first one
-    rv = getReaderList(hContext, &mszReaders,  &dwReaders);
-
-    if ( rv != SCARD_S_SUCCESS )
-    {
-      SCardReleaseContext( hContext );
-      PyErr_SetString(PycscException, pcsc_stringify_error(rv));
-      return NULL;
-    }
-  }
-  if (*mszReaders == '\0')
-  {
-    SCardReleaseContext( hContext );
-    PyErr_SetString(PycscException, "No reader connected");
-    return NULL;    
-  }
-  /* Connect */
-  rv = SCardConnect(hContext, mszReaders, dwMode, 
-            dwPreferredProtocol, &hCard, &eProtocol);
-  /* Free the memory now */
-  PyMem_Free((void *)mszReaders);
-
-  if ( rv != SCARD_S_SUCCESS )
-  {
-    SCardReleaseContext( hContext );
-    PyErr_SetString(PycscException, pcsc_stringify_error(rv));
-    return NULL;
-  }
-
-  /* Now that everything worked, alloc new object */
-  /* replace self from class with the new instance */
-  newself = PyObject_New(pycscobject, & PycscType);
-  if (newself == NULL)
-  {
-    SCardReleaseContext( hContext );
-    PyErr_SetString(PycscException, "Could not allocate new object");
-    return NULL;
-  }
-  newself->hContext   = hContext;
-  newself->hCard      = hCard;
-  newself->sMode      = dwMode;
-  newself->dwProtocol = eProtocol;
-
-#ifdef DEBUG
-  printf("Active protocol: 0xld\n", eProtocol);
-  printf("pycsc_pycsc: OK with  hContext = 0x%08X, hCard = 0x%08X\n",
-          hContext, hCard);
-#endif
-
-  return (PyObject *) newself;
-}
-
-static PyObject * pycscobject_listReader(PyObject *self, PyObject * args)
-{
-  SCARDCONTEXT  hContext;
-  LPSTR mszReaders = NULL;
-  LPSTR mszReadersScan;
-  DWORD dwReaders;
-  LONG rv;
-
-  PyObject *ret_value;
-
-  rv = SCardEstablishContext( SCARD_SCOPE_SYSTEM, NULL, NULL,
-                              &hContext);
-  if ( rv != SCARD_S_SUCCESS )
-  {
-    PyErr_SetString(PycscException, pcsc_stringify_error(rv));
-    return NULL;
-  }
-  rv = getReaderList(hContext, &mszReaders,  &dwReaders);
-
-  if ( rv != SCARD_S_SUCCESS )
-  {
-    PyErr_SetString(PycscException, pcsc_stringify_error(rv));
-    return NULL;
-  }
-  // Build output from mszReaders
-  ret_value = Py_BuildValue("[]");
-  if (!ret_value)
-  {
-    PyErr_SetString(PycscException, "Could not create list");
-    SCardReleaseContext(hContext);  
-    PyMem_Free((void *)mszReaders);
-    return NULL;
-  }
-  mszReadersScan = mszReaders;
-  while (*mszReadersScan != '\0')
-  {
-    //+ Does that free memomry properly in case of error with the append
-    //+ probably Py_BuildValue("s", mszReadersScan) needs a DECREF
-    //+ and so does ret_value
-    if (PyList_Append(ret_value, Py_BuildValue("s", mszReadersScan)))
-    {
-      PyErr_SetString(PycscException, "Could not append reader name");
-      SCardReleaseContext(hContext);  
-      PyMem_Free((void *)mszReaders);
-      return NULL;
-    }      
-    mszReadersScan += strlen(mszReadersScan)+1;
-  }
-  SCardReleaseContext(hContext);  
-  PyMem_Free((void *)mszReaders);
-  return ret_value;
-
-}
-
-static PyObject * pycscobject_listReaderGroups(PyObject *self, PyObject * args)
-{
-  PyErr_SetString(PycscException, "Not implemented");
-  return NULL;
-}
-
-static PyObject * pycscobject_getStatusChange(PyObject *self, PyObject * args,  PyObject *keywds)
-{
-  SCARDCONTEXT  hContext;
-  PyObject *ret_value = NULL;
-  SCARD_READERSTATE *pstReaderStates;
-  DWORD timeout = INFINITE;
-  PyObject *pyReaderStates = NULL;
-  PyObject *tmpSeq;
-  int readerstatesLength = 0;
-  int i;
-  LONG rv;
-
-  static char *kwlist[] = {"Timeout", "ReaderStates", NULL};
-
-  if (!PyArg_ParseTupleAndKeywords(args, keywds, "|lO", kwlist,
-                   &timeout, &pyReaderStates))
-  {
-      PyErr_SetString(PycscException, "Error parsing arguments");
-      return NULL;
-  }
-  // Create an empty sequence in case pyReaderStates was not given as arg
-  tmpSeq = Py_BuildValue("[]");
-  if (pyReaderStates==NULL)
-  {
-      pyReaderStates = tmpSeq;
-  }
-  // Parse the readerstate argument
-  pyReaderStates = PySequence_Fast(pyReaderStates, "pycsc: getStatusChange: Expecting sequence argument for readerstates");
-  Py_DECREF(tmpSeq);
-  if ( ! pyReaderStates )
-  {
-      PyErr_SetString(PycscException, "Error in call to PySequence_Fast");
-      return NULL;
-  }
-  readerstatesLength = PySequence_Fast_GET_SIZE(pyReaderStates);
-  pstReaderStates = PyMem_Malloc(sizeof(SCARD_READERSTATE)*readerstatesLength);
-  if (!pstReaderStates)
-  {
-      Py_DECREF(pyReaderStates);
-      return PyErr_NoMemory();
-  }
- 
-  // Iterate on the sequence. Each element should be a mapping reflecting the content of the struct
-  for (i=0; i<readerstatesLength; i++)
-  {
-      PyObject *pyReaderState;
-      pyReaderState = PySequence_Fast_GET_ITEM(pyReaderStates, i);
-      if ( (!pyReaderState) || (! PyMapping_Check(pyReaderState)) )
-      {
-          // Release memory
-          for (;i>0; i--)
-          {
-              PyMem_Free((void *)pstReaderStates[i-1].szReader);
-          }
-          PyMem_Free((void *)pstReaderStates);
-          Py_DECREF(pyReaderStates);
-          PyErr_SetString(PycscException, "pycsc: getStatusChange: Expecting mapping argument for each readerstate");
-          return NULL;
-      }
-      // Parse the content of the mapping to set the structure
-      // The keys of the mapping are:
-      // "reader" for the reader name
-      // "currentState" for the set of state information to watch for  
-      // Missing value values will be replaced by default values ("" for reader, SCARD_STATE_EMPTY for currentState)
-      pstReaderStates[0].szReader = "";
-      pstReaderStates[0].dwCurrentState = SCARD_STATE_EMPTY;
-      // First deal with dwCurrentState as the szReader free loop on error will be the same as below
-      if (PyMapping_HasKeyString(pyReaderState, "CurrentState"))
-      {
-          PyObject *pycurrentState = NULL;
-          pycurrentState = PyMapping_GetItemString(pyReaderState, "CurrentState");
-          if (!PyInt_Check(pycurrentState))
-          {
-              for (;i>0; i--)
-              {
-                  PyMem_Free((void *)pstReaderStates[i-1].szReader);
-              }
-              PyMem_Free((void *)pstReaderStates);
-              Py_DECREF(pyReaderStates);
-              PyErr_SetString(PycscException, "pycsc: getStatusChange: Expecting \"CurrentState\" key to reference an integer");
-              return NULL;              
-          }
-          pstReaderStates[i].dwCurrentState = PyInt_AsLong(pycurrentState);
-      }
-      if (PyMapping_HasKeyString(pyReaderState, "Reader"))
-      {
-          PyObject *pyReader = NULL;
-          char *pcReaderName;
-          int length;
-          pyReader = PyMapping_GetItemString(pyReaderState, "Reader");
-          if (!PyString_Check(pyReader))
-          {
-              for (;i>0; i--)
-              {
-                  PyMem_Free((void *)pstReaderStates[i-1].szReader);
-              }
-              PyMem_Free((void *)pstReaderStates);
-              Py_DECREF(pyReaderStates);
-              PyErr_SetString(PycscException, "pycsc: getStatusChange: Expecting \"Reader\" key to reference a string");
-              return NULL;
-          } 
-          // Make a copy of the string.
-          length = sizeof(char)*(strlen(PyString_AsString(pyReader))+1);
-          pcReaderName = PyMem_Malloc(length);
-          if (!pcReaderName)
-          {
-              for (;i>0; i--)
-              {
-                  PyMem_Free((void *)pstReaderStates[i-1].szReader);
-              }
-              PyMem_Free((void *)pstReaderStates);
-              Py_DECREF(pyReaderStates);              
-              PyErr_SetString(PycscException, "pycsc: getStatusChange: Memory allocation error");
-              return NULL;
-          }
-          strncpy(pcReaderName, PyString_AsString(pyReader), length);
-          pcReaderName[length-1] = '\0';
-          pstReaderStates[i].szReader = pcReaderName;
-          pstReaderStates[i].pvUserData = NULL;
-      }
-  }
-  // Input is not required anymore.
-  Py_DECREF(pyReaderStates);
-
-  // Connect to pcsc.
-  rv = SCardEstablishContext( SCARD_SCOPE_SYSTEM, NULL, NULL,
-                              &hContext);
-  if ( rv != SCARD_S_SUCCESS )
-  {
-      for (i=0;i<readerstatesLength; i++)
-      {
-          PyMem_Free((void *)pstReaderStates[i].szReader);
-      }
-      PyMem_Free((void *)pstReaderStates);
-      PyErr_SetString(PycscException, pcsc_stringify_error(rv));
-      return NULL;
-  }
-
-
-  rv = SCardGetStatusChange(hContext, timeout, pstReaderStates,
-                            readerstatesLength);
-  SCardReleaseContext(hContext);  
-  if ( rv != SCARD_S_SUCCESS )
-  {
-      for (i=0;i<readerstatesLength; i++)
-      {
-          PyMem_Free((void *)pstReaderStates[i].szReader);
-      }
-      PyMem_Free((void *)pstReaderStates);
-      PyErr_SetString(PycscException, pcsc_stringify_error(rv));
-      return NULL;
-  }
-  
-  // Construct the response sequence of mappings
-  ret_value = Py_BuildValue("[]");
-  if (!ret_value)
-  {
-      for (i=0;i<readerstatesLength; i++)
-      {
-          PyMem_Free((void *)pstReaderStates[i].szReader);
-      }
-      PyMem_Free((void *)pstReaderStates);
-      PyErr_SetString(PycscException, "Could not create list");
-      return NULL;
-  }
-  for (i=0;i<readerstatesLength; i++)
-  {
-      PyObject *pyreaderstate;
-      pyreaderstate = Py_BuildValue("{s:s, s:s, s:i, s:i, s:s#}",
-                                    "Reader", pstReaderStates[i].szReader,
-                                    "UserData", "",
-                                    "CurrentState", pstReaderStates[i].dwCurrentState,
-                                    "EventState", pstReaderStates[i].dwEventState,
-                                    "Atr", pstReaderStates[i].rgbAtr, pstReaderStates[i].cbAtr);
-      if (!pyreaderstate)
-      {
-          Py_DECREF(ret_value);
-          // Up to the value of i (non inclusive), the memory has already been released
-          for (;i<readerstatesLength; i++)
-          {
-              PyMem_Free((void *)pstReaderStates[i].szReader);
-          }
-          PyMem_Free((void *)pstReaderStates);
-          PyErr_SetString(PycscException, "Could not create dictionnary");
-          return NULL;
-      }
-      if (PyList_Append(ret_value, Py_BuildValue("O", pyreaderstate)))
-      {
-          PyErr_SetString(PycscException, "Could not append dictionnary to sequence");
-          Py_DECREF(ret_value);
-          Py_DECREF(pyreaderstate);
-          // Up to the value of i (non inclusive), the memory has already been released
-          for (;i<readerstatesLength; i++)
-          {
-              PyMem_Free((void *)pstReaderStates[i].szReader);
-          }
-          PyMem_Free((void *)pstReaderStates);
-          PyErr_SetString(PycscException, "Could not create dictionnary");
-          return NULL;
-      }      
-      // Release memory as soon as we don't need it anymore
-      PyMem_Free((void *)pstReaderStates[i].szReader);
-  }
-
-  
-  // Release memory
-  PyMem_Free((void *)pstReaderStates);
-
-  return ret_value;
-}
-
-
-/* Declaration of methods */
-static struct PyMethodDef pycsctype_methods[] =
-{
- {"pycsc",(PyCFunction)pycscobject_pycsc,             METH_VARARGS|METH_KEYWORDS},
- {"listReader",        pycscobject_listReader,        METH_VARARGS},
- {"listReaderGroups",  pycscobject_listReaderGroups,  METH_VARARGS},
- {"getStatusChange",(PyCFunction)   pycscobject_getStatusChange,   METH_VARARGS|METH_KEYWORDS},
- {(char*)NULL,         (PyCFunction)NULL,             (int)NULL}
-};
-
-
-/* Module initialisation */
-void initpycsc(void)
-{
-  PyObject *m, *d;
-
-  /* patch object type for building dll on windows... */
-  PycscType.ob_type = &PyType_Type;
-  m = Py_InitModule("pycsc", pycsctype_methods);
-  d = PyModule_GetDict(m);
-
-  //+ Add error code and constants definitions
-  PyDict_SetItemString(d, "SCARD_LEAVE_CARD", PyInt_FromLong(SCARD_LEAVE_CARD)); 
-  PyDict_SetItemString(d, "SCARD_RESET_CARD", PyInt_FromLong(SCARD_RESET_CARD));
-  PyDict_SetItemString(d, "SCARD_SHARE_SHARED", PyInt_FromLong(SCARD_SHARE_SHARED));
-  PyDict_SetItemString(d, "SCARD_SHARE_EXCLUSIVE", PyInt_FromLong(SCARD_SHARE_EXCLUSIVE));
-  PyDict_SetItemString(d, "SCARD_SHARE_DIRECT", PyInt_FromLong(SCARD_SHARE_DIRECT));
-  
-  PyDict_SetItemString(d, "SCARD_PROTOCOL_T0", PyInt_FromLong(SCARD_PROTOCOL_T0));
-  PyDict_SetItemString(d, "SCARD_PROTOCOL_T1", PyInt_FromLong(SCARD_PROTOCOL_T1));
-  PyDict_SetItemString(d, "SCARD_PROTOCOL_RAW", PyInt_FromLong(SCARD_PROTOCOL_RAW));
-#ifdef _WINDOWS_
-  PyDict_SetItemString(d, "SCARD_PROTOCOL_UNDEFINED", PyInt_FromLong(SCARD_PROTOCOL_UNDEFINED));
-#endif
-  PyDict_SetItemString(d, "SCARD_ABSENT", PyInt_FromLong(SCARD_ABSENT));
-  PyDict_SetItemString(d, "SCARD_PRESENT", PyInt_FromLong(SCARD_PRESENT));
-  PyDict_SetItemString(d, "SCARD_SWALLOWED", PyInt_FromLong(SCARD_SWALLOWED));
-  PyDict_SetItemString(d, "SCARD_POWERED", PyInt_FromLong(SCARD_POWERED));
-  PyDict_SetItemString(d, "SCARD_NEGOTIABLE", PyInt_FromLong(SCARD_NEGOTIABLE));
-  PyDict_SetItemString(d, "SCARD_SPECIFIC", PyInt_FromLong(SCARD_SPECIFIC));
-#ifndef _WINDOWS_
-  // PCSC-lite specific
-  PyDict_SetItemString(d, "SCARD_PROTOCOL_ANY", PyInt_FromLong(SCARD_PROTOCOL_ANY));
-#endif
-  PyDict_SetItemString(d, "SCARD_STATE_UNAWARE", PyInt_FromLong(SCARD_STATE_UNAWARE)); 
-  PyDict_SetItemString(d, "SCARD_STATE_IGNORE", PyInt_FromLong(SCARD_STATE_IGNORE)); 
-  PyDict_SetItemString(d, "SCARD_STATE_CHANGED", PyInt_FromLong(SCARD_STATE_CHANGED)); 
-  PyDict_SetItemString(d, "SCARD_STATE_UNKNOWN", PyInt_FromLong(SCARD_STATE_UNKNOWN)); 
-  PyDict_SetItemString(d, "SCARD_STATE_UNAVAILABLE", PyInt_FromLong(SCARD_STATE_UNAVAILABLE)); 
-  PyDict_SetItemString(d, "SCARD_STATE_EMPTY", PyInt_FromLong(SCARD_STATE_EMPTY)); 
-  PyDict_SetItemString(d, "SCARD_STATE_PRESENT", PyInt_FromLong(SCARD_STATE_PRESENT)); 
-  PyDict_SetItemString(d, "SCARD_STATE_ATRMATCH", PyInt_FromLong(SCARD_STATE_ATRMATCH)); 
-  PyDict_SetItemString(d, "SCARD_STATE_EXCLUSIVE", PyInt_FromLong(SCARD_STATE_EXCLUSIVE)); 
-  PyDict_SetItemString(d, "SCARD_STATE_INUSE", PyInt_FromLong(SCARD_STATE_INUSE)); 
-  PyDict_SetItemString(d, "SCARD_STATE_MUTE", PyInt_FromLong(SCARD_STATE_MUTE)); 
-  //+ Define the PycscException
-  PycscException = PyErr_NewException("pycsc.PycscException", NULL, NULL);
-  PyDict_SetItemString(d, "PycscException", PycscException);
-}
-
-/* Internal tool */
-static LONG getReaderList(SCARDCONTEXT hContext, LPSTR* pmszReaders, DWORD *pdwReaders)
-{
-  LPCSTR mszGroups = 0;
-  LPSTR mszReaders = NULL;
-  LONG  dwReaders;
-  LONG rv;
-
-  /* Read size of reader list */
-  rv = SCardListReaders( hContext, mszGroups, 0, &dwReaders );
-
-  if ( rv != SCARD_S_SUCCESS )
-  {
-    return rv;
-  }
-#ifdef DEBUG
-  printf("SCardListReaders dry run successful\n");
-#endif
-
-  /* malloc a buffer to store reader names */
-  mszReaders = (char *)PyMem_Malloc(sizeof(char)*dwReaders);
-
-  if (!mszReaders)
-  {
-    return SCARD_E_NO_MEMORY;
-  }
-
-  /* Get the list of readers*/
-  rv = SCardListReaders(hContext, mszGroups,
-                        mszReaders, &dwReaders );
-
-  if ( rv != SCARD_S_SUCCESS )
-  {
-    PyMem_Free((void *)mszReaders);
-    return rv;
-  }
-#ifdef DEBUG
-  printf("SCardListReaders successful\n");
-#endif
-  *pmszReaders = mszReaders;
-  *pdwReaders  = dwReaders;
-  return SCARD_S_SUCCESS;
-}

Copied: tags/pycsc/rel-0.0.4/pycsc.c (from rev 2214, trunk/pycsc/pycsc.c)




More information about the Pcsclite-cvs-commit mailing list