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