217 lines
5.7 KiB
C
217 lines
5.7 KiB
C
|
// 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 <string>
|
||
|
#include <memory> // for auto_ptr
|
||
|
|
||
|
#include <windef.h>
|
||
|
|
||
|
#include <scuOsVersion.h>
|
||
|
|
||
|
#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<HCardContext>
|
||
|
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<HCardContext> 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<HCardContext>
|
||
|
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<MultiStringZ> 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<HCardContext> m_shcardctx;
|
||
|
};
|
||
|
|
||
|
#endif // SLBCSP_CARDFINDER_H
|