//+------------------------------------------------------------------------- // // 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); } }