📄 ccidpage.cpp
字号:
// CcidPage.cpp : implementation file
//
#include "stdafx.h"
#include "scrtest.h"
#include "CcidPage.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCcidPage property page
IMPLEMENT_DYNCREATE(CCcidPage, CPropertyPage)
CCcidPage::CCcidPage() : CPropertyPage(CCcidPage::IDD)
{
//{{AFX_DATA_INIT(CCcidPage)
m_testFile = _T("");
//}}AFX_DATA_INIT
CCcidTest::m_CmdIdToClassName[_T("PC_to_RDR_IccPowerOn")] = _T("CCcidTest");
CCcidTest::m_CmdIdToClassName[_T("PC_to_RDR_IccPowerOff")] = _T("CCcidTest");
CCcidTest::m_CmdIdToClassName[_T("PC_to_RDR_GetSlotStatus")] = _T("CCcidTest");
CCcidTest::m_CmdIdToClassName[_T("PC_to_RDR_XfrBlock")] = _T("CCcidTest");
CRuntimeClass *pClass = RUNTIME_CLASS(CCcidTest);
CCcidTest::m_CmdIdToRuntimeClass[_T("PC_to_RDR_IccPowerOn")] = pClass;
CCcidTest::m_CmdIdToRuntimeClass[_T("PC_to_RDR_IccPowerOff")] = pClass;
CCcidTest::m_CmdIdToRuntimeClass[_T("PC_to_RDR_GetSlotStatus")] = pClass;
CCcidTest::m_CmdIdToRuntimeClass[_T("PC_to_RDR_XfrBlock")] = pClass;
CCcidTest::m_CmdIdToFuncNum[_T("PC_to_RDR_IccPowerOn")] = PC_to_RDR_IccPowerOn;
CCcidTest::m_CmdIdToFuncNum[_T("PC_to_RDR_IccPowerOff")] = PC_to_RDR_IccPowerOff;
CCcidTest::m_CmdIdToFuncNum[_T("PC_to_RDR_GetSlotStatus")] = PC_to_RDR_GetSlotStatus;
CCcidTest::m_CmdIdToFuncNum[_T("PC_to_RDR_XfrBlock")] = PC_to_RDR_XfrBlock;
m_psp.dwFlags &= ~PSP_HASHELP; // Lose the Help button
}
CCcidPage::~CCcidPage()
{
}
void CCcidPage::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCcidPage)
DDX_Control(pDX, IDC_COMBO_READER_SEL, m_ReaderCombo);
DDX_Control(pDX, IDC_HEXEDIT_RESPONSE, m_ResData);
DDX_Control(pDX, IDC_HEXEDIT_CMD, m_CmdData);
DDX_Control(pDX, IDC_CMD_COMBO, m_CmdCombo);
DDX_Text(pDX, IDC_TESTFILE, m_testFile);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCcidPage, CPropertyPage)
//{{AFX_MSG_MAP(CCcidPage)
ON_BN_CLICKED(IDC_BUTTON_FILE, OnButtonFileOpen)
ON_CBN_SELCHANGE(IDC_CMD_COMBO, OnSelchangeCmdCombo)
ON_CBN_DROPDOWN(IDC_CMD_COMBO, OnDropdownCmdCombo)
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_BUTTON_EXECUTE, OnButtonExecute)
ON_CBN_SELCHANGE(IDC_COMBO_READER_SEL, OnSelchangeComboReaderSel)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCcidPage message handlers
void CCcidPage::OnButtonFileOpen()
{
USES_CONVERSION;
CString strExt((LPCSTR)IDS_DEFAULTXMLEXTENSION);
CString strTitle((LPCSTR)IDS_OPENDIALOGTITLE);
CString strFilter((LPCSTR)IDS_DEFAULTXMLFILTERS);
CString strRootElem((LPCSTR)IDS_CCID_ROOT);
CString strCmdTag((LPCSTR)IDS_CMD_TAG);
UpdateData();
CFileDialog fileDialog(TRUE, strExt, NULL, OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY,
strFilter, this);
fileDialog.m_ofn.lpstrTitle = strTitle;
int ret = fileDialog.DoModal();
if (IDOK == ret)
{
CString strPathName = fileDialog.GetPathName();
if (!strPathName.IsEmpty())
{
m_testFile = strPathName;
UpdateData(FALSE);
}
if (!m_testFile.IsEmpty())
{
IXMLDOMDocumentPtr pDOMDoc = Helper::loadXML(m_testFile);
if(pDOMDoc)
{
ReleaseCurrentDocument();
m_pDOMDoc = pDOMDoc;
IXMLDOMElementPtr rootElementPtr = m_pDOMDoc->GetdocumentElement();
if (rootElementPtr == NULL)
return;
CString strText = W2T(rootElementPtr->GetnodeName());
TRACE(_T("%s\n"),strText);
if(strRootElem.CompareNoCase(strText))
{
CString strFileNotMatch((LPCSTR)IDS_FILE_NOTMATCH);
AfxMessageBox(strFileNotMatch);
return;
}
IXMLDOMNodeListPtr NodeListPtr;
NodeListPtr = rootElementPtr->getElementsByTagName((TCHAR *)strCmdTag.GetBuffer(0));
//ICmdTest::CreateObjects(NodeListPtr,m_CmdArray,CCcidTest::m_CmdIdToClassName);
ICmdTest::CreateObjects(NodeListPtr,m_CmdArray,CCcidTest::m_CmdIdToRuntimeClass);
UpdateCmdCombo();
}
}
}
}
BOOL CCcidPage::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CCcidPage::OnSelchangeCmdCombo()
{
// TODO: Add your control notification handler code here
int nCurSel = m_CmdCombo.GetCurSel();
TRACE("nCurSel=%d\n",nCurSel);
SetDlgItemText(IDC_CCID_DESC,m_CmdArray[nCurSel]->GetDescription());
int len;
LPBYTE pData = m_CmdArray[nCurSel]->GetSendData(len);
m_CmdData.SetBPR(4);
m_CmdData.SetDataAddr(pData,len);
}
void CCcidPage::OnDropdownCmdCombo()
{
// TODO: Add your control notification handler code here
TRACE(_T("OnDropdownCmdCombo\n"));
// Dump all of the items in the combo box.
#ifdef _DEBUG
CString str, str2;
int n;
for (int i=0;i < m_CmdCombo.GetCount();i++)
{
n = m_CmdCombo.GetLBTextLen( i );
m_CmdCombo.GetLBText( i, str.GetBuffer(n) );
str.ReleaseBuffer();
str2.Format(_T("item %d: %s\r\n"), i, str.GetBuffer(0));
afxDump << str2;
}
#endif
}
void CCcidPage::UpdateCmdCombo()
{
for (int i=0; i < m_CmdArray.GetSize(); i++)
m_CmdCombo.AddString(m_CmdArray[i]->GetCmdName());
m_CmdCombo.SetCurSel(0);
// Find the longest string in the combo box.
CString str;
CSize sz;
int dx=0;
CDC* pDC = m_CmdCombo.GetDC();
for (i=0;i < m_CmdCombo.GetCount();i++)
{
m_CmdCombo.GetLBText( i, str );
sz = pDC->GetTextExtent(str);
if (sz.cx > dx)
dx = sz.cx;
}
m_CmdCombo.ReleaseDC(pDC);
// Adjust the width for the vertical scroll bar and the left and right border.
dx += ::GetSystemMetrics(SM_CXVSCROLL) + 2*::GetSystemMetrics(SM_CXEDGE);
// Set the width of the list box so that every item is completely visible.
m_CmdCombo.SetDroppedWidth(dx);
OnSelchangeCmdCombo();
}
void CCcidPage::ReleaseCurrentDocument()
{
if (m_pDOMDoc)
{
m_CmdCombo.ResetContent();
for (int i=0; i < m_CmdArray.GetSize(); i++)
delete m_CmdArray[i];
m_CmdArray.RemoveAll();
m_pDOMDoc = NULL;
}
}
void CCcidPage::OnDestroy()
{
ReleaseCurrentDocument();
CPropertyPage::OnDestroy();
// TODO: Add your message handler code here
}
void CCcidPage::OnButtonExecute()
{
// TODO: Add your control notification handler code here
SetCursor (AfxGetApp ()->LoadStandardCursor (IDC_WAIT));
int nCurSel = m_CmdCombo.GetCurSel();
m_CmdArray[nCurSel]->Execute(this);
SetCursor (AfxGetApp ()->LoadStandardCursor (IDC_ARROW));
//SetDlgItemText(IDC_CCID_DESC,m_CmdArray[nCurSel]->GetDescription());
}
BOOL CCcidPage::OnSetActive()
{
// TODO: Add your specialized code here and/or call the base class
if(m_Device.ListDevices())
{
m_Device.SetCurDev(0);
UpdateReaderCombo();
}
return CPropertyPage::OnSetActive();
}
void CCcidPage::OnSelchangeComboReaderSel()
{
// TODO: Add your control notification handler code here
int nCurSel = m_ReaderCombo.GetCurSel();
m_Device.SetCurDev(nCurSel);
}
void CCcidPage::UpdateReaderCombo()
{
m_ReaderCombo.ResetContent();
for (int i=0; i < m_Device.m_asDevName.GetSize(); i++)
m_ReaderCombo.AddString(m_Device.m_asDevName[i]);
m_ReaderCombo.SetCurSel(m_Device.GetCurDev());
// Find the longest string in the combo box.
CString str;
CSize sz;
int dx=0;
CDC* pDC = m_ReaderCombo.GetDC();
for (i=0;i < m_ReaderCombo.GetCount();i++)
{
m_ReaderCombo.GetLBText( i, str );
sz = pDC->GetTextExtent(str);
if (sz.cx > dx)
dx = sz.cx;
}
m_ReaderCombo.ReleaseDC(pDC);
// Adjust the width for the vertical scroll bar and the left and right border.
dx += ::GetSystemMetrics(SM_CXVSCROLL) + 2*::GetSystemMetrics(SM_CXEDGE);
// Set the width of the list box so that every item is completely visible.
m_ReaderCombo.SetDroppedWidth(dx);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -