readerfactory.h

Go to the documentation of this file.
00001 /*
00002  * MUSCLE SmartCard Development ( http://www.linuxnet.com )
00003  *
00004  * Copyright (C) 1999
00005  *  David Corcoran <corcoran@linuxnet.com>
00006  * Copyright (C) 2004
00007  *  Ludovic Rousseau <ludovic.rousseau@free.fr>
00008  *
00009  * $Id: readerfactory.h 2543 2007-05-23 14:03:46Z rousseau $
00010  */
00011 
00017 #ifndef __readerfactory_h__
00018 #define __readerfactory_h__
00019 
00020 #include <inttypes.h>
00021 
00022 #include "thread_generic.h"
00023 #include "ifdhandler.h"
00024 
00025 #ifdef __cplusplus
00026 extern "C"
00027 {
00028 #endif
00029 
00030     typedef struct
00031     {
00032         char *pcFriendlyname;
00033         char *pcDevicename;
00034         char *pcLibpath;
00035         int dwChannelId;
00036     } SerialReader;
00037 
00038     struct FctMap_V1
00039     {
00040         RESPONSECODE (*pvfCreateChannel)(DWORD);
00041         RESPONSECODE (*pvfCloseChannel)(void);
00042         RESPONSECODE (*pvfGetCapabilities)(DWORD, PUCHAR);
00043         RESPONSECODE (*pvfSetCapabilities)(DWORD, PUCHAR);
00044         RESPONSECODE (*pvfSetProtocolParameters)(DWORD, UCHAR, UCHAR, UCHAR,
00045             UCHAR);
00046         RESPONSECODE (*pvfPowerICC)(DWORD);
00047         RESPONSECODE (*pvfTransmitToICC)(SCARD_IO_HEADER, PUCHAR, DWORD,
00048             PUCHAR, PDWORD, PSCARD_IO_HEADER);
00049         RESPONSECODE (*pvfICCPresence)(void);
00050     };
00051 
00052     typedef struct FctMap_V1 FCT_MAP_V1, *PFCT_MAP_V1;
00053 
00054     struct FctMap_V2
00055     {
00056         /* shared with API 3.0 */
00057         RESPONSECODE (*pvfCreateChannel)(DWORD, DWORD);
00058         RESPONSECODE (*pvfCloseChannel)(DWORD);
00059         RESPONSECODE (*pvfGetCapabilities)(DWORD, DWORD, PDWORD, PUCHAR);
00060         RESPONSECODE (*pvfSetCapabilities)(DWORD, DWORD, DWORD, PUCHAR);
00061         RESPONSECODE (*pvfSetProtocolParameters)(DWORD, DWORD, UCHAR, UCHAR,
00062             UCHAR, UCHAR);
00063         RESPONSECODE (*pvfPowerICC)(DWORD, DWORD, PUCHAR, PDWORD);
00064         RESPONSECODE (*pvfTransmitToICC)(DWORD, SCARD_IO_HEADER, PUCHAR,
00065             DWORD, PUCHAR, PDWORD, PSCARD_IO_HEADER);
00066         RESPONSECODE (*pvfICCPresence)(DWORD);
00067 
00068         /* API v2.0 only */
00069         RESPONSECODE (*pvfControl)(DWORD, PUCHAR, DWORD, PUCHAR, PDWORD);
00070     };
00071 
00072     typedef struct FctMap_V2 FCT_MAP_V2, *PFCT_MAP_V2;
00073 
00074     struct FctMap_V3
00075     {
00076         /* the common fields SHALL be in the same order as in FctMap_V2 */
00077         RESPONSECODE (*pvfCreateChannel)(DWORD, DWORD);
00078         RESPONSECODE (*pvfCloseChannel)(DWORD);
00079         RESPONSECODE (*pvfGetCapabilities)(DWORD, DWORD, PDWORD, PUCHAR);
00080         RESPONSECODE (*pvfSetCapabilities)(DWORD, DWORD, DWORD, PUCHAR);
00081         RESPONSECODE (*pvfSetProtocolParameters)(DWORD, DWORD, UCHAR, UCHAR,
00082                 UCHAR, UCHAR);
00083         RESPONSECODE (*pvfPowerICC)(DWORD, DWORD, PUCHAR, PDWORD);
00084         RESPONSECODE (*pvfTransmitToICC)(DWORD, SCARD_IO_HEADER, PUCHAR,
00085             DWORD, PUCHAR, PDWORD, PSCARD_IO_HEADER);
00086         RESPONSECODE (*pvfICCPresence)(DWORD);
00087 
00088         /* API V3.0 only */
00089         RESPONSECODE (*pvfControl)(DWORD, DWORD, LPCVOID, DWORD, LPVOID,
00090             DWORD, LPDWORD);
00091         RESPONSECODE (*pvfCreateChannelByName)(DWORD, LPSTR);
00092     };
00093 
00094     typedef struct FctMap_V3 FCT_MAP_V3, *PFCT_MAP_V3;
00095 
00096     /*
00097      * The following is not currently used but in place if needed
00098      */
00099 
00100     struct RdrCapabilities
00101     {
00102         DWORD dwAsynch_Supported;   /* Asynchronous Support */
00103         DWORD dwDefault_Clock;  /* Default Clock Rate */
00104         DWORD dwMax_Clock;      /* Max Clock Rate */
00105         DWORD dwDefault_Data_Rate;  /* Default Data Rate */
00106         DWORD dwMax_Data_Rate;  /* Max Data Rate */
00107         DWORD dwMax_IFSD;       /* Maximum IFSD Size */
00108         DWORD dwSynch_Supported;    /* Synchronous Support */
00109         DWORD dwPower_Mgmt;     /* Power Mgmt Features */
00110         DWORD dwCard_Auth_Devices;  /* Card Auth Devices */
00111         DWORD dwUser_Auth_Device;   /* User Auth Devices */
00112         DWORD dwMechanics_Supported;    /* Machanics Supported */
00113         DWORD dwVendor_Features;    /* User Defined.  */
00114     };
00115 
00116     typedef struct RdrCapabilities RDR_CAPABILITIES, *PRDR_CAPABILITIES;
00117 
00118     struct ProtOptions
00119     {
00120         DWORD dwProtocol_Type;  /* Protocol Type */
00121         DWORD dwCurrent_Clock;  /* Current Clock */
00122         DWORD dwCurrent_F;      /* Current F */
00123         DWORD dwCurrent_D;      /* Current D */
00124         DWORD dwCurrent_N;      /* Current N */
00125         DWORD dwCurrent_W;      /* Current W */
00126         DWORD dwCurrent_IFSC;   /* Current IFSC */
00127         DWORD dwCurrent_IFSD;   /* Current IFSD */
00128         DWORD dwCurrent_BWT;    /* Current BWT */
00129         DWORD dwCurrent_CWT;    /* Current CWT */
00130         DWORD dwCurrent_EBC;    /* Current EBC */
00131     };
00132 
00133     typedef struct ProtOptions PROT_OPTIONS, *PPROT_OPTIONS;
00134 
00135     struct RdrCliHandles
00136     {
00137         SCARDHANDLE hCard;      /* hCard for this connection */
00138         DWORD dwEventStatus;    /* Recent event that must be sent */
00139     };
00140 
00141     typedef struct RdrCliHandles RDR_CLIHANDLES, *PRDR_CLIHANDLES;
00142 
00143     struct ReaderContext
00144     {
00145         char lpcReader[MAX_READERNAME]; /* Reader Name */
00146         char lpcLibrary[MAX_LIBNAME];   /* Library Path */
00147         char lpcDevice[MAX_DEVICENAME]; /* Device Name */
00148         PCSCLITE_THREAD_T pthThread;    /* Event polling thread */
00149         PCSCLITE_MUTEX_T mMutex;    /* Mutex for this connection */
00150         RDR_CLIHANDLES psHandles[PCSCLITE_MAX_READER_CONTEXT_CHANNELS];
00151                                          /* Structure of connected handles */
00152         union
00153         {
00154             FCT_MAP_V1 psFunctions_v1;  /* API V1.0 */
00155             FCT_MAP_V2 psFunctions_v2;  /* API V2.0 */
00156             FCT_MAP_V3 psFunctions_v3;  /* API V3.0 */
00157         } psFunctions;
00158 
00159         LPVOID vHandle;         /* Dlopen handle */
00160         DWORD dwVersion;        /* IFD Handler version number */
00161         DWORD dwPort;           /* Port ID */
00162         DWORD dwSlot;           /* Current Reader Slot */
00163         DWORD dwBlockStatus;    /* Current blocking status */
00164         DWORD dwLockId;         /* Lock Id */
00165         int LockCount;          /* number of recursive locks */
00166         DWORD dwIdentity;       /* Shared ID High Nibble */
00167         int32_t dwContexts;     /* Number of open contexts */
00168         PDWORD pdwFeeds;        /* Number of shared client to lib */
00169         PDWORD pdwMutex;        /* Number of client to mutex */
00170 
00171         struct pubReaderStatesList *readerState; /* link to the reader state */
00172         /* we can't use PREADER_STATE here since eventhandler.h can't be
00173          * included because of circular dependencies */
00174 
00175         /* these structures are unused */
00176 #if 0
00177         RDR_CAPABILITIES psCapabilites; /* Structure of reader
00178                            capabilities */
00179         PROT_OPTIONS psProtOptions; /* Structure of protocol options */
00180 #endif
00181     };
00182 
00183     typedef struct ReaderContext READER_CONTEXT, *PREADER_CONTEXT;
00184 
00185     LONG RFAllocateReaderSpace(void);
00186     LONG RFAddReader(LPSTR, DWORD, LPSTR, LPSTR);
00187     LONG RFRemoveReader(LPSTR, DWORD);
00188     LONG RFSetReaderName(PREADER_CONTEXT, LPSTR, LPSTR, DWORD, DWORD);
00189     LONG RFListReaders(LPSTR, LPDWORD);
00190     LONG RFReaderInfo(LPSTR, struct ReaderContext **);
00191     LONG RFReaderInfoNamePort(DWORD, LPSTR, struct ReaderContext **);
00192     LONG RFReaderInfoById(DWORD, struct ReaderContext **);
00193     LONG RFCheckSharing(DWORD);
00194     LONG RFLockSharing(DWORD);
00195     LONG RFUnlockSharing(DWORD);
00196     LONG RFUnblockReader(PREADER_CONTEXT);
00197     LONG RFUnblockContext(SCARDCONTEXT);
00198     LONG RFLoadReader(PREADER_CONTEXT);
00199     LONG RFBindFunctions(PREADER_CONTEXT);
00200     LONG RFUnBindFunctions(PREADER_CONTEXT);
00201     LONG RFUnloadReader(PREADER_CONTEXT);
00202     LONG RFInitializeReader(PREADER_CONTEXT);
00203     LONG RFUnInitializeReader(PREADER_CONTEXT);
00204     SCARDHANDLE RFCreateReaderHandle(PREADER_CONTEXT);
00205     LONG RFDestroyReaderHandle(SCARDHANDLE hCard);
00206     LONG RFAddReaderHandle(PREADER_CONTEXT, SCARDHANDLE);
00207     LONG RFFindReaderHandle(SCARDHANDLE);
00208     LONG RFRemoveReaderHandle(PREADER_CONTEXT, SCARDHANDLE);
00209     LONG RFSetReaderEventState(PREADER_CONTEXT, DWORD);
00210     LONG RFCheckReaderEventState(PREADER_CONTEXT, SCARDHANDLE);
00211     LONG RFClearReaderEventState(PREADER_CONTEXT, SCARDHANDLE);
00212     LONG RFCheckReaderStatus(PREADER_CONTEXT);
00213     void RFCleanupReaders(int);
00214     int RFStartSerialReaders(const char *readerconf);
00215     void RFReCheckReaderConf(void);
00216     void RFSuspendAllReaders(void);
00217     void RFAwakeAllReaders(void);
00218 
00219 #ifdef __cplusplus
00220 }
00221 #endif
00222 
00223 #endif

Generated on Wed Mar 31 11:47:35 2010 for pcsc-lite by  doxygen 1.4.7