You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
439 lines
11 KiB
439 lines
11 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1998 - 1999
|
|
//
|
|
// File: ScInsBar.cpp
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
// ScInsBar.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "scdlg.h"
|
|
#include "scinsdlg.h"
|
|
#include "ScInsBar.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CScEdit special edit boxes (CardName, CardStatus)
|
|
|
|
BEGIN_MESSAGE_MAP(CScEdit, CEdit)
|
|
//{{AFX_MSG_MAP(CScEdit)
|
|
ON_WM_CONTEXTMENU()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
void CScEdit::OnContextMenu(CWnd* pWnd, CPoint pt)
|
|
{
|
|
::WinHelp(m_hWnd, _T("SCardDlg.hlp"), HELP_CONTEXTMENU, (DWORD_PTR)(PVOID)g_aHelpIDs_IDD_SCARDDLG_BAR);
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CScInsertBar dialog
|
|
|
|
|
|
CScInsertBar::CScInsertBar(CWnd* pParent /*=NULL*/)
|
|
: CDialog(CScInsertBar::IDD, pParent)
|
|
{
|
|
m_paReaderState = NULL;
|
|
//{{AFX_DATA_INIT(CScInsertBar)
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
void CScInsertBar::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CScInsertBar)
|
|
DDX_Control(pDX, IDC_NAME, m_ediName);
|
|
DDX_Control(pDX, IDC_STATUS, m_ediStatus);
|
|
DDX_Control(pDX, IDC_READERS, m_lstReaders);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
void CScInsertBar::OnCancel()
|
|
{
|
|
CScInsertDlg* pParent = (CScInsertDlg*)GetParent();
|
|
_ASSERTE(NULL != pParent);
|
|
if (NULL != pParent)
|
|
{
|
|
pParent->PostMessage(IDCANCEL);
|
|
}
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CScInsertBar, CDialog)
|
|
//{{AFX_MSG_MAP(CScInsertBar)
|
|
ON_WM_DESTROY()
|
|
ON_NOTIFY(LVN_ITEMCHANGED, IDC_READERS, OnReaderItemChanged)
|
|
ON_WM_HELPINFO()
|
|
ON_WM_CONTEXTMENU()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CScInsertBar UI & smart card methods
|
|
|
|
|
|
/*++
|
|
|
|
InitializeReaderList:
|
|
|
|
Initialize the list control w/ large images, and set up the
|
|
CStringArray of image (reader/card status) descriptions...
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
Author:
|
|
|
|
Amanda Matlosz 07/14/1998
|
|
|
|
--*/
|
|
void CScInsertBar::InitializeReaderList(void)
|
|
{
|
|
HICON hicon;
|
|
CImageList imageList;
|
|
CString str;
|
|
|
|
// Create the image list & give it to the list control
|
|
imageList.Create (
|
|
IMAGE_WIDTH,
|
|
IMAGE_HEIGHT,
|
|
TRUE, // list does include masks
|
|
NUMBER_IMAGES,
|
|
0); // list won't grow
|
|
|
|
// Build the image list
|
|
for (int i = 0; i < NUMBER_IMAGES; i++ )
|
|
{
|
|
// Load icon and add it to image list
|
|
hicon = NULL;
|
|
hicon = ::LoadIcon ( AfxGetInstanceHandle(),
|
|
MAKEINTRESOURCE(IMAGE_LIST_IDS[i]) );
|
|
if (NULL==hicon) {
|
|
break; // what can we do?
|
|
}
|
|
imageList.Add (hicon);
|
|
|
|
}
|
|
|
|
// Be sure that all the small icons were added.
|
|
_ASSERTE(imageList.GetImageCount() == NUMBER_IMAGES);
|
|
|
|
m_lstReaders.SetImageList(&imageList, (int) LVSIL_NORMAL);
|
|
imageList.Detach();
|
|
}
|
|
|
|
|
|
/*++
|
|
|
|
UpdateStatusList:
|
|
|
|
This routine resets the list box display
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
A LONG value indicating the status of the requested action. Please
|
|
see the Smartcard header files for additional information.
|
|
|
|
Author:
|
|
|
|
Amanda Matlosz 06/15/1998
|
|
|
|
Notes:
|
|
|
|
Strings need to be converted from type stored in the smartcard
|
|
thread help classes to this dialog's build type (i.e. UNICODE/ANSI)!!!!
|
|
|
|
--*/
|
|
void CScInsertBar::UpdateStatusList(CSCardReaderStateArray* paReaderState)
|
|
{
|
|
|
|
CString strCardStatus, strCardName;
|
|
CSCardReaderState* pReader = NULL;
|
|
CSCardReaderState* pSelectedRdr = NULL;
|
|
LV_ITEM lv_item;
|
|
|
|
//
|
|
// Update the reader information
|
|
//
|
|
|
|
m_paReaderState = paReaderState;
|
|
|
|
// reset previous knowledge re: reader/card status
|
|
m_ediName.SetWindowText(_T(""));
|
|
m_ediStatus.SetWindowText(_T(""));
|
|
m_lstReaders.DeleteAllItems();
|
|
|
|
if (NULL != m_paReaderState)
|
|
{
|
|
// Insert (new) items
|
|
|
|
lv_item.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
|
|
lv_item.cchTextMax = MAX_ITEMLEN;
|
|
|
|
int nNumReaders = (int)m_paReaderState->GetSize();
|
|
for(int nIndex = 0; nIndex < nNumReaders; nIndex++)
|
|
{
|
|
// Setup struct for system reader list
|
|
pReader = m_paReaderState->GetAt(nIndex);
|
|
_ASSERTE(NULL != pReader);
|
|
|
|
lv_item.iItem = nIndex;
|
|
lv_item.stateMask = 0;
|
|
lv_item.state = 0;
|
|
lv_item.iSubItem = 0;
|
|
lv_item.iImage = (int)READEREMPTY;
|
|
lv_item.pszText = NULL;
|
|
// set lparam to the reader ptr so we can fetch the readerinfo later
|
|
lv_item.lParam = (LPARAM)pReader;
|
|
|
|
//
|
|
// Get the card status: image, and select OK card
|
|
//
|
|
|
|
if (NULL != pReader)
|
|
{
|
|
lv_item.pszText = (LPTSTR)(LPCTSTR)(pReader->strReader);
|
|
|
|
DWORD dwState = pReader->dwState;
|
|
if (dwState == SC_STATUS_NO_CARD)
|
|
{
|
|
lv_item.iImage = (int)READEREMPTY;
|
|
}
|
|
else if (dwState == SC_STATUS_ERROR)
|
|
{
|
|
lv_item.iImage = (int)READERERROR;
|
|
}
|
|
else
|
|
{
|
|
if (pReader->fOK)
|
|
{
|
|
lv_item.iImage = (int)READERLOADED;
|
|
}
|
|
else
|
|
{
|
|
lv_item.iImage = (int)WRONGCARD;
|
|
}
|
|
}
|
|
|
|
// Select if this is a search card
|
|
if (pReader->fOK && (NULL==pSelectedRdr))
|
|
{
|
|
lv_item.state = LVIS_SELECTED | LVIS_FOCUSED;
|
|
|
|
// Set that a selection has occurred
|
|
pSelectedRdr = pReader;
|
|
}
|
|
}
|
|
|
|
// Add Item
|
|
m_lstReaders.InsertItem(&lv_item);
|
|
}
|
|
|
|
// indicate that the reader selection has changed
|
|
if (NULL != pSelectedRdr)
|
|
{
|
|
OnReaderSelChange(pSelectedRdr);
|
|
}
|
|
else
|
|
{
|
|
// select the first item in the list
|
|
m_lstReaders.SetItemState(0, LVIS_SELECTED | LVIS_FOCUSED, 0);
|
|
OnReaderSelChange(m_paReaderState->GetAt(0));
|
|
}
|
|
m_lstReaders.SetFocus(); // TODO: ?? Remove this? ??
|
|
}
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CScInsertBar message handlers
|
|
|
|
|
|
/*++
|
|
|
|
void ShowHelp:
|
|
|
|
Helper function for OnHelpInfo and OnContextMenu.
|
|
|
|
BOOL OnHelpInfo:
|
|
|
|
Called by the MFC framework when the user hits F1.
|
|
|
|
void OnContextMenu
|
|
|
|
Called by the MFC framework when the user right-clicks.
|
|
|
|
Author:
|
|
|
|
Amanda Matlosz 03/04/1999
|
|
|
|
Note:
|
|
|
|
These three functions work together to provide context-sensitive
|
|
help for the insertdlg.
|
|
|
|
--*/
|
|
void CScInsertBar::ShowHelp(HWND hWnd, UINT nCommand)
|
|
{
|
|
|
|
::WinHelp(hWnd, _T("SCardDlg.hlp"), nCommand, (DWORD_PTR)(PVOID)g_aHelpIDs_IDD_SCARDDLG_BAR);
|
|
}
|
|
|
|
afx_msg BOOL CScInsertBar::OnHelpInfo(LPHELPINFO lpHelpInfo)
|
|
{
|
|
_ASSERTE(NULL != lpHelpInfo);
|
|
|
|
ShowHelp((HWND)lpHelpInfo->hItemHandle, HELP_WM_HELP);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
afx_msg void CScInsertBar::OnContextMenu(CWnd* pWnd, CPoint pt)
|
|
{
|
|
_ASSERTE(NULL != pWnd);
|
|
|
|
ShowHelp(pWnd->m_hWnd, HELP_CONTEXTMENU);
|
|
}
|
|
|
|
void CScInsertBar::OnDestroy()
|
|
{
|
|
// clean up image list
|
|
m_SCardImages.DeleteImageList();
|
|
|
|
CDialog::OnDestroy();
|
|
}
|
|
|
|
|
|
BOOL CScInsertBar::OnInitDialog()
|
|
{
|
|
|
|
CDialog::OnInitDialog();
|
|
|
|
//
|
|
// prepare list control
|
|
//
|
|
|
|
InitializeReaderList();
|
|
|
|
//
|
|
// TODO: try SubclassWindow() trick. What's up with MFC?
|
|
//
|
|
CWnd* pEdit = NULL;
|
|
pEdit = GetDlgItem(IDC_NAME);
|
|
if (NULL != pEdit) m_ediName.SubclassWindow(pEdit->m_hWnd);
|
|
pEdit = NULL;
|
|
pEdit = GetDlgItem(IDC_STATUS);
|
|
if (NULL != pEdit) m_ediStatus.SubclassWindow(pEdit->m_hWnd);
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
|
|
/*++
|
|
|
|
OnReaderItemChanged:
|
|
|
|
Routine processes a selection change in the list control --
|
|
if a card name is selected, it is displayed in a separate control
|
|
|
|
Arguments:
|
|
|
|
pNMHDR - pointer to notification structure
|
|
pResult - pointer to LRESULT
|
|
|
|
Return Value:
|
|
|
|
Returns TRUE on success; FALSE otherwise.
|
|
|
|
Author:
|
|
|
|
Amanda Matlosz 09/26/1998
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
void CScInsertBar::OnReaderItemChanged(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
int nItem = m_lstReaders.GetNextItem(-1, LVNI_SELECTED);
|
|
|
|
if (nItem != -1)
|
|
{
|
|
CSCardReaderState* pRdrSt = (CSCardReaderState*)m_lstReaders.GetItemData(nItem);
|
|
OnReaderSelChange(pRdrSt);
|
|
}
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
|
|
void CScInsertBar::OnReaderSelChange(CSCardReaderState* pSelectedRdr)
|
|
{
|
|
_ASSERTE(pSelectedRdr);
|
|
if (NULL != pSelectedRdr)
|
|
{
|
|
//
|
|
// Change UI to show selection details
|
|
//
|
|
|
|
CString strStatus, strName;
|
|
DWORD dwState = pSelectedRdr->dwState;
|
|
|
|
strStatus.LoadString(IDS_SC_STATUS_NO_CARD + dwState - SC_STATUS_NO_CARD);
|
|
|
|
if (dwState != SC_STATUS_NO_CARD)
|
|
{
|
|
strName = pSelectedRdr->strCard;
|
|
strName.TrimLeft();
|
|
if (strName.IsEmpty() || dwState == SC_STATUS_UNKNOWN)
|
|
{
|
|
strName.LoadString(IDS_SC_NAME_UNKNOWN);
|
|
}
|
|
|
|
if (!pSelectedRdr->fOK && (dwState >= SC_SATATUS_AVAILABLE && dwState <= SC_STATUS_EXCLUSIVE))
|
|
{
|
|
CString strAdd;
|
|
strAdd.LoadString(IDS_SC_CANT_USE);
|
|
strStatus += " ";
|
|
strStatus += strAdd;
|
|
}
|
|
}
|
|
|
|
m_ediName.SetWindowText(strName);
|
|
m_ediStatus.SetWindowText(strStatus);
|
|
}
|
|
|
|
//
|
|
// Inform parent of change in selection, even if that sel is "NULL"
|
|
//
|
|
|
|
CScInsertDlg* pParent = (CScInsertDlg*)GetParent();
|
|
_ASSERTE(NULL != pParent);
|
|
if (NULL != pParent)
|
|
{
|
|
pParent->SetSelection(pSelectedRdr);
|
|
}
|
|
}
|
|
|
|
|