PCSCManager.h

Go to the documentation of this file.
00001 
00008 // Revision $Revision: 134 $
00009 #pragma once
00010 #include "ManagerInterface.h"
00011 #include "DynamicLibrary.h"
00012 #include <winscard.h>
00013 
00014 #ifdef WIN32
00015 #define SCAPI __stdcall
00016 #define CSTRTYPE const CHAR *
00017 #define STRTYPE CHAR *
00018 #undef SCARD_READERSTATE
00019 #define SCARD_READERSTATE SCARD_READERSTATEA
00020 #else
00021 #define SCAPI
00022 #ifdef LPCTSTR
00023 define CSTRTYPE LPCSTR
00024 #else
00025 #define CSTRTYPE LPSTR
00026 #endif
00027 #define STRTYPE LPSTR
00028 #ifndef SCARD_E_NO_READERS_AVAILABLE
00029 #define SCARD_E_NO_READERS_AVAILABLE SCARD_E_READER_UNAVAILABLE
00030 #endif
00031 #include <wintypes.h>
00032 #endif
00033 
00035 struct PCSCConnection : public ConnectionBase {
00036         SCARDHANDLE hScard;
00037         DWORD proto;
00038         PCSCConnection(ManagerInterface &iface,unsigned int index,bool force) :
00039                 ConnectionBase(iface,index,force) {}
00040         PCSCConnection(ManagerInterface &iface,SCARDHANDLE existing,DWORD mProto): 
00041                 ConnectionBase(iface),hScard(existing),proto(mProto) {}
00042         ~PCSCConnection() {
00043         }
00044 };
00045 
00047 
00050 class PCSCManager : public ManagerInterface {
00051         DynamicLibrary mLibrary;
00052         bool mOwnContext;
00053 #ifdef WIN32
00054         HANDLE mSCStartedEvent;
00055 #endif
00056         SCARDCONTEXT mSCardContext;
00057         std::vector<char > mReaders;
00058         std::vector<SCARD_READERSTATE> mReaderStates;
00059 
00060 #ifdef WIN32
00061         HANDLE (SCAPI *pSCardAccessStartedEvent)();
00062         void (SCAPI *pSCardReleaseStartedEvent)(HANDLE hStartedEventHandle);
00063 #endif
00064         LONG (SCAPI *pSCardEstablishContext)(DWORD scope,LPCVOID res1,LPCVOID res2,SCARDCONTEXT *context);
00065         LONG (SCAPI *pSCardReleaseContext)(SCARDCONTEXT hContext);
00066         LONG (SCAPI *pSCardGetStatusChange)(SCARDCONTEXT hContext,DWORD dwTimeout,SCARD_READERSTATE *rgReaderStates,DWORD cReaders);
00067         LONG (SCAPI *pSCardListReaders)(SCARDCONTEXT hContext,CSTRTYPE mszGroups,STRTYPE mszReaders,LPDWORD pcchReaders);
00068         LONG (SCAPI *pSCardTransmit)(SCARDHANDLE hCard,LPCSCARD_IO_REQUEST pioSendPci,
00069                 LPCBYTE pbSendBuffer,DWORD cbSendLength,
00070                 LPSCARD_IO_REQUEST pioRecvPci,LPBYTE pbRecvBuffer,
00071                 LPDWORD pcbRecvLength);
00072         LONG (SCAPI *pSCardGetAttrib)(SCARDHANDLE hCard,DWORD dwAttrId,LPBYTE pbAttr,LPDWORD pcbAttrLen);
00073         LONG (SCAPI *pSCardConnect)(SCARDCONTEXT hContext,CSTRTYPE szReader,DWORD dwShareMode,
00074                 DWORD dwPreferredProtocols,LPSCARDHANDLE phCard,LPDWORD pdwActiveProtocol);
00075         LONG (SCAPI *pSCardReconnect)(SCARDHANDLE hCard, DWORD dwShareMode,DWORD dwPreferredProtocols,DWORD dwInitialization,
00076                 LPDWORD pdwActiveProtocol);
00077         LONG (SCAPI *pSCardDisconnect)(SCARDHANDLE hCard,DWORD dwDisposition);
00078         LONG (SCAPI *pSCardBeginTransaction)(SCARDHANDLE hCard);
00079         LONG (SCAPI *pSCardEndTransaction)(     SCARDHANDLE hCard,DWORD dwDisposition);
00080         LONG (SCAPI *pSCardStatus)( SCARDHANDLE hCard,STRTYPE szReaderName,LPDWORD pcchReaderLen,
00081                 LPDWORD pdwState,LPDWORD pdwProtocol,LPBYTE pbAtr,LPDWORD pcbAtrLen);
00082 
00083         void construct(void);
00084         void ensureReaders(uint idx);
00085 
00086         void makeConnection(ConnectionBase *c,uint idx);
00087         void deleteConnection(ConnectionBase *c);
00088         void beginTransaction(ConnectionBase *c);
00089         void endTransaction(ConnectionBase *c,bool forceReset = false);
00090         void execCommand(ConnectionBase *c,std::vector<BYTE> &cmd,std::vector<BYTE> &recv,
00091                 unsigned int &recvLen);
00092         bool isT1Protocol(ConnectionBase *c);
00093 
00094 public:
00095         PCSCManager(void);
00097         PCSCManager(SCARDCONTEXT existingContext);
00098         ~PCSCManager(void);
00099         uint getReaderCount();
00100         std::string getReaderName(uint idx);
00101         std::string getReaderState(uint idx);
00102         std::string getATRHex(uint idx);
00103         PCSCConnection * connect(uint idx,bool forceT0);
00105         PCSCConnection * connect(SCARDHANDLE existingHandle);
00106         PCSCConnection * reconnect(ConnectionBase *c,bool forceT0);
00107 };

Generated on Fri Oct 31 12:29:36 2008 for Cardlib reference by  doxygen 1.5.1