//********************************************************************* //* Microsoft Windows ** //* Copyright(c) Microsoft Corp., 1994 ** //********************************************************************* // // INTRO.C - Functions for introductory Wizard pages // // HISTORY: // // 05/13/98 donaldm Created. // //********************************************************************* #include "pre.h" #include "windowsx.h" #include "tutor.h" #include "icwcfg.h" #include "icwextsn.h" extern UINT GetDlgIDFromIndex(UINT uPageIndex); extern CICWTutorApp* g_pICWTutorApp; extern BOOL g_bNewIspPath; extern BOOL g_bAutoConfigPath; extern BOOL g_bManualPath; extern BOOL g_bLanPath; extern BOOL g_bSkipIntro; extern BOOL MyIsSmartStartEx(LPTSTR lpszConnectionName, DWORD dwBufLen); BOOL g_bExistConnect = FALSE; BOOL g_bCheckForOEM = FALSE; TCHAR g_szAnsiName [ICW_MAX_RASNAME + 1] = TEXT("\0"); /******************************************************************* NAME: ReadOEMOffline SYNOPSIS: Read OfflineOffers flag from the oeminfo.ini file ENTRY: None RETURN: True if OEM offline is read ********************************************************************/ BOOL ReadOEMOffline(BOOL *bOEMOffline) { // OEM code // TCHAR szOeminfoPath[MAX_PATH + 1]; TCHAR *lpszTerminator = NULL; TCHAR *lpszLastChar = NULL; BOOL bRet = FALSE; // If we already checked, don't do it again if (!g_bCheckForOEM) { if( 0 != GetSystemDirectory( szOeminfoPath, MAX_PATH + 1 ) ) { lpszTerminator = &(szOeminfoPath[ lstrlen(szOeminfoPath) ]); lpszLastChar = CharPrev( szOeminfoPath, lpszTerminator ); if( TEXT('\\') != *lpszLastChar ) { lpszLastChar = CharNext( lpszLastChar ); *lpszLastChar = '\\'; lpszLastChar = CharNext( lpszLastChar ); *lpszLastChar = '\0'; } lstrcat( szOeminfoPath, ICW_OEMINFO_FILENAME ); //Default oem code must be NULL if it doesn't exist in oeminfo.ini if (1 == GetPrivateProfileInt(ICW_OEMINFO_ICWSECTION, ICW_OEMINFO_OFFLINEOFFERS, 0, szOeminfoPath)) { // Check if file already exists if (0xFFFFFFFF != GetFileAttributes(ICW_OEMINFOPath)) { bRet = TRUE; } } } *bOEMOffline = bRet; g_bCheckForOEM = TRUE; } return TRUE; } /******************************************************************* NAME: SetNextPage SYNOPSIS: Determine whether we should proceed to icwconn.dll ********************************************************************/ BOOL SetNextPage(HWND hDlg, UINT* puNextPage, BOOL *pfKeepHistory) { BOOL bRetVal = FALSE; // If we have switched path, then redownload if (gpWizardState->bDoneRefServDownload) { if ( (DWORD) (gpWizardState->cmnStateData.dwFlags & ICW_CFGFLAG_AUTOCONFIG) != (DWORD) (gpWizardState->dwLastSelection & ICW_CFGFLAG_AUTOCONFIG) ) { gpWizardState->bDoneRefServDownload = FALSE; } } // Read OEM offline flag ReadOEMOffline(&gpWizardState->cmnStateData.bOEMOffline); // // Make sure we are not in autoconfig // if (!(gpWizardState->cmnStateData.dwFlags & ICW_CFGFLAG_AUTOCONFIG)) { if (gpWizardState->cmnStateData.bOEMOffline && gpWizardState->cmnStateData.bOEMEntryPt) gpWizardState->bDoneRefServDownload = TRUE; } gpWizardState->dwLastSelection = gpWizardState->cmnStateData.dwFlags; // If we have completed the download, then list just jump to the next page if (gpWizardState->bDoneRefServDownload) //if (TRUE) { int iReturnPage = 0; if (gpWizardState->cmnStateData.dwFlags & ICW_CFGFLAG_BRANDED) iReturnPage = gpWizardState->uPageHistory[gpWizardState->uPagesCompleted]; else { if (gpWizardState->uPagesCompleted > 0) { iReturnPage = gpWizardState->uPageHistory[gpWizardState->uPagesCompleted-1]; } else { iReturnPage = gpWizardState->uCurrentPage; } } if (LoadICWCONNUI(GetParent(hDlg), GetDlgIDFromIndex(iReturnPage), IDD_PAGE_DEFAULT, gpWizardState->cmnStateData.dwFlags)) { if( DialogIDAlreadyInUse( g_uICWCONNUIFirst) ) { // we're about to jump into the external apprentice, and we don't want // this page to show up in our history list *puNextPage = g_uICWCONNUIFirst; // Backup 1 in the history list, since we the external pages navigate back // we want this history list to be in the correct spot. Normally // pressing back would back up the history list, and figure out where to // go, but in this case, the external DLL just jumps right back in. // We also don't want to keep histroy. if (!(gpWizardState->cmnStateData.dwFlags & ICW_CFGFLAG_BRANDED)) { if (gpWizardState->uPagesCompleted > 0) { gpWizardState->uPagesCompleted--; } else { if (pfKeepHistory) { *pfKeepHistory = FALSE; } } } bRetVal = TRUE; } } } return bRetVal; } /******************************************************************* NAME: SetIntroNextPage SYNOPSIS: Determine whether we what is the next page of intro page ********************************************************************/ void SetIntroNextPage(HWND hDlg, UINT* puNextPage, BOOL *pfKeepHistory) { short wNumLocations; long lCurrLocIndex; BOOL bRetVal; *puNextPage = ORD_PAGE_AREACODE; // Check dialing location here to prevent flashing of areacode page gpWizardState->pTapiLocationInfo->GetTapiLocationInfo(&bRetVal); gpWizardState->pTapiLocationInfo->get_wNumberOfLocations(&wNumLocations, &lCurrLocIndex); if (1 >= wNumLocations) { BSTR bstrAreaCode = NULL; DWORD dwCountryCode; *puNextPage = ORD_PAGE_REFSERVDIAL; gpWizardState->pTapiLocationInfo->get_lCountryCode((long *)&dwCountryCode); gpWizardState->pTapiLocationInfo->get_bstrAreaCode(&bstrAreaCode); gpWizardState->cmnStateData.dwCountryCode = dwCountryCode; lstrcpy(gpWizardState->cmnStateData.szAreaCode, W2A(bstrAreaCode)); SysFreeString(bstrAreaCode); // we can skip area code page *puNextPage = ORD_PAGE_REFSERVDIAL; SetNextPage(hDlg, puNextPage, pfKeepHistory); } } INT_PTR CALLBACK ExistingConnectionCmdProc ( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch (uMsg) { case WM_INITDIALOG: { // put the dialog in the center of the screen RECT rc; TCHAR szFmt [MAX_MESSAGE_LEN]; TCHAR *args [1]; LPVOID pszIntro = NULL; GetWindowRect(hDlg, &rc); SetWindowPos(hDlg, NULL, ((GetSystemMetrics(SM_CXSCREEN) - (rc.right - rc.left)) / 2), ((GetSystemMetrics(SM_CYSCREEN) - (rc.bottom - rc.top)) / 2), 0, 0, SWP_NOSIZE | SWP_NOACTIVATE); args[0] = (LPTSTR) lParam; LoadString(g_hInstance, IDS_EXIT_CONN, szFmt, ARRAYSIZE(szFmt)); if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY, szFmt, 0, 0, (LPTSTR)&pszIntro, 0, (va_list*)args)) { SetWindowText(GetDlgItem(hDlg, IDC_EXIT_CONN), (LPTSTR) pszIntro); } if (pszIntro) { LocalFree(pszIntro); } break; } case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog(hDlg,TRUE); break; case IDCANCEL: EndDialog(hDlg,FALSE); break; } break; } return FALSE; } /******************************************************************* NAME: IntroInitProc SYNOPSIS: Called when "Intro" page is displayed ENTRY: hDlg - dialog window fFirstInit - TRUE if this is the first time the dialog is initialized, FALSE if this InitProc has been called before (e.g. went past this page and backed up) ********************************************************************/ BOOL CALLBACK IntroInitProc ( HWND hDlg, BOOL fFirstInit, UINT *puNextPage ) { if (!(gpWizardState->cmnStateData.dwFlags & ICW_CFGFLAG_BRANDED) &&!(gpWizardState->cmnStateData.bOEMCustom) ) { // This is the very first page, so do not allow back PropSheet_SetWizButtons(GetParent(hDlg),PSWIZB_NEXT); } if (fFirstInit) { //#ifdef NON_NT5 // Hide the manual option when running in run once if (g_bRunOnce) { ShowWindow(GetDlgItem(hDlg, IDC_ICWMAN), SW_HIDE); EnableWindow(GetDlgItem(hDlg, IDC_ICWMAN), FALSE); } // initialize radio buttons Button_SetCheck(GetDlgItem(hDlg, IDC_RUNNEW), g_bNewIspPath); Button_SetCheck(GetDlgItem(hDlg, IDC_RUNAUTO), g_bAutoConfigPath); Button_SetCheck(GetDlgItem(hDlg, IDC_ICWMAN), g_bManualPath || g_bLanPath); if (SMART_QUITICW == MyIsSmartStartEx(g_szAnsiName, ARRAYSIZE(g_szAnsiName))) g_bExistConnect = TRUE; /* #else //We only support manual path for NT5 for NT5 beta3 release. EnableWindow(GetDlgItem(hDlg, IDC_RUNNEW), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_RUNAUTO), FALSE); Button_SetCheck(GetDlgItem(hDlg, IDC_ICWMAN), TRUE); #endif */ } else { // If branded, then our template is intro2 if ((gpWizardState->cmnStateData.dwFlags & ICW_CFGFLAG_BRANDED) || (gpWizardState->cmnStateData.bOEMCustom) ) { gpWizardState->uCurrentPage = ORD_PAGE_INTRO2; } else { gpWizardState->uCurrentPage = ORD_PAGE_INTRO; } // If it is reboot from manual wiz, advance to the manual option page if (g_bManualPath || g_bLanPath) { gpWizardState->uPageHistory[gpWizardState->uPagesCompleted] = gpWizardState->uCurrentPage; gpWizardState->uPagesCompleted++; TCHAR szTitle[MAX_TITLE]; LoadString(g_hInstance, IDS_APPNAME, szTitle, ARRAYSIZE(szTitle)); SetWindowText(GetParent(hDlg), szTitle); *puNextPage = ORD_PAGE_MANUALOPTIONS; } if (g_bSkipIntro) { PropSheet_PressButton(GetParent(hDlg), PSBTN_NEXT); g_bSkipIntro = FALSE; } } return TRUE; } /******************************************************************* NAME: IntroOKProc SYNOPSIS: Called when Next or Back btns pressed from "Intro" page ENTRY: hDlg - dialog window fForward - TRUE if 'Next' was pressed, FALSE if 'Back' puNextPage - if 'Next' was pressed, proc can fill this in with next page to go to. This parameter is ingored if 'Back' was pressed. pfKeepHistory - page will not be kept in history if proc fills this in with FALSE. EXIT: returns TRUE to allow page to be turned, FALSE to keep the same page. ********************************************************************/ BOOL CALLBACK IntroOKProc ( HWND hDlg, BOOL fForward, UINT *puNextPage, BOOL *pfKeepHistory ) { ASSERT(puNextPage); if (fForward) { gpWizardState->lRefDialTerminateStatus = ERROR_SUCCESS; gpWizardState->cmnStateData.dwFlags &= ~(DWORD)ICW_CFGFLAG_AUTOCONFIG; gpWizardState->cmnStateData.dwFlags &= ~(DWORD)ICW_CFGFLAG_SMARTREBOOT_NEWISP; gpWizardState->cmnStateData.dwFlags &= ~(DWORD)ICW_CFGFLAG_SMARTREBOOT_AUTOCONFIG; // this is seperate from ICW_CFGFLAG_AUTOCONFIG so as not to confuse function of flag gpWizardState->cmnStateData.dwFlags &= ~(DWORD)ICW_CFGFLAG_SMARTREBOOT_MANUAL; gpWizardState->cmnStateData.dwFlags &= ~(DWORD)ICW_CFGFLAG_SMARTREBOOT_LAN; // read radio button state if( IsDlgButtonChecked(hDlg, IDC_RUNNEW) ) { gpWizardState->cmnStateData.dwFlags |= ICW_CFGFLAG_SMARTREBOOT_NEWISP; if (g_bExistConnect) { if (!DialogBoxParam(g_hInstance,MAKEINTRESOURCE(IDD_EXISTINGCONNECTION),hDlg, ExistingConnectionCmdProc, (LPARAM)g_szAnsiName)) { gfQuitWizard = TRUE; // Quit the wizard return FALSE; } } // Do the system config checks if (!gpWizardState->cmnStateData.bSystemChecked && !ConfigureSystem(hDlg)) { // gfQuitWizard will be set in ConfigureSystem if we need to quit return FALSE; } // OK, give me the next page SetIntroNextPage(hDlg, puNextPage, pfKeepHistory); } else if( IsDlgButtonChecked(hDlg, IDC_RUNAUTO) ) { gpWizardState->cmnStateData.dwFlags |= ICW_CFGFLAG_SMARTREBOOT_AUTOCONFIG; // Do the system config checks if (!gpWizardState->cmnStateData.bSystemChecked && !ConfigureSystem(hDlg)) { // gfQuitWizard will be set in ConfigureSystem if we need to quit return FALSE; } // The system config check is done in Inetcfg gpWizardState->cmnStateData.dwFlags |= ICW_CFGFLAG_AUTOCONFIG; SetIntroNextPage(hDlg, puNextPage, pfKeepHistory); } else if( IsDlgButtonChecked(hDlg, IDC_ICWMAN) ) { *puNextPage = ORD_PAGE_MANUALOPTIONS; } } else if (!(gpWizardState->cmnStateData.dwFlags & ICW_CFGFLAG_BRANDED)) { // Were are out of here, since we cannot go back from the first page gpWizardState->uPagesCompleted = 1; gfUserBackedOut = TRUE; gfQuitWizard = TRUE; } else if (gpWizardState->cmnStateData.dwFlags & ICW_CFGFLAG_BRANDED) gpWizardState->uPagesCompleted = 1; return TRUE; } BOOL CALLBACK IntroCmdProc(HWND hDlg, WPARAM wParam, LPARAM lParam) { switch (GET_WM_COMMAND_CMD(wParam, lParam)) { case BN_CLICKED: { if (GET_WM_COMMAND_ID(wParam, lParam) == IDC_TUTORIAL) g_pICWTutorApp->LaunchTutorApp(); break; } case BN_DBLCLK: { switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDC_RUNNEW: case IDC_RUNAUTO: case IDC_ICWMAN: { // somebody double-clicked a radio button // auto-advance to the next page PropSheet_PressButton(GetParent(hDlg), PSBTN_NEXT); break; } } break; } } return TRUE; }