00001
00002
00003
00004
00005
00006
00007
00008
00009
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
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
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
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
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 struct RdrCliHandles
00097 {
00098 SCARDHANDLE hCard;
00099 DWORD dwEventStatus;
00100 };
00101
00102 typedef struct RdrCliHandles RDR_CLIHANDLES, *PRDR_CLIHANDLES;
00103
00104 struct ReaderContext
00105 {
00106 char lpcReader[MAX_READERNAME];
00107 char lpcLibrary[MAX_LIBNAME];
00108 char lpcDevice[MAX_DEVICENAME];
00109 PCSCLITE_THREAD_T pthThread;
00110 RESPONSECODE (*pthCardEvent)(DWORD);
00111 PCSCLITE_MUTEX_T mMutex;
00112 RDR_CLIHANDLES psHandles[PCSCLITE_MAX_READER_CONTEXT_CHANNELS];
00114 union
00115 {
00116 FCT_MAP_V1 psFunctions_v1;
00117 FCT_MAP_V2 psFunctions_v2;
00118 FCT_MAP_V3 psFunctions_v3;
00119 } psFunctions;
00121 LPVOID vHandle;
00122 DWORD dwVersion;
00123 DWORD dwPort;
00124 DWORD dwSlot;
00125 DWORD dwBlockStatus;
00126 DWORD dwLockId;
00127 int LockCount;
00128 DWORD dwIdentity;
00129 int32_t dwContexts;
00130 PDWORD pdwFeeds;
00131 PDWORD pdwMutex;
00133 struct pubReaderStatesList *readerState;
00134
00135
00136 };
00137
00138 typedef struct ReaderContext READER_CONTEXT, *PREADER_CONTEXT;
00139
00140 LONG RFAllocateReaderSpace(void);
00141 LONG RFAddReader(LPSTR, DWORD, LPSTR, LPSTR);
00142 LONG RFRemoveReader(LPSTR, DWORD);
00143 LONG RFSetReaderName(PREADER_CONTEXT, LPSTR, LPSTR, DWORD, DWORD);
00144 LONG RFListReaders(LPSTR, LPDWORD);
00145 LONG RFReaderInfo(LPSTR, struct ReaderContext **);
00146 LONG RFReaderInfoNamePort(DWORD, LPSTR, struct ReaderContext **);
00147 LONG RFReaderInfoById(DWORD, struct ReaderContext **);
00148 LONG RFCheckSharing(DWORD);
00149 LONG RFLockSharing(DWORD);
00150 LONG RFUnlockSharing(DWORD);
00151 LONG RFUnblockReader(PREADER_CONTEXT);
00152 LONG RFUnblockContext(SCARDCONTEXT);
00153 LONG RFLoadReader(PREADER_CONTEXT);
00154 LONG RFBindFunctions(PREADER_CONTEXT);
00155 LONG RFUnBindFunctions(PREADER_CONTEXT);
00156 LONG RFUnloadReader(PREADER_CONTEXT);
00157 LONG RFInitializeReader(PREADER_CONTEXT);
00158 LONG RFUnInitializeReader(PREADER_CONTEXT);
00159 SCARDHANDLE RFCreateReaderHandle(PREADER_CONTEXT);
00160 LONG RFDestroyReaderHandle(SCARDHANDLE hCard);
00161 LONG RFAddReaderHandle(PREADER_CONTEXT, SCARDHANDLE);
00162 LONG RFFindReaderHandle(SCARDHANDLE);
00163 LONG RFRemoveReaderHandle(PREADER_CONTEXT, SCARDHANDLE);
00164 LONG RFSetReaderEventState(PREADER_CONTEXT, DWORD);
00165 LONG RFCheckReaderEventState(PREADER_CONTEXT, SCARDHANDLE);
00166 LONG RFClearReaderEventState(PREADER_CONTEXT, SCARDHANDLE);
00167 LONG RFCheckReaderStatus(PREADER_CONTEXT);
00168 void RFCleanupReaders(int);
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