pcsc-lite 1.6.4
|
00001 /* 00002 * MUSCLE SmartCard Development ( http://www.linuxnet.com ) 00003 * 00004 * Copyright (C) 1999 00005 * David Corcoran <corcoran@linuxnet.com> 00006 * Copyright (C) 2002-2010 00007 * Ludovic Rousseau <ludovic.rousseau@free.fr> 00008 * 00009 * $Id: readerfactory.h 5058 2010-07-02 14:39:55Z rousseau $ 00010 */ 00011 00017 #ifndef __readerfactory_h__ 00018 #define __readerfactory_h__ 00019 00020 #include <inttypes.h> 00021 #include <pthread.h> 00022 00023 #include "ifdhandler.h" 00024 #include "pcscd.h" 00025 #include "simclist.h" 00026 00027 #ifdef __cplusplus 00028 extern "C" 00029 { 00030 #endif 00031 00032 typedef struct 00033 { 00034 char *pcFriendlyname; 00035 char *pcDevicename; 00036 char *pcLibpath; 00037 int channelId; 00038 } SerialReader; 00039 00040 struct FctMap_V1 00041 { 00042 RESPONSECODE (*pvfCreateChannel)(DWORD); 00043 RESPONSECODE (*pvfCloseChannel)(void); 00044 RESPONSECODE (*pvfGetCapabilities)(DWORD, PUCHAR); 00045 RESPONSECODE (*pvfSetCapabilities)(DWORD, PUCHAR); 00046 RESPONSECODE (*pvfSetProtocolParameters)(DWORD, UCHAR, UCHAR, UCHAR, 00047 UCHAR); 00048 RESPONSECODE (*pvfPowerICC)(DWORD); 00049 RESPONSECODE (*pvfTransmitToICC)(SCARD_IO_HEADER, PUCHAR, DWORD, 00050 PUCHAR, PDWORD, PSCARD_IO_HEADER); 00051 RESPONSECODE (*pvfICCPresence)(void); 00052 }; 00053 00054 typedef struct FctMap_V1 FCT_MAP_V1; 00055 00056 struct FctMap_V2 00057 { 00058 /* shared with API 3.0 */ 00059 RESPONSECODE (*pvfCreateChannel)(DWORD, DWORD); 00060 RESPONSECODE (*pvfCloseChannel)(DWORD); 00061 RESPONSECODE (*pvfGetCapabilities)(DWORD, DWORD, PDWORD, PUCHAR); 00062 RESPONSECODE (*pvfSetCapabilities)(DWORD, DWORD, DWORD, PUCHAR); 00063 RESPONSECODE (*pvfSetProtocolParameters)(DWORD, DWORD, UCHAR, UCHAR, 00064 UCHAR, UCHAR); 00065 RESPONSECODE (*pvfPowerICC)(DWORD, DWORD, PUCHAR, PDWORD); 00066 RESPONSECODE (*pvfTransmitToICC)(DWORD, SCARD_IO_HEADER, PUCHAR, 00067 DWORD, PUCHAR, PDWORD, PSCARD_IO_HEADER); 00068 RESPONSECODE (*pvfICCPresence)(DWORD); 00069 00070 /* API v2.0 only */ 00071 RESPONSECODE (*pvfControl)(DWORD, PUCHAR, DWORD, PUCHAR, PDWORD); 00072 }; 00073 00074 typedef struct FctMap_V2 FCT_MAP_V2; 00075 00076 struct FctMap_V3 00077 { 00078 /* the common fields SHALL be in the same order as in FctMap_V2 */ 00079 RESPONSECODE (*pvfCreateChannel)(DWORD, DWORD); 00080 RESPONSECODE (*pvfCloseChannel)(DWORD); 00081 RESPONSECODE (*pvfGetCapabilities)(DWORD, DWORD, PDWORD, PUCHAR); 00082 RESPONSECODE (*pvfSetCapabilities)(DWORD, DWORD, DWORD, PUCHAR); 00083 RESPONSECODE (*pvfSetProtocolParameters)(DWORD, DWORD, UCHAR, UCHAR, 00084 UCHAR, UCHAR); 00085 RESPONSECODE (*pvfPowerICC)(DWORD, DWORD, PUCHAR, PDWORD); 00086 RESPONSECODE (*pvfTransmitToICC)(DWORD, SCARD_IO_HEADER, PUCHAR, 00087 DWORD, PUCHAR, PDWORD, PSCARD_IO_HEADER); 00088 RESPONSECODE (*pvfICCPresence)(DWORD); 00089 00090 /* API V3.0 only */ 00091 RESPONSECODE (*pvfControl)(DWORD, DWORD, LPCVOID, DWORD, LPVOID, 00092 DWORD, LPDWORD); 00093 RESPONSECODE (*pvfCreateChannelByName)(DWORD, LPSTR); 00094 }; 00095 00096 typedef struct FctMap_V3 FCT_MAP_V3; 00097 00098 struct RdrCliHandles 00099 { 00100 SCARDHANDLE hCard; 00101 DWORD dwEventStatus; 00102 }; 00103 00104 typedef struct RdrCliHandles RDR_CLIHANDLES; 00105 00106 struct ReaderContext 00107 { 00108 char lpcReader[MAX_READERNAME]; 00109 char *lpcLibrary; 00110 char *lpcDevice; 00111 pthread_t pthThread; 00112 RESPONSECODE (*pthCardEvent)(DWORD); 00113 pthread_mutex_t *mMutex; 00114 list_t handlesList; 00115 pthread_mutex_t handlesList_lock; 00117 union 00118 { 00119 FCT_MAP_V1 psFunctions_v1; 00120 FCT_MAP_V2 psFunctions_v2; 00121 FCT_MAP_V3 psFunctions_v3; 00122 } psFunctions; 00124 LPVOID vHandle; 00125 int version; 00126 int port; 00127 int slot; 00128 SCARDHANDLE hLockId; 00129 DWORD dwIdentity; 00130 int LockCount; 00131 int32_t contexts; 00132 int * pFeeds; 00133 int * pMutex; 00135 struct pubReaderStatesList *readerState; 00136 /* we can't use READER_CONTEXT * here since eventhandler.h can't be 00137 * included because of circular dependencies */ 00138 }; 00139 00140 typedef struct ReaderContext READER_CONTEXT; 00141 00142 LONG RFAllocateReaderSpace(unsigned int); 00143 LONG RFAddReader(LPSTR, int, LPSTR, LPSTR); 00144 LONG RFRemoveReader(LPSTR, int); 00145 LONG RFSetReaderName(READER_CONTEXT *, LPSTR, LPSTR, int, DWORD); 00146 LONG RFReaderInfo(LPSTR, /*@out@*/ struct ReaderContext **); 00147 LONG RFReaderInfoNamePort(int, LPSTR, /*@out@*/ struct ReaderContext **); 00148 LONG RFReaderInfoById(DWORD, /*@out@*/ struct ReaderContext **); 00149 LONG RFCheckSharing(SCARDHANDLE, READER_CONTEXT *); 00150 LONG RFLockSharing(SCARDHANDLE, READER_CONTEXT *); 00151 LONG RFUnlockSharing(SCARDHANDLE, READER_CONTEXT *); 00152 LONG RFUnlockAllSharing(SCARDHANDLE, READER_CONTEXT *); 00153 LONG RFLoadReader(READER_CONTEXT *); 00154 LONG RFBindFunctions(READER_CONTEXT *); 00155 LONG RFUnBindFunctions(READER_CONTEXT *); 00156 LONG RFUnloadReader(READER_CONTEXT *); 00157 LONG RFInitializeReader(READER_CONTEXT *); 00158 LONG RFUnInitializeReader(READER_CONTEXT *); 00159 SCARDHANDLE RFCreateReaderHandle(READER_CONTEXT *); 00160 LONG RFDestroyReaderHandle(SCARDHANDLE hCard); 00161 LONG RFAddReaderHandle(READER_CONTEXT *, SCARDHANDLE); 00162 LONG RFFindReaderHandle(SCARDHANDLE); 00163 LONG RFRemoveReaderHandle(READER_CONTEXT *, SCARDHANDLE); 00164 LONG RFSetReaderEventState(READER_CONTEXT *, DWORD); 00165 LONG RFCheckReaderEventState(READER_CONTEXT *, SCARDHANDLE); 00166 LONG RFClearReaderEventState(READER_CONTEXT *, SCARDHANDLE); 00167 LONG RFCheckReaderStatus(READER_CONTEXT *); 00168 void RFCleanupReaders(void); 00169 int RFStartSerialReaders(const char *readerconf); 00170 void RFReCheckReaderConf(void); 00171 void RFSuspendAllReaders(void); 00172 void RFAwakeAllReaders(void); 00173 00174 #ifdef __cplusplus 00175 } 00176 #endif 00177 00178 #endif