⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ccidpage.cpp

📁 usblsccid-0.9.2: ED1x Smart Card Reader Driver
💻 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 + -