#ifndef __readerfactory_h__
#define __readerfactory_h__
#include <inttypes.h>
#include "thread_generic.h"
#include "ifdhandler.h"
#ifdef __cplusplus
extern "C"
{
#endif
typedef struct
{
char *pcFriendlyname;
char *pcDevicename;
char *pcLibpath;
int dwChannelId;
} SerialReader;
struct FctMap_V1
{
RESPONSECODE (*pvfCreateChannel)(DWORD);
RESPONSECODE (*pvfCloseChannel)(void);
RESPONSECODE (*pvfGetCapabilities)(DWORD, PUCHAR);
RESPONSECODE (*pvfSetCapabilities)(DWORD, PUCHAR);
RESPONSECODE (*pvfSetProtocolParameters)(DWORD, UCHAR, UCHAR, UCHAR,
UCHAR);
RESPONSECODE (*pvfPowerICC)(DWORD);
RESPONSECODE (*pvfTransmitToICC)(SCARD_IO_HEADER, PUCHAR, DWORD,
PUCHAR, PDWORD, PSCARD_IO_HEADER);
RESPONSECODE (*pvfICCPresence)(void);
};
typedef struct FctMap_V1 FCT_MAP_V1, *PFCT_MAP_V1;
struct FctMap_V2
{
RESPONSECODE (*pvfCreateChannel)(DWORD, DWORD);
RESPONSECODE (*pvfCloseChannel)(DWORD);
RESPONSECODE (*pvfGetCapabilities)(DWORD, DWORD, PDWORD, PUCHAR);
RESPONSECODE (*pvfSetCapabilities)(DWORD, DWORD, DWORD, PUCHAR);
RESPONSECODE (*pvfSetProtocolParameters)(DWORD, DWORD, UCHAR, UCHAR,
UCHAR, UCHAR);
RESPONSECODE (*pvfPowerICC)(DWORD, DWORD, PUCHAR, PDWORD);
RESPONSECODE (*pvfTransmitToICC)(DWORD, SCARD_IO_HEADER, PUCHAR,
DWORD, PUCHAR, PDWORD, PSCARD_IO_HEADER);
RESPONSECODE (*pvfICCPresence)(DWORD);
RESPONSECODE (*pvfControl)(DWORD, PUCHAR, DWORD, PUCHAR, PDWORD);
};
typedef struct FctMap_V2 FCT_MAP_V2, *PFCT_MAP_V2;
struct FctMap_V3
{
RESPONSECODE (*pvfCreateChannel)(DWORD, DWORD);
RESPONSECODE (*pvfCloseChannel)(DWORD);
RESPONSECODE (*pvfGetCapabilities)(DWORD, DWORD, PDWORD, PUCHAR);
RESPONSECODE (*pvfSetCapabilities)(DWORD, DWORD, DWORD, PUCHAR);
RESPONSECODE (*pvfSetProtocolParameters)(DWORD, DWORD, UCHAR, UCHAR,
UCHAR, UCHAR);
RESPONSECODE (*pvfPowerICC)(DWORD, DWORD, PUCHAR, PDWORD);
RESPONSECODE (*pvfTransmitToICC)(DWORD, SCARD_IO_HEADER, PUCHAR,
DWORD, PUCHAR, PDWORD, PSCARD_IO_HEADER);
RESPONSECODE (*pvfICCPresence)(DWORD);
RESPONSECODE (*pvfControl)(DWORD, DWORD, LPCVOID, DWORD, LPVOID,
DWORD, LPDWORD);
RESPONSECODE (*pvfCreateChannelByName)(DWORD, LPSTR);
};
typedef struct FctMap_V3 FCT_MAP_V3, *PFCT_MAP_V3;
struct RdrCapabilities
{
DWORD dwAsynch_Supported;
DWORD dwDefault_Clock;
DWORD dwMax_Clock;
DWORD dwDefault_Data_Rate;
DWORD dwMax_Data_Rate;
DWORD dwMax_IFSD;
DWORD dwSynch_Supported;
DWORD dwPower_Mgmt;
DWORD dwCard_Auth_Devices;
DWORD dwUser_Auth_Device;
DWORD dwMechanics_Supported;
DWORD dwVendor_Features;
};
typedef struct RdrCapabilities RDR_CAPABILITIES, *PRDR_CAPABILITIES;
struct ProtOptions
{
DWORD dwProtocol_Type;
DWORD dwCurrent_Clock;
DWORD dwCurrent_F;
DWORD dwCurrent_D;
DWORD dwCurrent_N;
DWORD dwCurrent_W;
DWORD dwCurrent_IFSC;
DWORD dwCurrent_IFSD;
DWORD dwCurrent_BWT;
DWORD dwCurrent_CWT;
DWORD dwCurrent_EBC;
};
typedef struct ProtOptions PROT_OPTIONS, *PPROT_OPTIONS;
struct RdrCliHandles
{
SCARDHANDLE hCard;
DWORD dwEventStatus;
};
typedef struct RdrCliHandles RDR_CLIHANDLES, *PRDR_CLIHANDLES;
struct ReaderContext
{
char lpcReader[MAX_READERNAME];
char lpcLibrary[MAX_LIBNAME];
char lpcDevice[MAX_DEVICENAME];
PCSCLITE_THREAD_T pthThread;
PCSCLITE_MUTEX_T mMutex;
RDR_CLIHANDLES psHandles[PCSCLITE_MAX_READER_CONTEXT_CHANNELS];
union
{
FCT_MAP_V1 psFunctions_v1;
FCT_MAP_V2 psFunctions_v2;
FCT_MAP_V3 psFunctions_v3;
} psFunctions;
LPVOID vHandle;
DWORD dwVersion;
DWORD dwPort;
DWORD dwSlot;
DWORD dwBlockStatus;
DWORD dwLockId;
DWORD dwIdentity;
int32_t dwContexts;
PDWORD pdwFeeds;
PDWORD pdwMutex;
struct pubReaderStatesList *readerState;
#if 0
RDR_CAPABILITIES psCapabilites;
PROT_OPTIONS psProtOptions;
#endif
};
typedef struct ReaderContext READER_CONTEXT, *PREADER_CONTEXT;
LONG RFAllocateReaderSpace(void);
LONG RFAddReader(LPSTR, DWORD, LPSTR, LPSTR);
LONG RFRemoveReader(LPSTR, DWORD);
LONG RFSetReaderName(PREADER_CONTEXT, LPCSTR, LPCSTR, DWORD, DWORD);
LONG RFListReaders(LPSTR, LPDWORD);
LONG RFReaderInfo(LPSTR, struct ReaderContext **);
LONG RFReaderInfoNamePort(DWORD, LPSTR, struct ReaderContext **);
LONG RFReaderInfoById(DWORD, struct ReaderContext **);
LONG RFCheckSharing(DWORD);
LONG RFLockSharing(DWORD);
LONG RFUnlockSharing(DWORD);
LONG RFUnblockReader(PREADER_CONTEXT);
LONG RFUnblockContext(SCARDCONTEXT);
#if 0
LONG RFLoadReader(PREADER_CONTEXT);
LONG RFBindFunctions(PREADER_CONTEXT);
LONG RFUnBindFunctions(PREADER_CONTEXT);
LONG RFUnloadReader(PREADER_CONTEXT);
#endif
LONG RFInitializeReader(PREADER_CONTEXT);
LONG RFUnInitializeReader(PREADER_CONTEXT);
SCARDHANDLE RFCreateReaderHandle(PREADER_CONTEXT);
LONG RFDestroyReaderHandle(SCARDHANDLE hCard);
LONG RFAddReaderHandle(PREADER_CONTEXT, SCARDHANDLE);
LONG RFFindReaderHandle(SCARDHANDLE);
LONG RFRemoveReaderHandle(PREADER_CONTEXT, SCARDHANDLE);
LONG RFSetReaderEventState(PREADER_CONTEXT, DWORD);
LONG RFCheckReaderEventState(PREADER_CONTEXT, SCARDHANDLE);
LONG RFClearReaderEventState(PREADER_CONTEXT, SCARDHANDLE);
LONG RFCheckReaderStatus(PREADER_CONTEXT);
void RFCleanupReaders(int);
int RFStartSerialReaders(const char *readerconf);
void RFReCheckReaderConf(void);
void RFSuspendAllReaders(void);
void RFAwakeAllReaders(void);
void ReaderContextLock(PREADER_CONTEXT rContext);
void ReaderContextUnlock(PREADER_CONTEXT rContext);
int ReaderContextIsLocked(PREADER_CONTEXT rContext);
#ifdef __cplusplus
}
#endif
#endif