pcsc-lite 1.6.4
readerfactory.h
Go to the documentation of this file.
00001 /*
00002  * MUSCLE SmartCard Development ( http://www.linuxnet.com )
00003  *
00004  * Copyright (C) 1999
00005  *  David Corcoran <corcoran@linuxnet.com>
00006  * Copyright (C) 2002-2010
00007  *  Ludovic Rousseau <ludovic.rousseau@free.fr>
00008  *
00009  * $Id: readerfactory.h 5058 2010-07-02 14:39:55Z 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 #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         /* shared with API 3.0 */
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         /* API v2.0 only */
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         /* the common fields SHALL be in the same order as in FctMap_V2 */
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         /* API V3.0 only */
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         /* we can't use READER_CONTEXT * here since eventhandler.h can't be
00137          * included because of circular dependencies */
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, /*@out@*/ struct ReaderContext **);
00147     LONG RFReaderInfoNamePort(int, LPSTR, /*@out@*/ struct ReaderContext **);
00148     LONG RFReaderInfoById(DWORD, /*@out@*/ struct ReaderContext **);
00149     LONG RFCheckSharing(SCARDHANDLE, READER_CONTEXT *);
00150     LONG RFLockSharing(SCARDHANDLE, READER_CONTEXT *);
00151     LONG RFUnlockSharing(SCARDHANDLE, READER_CONTEXT *);
00152     LONG RFUnlockAllSharing(SCARDHANDLE, READER_CONTEXT *);
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