#include "pch.h" #pragma hdrstop #include "resource.h" #include "wizard.h" extern CWizard * g_pSetupWizard; // // Function: OnExitPageActivate // // Purpose: Handle the PSN_SETACTIVE notification. // // Parameters: hwndDlg [IN] - Handle to the exit child dialog // // Returns: BOOL, TRUE on success // BOOL OnExitPageActivate( HWND hwndDlg ) { TraceFileFunc(ttidGuiModeSetup); // Retrieve the CWizard instance from the dialog CWizard * pWizard = reinterpret_cast(::GetWindowLongPtr(hwndDlg, DWLP_USER)); TraceTag(ttidWizard, "Entering exit page..."); ::SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, 0); // If we've past the point of no return do not allow the user to // back up from this page. if ((NULL == pWizard) || pWizard->FExitNoReturn()) { // Note that this is failure handling. Either no networking answerfile // section exists or there was an error in networking setup // clean up the global object. // // Note: scottbri 19-Feb-1998 // // The OC networking components need access to INetCfg but we have it locked. // On top of this it (INetCfg) has been handed off to the LAN page which has // cached it away. To free up INetCfg we need to delete g_pSetupWizard and // never allow the user to backup from this page. Ideally base setup would // call us before the OC stuff is done, but OC is implemented as pages which // follow netsetup, even though you can't back up from them. // if (pWizard && !IsPostInstall(pWizard)) { ::SetWindowLongPtr(hwndDlg, DWLP_USER, 0); Assert(pWizard == g_pSetupWizard); delete g_pSetupWizard; g_pSetupWizard = NULL; } PostMessage(GetParent(hwndDlg), PSM_PRESSBUTTON, (WPARAM)(PSBTN_NEXT), 0); return TRUE; } Assert(pWizard); PAGEDIRECTION PageDir = pWizard->GetPageDirection(IDD_Exit); if (NWPD_FORWARD == PageDir) { pWizard->SetPageDirection(IDD_Exit, NWPD_BACKWARD); if (IsPostInstall(pWizard)) { // Exit the wizard PropSheet_PressButton(GetParent(hwndDlg), PSBTN_FINISH); } else { // // Note: scottbri 19-Feb-1998 // // The OC networking components need access to INetCfg but we have it locked. // On top of this it (INetCfg) has been handed off to the LAN page which has // cached it away. To free up INetCfg we need to delete g_pSetupWizard and // never allow the user to backup from this page. Ideally base setup would // call us before the OC stuff is done, but OC is implemented as pages which // follow netsetup, even though you can't back up from them. // if (!IsPostInstall(pWizard)) { ::SetWindowLongPtr(hwndDlg, DWLP_USER, 0); Assert(pWizard == g_pSetupWizard); delete g_pSetupWizard; g_pSetupWizard = NULL; } // Goto the page after the exit page PostMessage(GetParent(hwndDlg), PSM_PRESSBUTTON, (WPARAM)(PSBTN_NEXT), 0); } } else { // Goto the page before the exit page pWizard->SetPageDirection(IDD_Exit, NWPD_FORWARD); if (IsPostInstall(pWizard)) { // Main page TraceTag(ttidWizard, "Exit page to Main Page..."); ::SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, IDD_Main); } else { // try to get the join page TraceTag(ttidWizard, "Exit page to Join Page..."); ::SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, IDD_Join); } } return TRUE; } // // Function: dlgprocExit // // Purpose: Dialog Procedure for the Exit wizard page // // Parameters: standard dlgproc parameters // // Returns: INT_PTR // INT_PTR CALLBACK dlgprocExit( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { TraceFileFunc(ttidGuiModeSetup); BOOL frt = FALSE; switch (uMsg) { case WM_INITDIALOG: { // Initialize our pointers to property sheet info. PROPSHEETPAGE* psp = (PROPSHEETPAGE*)lParam; Assert(psp->lParam); ::SetWindowLongPtr(hwndDlg, DWLP_USER, psp->lParam); } break; case WM_NOTIFY: { LPNMHDR pnmh = (LPNMHDR)lParam; switch (pnmh->code) { // propsheet notification case PSN_HELP: break; case PSN_SETACTIVE: frt = OnExitPageActivate( hwndDlg ); break; case PSN_APPLY: break; case PSN_KILLACTIVE: break; case PSN_RESET: break; case PSN_WIZBACK: break; case PSN_WIZFINISH: break; case PSN_WIZNEXT: break; default: break; } } break; default: break; } return( frt ); } // // Function: ExitPageCleanup // // 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 ExitPageCleanup(CWizard *pWizard, LPARAM lParam) { TraceFileFunc(ttidGuiModeSetup); } // // Function: CreateExitPage // // Purpose: To determine if the Exit page needs to be shown, and to // to create the page if requested. Note the Exit 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 HrCreateExitPage(CWizard *pWizard, PINTERNAL_SETUP_DATA pData, BOOL fCountOnly, UINT *pnPages) { TraceFileFunc(ttidGuiModeSetup); HRESULT hr = S_OK; (*pnPages)++; // If not only counting, create and register the page if (!fCountOnly) { HPROPSHEETPAGE hpsp; PROPSHEETPAGE psp; TraceTag(ttidWizard, "Creating Exit Page"); psp.dwSize = sizeof( PROPSHEETPAGE ); psp.dwFlags = 0; psp.hInstance = _Module.GetResourceInstance(); psp.pszTemplate = MAKEINTRESOURCE( IDD_Exit ); psp.hIcon = NULL; psp.pfnDlgProc = dlgprocExit; psp.lParam = reinterpret_cast(pWizard); hpsp = CreatePropertySheetPage( &psp ); if (hpsp) { pWizard->RegisterPage(IDD_Exit, hpsp, ExitPageCleanup, NULL); } else { hr = E_OUTOFMEMORY; } } TraceHr(ttidWizard, FAL, hr, FALSE, "HrCreateExitPage"); return hr; } // // Function: AppendExitPage // // Purpose: Add the Exit 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 AppendExitPage(CWizard *pWizard, HPROPSHEETPAGE* pahpsp, UINT *pcPages) { TraceFileFunc(ttidGuiModeSetup); HPROPSHEETPAGE hPage = pWizard->GetPageHandle(IDD_Exit); Assert(hPage); pahpsp[*pcPages] = hPage; (*pcPages)++; }