windows-nt/Source/XPSP1/NT/net/config/shell/netsetup/wmode.cpp
2020-09-26 16:20:57 +08:00

260 lines
7.3 KiB
C++

#include "pch.h"
#pragma hdrstop
#include "pch.hxx"
#include "wizard.h"
//
// Function: OnModeWizBackNext
//
// Purpose: Handle the PSN_WIZ notification.
//
// Parameters: hwndDlg [IN] - Handle to the exit child dialog
//
// Returns: BOOL, TRUE on success
//
BOOL OnModeWizBackNext(HWND hwndDlg)
{
HPROPSHEETPAGE hPage = NULL;
// Retrieve the CWizard instance from the dialog
LPARAM lParam = GetWindowLong(hwndDlg, DWL_USER);
CWizard * pWizard = reinterpret_cast<CWizard *>(lParam);
Assert(NULL != pWizard);
PAGEDIRECTION PageDir = pWizard->GetPageDirection(IDD_Mode);
if (NWPD_FORWARD == PageDir)
{
if (IsDlgButtonChecked(hwndDlg, CHK_MODE_TYPICAL))
{
pWizard->ChangeSetupMode(NCWUC_SETUPMODE_TYPICAL);
// Goto the Join page if not postinstall
hPage = pWizard->GetPageHandle(IDD_Join);
}
else
{
HRESULT hr = S_OK;
pWizard->ChangeSetupMode(NCWUC_SETUPMODE_CUSTOM);
pWizard->SetCurrentProvider(0);
CWizProvider * pWizProvider = pWizard->GetCurrentProvider();
Assert(NULL != pWizProvider);
Assert(pWizProvider->ULPageCount());
// Push the adapter guid onto the provider
hr = pWizProvider->HrSpecifyAdapterGuid(
pWizard->GetCurrentAdapterGuid());
// Goto the first page of the appropriate provider
pWizard->SetPageDirection(IDD_Mode, NWPD_BACKWARD);
CWizProvider * pWizProvider = pWizard->GetCurrentProvider();
Assert(NULL != pWizProvider);
Assert(0 < pWizProvider->ULPageCount());
hPage = (pWizProvider->PHPropPages())[0];
}
}
else
{
// Back from here is wwelcome when postinstall
// and wupgrade when not postinstall
pWizard->SetPageDirection(IDD_Mode, NWPD_FORWARD);
return FALSE; // Let the default occur
}
Assert(hPage);
SetWindowLong(hwndDlg, DWL_MSGRESULT, -1);
PostMessage(GetParent(hwndDlg), PSM_SETCURSEL, 0,
(LPARAM)(HPROPSHEETPAGE)hPage);
return TRUE; // The PostMessage will do the work
}
//
// Function: dlgprocMode
//
// Purpose: Dialog Procedure for the Mode wizard page
//
// Parameters: standard dlgproc parameters
//
// Returns: INT_PTR
//
INT_PTR CALLBACK dlgprocMode( HWND hwndDlg, UINT uMsg,
WPARAM wParam, LPARAM lParam )
{
BOOL frt = FALSE;
switch (uMsg)
{
case WM_INITDIALOG:
{
// Initialize our pointers to property sheet info.
PROPSHEETPAGE* psp = (PROPSHEETPAGE*)lParam;
Assert(psp->lParam);
SetWindowLong(hwndDlg, DWL_USER, psp->lParam);
tstring str = SzLoadIds(IDS_TXT_MODE_DESC_1);
str += SzLoadIds(IDS_TXT_MODE_DESC_2);
SetWindowText(GetDlgItem(hwndDlg, TXT_MODE_DESC), str.c_str());
CWizard * pWizard = reinterpret_cast<CWizard *>(psp->lParam);
Assert(NULL != pWizard);
CWizardUiContext * pCtx = pWizard->GetUiContext();
Assert(NULL != pCtx);
int idc = ((pCtx->GetSetupMode() & SETUPMODE_TYPICAL) ?
CHK_MODE_TYPICAL : CHK_MODE_CUSTOM);
CheckRadioButton(hwndDlg, CHK_MODE_TYPICAL,
CHK_MODE_CUSTOM, idc);
}
break;
case WM_NOTIFY:
{
LPNMHDR pnmh = (LPNMHDR)lParam;
switch (pnmh->code)
{
// propsheet notification
case PSN_HELP:
break;
case PSN_SETACTIVE:
TraceTag(ttidWizard, "Entering Mode page...");
break;
case PSN_APPLY:
break;
case PSN_KILLACTIVE:
break;
case PSN_RESET:
break;
case PSN_WIZBACK:
frt = OnModeWizBackNext(hwndDlg);
break;
case PSN_WIZFINISH:
break;
case PSN_WIZNEXT:
frt = OnModeWizBackNext(hwndDlg);
break;
default:
break;
}
}
break;
default:
break;
}
return( frt );
}
//
// Function: ModePageCleanup
//
// Purpose: As a callback function to allow any page allocated memory
// to be cleaned up, after the page will no longer be accessed.
//
// Parameters: pWizard [IN] - The wizard against which the page called
// register page
// lParam [IN] - The lParam supplied in the RegisterPage call
//
// Returns: nothing
//
VOID ModePageCleanup(CWizard *pWizard, LPARAM lParam)
{
}
//
// Function: CreateModePage
//
// Purpose: To determine if the Mode page needs to be shown, and to
// to create the page if requested. Note the Mode page is
// responsible for initial installs also.
//
// Parameters: pWizard [IN] - Ptr to a Wizard instance
// pData [IN] - Context data to describe the world in
// which the Wizard will be run
// fCountOnly [IN] - If True, only the maximum number of
// pages this routine will create need
// be determined.
// pnPages [IN] - Increment by the number of pages
// to create/created
//
// Returns: HRESULT, S_OK on success
//
HRESULT HrCreateModePage(CWizard *pWizard, PINTERNAL_SETUP_DATA pData,
BOOL fCountOnly, UINT *pnPages)
{
HRESULT hr = S_OK;
// Batch Mode or for fresh install
if (pWizard->FProcessLanPages())
{
(*pnPages)++;
// If not only counting, create and register the page
if (!fCountOnly)
{
HPROPSHEETPAGE hpsp;
PROPSHEETPAGE psp;
TraceTag(ttidWizard, "Creating Mode Page");
psp.dwSize = sizeof( PROPSHEETPAGE );
psp.dwFlags = 0;
psp.hInstance = _Module.GetResourceInstance();
psp.pszTemplate = MAKEINTRESOURCE( IDD_Mode );
psp.hIcon = NULL;
psp.pfnDlgProc = dlgprocMode;
psp.lParam = reinterpret_cast<LPARAM>(pWizard);
hpsp = CreatePropertySheetPage( &psp );
if (hpsp)
{
pWizard->RegisterPage(IDD_Mode, hpsp,
ModePageCleanup, NULL);
}
else
{
hr = E_OUTOFMEMORY;
}
}
}
TraceHr(ttidWizard, FAL, hr, FALSE, "HrCreateModePage");
return hr;
}
//
// Function: AppendModePage
//
// Purpose: Add the Mode page, if it was created, to the set of pages
// that will be displayed.
//
// Parameters: pWizard [IN] - Ptr to Wizard Instance
// pahpsp [IN,OUT] - Array of pages to add our page to
// pcPages [IN,OUT] - Count of pages in pahpsp
//
// Returns: Nothing
//
VOID AppendModePage(CWizard *pWizard, HPROPSHEETPAGE* pahpsp, UINT *pcPages)
{
if (pWizard->FProcessLanPages())
{
HPROPSHEETPAGE hPage = pWizard->GetPageHandle(IDD_Mode);
Assert(hPage);
pahpsp[*pcPages] = hPage;
(*pcPages)++;
}
}