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 #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
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
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
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
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
00137
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, struct ReaderContext **);
00147 LONG RFReaderInfoNamePort(int, LPSTR, struct ReaderContext **);
00148 LONG RFReaderInfoById(DWORD, struct ReaderContext **);
00149 LONG RFCheckSharing(SCARDHANDLE);
00150 LONG RFLockSharing(SCARDHANDLE);
00151 LONG RFUnlockSharing(SCARDHANDLE);
00152 LONG RFUnlockAllSharing(SCARDHANDLE);
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