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

Generated on Sat Jan 6 09:13:12 2007 for pcsc-lite by  doxygen 1.4.7