pcsc-lite
1.8.2
|
00001 /* 00002 * MUSCLE SmartCard Development ( http://www.linuxnet.com ) 00003 * 00004 * Copyright (C) 1999 00005 * David Corcoran <corcoran@linuxnet.com> 00006 * Copyright (C) 2002-2011 00007 * Ludovic Rousseau <ludovic.rousseau@free.fr> 00008 * 00009 * $Id: readerfactory.h 5900 2011-08-21 13:53:33Z 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 typedef struct 00028 { 00029 char *pcFriendlyname; 00030 char *pcDevicename; 00031 char *pcLibpath; 00032 int channelId; 00033 } SerialReader; 00034 00035 struct FctMap_V2 00036 { 00037 /* shared with API 3.0 */ 00038 RESPONSECODE (*pvfCreateChannel)(DWORD, DWORD); 00039 RESPONSECODE (*pvfCloseChannel)(DWORD); 00040 RESPONSECODE (*pvfGetCapabilities)(DWORD, DWORD, PDWORD, PUCHAR); 00041 RESPONSECODE (*pvfSetCapabilities)(DWORD, DWORD, DWORD, PUCHAR); 00042 RESPONSECODE (*pvfSetProtocolParameters)(DWORD, DWORD, UCHAR, UCHAR, 00043 UCHAR, UCHAR); 00044 RESPONSECODE (*pvfPowerICC)(DWORD, DWORD, PUCHAR, PDWORD); 00045 RESPONSECODE (*pvfTransmitToICC)(DWORD, SCARD_IO_HEADER, PUCHAR, 00046 DWORD, PUCHAR, PDWORD, PSCARD_IO_HEADER); 00047 RESPONSECODE (*pvfICCPresence)(DWORD); 00048 00049 /* API v2.0 only */ 00050 RESPONSECODE (*pvfControl)(DWORD, PUCHAR, DWORD, PUCHAR, PDWORD); 00051 }; 00052 00053 typedef struct FctMap_V2 FCT_MAP_V2; 00054 00055 struct FctMap_V3 00056 { 00057 /* the common fields SHALL be in the same order as in FctMap_V2 */ 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 V3.0 only */ 00070 RESPONSECODE (*pvfControl)(DWORD, DWORD, LPCVOID, DWORD, LPVOID, 00071 DWORD, LPDWORD); 00072 RESPONSECODE (*pvfCreateChannelByName)(DWORD, LPSTR); 00073 }; 00074 00075 typedef struct FctMap_V3 FCT_MAP_V3; 00076 00077 struct RdrCliHandles 00078 { 00079 SCARDHANDLE hCard; 00080 DWORD dwEventStatus; 00081 }; 00082 00083 typedef struct RdrCliHandles RDR_CLIHANDLES; 00084 00085 struct ReaderContext 00086 { 00087 char *library; 00088 char *device; 00089 pthread_t pthThread; 00090 RESPONSECODE (*pthCardEvent)(DWORD, int); 00091 pthread_mutex_t *mMutex; 00092 list_t handlesList; 00093 pthread_mutex_t handlesList_lock; 00095 union 00096 { 00097 FCT_MAP_V2 psFunctions_v2; 00098 FCT_MAP_V3 psFunctions_v3; 00099 } psFunctions; 00101 LPVOID vHandle; 00102 int version; 00103 int port; 00104 int slot; 00105 SCARDHANDLE hLockId; 00106 DWORD dwIdentity; 00107 int LockCount; 00108 int32_t contexts; 00109 int * pFeeds; 00110 int * pMutex; 00111 int powerState; 00112 pthread_mutex_t powerState_lock; 00114 struct pubReaderStatesList *readerState; 00115 /* we can't use READER_CONTEXT * here since eventhandler.h can't be 00116 * included because of circular dependencies */ 00117 }; 00118 00119 typedef struct ReaderContext READER_CONTEXT; 00120 00121 LONG RFAllocateReaderSpace(unsigned int); 00122 LONG RFAddReader(const char *, int, const char *, const char *); 00123 LONG RFRemoveReader(const char *, int); 00124 LONG RFSetReaderName(READER_CONTEXT *, const char *, const char *, int); 00125 LONG RFReaderInfo(const char *, /*@out@*/ struct ReaderContext **); 00126 LONG RFReaderInfoNamePort(int, const char *, /*@out@*/ struct ReaderContext **); 00127 LONG RFReaderInfoById(DWORD, /*@out@*/ struct ReaderContext **); 00128 LONG RFCheckSharing(SCARDHANDLE, READER_CONTEXT *); 00129 LONG RFLockSharing(SCARDHANDLE, READER_CONTEXT *); 00130 LONG RFUnlockSharing(SCARDHANDLE, READER_CONTEXT *); 00131 LONG RFUnlockAllSharing(SCARDHANDLE, READER_CONTEXT *); 00132 LONG RFLoadReader(READER_CONTEXT *); 00133 LONG RFBindFunctions(READER_CONTEXT *); 00134 LONG RFUnBindFunctions(READER_CONTEXT *); 00135 LONG RFUnloadReader(READER_CONTEXT *); 00136 LONG RFInitializeReader(READER_CONTEXT *); 00137 LONG RFUnInitializeReader(READER_CONTEXT *); 00138 SCARDHANDLE RFCreateReaderHandle(READER_CONTEXT *); 00139 LONG RFDestroyReaderHandle(SCARDHANDLE hCard); 00140 LONG RFAddReaderHandle(READER_CONTEXT *, SCARDHANDLE); 00141 LONG RFFindReaderHandle(SCARDHANDLE); 00142 LONG RFRemoveReaderHandle(READER_CONTEXT *, SCARDHANDLE); 00143 LONG RFSetReaderEventState(READER_CONTEXT *, DWORD); 00144 LONG RFCheckReaderEventState(READER_CONTEXT *, SCARDHANDLE); 00145 LONG RFClearReaderEventState(READER_CONTEXT *, SCARDHANDLE); 00146 LONG RFCheckReaderStatus(READER_CONTEXT *); 00147 void RFCleanupReaders(void); 00148 void RFWaitForReaderInit(void); 00149 int RFStartSerialReaders(const char *readerconf); 00150 void RFReCheckReaderConf(void); 00151 00152 #endif