pcsc-lite 1.5.5
|
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 4289 2009-07-01 12:02:54Z 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 #include "pcscd.h" 00025 00026 #ifdef __cplusplus 00027 extern "C" 00028 { 00029 #endif 00030 00031 typedef struct 00032 { 00033 char *pcFriendlyname; 00034 char *pcDevicename; 00035 char *pcLibpath; 00036 int dwChannelId; 00037 } SerialReader; 00038 00039 struct FctMap_V1 00040 { 00041 RESPONSECODE (*pvfCreateChannel)(DWORD); 00042 RESPONSECODE (*pvfCloseChannel)(void); 00043 RESPONSECODE (*pvfGetCapabilities)(DWORD, PUCHAR); 00044 RESPONSECODE (*pvfSetCapabilities)(DWORD, PUCHAR); 00045 RESPONSECODE (*pvfSetProtocolParameters)(DWORD, UCHAR, UCHAR, UCHAR, 00046 UCHAR); 00047 RESPONSECODE (*pvfPowerICC)(DWORD); 00048 RESPONSECODE (*pvfTransmitToICC)(SCARD_IO_HEADER, PUCHAR, DWORD, 00049 PUCHAR, PDWORD, PSCARD_IO_HEADER); 00050 RESPONSECODE (*pvfICCPresence)(void); 00051 }; 00052 00053 typedef struct FctMap_V1 FCT_MAP_V1, *PFCT_MAP_V1; 00054 00055 struct FctMap_V2 00056 { 00057 /* shared with API 3.0 */ 00058 RESPONSECODE (*pvfCreateChannel)(DWORD, DWORD); 00059 RESPONSECODE (*pvfCloseChannel)(DWORD); 00060 RESPONSECODE (*pvfGetCapabilities)(DWORD, DWORD, PDWORD, PUCHAR); 00061 RESPONSECODE (*pvfSetCapabilities)(DWORD, DWORD, DWORD, PUCHAR); 00062 RESPONSECODE (*pvfSetProtocolParameters)(DWORD, DWORD, UCHAR, UCHAR, 00063 UCHAR, UCHAR); 00064 RESPONSECODE (*pvfPowerICC)(DWORD, DWORD, PUCHAR, PDWORD); 00065 RESPONSECODE (*pvfTransmitToICC)(DWORD, SCARD_IO_HEADER, PUCHAR, 00066 DWORD, PUCHAR, PDWORD, PSCARD_IO_HEADER); 00067 RESPONSECODE (*pvfICCPresence)(DWORD); 00068 00069 /* API v2.0 only */ 00070 RESPONSECODE (*pvfControl)(DWORD, PUCHAR, DWORD, PUCHAR, PDWORD); 00071 }; 00072 00073 typedef struct FctMap_V2 FCT_MAP_V2, *PFCT_MAP_V2; 00074 00075 struct FctMap_V3 00076 { 00077 /* the common fields SHALL be in the same order as in FctMap_V2 */ 00078 RESPONSECODE (*pvfCreateChannel)(DWORD, DWORD); 00079 RESPONSECODE (*pvfCloseChannel)(DWORD); 00080 RESPONSECODE (*pvfGetCapabilities)(DWORD, DWORD, PDWORD, PUCHAR); 00081 RESPONSECODE (*pvfSetCapabilities)(DWORD, DWORD, DWORD, PUCHAR); 00082 RESPONSECODE (*pvfSetProtocolParameters)(DWORD, DWORD, UCHAR, UCHAR, 00083 UCHAR, UCHAR); 00084 RESPONSECODE (*pvfPowerICC)(DWORD, DWORD, PUCHAR, PDWORD); 00085 RESPONSECODE (*pvfTransmitToICC)(DWORD, SCARD_IO_HEADER, PUCHAR, 00086 DWORD, PUCHAR, PDWORD, PSCARD_IO_HEADER); 00087 RESPONSECODE (*pvfICCPresence)(DWORD); 00088 00089 /* API V3.0 only */ 00090 RESPONSECODE (*pvfControl)(DWORD, DWORD, LPCVOID, DWORD, LPVOID, 00091 DWORD, LPDWORD); 00092 RESPONSECODE (*pvfCreateChannelByName)(DWORD, LPSTR); 00093 }; 00094 00095 typedef struct FctMap_V3 FCT_MAP_V3, *PFCT_MAP_V3; 00096 00097 struct RdrCliHandles 00098 { 00099 SCARDHANDLE hCard; 00100 DWORD dwEventStatus; 00101 }; 00102 00103 typedef struct RdrCliHandles RDR_CLIHANDLES, *PRDR_CLIHANDLES; 00104 00105 struct ReaderContext 00106 { 00107 char lpcReader[MAX_READERNAME]; 00108 char lpcLibrary[MAX_LIBNAME]; 00109 char lpcDevice[MAX_DEVICENAME]; 00110 PCSCLITE_THREAD_T pthThread; 00111 RESPONSECODE (*pthCardEvent)(DWORD); 00112 PCSCLITE_MUTEX_T mMutex; 00113 RDR_CLIHANDLES psHandles[PCSCLITE_MAX_READER_CONTEXT_CHANNELS]; 00115 union 00116 { 00117 FCT_MAP_V1 psFunctions_v1; 00118 FCT_MAP_V2 psFunctions_v2; 00119 FCT_MAP_V3 psFunctions_v3; 00120 } psFunctions; 00122 LPVOID vHandle; 00123 DWORD dwVersion; 00124 DWORD dwPort; 00125 DWORD dwSlot; 00126 DWORD dwBlockStatus; 00127 DWORD dwLockId; 00128 DWORD dwIdentity; 00129 int LockCount; 00130 int32_t dwContexts; 00131 PDWORD pdwFeeds; 00132 PDWORD pdwMutex; 00134 struct pubReaderStatesList *readerState; 00135 /* we can't use PREADER_STATE here since eventhandler.h can't be 00136 * included because of circular dependencies */ 00137 }; 00138 00139 typedef struct ReaderContext READER_CONTEXT, *PREADER_CONTEXT; 00140 00141 LONG RFAllocateReaderSpace(void); 00142 LONG RFAddReader(LPSTR, DWORD, LPSTR, LPSTR); 00143 LONG RFRemoveReader(LPSTR, DWORD); 00144 LONG RFSetReaderName(PREADER_CONTEXT, LPSTR, LPSTR, DWORD, DWORD); 00145 LONG RFListReaders(LPSTR, LPDWORD); 00146 LONG RFReaderInfo(LPSTR, /*@out@*/ struct ReaderContext **); 00147 LONG RFReaderInfoNamePort(DWORD, LPSTR, /*@out@*/ struct ReaderContext **); 00148 LONG RFReaderInfoById(DWORD, /*@out@*/ struct ReaderContext **); 00149 LONG RFCheckSharing(DWORD); 00150 LONG RFLockSharing(DWORD); 00151 LONG RFUnlockSharing(DWORD); 00152 LONG RFUnlockAllSharing(DWORD); 00153 LONG RFUnblockReader(PREADER_CONTEXT); 00154 LONG RFUnblockContext(SCARDCONTEXT); 00155 LONG RFLoadReader(PREADER_CONTEXT); 00156 LONG RFBindFunctions(PREADER_CONTEXT); 00157 LONG RFUnBindFunctions(PREADER_CONTEXT); 00158 LONG RFUnloadReader(PREADER_CONTEXT); 00159 LONG RFInitializeReader(PREADER_CONTEXT); 00160 LONG RFUnInitializeReader(PREADER_CONTEXT); 00161 SCARDHANDLE RFCreateReaderHandle(PREADER_CONTEXT); 00162 LONG RFDestroyReaderHandle(SCARDHANDLE hCard); 00163 LONG RFAddReaderHandle(PREADER_CONTEXT, SCARDHANDLE); 00164 LONG RFFindReaderHandle(SCARDHANDLE); 00165 LONG RFRemoveReaderHandle(PREADER_CONTEXT, SCARDHANDLE); 00166 LONG RFSetReaderEventState(PREADER_CONTEXT, DWORD); 00167 LONG RFCheckReaderEventState(PREADER_CONTEXT, SCARDHANDLE); 00168 LONG RFClearReaderEventState(PREADER_CONTEXT, SCARDHANDLE); 00169 LONG RFCheckReaderStatus(PREADER_CONTEXT); 00170 void RFCleanupReaders(int); 00171 int RFStartSerialReaders(const char *readerconf); 00172 void RFReCheckReaderConf(void); 00173 void RFSuspendAllReaders(void); 00174 void RFAwakeAllReaders(void); 00175 00176 #ifdef __cplusplus 00177 } 00178 #endif 00179 00180 #endif