windows-nt/Source/XPSP1/NT/inetsrv/iis/ui/itools/keyring/nkdn2.cpp
2020-09-26 16:20:57 +08:00

338 lines
9.7 KiB
C++

// NKDN2.cpp : implementation file
//
#include "stdafx.h"
#include "keyring.h"
#include "NKChseCA.h"
#include "NKDN.h"
#include "NKDN2.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define SZ_CCODES_FILE _T("ccodes.txt")
#define SZ_CCODES_SECTION _T("CountryCodes")
#define REGKEY_STP _T("SOFTWARE\\Microsoft\\INetStp")
#define REGKEY_INSTALLKEY _T("InstallPath")
enum {
WM_INTERNAL_SETCOUNTRYCODE = WM_USER
};
/////////////////////////////////////////////////////////////////////////////
// CNKDistinguisedName2 dialog
CNKDistinguisedName2::CNKDistinguisedName2(CWnd* pParent /*=NULL*/)
: CNKPages(CNKDistinguisedName2::IDD)
{
//{{AFX_DATA_INIT(CNKDistinguisedName2)
m_nkdn2_sz_L = _T("");
m_nkdn2_sz_S = _T("");
m_nkdn2_sz_C = _T("");
//}}AFX_DATA_INIT
m_hotlink_codessite.m_fBrowse = TRUE;
}
void CNKDistinguisedName2::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CNKDistinguisedName2)
DDX_Control(pDX, IDC_HOTLINK_CCODES, m_hotlink_codessite);
DDX_Control(pDX, IDC_NEWKEY_COUNTRY, m_control_C);
DDX_Control(pDX, IDC_NEWKEY_STATE, m_control_S);
DDX_Control(pDX, IDC_NEWKEY_LOCALITY, m_control_L);
DDX_Text(pDX, IDC_NEWKEY_LOCALITY, m_nkdn2_sz_L);
DDV_MaxChars(pDX, m_nkdn2_sz_L, 128);
DDX_Text(pDX, IDC_NEWKEY_STATE, m_nkdn2_sz_S);
DDV_MaxChars(pDX, m_nkdn2_sz_S, 128);
DDX_CBString(pDX, IDC_NEWKEY_COUNTRY, m_nkdn2_sz_C);
DDV_MaxChars(pDX, m_nkdn2_sz_C, 2);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CNKDistinguisedName2, CDialog)
//{{AFX_MSG_MAP(CNKDistinguisedName2)
ON_EN_CHANGE(IDC_NEWKEY_COUNTRY, OnChangeNewkeyCountry)
ON_EN_CHANGE(IDC_NEWKEY_LOCALITY, OnChangeNewkeyLocality)
ON_EN_CHANGE(IDC_NEWKEY_STATE, OnChangeNewkeyState)
ON_CBN_CLOSEUP(IDC_NEWKEY_COUNTRY, OnCloseupNewkeyCountry)
ON_CBN_SELCHANGE(IDC_NEWKEY_COUNTRY, OnSelchangeNewkeyCountry)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#define SZ_DN_C "DN_COUNTRY"
#define SZ_DN_L "DN_LOCALITY"
#define SZ_DN_S "DN_STATE"
//----------------------------------------------------------------
void CNKDistinguisedName2::OnFinish()
{
m_nkdn2_sz_C.MakeUpper();
// store the user entries
SetStoredString( m_nkdn2_sz_C, SZ_DN_C );
SetStoredString( m_nkdn2_sz_L, SZ_DN_L );
SetStoredString( m_nkdn2_sz_S, SZ_DN_S );
}
//----------------------------------------------------------------
BOOL CNKDistinguisedName2::OnInitDialog()
{
// if the entries from last time are available, use them
try
{
FGetStoredString( m_nkdn2_sz_L, SZ_DN_L );
FGetStoredString( m_nkdn2_sz_S, SZ_DN_S );
}
catch( CException e )
{
}
// initialize the edit field part with the ISO code returned by GetLocalInfo
GetLocaleInfo(
LOCALE_SYSTEM_DEFAULT, // locale identifier
LOCALE_SABBREVCTRYNAME, // type of information
m_nkdn2_sz_C.GetBuffer(4), // address of buffer for information
2 // size of buffer
);
m_nkdn2_sz_C.ReleaseBuffer(2);
// call superclass
CPropertyPage::OnInitDialog();
// fill in the country code drop-down list
InitCountryCodeDropDown();
// return 0 to say we set the default item
// return 1 to just select the default default item
return 1;
}
//----------------------------------------------------------------
BOOL CNKDistinguisedName2::OnSetActive()
{
ActivateButtons();
return CPropertyPage::OnSetActive();
}
//----------------------------------------------------------------
void CNKDistinguisedName2::ActivateButtons()
{
DWORD flags = PSWIZB_BACK;
BOOL fFinish = FALSE;
BOOL fCanGoOn = TRUE;
// first, see if this is the end of the road by checing the chooseca page
if ( m_pChooseCAPage->m_nkca_radio == 1 )
fFinish = TRUE;
UpdateData(TRUE);
//now make sure there is something in each of the required fields
fCanGoOn &= !m_nkdn2_sz_C.IsEmpty();
fCanGoOn &= !m_nkdn2_sz_S.IsEmpty();
fCanGoOn &= !m_nkdn2_sz_L.IsEmpty();
// if we can go on, hilite the button
if ( fCanGoOn )
{
if ( fFinish )
flags |= PSWIZB_FINISH;
else
flags |= PSWIZB_NEXT;
}
else
// cannot go on
{
if ( fFinish )
flags |= PSWIZB_DISABLEDFINISH;
}
// update the property sheet buttons
m_pPropSheet->SetWizardButtons( flags );
}
//----------------------------------------------------------------
void CNKDistinguisedName2::GetCCodePath( CString &sz )
{
HKEY hKey;
TCHAR chPath[MAX_PATH+1];
DWORD cbPath;
DWORD err, type;
// get the server install path from the registry
// open the registry key, if it exists
err = RegOpenKeyEx(
HKEY_LOCAL_MACHINE, // handle of open key
REGKEY_STP, // address of name of subkey to open
0, // reserved
KEY_READ, // security access mask
&hKey // address of handle of open key
);
// if we did not open the key for any reason (say... it doesn't exist)
// then leave right away
if ( err != ERROR_SUCCESS )
return;
cbPath = sizeof(chPath);
type = REG_SZ;
err = RegQueryValueEx(
hKey, // handle of key to query
REGKEY_INSTALLKEY, // address of name of value to query
NULL, // reserved
&type, // address of buffer for value type
(PUCHAR)chPath, // address of data buffer
&cbPath // address of data buffer size
);
// close the key
RegCloseKey( hKey );
// if we did get the key for any reason (say... it doesn't exist)
// then leave right away
if ( err != ERROR_SUCCESS )
return;
// put it all together
sz = chPath;
sz += _T('\\');
sz += SZ_CCODES_FILE;
}
//----------------------------------------------------------------
void CNKDistinguisedName2::InitCountryCodeDropDown()
{
WIN32_FILE_ATTRIBUTE_DATA dataFile;
CString szCCodesFile;
PTCHAR pszCode;
// get the location of the codes file
GetCCodePath( szCCodesFile );
// make sure the file exists and get info on it at the same time
if ( !GetFileAttributesEx(szCCodesFile, GetFileExInfoStandard, &dataFile) )
return;
// Allocate a buffer to recieve the data based on the size of the file
PTCHAR pBuff = (PTCHAR)GlobalAlloc( GPTR, dataFile.nFileSizeLow * 2 );
DWORD cch = GetPrivateProfileSection(
SZ_CCODES_SECTION, // address of section name
pBuff, // address of return buffer
dataFile.nFileSizeLow, // size of return buffer
szCCodesFile // address of initialization filename
);
pszCode = pBuff;
// loop through the items, adding each
while ( *pszCode != 0 )
{
// add the country code
InitOneCountryCode( pszCode );
// increment the list
pszCode = _tcsninc( pszCode, _tcslen(pszCode)+1 );
}
GlobalFree( pBuff );
}
//----------------------------------------------------------------
void CNKDistinguisedName2::InitOneCountryCode( LPCTSTR pszCode )
{
CString szData = pszCode;
CString szCountry;
INT iCode;
// get the location of the equals character - it MUST be the third character
if ( szData.Find(_T('=')) != 2 )
return;
szCountry = szData.Right( szData.GetLength() - 3 );
// add the code to the cstring list and save its index position
iCode = m_rgbszCodes.Add( szData.Left(2) );
// add the item to the combo box
int iPos = m_control_C.AddString( szCountry );
// attach the index into the string array
m_control_C.SetItemData( iPos, iCode );
}
/////////////////////////////////////////////////////////////////////////////
// CNKDistinguisedName2 message handlers
//----------------------------------------------------------------
void CNKDistinguisedName2::OnChangeNewkeyCountry()
{
ActivateButtons();
}
//----------------------------------------------------------------
void CNKDistinguisedName2::OnChangeNewkeyLocality()
{
ActivateButtons();
}
//----------------------------------------------------------------
void CNKDistinguisedName2::OnChangeNewkeyState()
{
ActivateButtons();
}
//----------------------------------------------------------------
void CNKDistinguisedName2::OnCloseupNewkeyCountry()
{
// if there is no current selected item, do nothing
if ( m_control_C.GetCurSel() == -1 )
return;
// get the selection's hidden dword
ULONG_PTR iCode = m_control_C.GetItemData( m_control_C.GetCurSel() );
m_control_C.SetCurSel(-1);
// for some reason, attempting to set the string directly here isn't working.
PostMessage( WM_INTERNAL_SETCOUNTRYCODE, 0, iCode );
}
//----------------------------------------------------------------
void CNKDistinguisedName2::OnSelchangeNewkeyCountry()
{
// if there is no current selected item, do nothing
if ( m_control_C.GetCurSel() == -1 )
return;
// get the selection's hidden dword
ULONG_PTR iCode = m_control_C.GetItemData( m_control_C.GetCurSel() );
m_control_C.SetCurSel(-1);
// for some reason, attempting to set the string directly here isn't working.
PostMessage( WM_INTERNAL_SETCOUNTRYCODE, 0, iCode );
}
//----------------------------------------------------------------
LRESULT CNKDistinguisedName2::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if ( message == WM_INTERNAL_SETCOUNTRYCODE )
{
INT iCode = (INT)lParam;
// set the text of the box
m_control_C.SetWindowText( m_rgbszCodes.GetAt(iCode) );
}
return CDialog::WindowProc(message, wParam, lParam);
}