windows-nt/Source/XPSP1/NT/inetsrv/iis/ui/admin/certwiz/choosecsppage.cpp
2020-09-26 16:20:57 +08:00

150 lines
3.5 KiB
C++

// ChooseCspPage.cpp : implementation file
//
#include "stdafx.h"
#include "CertWiz.h"
#include "ChooseCspPage.h"
#include "Certificat.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CChooseCertPage property page
IMPLEMENT_DYNCREATE(CChooseCspPage, CIISWizardPage)
CChooseCspPage::CChooseCspPage(CCertificate * pCert)
: CIISWizardPage(CChooseCspPage::IDD, IDS_CERTWIZ, TRUE),
m_pCert(pCert)
{
//{{AFX_DATA_INIT(CChooseCspPage)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
CChooseCspPage::~CChooseCspPage()
{
}
void CChooseCspPage::DoDataExchange(CDataExchange* pDX)
{
CIISWizardPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CChooseCspPage)
DDX_Control(pDX, IDC_CSP_LIST, m_List);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CChooseCspPage, CIISWizardPage)
//{{AFX_MSG_MAP(CChooseCspPage)
ON_LBN_SELCHANGE(IDC_CSP_LIST, OnListSelChange)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CChooseCspPage message handlers
LRESULT CChooseCspPage::OnWizardBack()
{
return IDD_PREV_PAGE;
}
LRESULT CChooseCspPage::OnWizardNext()
{
int index = m_List.GetCurSel();
ASSERT(index != LB_ERR);
m_List.GetText(index, m_pCert->m_CspName);
m_pCert->m_CustomProviderType = (DWORD) m_List.GetItemData(index);
return IDD_NEXT_PAGE;
}
BOOL CChooseCspPage::OnSetActive()
{
// If nothing is selected -- stay here
if (!m_pCert->m_CspName.IsEmpty())
{
m_List.SelectString(-1, m_pCert->m_CspName);
}
SetWizardButtons(LB_ERR == m_List.GetCurSel() ?
PSWIZB_BACK : PSWIZB_BACK | PSWIZB_NEXT);
return CIISWizardPage::OnSetActive();
}
BOOL CChooseCspPage::OnInitDialog()
{
ASSERT(m_pCert != NULL);
CIISWizardPage::OnInitDialog();
CString str;
BSTR bstrProvName = NULL;
DWORD dwType, nProv;
int j;
HRESULT hr;
// array of compatible CSP provider types (see wincrypt.h)
DWORD IISProvType[] =
{
PROV_RSA_SCHANNEL,
PROV_DH_SCHANNEL
};
IEnroll * pEnroll = m_pCert->GetEnrollObject();
ASSERT(pEnroll != NULL);
// Loop, for each Prov Type
for (j = 0; j < (sizeof(IISProvType)/sizeof(DWORD)); j++)
{
nProv = 0;
// check specific prov type
dwType = IISProvType[j];
// pEnroll is previously instantiated ICEnroll interface pointer
hr = pEnroll->put_ProviderType(dwType);
if (FAILED(hr))
{
TRACE(_T("Failed put_ProviderType - %x\n"), hr);
goto error;
}
// enumerate the CSPs of this type
int idx;
while (S_OK == (hr = pEnroll->enumProvidersWStr(nProv, 0, &bstrProvName)))
{
TRACE(_T("Provider %ws (type %d )\n"), bstrProvName, dwType );
// increment the index
nProv++;
// Free this string, so it can be re-used.
idx = m_List.AddString(bstrProvName);
m_List.SetItemData(idx, dwType);
if (NULL != bstrProvName)
{
SysFreeString(bstrProvName);
bstrProvName = NULL;
}
}
// Print message if provider type doesn't have any CSPs.
if (0 == nProv)
{
TRACE(_T("There were no CSPs of type %d\n"), dwType );
}
}
error:
// Clean up resources, etc.
if (NULL != bstrProvName)
SysFreeString(bstrProvName);
return TRUE;
}
void CChooseCspPage::OnListSelChange()
{
SetWizardButtons(-1 == m_List.GetCurSel() ?
PSWIZB_BACK : PSWIZB_BACK | PSWIZB_NEXT);
}