pcsc-lite  1.7.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-2011
00007  *  Ludovic Rousseau <ludovic.rousseau@free.fr>
00008  *
00009  * $Id: readerfactory.h 5711 2011-05-05 09:02:08Z 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     typedef struct
00028     {
00029         char *pcFriendlyname;   
00030         char *pcDevicename;     
00031         char *pcLibpath;        
00032         int channelId;      
00033     } SerialReader;
00034 
00035     struct FctMap_V2
00036     {
00037         /* shared with API 3.0 */
00038         RESPONSECODE (*pvfCreateChannel)(DWORD, DWORD);
00039         RESPONSECODE (*pvfCloseChannel)(DWORD);
00040         RESPONSECODE (*pvfGetCapabilities)(DWORD, DWORD, PDWORD, PUCHAR);
00041         RESPONSECODE (*pvfSetCapabilities)(DWORD, DWORD, DWORD, PUCHAR);
00042         RESPONSECODE (*pvfSetProtocolParameters)(DWORD, DWORD, UCHAR, UCHAR,
00043             UCHAR, UCHAR);
00044         RESPONSECODE (*pvfPowerICC)(DWORD, DWORD, PUCHAR, PDWORD);
00045         RESPONSECODE (*pvfTransmitToICC)(DWORD, SCARD_IO_HEADER, PUCHAR,
00046             DWORD, PUCHAR, PDWORD, PSCARD_IO_HEADER);
00047         RESPONSECODE (*pvfICCPresence)(DWORD);
00048 
00049         /* API v2.0 only */
00050         RESPONSECODE (*pvfControl)(DWORD, PUCHAR, DWORD, PUCHAR, PDWORD);
00051     };
00052 
00053     typedef struct FctMap_V2 FCT_MAP_V2;
00054 
00055     struct FctMap_V3
00056     {
00057         /* the common fields SHALL be in the same order as in FctMap_V2 */
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         /* API V3.0 only */
00070         RESPONSECODE (*pvfControl)(DWORD, DWORD, LPCVOID, DWORD, LPVOID,
00071             DWORD, LPDWORD);
00072         RESPONSECODE (*pvfCreateChannelByName)(DWORD, LPSTR);
00073     };
00074 
00075     typedef struct FctMap_V3 FCT_MAP_V3;
00076 
00077     struct RdrCliHandles
00078     {
00079         SCARDHANDLE hCard;      
00080         DWORD dwEventStatus;    
00081     };
00082 
00083     typedef struct RdrCliHandles RDR_CLIHANDLES;
00084 
00085     struct ReaderContext
00086     {
00087         char *library;  
00088         char *device;   
00089         pthread_t pthThread;    
00090         RESPONSECODE (*pthCardEvent)(DWORD, int);   
00091         pthread_mutex_t *mMutex;    
00092         list_t handlesList;
00093         pthread_mutex_t handlesList_lock;   
00095         union
00096         {
00097             FCT_MAP_V2 psFunctions_v2;  
00098             FCT_MAP_V3 psFunctions_v3;  
00099         } psFunctions;  
00101         LPVOID vHandle;         
00102         int version;            
00103         int port;               
00104         int slot;               
00105         SCARDHANDLE hLockId;    
00106         DWORD dwIdentity;       
00107         int LockCount;          
00108         int32_t contexts;       
00109         int * pFeeds;           
00110         int * pMutex;           
00111         int powerState;         
00112         pthread_mutex_t powerState_lock;    
00114         struct pubReaderStatesList *readerState; 
00115         /* we can't use READER_CONTEXT * here since eventhandler.h can't be
00116          * included because of circular dependencies */
00117     };
00118 
00119     typedef struct ReaderContext READER_CONTEXT;
00120 
00121     LONG RFAllocateReaderSpace(unsigned int);
00122     LONG RFAddReader(const char *, int, const char *, const char *);
00123     LONG RFRemoveReader(const char *, int);
00124     LONG RFSetReaderName(READER_CONTEXT *, const char *, const char *, int, DWORD);
00125     LONG RFReaderInfo(const char *, /*@out@*/ struct ReaderContext **);
00126     LONG RFReaderInfoNamePort(int, const char *, /*@out@*/ struct ReaderContext **);
00127     LONG RFReaderInfoById(DWORD, /*@out@*/ struct ReaderContext **);
00128     LONG RFCheckSharing(SCARDHANDLE, READER_CONTEXT *);
00129     LONG RFLockSharing(SCARDHANDLE, READER_CONTEXT *);
00130     LONG RFUnlockSharing(SCARDHANDLE, READER_CONTEXT *);
00131     LONG RFUnlockAllSharing(SCARDHANDLE, READER_CONTEXT *);
00132     LONG RFLoadReader(READER_CONTEXT *);
00133     LONG RFBindFunctions(READER_CONTEXT *);
00134     LONG RFUnBindFunctions(READER_CONTEXT *);
00135     LONG RFUnloadReader(READER_CONTEXT *);
00136     LONG RFInitializeReader(READER_CONTEXT *);
00137     LONG RFUnInitializeReader(READER_CONTEXT *);
00138     SCARDHANDLE RFCreateReaderHandle(READER_CONTEXT *);
00139     LONG RFDestroyReaderHandle(SCARDHANDLE hCard);
00140     LONG RFAddReaderHandle(READER_CONTEXT *, SCARDHANDLE);
00141     LONG RFFindReaderHandle(SCARDHANDLE);
00142     LONG RFRemoveReaderHandle(READER_CONTEXT *, SCARDHANDLE);
00143     LONG RFSetReaderEventState(READER_CONTEXT *, DWORD);
00144     LONG RFCheckReaderEventState(READER_CONTEXT *, SCARDHANDLE);
00145     LONG RFClearReaderEventState(READER_CONTEXT *, SCARDHANDLE);
00146     LONG RFCheckReaderStatus(READER_CONTEXT *);
00147     void RFCleanupReaders(void);
00148     void RFWaitForReaderInit(void);
00149     int RFStartSerialReaders(const char *readerconf);
00150     void RFReCheckReaderConf(void);
00151 
00152 #endif