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 #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
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
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
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
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 int LockCount;
00129 DWORD dwIdentity;
00130 int32_t dwContexts;
00131 PDWORD pdwFeeds;
00132 PDWORD pdwMutex;
00134 struct pubReaderStatesList *readerState;
00135
00136
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, struct ReaderContext **);
00147 LONG RFReaderInfoNamePort(DWORD, LPSTR, struct ReaderContext **);
00148 LONG RFReaderInfoById(DWORD, struct ReaderContext **);
00149 LONG RFCheckSharing(DWORD);
00150 LONG RFLockSharing(DWORD);
00151 LONG RFUnlockSharing(DWORD);
00152 LONG RFUnblockReader(PREADER_CONTEXT);
00153 LONG RFUnblockContext(SCARDCONTEXT);
00154 LONG RFLoadReader(PREADER_CONTEXT);
00155 LONG RFBindFunctions(PREADER_CONTEXT);
00156 LONG RFUnBindFunctions(PREADER_CONTEXT);
00157 LONG RFUnloadReader(PREADER_CONTEXT);
00158 LONG RFInitializeReader(PREADER_CONTEXT);
00159 LONG RFUnInitializeReader(PREADER_CONTEXT);
00160 SCARDHANDLE RFCreateReaderHandle(PREADER_CONTEXT);
00161 LONG RFDestroyReaderHandle(SCARDHANDLE hCard);
00162 LONG RFAddReaderHandle(PREADER_CONTEXT, SCARDHANDLE);
00163 LONG RFFindReaderHandle(SCARDHANDLE);
00164 LONG RFRemoveReaderHandle(PREADER_CONTEXT, SCARDHANDLE);
00165 LONG RFSetReaderEventState(PREADER_CONTEXT, DWORD);
00166 LONG RFCheckReaderEventState(PREADER_CONTEXT, SCARDHANDLE);
00167 LONG RFClearReaderEventState(PREADER_CONTEXT, SCARDHANDLE);
00168 LONG RFCheckReaderStatus(PREADER_CONTEXT);
00169 void RFCleanupReaders(int);
00170 int RFStartSerialReaders(const char *readerconf);
00171 void RFReCheckReaderConf(void);
00172 void RFSuspendAllReaders(void);
00173 void RFAwakeAllReaders(void);
00174
00175 #ifdef __cplusplus
00176 }
00177 #endif
00178
00179 #endif