// CardFinder.h -- CardFinder class header // (c) Copyright Schlumberger Technology Corp., unpublished work, created // 1999. This computer program includes Confidential, Proprietary // Information and is a Trade Secret of Schlumberger Technology Corp. All // use, disclosure, and/or reproduction is prohibited unless authorized // in writing. All Rights Reserved. #if !defined(SLBCSP_CARDFINDER_H) #define SLBCSP_CARDFINDER_H #if defined(_UNICODE) #if !defined(UNICODE) #define UNICODE #endif //!UNICODE #endif //_UNICODE #if defined(UNICODE) #if !defined(_UNICODE) #define _UNICODE #endif //!_UNICODE #endif //UNICODE #include #include // for auto_ptr #include #include #include "StResource.h" #include "HSCardCtx.h" #include "cspec.h" #include "HCardCtx.h" #include "Secured.h" #include "MultiStrZ.h" #include "ExceptionContext.h" #if defined(SLB_NOWIN2K_BUILD) #define SLBCSP_USE_SCARDUIDLGSELECTCARD 0 #else #define SLBCSP_USE_SCARDUIDLGSELECTCARD 1 #endif class CardFinder : protected ExceptionContext { friend class OpenCardCallbackContext; // for Do* routines public: // Types enum DialogDisplayMode { ddmNever, ddmIfNecessary, ddmAlways }; // C'tors/D'tors CardFinder(DialogDisplayMode ddm, HWND hwnd = 0, CString const &rsDialogTitle = StringResource(IDS_SEL_SLB_CRYPTO_CARD).AsCString()); virtual ~CardFinder(); // Operators // Operations Secured Find(CSpec const &rsReader); // Access DialogDisplayMode DisplayMode() const; HWND Window() const; // Predicates // Static Variables protected: // Note: CardFinder uses GetOpenCardName/SCardUIDlgSelect to find // the card. These routines do not propagate exception thrown by // the callback routines. To throw these exceptions from // CardFinder and its derived classes, a set of wrapper callback // routines Connect, Disconnect and IsValid are defined for // DoConnect, DoDisconnect, and DoIsValid (repectively) which catch // exceptions thrown by these Do routines and set the // CallbackException attribute. When control is returned from // GetOpenCardName/SCardUIDlgSelect, the DoOnError routine is // called. If a callback exception still exists, then the // exception is propagated to the caller of CardFinder class. // Types #if !SLBCSP_USE_SCARDUIDLGSELECTCARD typedef OPENCARDNAME OpenCardNameType; #else typedef OPENCARDNAME_EX OpenCardNameType; #endif // C'tors/D'tors // Operators // Operations void CardFound(Secured const &rshcardctx); virtual SCARDHANDLE DoConnect(std::string const &rsSelectedReader); virtual void DoDisconnect(); void DoFind(CSpec const &rcspec); virtual void DoOnError(); virtual void DoProcessSelection(DWORD dwStatus, OpenCardNameType &ropencardname, bool &rfContinue); void YNPrompt(UINT uID) const; // Access CSpec const & CardSpec() const; Secured CardFound() const; // Predicates virtual bool DoIsValid(); // Variables private: // Types // C'tors/D'tors // Operators // Operations void CheckFn(LPOCNCHKPROC lpfnCheck); static SCARDHANDLE __stdcall Connect(SCARDCONTEXT scardctx, LPTSTR szReader, LPTSTR mszCards, LPVOID lpvUserData); void ConnectFn(LPOCNCONNPROC lpfnConnect); static void __stdcall Disconnect(SCARDCONTEXT scardctx, SCARDHANDLE hSCard, LPVOID lpvUserData); void DisconnectFn(LPOCNDSCPROC lpfnDisconnect); void OnError(); DWORD SelectCard(OpenCardNameType &ropcn); void UserData(void *pvUserData); void WorkaroundOpenCardDefect(OpenCardNameType const &ropcnDlgCtrl, DWORD &rdwStatus); // Access LPOCNCHKPROC CheckFn() const; LPOCNDSCPROC DisconnectFn() const; // Predicates static BOOL __stdcall IsValid(SCARDCONTEXT scardctx, SCARDHANDLE hSCard, LPVOID lpvUserData); // Variables CString const m_sDialogTitle; DialogDisplayMode const m_ddm; HWND const m_hwnd; std::auto_ptr m_apmszSupportedCards; OpenCardNameType m_opcnDlgCtrl; #if SLBCSP_USE_SCARDUIDLGSELECTCARD OPENCARD_SEARCH_CRITERIA m_opcnCriteria; CString m_sInsertPrompt; #endif CSpec m_cspec; HSCardContext m_hscardctx; Secured m_shcardctx; }; #endif // SLBCSP_CARDFINDER_H