//********************************************************************* //* Microsoft Windows ** //* Copyright(c) Microsoft Corp., 1994 ** //********************************************************************* // // ISPPAGE.CPP - Functions for // // HISTORY: // // 05/13/98 donaldm Created. // //********************************************************************* #include "pre.h" #include "shlobj.h" #include "webvwids.h" TCHAR szHTMLFile[MAX_PATH]; //Name of html file BOOL bOKToPersist = TRUE; DWORD g_dwPageType = 0; BOOL g_bWebGateCheck = TRUE; BOOL g_bConnectionErr = FALSE; //PROTOTYPES BOOL SaveISPFile( HWND hwndParent, TCHAR* szSrcFileName, DWORD dwFileType); #if defined (DBG) BOOL HtmlSaveAs( HWND hwndParent, TCHAR* szFileName, TCHAR* szTargetFileName); void AskSaveISPHTML(HWND hWnd, LPTSTR lpszHTMLFile) { HKEY hKey = NULL; DWORD dwTemp = 0; DWORD dwType = 0; DWORD dwSize = sizeof(dwTemp); RegOpenKey(HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\ISignup\\Debug"), &hKey); if (hKey) { RegQueryValueEx(hKey,TEXT("SaveIspHtmLocally"),0,&dwType,(LPBYTE)&dwTemp, &dwSize); if (dwTemp) { if (IDYES == MessageBox(hWnd, TEXT("Would you like to save this ISP HTML file?"), TEXT("ICW -- DEBUG"), MB_YESNO | MB_ICONQUESTION | MB_APPLMODAL)) HtmlSaveAs(hWnd, lpszHTMLFile, NULL); } } } #endif // dbg void InitPageControls ( HWND hDlg, DWORD dwPageType, DWORD dwPageFlag ) { TCHAR szTemp[MAX_MESSAGE_LEN]; switch (dwPageType) { // TOS, has the Accept, Don't Accept UI case PAGETYPE_ISP_TOS: { // Show the TOS controls ShowWindow(GetDlgItem(hDlg, IDC_ISPDATA_TOSINSTRT), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDC_ISPDATA_TOSHTML), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDC_ISPDATA_TOSSAVE), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDC_ISPDATA_TOSACCEPT), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDC_ISPDATA_TOSDECLINE), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDC_TOS_TOSSAVE), SW_SHOW); //hide "normal weboc" ShowWindow(GetDlgItem(hDlg, IDC_ISPDATA_HTML), SW_HIDE); //hide the save check box controls ShowWindow(GetDlgItem(hDlg, IDC_SAVE_DESKTOP_TEXT), SW_HIDE); ShowWindow(GetDlgItem(hDlg, IDC_ISPDATA_CUSTHTML), SW_HIDE); // Reset the TOS page Button_SetCheck(GetDlgItem(hDlg, IDC_ISPDATA_TOSACCEPT), BST_UNCHECKED); Button_SetCheck(GetDlgItem(hDlg, IDC_ISPDATA_TOSDECLINE),BST_UNCHECKED); // Set tab focus SetWindowLong(GetDlgItem(hDlg, IDC_ISPDATA_TOSACCEPT), GWL_STYLE, GetWindowLong(GetDlgItem(hDlg, IDC_ISPDATA_TOSACCEPT),GWL_STYLE)|WS_TABSTOP); EnableWindow(GetDlgItem(hDlg, IDC_ISPDATA_TOSDECLINE), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_ISPDATA_TOSACCEPT), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_ISPDATA_TOSSAVE), TRUE); PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK); break; } // Finish, Custom Finish, and Normal are the same from a UI perspective (Also default) case PAGETYPE_ISP_CUSTOMFINISH: case PAGETYPE_ISP_FINISH: case PAGETYPE_ISP_NORMAL: default: { BOOL bIsQuickFinish = FALSE; // Need to see if this is a Quick Finish page gpWizardState->pHTMLWalker->get_IsQuickFinish(&bIsQuickFinish); // Hide the TOS controls ShowWindow(GetDlgItem(hDlg, IDC_ISPDATA_TOSINSTRT), SW_HIDE); ShowWindow(GetDlgItem(hDlg, IDC_ISPDATA_TOSHTML), SW_HIDE); ShowWindow(GetDlgItem(hDlg, IDC_ISPDATA_TOSACCEPT), SW_HIDE); ShowWindow(GetDlgItem(hDlg, IDC_ISPDATA_TOSDECLINE), SW_HIDE); ShowWindow(GetDlgItem(hDlg, IDC_TOS_TOSSAVE), SW_HIDE); if (dwPageFlag & PAGEFLAG_SAVE_CHKBOX) { // Show check box controls ShowWindow(GetDlgItem(hDlg, IDC_ISPDATA_CUSTHTML), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDC_SAVE_DESKTOP_TEXT), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDC_ISPDATA_TOSSAVE), SW_SHOW); // Hide the normal controls ShowWindow(GetDlgItem(hDlg, IDC_ISPDATA_HTML), SW_HIDE); //Reenable the UI EnableWindow(GetDlgItem(hDlg, IDC_ISPDATA_TOSSAVE), TRUE); } else { //show "normal" web oc ShowWindow(GetDlgItem(hDlg, IDC_ISPDATA_HTML), SW_SHOW); // Hide the Checkbox controls ShowWindow(GetDlgItem(hDlg, IDC_ISPDATA_TOSSAVE), SW_HIDE); ShowWindow(GetDlgItem(hDlg, IDC_SAVE_DESKTOP_TEXT), SW_HIDE); ShowWindow(GetDlgItem(hDlg, IDC_ISPDATA_CUSTHTML), SW_HIDE); } //set the wizard buttons // If we are on a Custom Finish, or Quick finish page then // use Active the Finish button PropSheet_SetWizButtons(GetParent(hDlg), ((bIsQuickFinish || (PAGETYPE_ISP_CUSTOMFINISH == dwPageType)) ? PSWIZB_FINISH : PSWIZB_NEXT) | PSWIZB_BACK); break; } } // Change the title for the finish page if (gpWizardState->cmnStateData.dwFlags & ICW_CFGFLAG_AUTOCONFIG) { LoadString(ghInstanceResDll, IDS_STEP3_TITLE, szTemp, MAX_MESSAGE_LEN); } else { if((PAGETYPE_ISP_CUSTOMFINISH == dwPageType ) || (PAGETYPE_ISP_FINISH == dwPageType)) LoadString(ghInstanceResDll, IDS_STEP3_TITLE, szTemp, MAX_MESSAGE_LEN); else LoadString(ghInstanceResDll, IDS_STEP2_TITLE, szTemp, MAX_MESSAGE_LEN); } PropSheet_SetHeaderTitle(GetParent(hDlg), EXE_NUM_WIZARD_PAGES + ORD_PAGE_ISPDATA, szTemp); } HRESULT InitForPageType ( HWND hDlg ) { DWORD dwPageType = 0; DWORD dwPageFlag = 0; BOOL bRetVal = FALSE; HRESULT hRes = E_FAIL; BSTR bstrPageID = NULL; BSTR bstrHTMLFile = NULL; //make sure these are disabled here incase getpagetype fails EnableWindow(GetDlgItem(hDlg, IDC_ISPDATA_TOSDECLINE), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_ISPDATA_TOSACCEPT), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_ISPDATA_TOSSAVE), FALSE); // Get webgate to dump the HTML into a file gpWizardState->pWebGate->DumpBufferToFile(&bstrHTMLFile, &bRetVal); // Use the Walker to get the page type gpWizardState->pHTMLWalker->AttachToMSHTML(bstrHTMLFile); gpWizardState->pHTMLWalker->Walk(); // Setup the controls based on the page type if (FAILED(hRes = gpWizardState->pHTMLWalker->get_PageType(&dwPageType))) { gpWizardState->pRefDial->DoHangup(); g_bMalformedPage = TRUE; //used by server error to get correct msg } else { if (dwPageType == PAGETYPE_ISP_TOS) { if(gpWizardState->cmnStateData.bOEMCustom) { gpWizardState->pICWWebView->SetHTMLBackgroundBitmap(NULL, NULL); } gpWizardState->pICWWebView->ConnectToWindow(GetDlgItem(hDlg, IDC_ISPDATA_TOSHTML), PAGETYPE_ISP_TOS); } else { RECT rcHTML; HWND hWndHTML; gpWizardState->pHTMLWalker->get_PageFlag(&dwPageFlag); if (dwPageFlag & PAGEFLAG_SAVE_CHKBOX) { hWndHTML = GetDlgItem(hDlg, IDC_ISPDATA_CUSTHTML); // See if we need to display the app background bitmap in the HTML // window if(gpWizardState->cmnStateData.bOEMCustom) { GetWindowRect(hWndHTML, &rcHTML); MapWindowPoints(NULL, gpWizardState->cmnStateData.hWndApp, (LPPOINT)&rcHTML, 2); gpWizardState->pICWWebView->SetHTMLBackgroundBitmap(gpWizardState->cmnStateData.hbmBkgrnd, &rcHTML); } gpWizardState->pICWWebView->ConnectToWindow(hWndHTML, PAGETYPE_ISP_NORMAL); } else { hWndHTML = GetDlgItem(hDlg, IDC_ISPDATA_HTML); // See if we need to display the app background bitmap in the HTML // window if(gpWizardState->cmnStateData.bOEMCustom) { GetWindowRect(hWndHTML, &rcHTML); MapWindowPoints(NULL, gpWizardState->cmnStateData.hWndApp, (LPPOINT)&rcHTML, 2); gpWizardState->pICWWebView->SetHTMLBackgroundBitmap(gpWizardState->cmnStateData.hbmBkgrnd, &rcHTML); } gpWizardState->pICWWebView->ConnectToWindow(hWndHTML, PAGETYPE_ISP_NORMAL); } } // Custom finish means that the ISP wants us to show some special text // and then finish the wizard if (dwPageType == PAGETYPE_ISP_CUSTOMFINISH) { BOOL bRetVal; // Show the page. no need to cache it bOKToPersist = FALSE; lstrcpy(szHTMLFile, W2A(bstrHTMLFile)); gpWizardState->pICWWebView->DisplayHTML(szHTMLFile); // Kill the idle timer and connection, since there are no more pages ASSERT(gpWizardState->pRefDial); KillIdleTimer(); gpWizardState->pRefDial->DoHangup(); gpWizardState->pRefDial->RemoveConnectoid(&bRetVal); gpWizardState->bDialExact = FALSE; } else { // In order to persist data entered by the user, we have to // effectivly "cache" the pages, so that when the user goes back // we make MSHTML think that we are loading a page that it has seen // before, and it will then reload the persisted history. // This will be done by using the PAGEID value in the HTML to form a // temp file name, so that we can re-load the page date from that file // each time we see the same page ID value. // Get the Page ID. gpWizardState->pHTMLWalker->get_PageID(&bstrPageID); if (bOKToPersist && SUCCEEDED( gpWizardState->lpSelectedISPInfo->CopyFiletoISPPageCache(bstrPageID, W2A(bstrHTMLFile)))) { // We have a "cache" file, so we can use it and persist data // Get the cache file name now, since we will need it later gpWizardState->lpSelectedISPInfo->GetCacheFileNameFromPageID(bstrPageID, szHTMLFile, sizeof(szHTMLFile)); } else { bOKToPersist = FALSE; lstrcpy(szHTMLFile, W2A(bstrHTMLFile)); } // Display the page we just "cached" gpWizardState->pICWWebView->DisplayHTML(szHTMLFile); if (bOKToPersist) { // Restore any persisted data on this page. gpWizardState->lpSelectedISPInfo->LoadHistory(bstrPageID); } // Cleanup SysFreeString(bstrPageID); } #if defined(DBG) AskSaveISPHTML(hDlg, szHTMLFile); #endif InitPageControls(hDlg, dwPageType, dwPageFlag); g_dwPageType = dwPageType; } // Detach the walker gpWizardState->pHTMLWalker->Detach(); HideProgressAnimation(); SysFreeString(bstrHTMLFile); return hRes; } /******************************************************************* NAME: ISPPageInitProc SYNOPSIS: Called when 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 ISPPageInitProc ( HWND hDlg, BOOL fFirstInit, UINT *puNextPage ) { if (fFirstInit) { // Setup an Event Handler for RefDial and Webgate CINSHandlerEvent *pINSHandlerEvent; pINSHandlerEvent = new CINSHandlerEvent(hDlg); if (NULL != pINSHandlerEvent) { HRESULT hr; gpWizardState->pINSHandlerEvents = pINSHandlerEvent; gpWizardState->pINSHandlerEvents->AddRef(); hr = ConnectToConnectionPoint((IUnknown *)gpWizardState->pINSHandlerEvents, DIID__INSHandlerEvents, TRUE, (IUnknown *)gpWizardState->pINSHandler, &gpWizardState->pINSHandlerEvents->m_dwCookie, NULL); } PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK); } else { if (FAILED(InitForPageType(hDlg))) { //The page type isn't recognized which means there's a problem //with the data. goto the serverr page gpWizardState->pRefDial->DoHangup(); *puNextPage = ORD_PAGE_SERVERR; } // if we've travelled through external apprentice pages, // it's easy for our current page pointer to get munged, // so reset it here for sanity's sake. gpWizardState->uCurrentPage = ORD_PAGE_ISPDATA; } return TRUE; } // Returns FALSE if we should stay on this page, TRUE if we should change pages // the param bError indicates we should proceed to the server Error Page. BOOL ProcessNextBackPage ( HWND hDlg, BOOL fForward, BOOL *pfError ) { BOOL bRet = FALSE; TCHAR szURL[2*INTERNET_MAX_URL_LENGTH + 1] = TEXT("\0"); *pfError = FALSE; gpWizardState->pHTMLWalker->get_URL(szURL, fForward); // See if a URL is Specified if (lstrcmp(szURL, TEXT("")) == 0) { //Stop the animation HideProgressAnimation(); //Reenable the UI PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_NEXT | PSWIZB_BACK); // If forward, we want to force our way to the server error page, // since we cannot go forward to a blank URL if (fForward) { KillIdleTimer(); gpWizardState->pRefDial->DoHangup(); *pfError = TRUE; } else { // We are backing out of ISP page land, so lets hangup. if(gpWizardState->pRefDial) { BOOL bRetVal; KillIdleTimer(); gpWizardState->pRefDial->DoHangup(); gpWizardState->pRefDial->RemoveConnectoid(&bRetVal); gpWizardState->bDialExact = FALSE; } } // We will need to navigate away from the ISP page bRet = TRUE; } else { BOOL bRetWebGate; BOOL bConnected = FALSE; g_bWebGateCheck = TRUE; g_bConnectionErr = FALSE; // Do not go to the next page. Also valid for the cancel case bRet = FALSE; // Kill the idle Timer KillIdleTimer(); // Tell webgate to go fetch the page gpWizardState->pWebGate->put_Path(A2W(szURL)); gpWizardState->pWebGate->FetchPage(0,0,&bRetWebGate); //This flag is only to be used by ICWDEBUG.EXE if (gpWizardState->cmnStateData.dwFlags & ICW_CFGFLAG_MODEMOVERRIDE) bConnected = TRUE; else gpWizardState->pRefDial->get_RasGetConnectStatus(&bConnected); if (bConnected) { WaitForEvent(gpWizardState->hEventWebGateDone); } else { g_bConnectionErr = TRUE; } // See if the user canceled. If so we want to force the wizard to bail. // this can be hacked by forcing the return value to be FALSE and // setting the gfQuitWizard flag to TRUE. Gendlg will check this flag // when the OK proc returns, and process appropriatly if (!gfUserCancelled) { if (g_bConnectionErr) { // Make it go to server error page bRet = TRUE; *pfError = TRUE; } else { // Restart the Idle Timer StartIdleTimer(); // detach the walker, since Init for page type needs it gpWizardState->pHTMLWalker->Detach(); // Setup for this page if (FAILED(InitForPageType(hDlg))) { //The page type isn't recognized which means there's a problem //with the data. goto the serverr page *pfError = TRUE; bRet = TRUE; } } } else { // Force the wizard to quit, since the user canceled gfQuitWizard = TRUE; } } return bRet; } /******************************************************************* NAME: ISPPageOKProc SYNOPSIS: Called when Next or Back btns pressed from 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 ISPPageOKProc ( HWND hDlg, BOOL fForward, UINT *puNextPage, BOOL *pfKeepHistory ) { ASSERT(puNextPage); DWORD dwPageType; TCHAR szURL[2*INTERNET_MAX_URL_LENGTH + 1] = TEXT("\0"); BOOL bRetVal = TRUE; BSTR bstrPageID = NULL; IWebBrowser2 *lpWebBrowser; // We don't want to keep any of the ISP pages in the history list *pfKeepHistory = FALSE; // If we are going forward, and if the user has been autodisconnected, then // we want to automatically navigate to the server error page. if (fForward && gpWizardState->bAutoDisconnected) { gpWizardState->bAutoDisconnected = FALSE; *puNextPage = ORD_PAGE_SERVERR; return TRUE; } // Attach the walker to the curent page to get the page type gpWizardState->pICWWebView->get_BrowserObject(&lpWebBrowser); gpWizardState->pHTMLWalker->AttachToDocument(lpWebBrowser); gpWizardState->pHTMLWalker->Walk(); gpWizardState->pHTMLWalker->get_PageType(&dwPageType); // Custom finish means we just exit, so we just need to return TRUE if (PAGETYPE_ISP_CUSTOMFINISH == dwPageType) { gpWizardState->pHTMLWalker->Detach(); return TRUE; } // Check the TOS settings. If the users decline, don't allow them to proceed if (IsWindowVisible(GetDlgItem(hDlg, IDC_ISPDATA_TOSDECLINE)) ) { if (fForward) { if (Button_GetCheck(GetDlgItem(hDlg, IDC_ISPDATA_TOSDECLINE))) { if (MsgBox(hDlg,IDS_ERR_TOS_DECLINE,MB_ICONSTOP,MB_OKCANCEL) != IDOK) { gfQuitWizard = TRUE; } Button_SetCheck(GetDlgItem(hDlg, IDC_ISPDATA_TOSACCEPT), 0); Button_SetCheck(GetDlgItem(hDlg, IDC_ISPDATA_TOSDECLINE), 0); // Set tab focus SetWindowLong(GetDlgItem(hDlg, IDC_ISPDATA_TOSACCEPT), GWL_STYLE, GetWindowLong(GetDlgItem(hDlg, IDC_ISPDATA_TOSACCEPT),GWL_STYLE)|WS_TABSTOP); SetFocus(GetDlgItem(hDlg, IDC_ISPDATA_TOSHTML)); PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK); return FALSE; } } EnableWindow(GetDlgItem(hDlg, IDC_ISPDATA_TOSDECLINE), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_ISPDATA_TOSACCEPT), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_ISPDATA_TOSSAVE), FALSE); } //Show the progress animation ShowProgressAnimation(); //Disable the UI PropSheet_SetWizButtons(GetParent(hDlg), 0); if (bOKToPersist) { // Persist any data on this page. gpWizardState->pHTMLWalker->get_PageID(&bstrPageID); gpWizardState->lpSelectedISPInfo->SaveHistory(bstrPageID); SysFreeString(bstrPageID); } // User going back? if (fForward) { // Depending on the page type, we do different things switch (dwPageType) { // The finish page types, mean that what we fetch next is an INS file case PAGETYPE_ISP_FINISH: { BSTR bstrINSFile; BSTR bstrStartURL; BOOL bRet; BOOL bIsQuickFinish = FALSE; long lBrandingFlags; gpWizardState->pHTMLWalker->get_URL(szURL, TRUE); // Kill the idle timer KillIdleTimer(); gpWizardState->pHTMLWalker->get_IsQuickFinish(&bIsQuickFinish); if(!bIsQuickFinish) { BOOL bConnected = FALSE; g_bWebGateCheck = TRUE; g_bConnectionErr = FALSE; // Tell webgate to go fetch the page gpWizardState->pWebGate->put_Path(A2W(szURL)); gpWizardState->pWebGate->FetchPage(1,0,&bRet); //This flag is only to be used by ICWDEBUG.EXE if (gpWizardState->cmnStateData.dwFlags & ICW_CFGFLAG_MODEMOVERRIDE) bConnected = TRUE; else // Check for connection status before proceed gpWizardState->pRefDial->get_RasGetConnectStatus(&bConnected); if (bConnected) { WaitForEvent(gpWizardState->hEventWebGateDone); } else { bConnected = TRUE; } if (g_bConnectionErr) { gpWizardState->pRefDial->DoHangup(); *puNextPage = ORD_PAGE_SERVERR; break; } // Can't allow the user to cancel now PropSheet_CancelToClose(GetParent(hDlg)); PropSheet_SetWizButtons(GetParent(hDlg),0); UpdateWindow(GetParent(hDlg)); //Stop the animation HideProgressAnimation(); // See if the user canceled while downloading the INS file if (!gfUserCancelled) { // OK process the INS file. gpWizardState->pWebGate->get_DownloadFname(&bstrINSFile); // Get the Branding flags gpWizardState->pRefDial->get_BrandingFlags(&lBrandingFlags); // Tell the INSHandler about the branding flags gpWizardState->pINSHandler->put_BrandingFlags(lBrandingFlags); // Process the inf file. gpWizardState->pINSHandler->ProcessINS(bstrINSFile, &bRet); //hang on to whether or not this failed. gpWizardState->cmnStateData.ispInfo.bFailedIns = !bRet; // Get the Start URL from INS file. gpWizardState->pINSHandler->get_DefaultURL(&bstrStartURL); lstrcpy(gpWizardState->cmnStateData.ispInfo.szStartURL, W2A(bstrStartURL)); // Time to retun to the main wizard *puNextPage = g_uExternUINext; // Detach the walker before we go gpWizardState->pHTMLWalker->Detach(); //Copy over the isp name and support number for the last page. lstrcpy(gpWizardState->cmnStateData.ispInfo.szISPName, gpWizardState->lpSelectedISPInfo->get_szISPName()); BSTR bstrSupportPhoneNum; gpWizardState->pRefDial->get_ISPSupportNumber(&bstrSupportPhoneNum); lstrcpy(gpWizardState->cmnStateData.ispInfo.szSupportNumber, W2A(bstrSupportPhoneNum)); } else { // The user canceled while we were donwloading the INS, so lets bail gpWizardState->pHTMLWalker->Detach(); gfQuitWizard = TRUE; bRetVal = FALSE; } } else HideProgressAnimation(); // Let the wizard Continue/Finish break; } // These page types mean that we need to form a new URL, and get the next page case PAGETYPE_ISP_TOS: case PAGETYPE_ISP_NORMAL: { BOOL bError; bRetVal = ProcessNextBackPage(hDlg, TRUE, &bError); if (bError) { // Go to the server error page gpWizardState->pRefDial->DoHangup(); *puNextPage = ORD_PAGE_SERVERR; } break; } default: { //Stop the animation HideProgressAnimation(); gpWizardState->pRefDial->DoHangup(); // Goto the server error page, since we surely did not recognize this page type *puNextPage = ORD_PAGE_SERVERR; break; } } } else { // Going Backwards. BOOL bError; bRetVal = ProcessNextBackPage(hDlg, FALSE, &bError); if (bError) { // Go to the server error page *puNextPage = ORD_PAGE_SERVERR; } } return bRetVal; } /******************************************************************* NAME: ISPCmdProc ********************************************************************/ BOOL CALLBACK ISPCmdProc ( HWND hDlg, WPARAM wParam, LPARAM lParam ) { switch (GET_WM_COMMAND_CMD(wParam, lParam)) { case BN_CLICKED: { switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDC_ISPDATA_TOSACCEPT: case IDC_ISPDATA_TOSDECLINE: { PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_NEXT | PSWIZB_BACK); break; } case IDC_ISPDATA_TOSSAVE: { if (SaveISPFile(hDlg, szHTMLFile, g_dwPageType)) { SetFocus(GetDlgItem(hDlg, IDC_ISPDATA_TOSHTML)); EnableWindow(GetDlgItem(hDlg, IDC_ISPDATA_TOSSAVE), FALSE); } break; } default: break; } break; } case BN_DBLCLK: { switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDC_ISPDATA_TOSACCEPT: case IDC_ISPDATA_TOSDECLINE: { // somebody double-clicked a radio button // auto-advance to the next page PropSheet_PressButton(GetParent(hDlg), PSBTN_NEXT); break; } default: break; } break; } case BN_SETFOCUS: { if ((GET_WM_COMMAND_ID(wParam, lParam) == IDC_ISPDATA_TOSACCEPT) ) { CheckDlgButton(hDlg, IDC_ISPDATA_TOSACCEPT, BST_CHECKED); // Uncheck the decline checkbox make sure no two radio button // selected at the same time. CheckDlgButton(hDlg, IDC_ISPDATA_TOSDECLINE, BST_UNCHECKED); PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_NEXT | PSWIZB_BACK); } break; } default: break; } return 1; } /******************************************************************* NAME: DisplayConfirmationDialog SYNOPSIS: Display a confirmation dialog for the file being written ENTRY: hwndParent - dialog window dwFileType - current isp page type szFileName - source file name EXIT: returns TRUE when save successfully; FALSE otherwise. ********************************************************************/ BOOL DisplayConfirmationDialog(HWND hwndParent, DWORD dwFileType, TCHAR* szFileName) { TCHAR szFinal [MAX_MESSAGE_LEN] = TEXT("\0"); TCHAR szFmt [MAX_MESSAGE_LEN]; TCHAR *args [1]; LPVOID pszIntro; BOOL bRet = TRUE; UINT uMsgID; args[0] = (LPTSTR) szFileName; if (PAGETYPE_ISP_TOS == dwFileType) { uMsgID = IDS_SAVE_COPY_CONFIRM_MSG; } else { uMsgID = IDS_SAVE_ISP_CONFIRM_MSG; } LoadString(ghInstanceResDll, uMsgID, szFmt, ARRAYSIZE(szFmt)); FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY, szFmt, 0, 0, (LPTSTR)&pszIntro, 0, (va_list*)args); lstrcpy(szFinal, (LPTSTR)pszIntro); LoadString(ghInstanceResDll, IDS_APPNAME, szFmt, ARRAYSIZE(szFmt)); MessageBox(hwndParent, szFinal, szFmt, MB_OK | MB_ICONINFORMATION | MB_APPLMODAL); LocalFree(pszIntro); return(bRet); } /******************************************************************* NAME: SaveISPFile SYNOPSIS: Called want to save html file to desktop without dialog ENTRY: hwndParent - dialog window szSrcFileName - source file name uFileType - Type of files embedded in the htm file EXIT: returns TRUE when save successfully; FALSE otherwise. ********************************************************************/ BOOL SaveISPFile( HWND hwndParent, TCHAR* szSrcFileName, DWORD dwFileType) { TCHAR szNewFileBuff [MAX_PATH + 1]; TCHAR szWorkingDir [MAX_PATH + 1]; TCHAR szDesktopPath [MAX_PATH + 1]; TCHAR szLocalFile [MAX_PATH + 1]; TCHAR szISPName [MAX_ISP_NAME + 1]; TCHAR szFmt [MAX_MESSAGE_LEN]; TCHAR szNumber [MAX_MESSAGE_LEN]; TCHAR *args [2]; DWORD dwFileFormatOrig; DWORD dwFileFormatCopy; LPTSTR pszInvalideChars = TEXT("\\/:*?\"<>|"); LPVOID pszIntro = NULL; LPITEMIDLIST lpItemDList = NULL; HRESULT hr = E_FAIL; //don't assume success IMalloc *pMalloc = NULL; BOOL ret = FALSE; ASSERT(hwndParent); ASSERT(szFileName); // Validate page type, return false if page type is unknown if (PAGETYPE_ISP_TOS == dwFileType) { dwFileFormatOrig = IDS_TERMS_FILENAME; dwFileFormatCopy = IDS_TERMS_FILENAME_COPY; } else if ((PAGETYPE_ISP_CUSTOMFINISH == dwFileType) || (PAGETYPE_ISP_FINISH == dwFileType) || (PAGETYPE_ISP_NORMAL == dwFileType)) { dwFileFormatOrig = IDS_ISPINFO_FILENAME; dwFileFormatCopy = IDS_ISPINFO_FILENAME_COPY; } else { return FALSE; } GetCurrentDirectory(ARRAYSIZE(szWorkingDir), szWorkingDir); hr = SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP,&lpItemDList); //Get the "DESKTOP" dir ASSERT(SUCCEEDED(hr)); if (SUCCEEDED(hr)) { SHGetPathFromIDList(lpItemDList, szDesktopPath); // Free up the memory allocated for LPITEMIDLIST if (SUCCEEDED (SHGetMalloc (&pMalloc))) { pMalloc->Free (lpItemDList); pMalloc->Release (); } } // Replace invalid file name char in ISP name with underscore lstrcpy(szISPName, gpWizardState->lpSelectedISPInfo->get_szISPName()); for( int i = 0; szISPName[i]; i++ ) { if(_tcschr(pszInvalideChars, szISPName[i])) { szISPName[i] = '_'; } } // Load the default file name args[0] = (LPTSTR) szISPName; args[1] = NULL; LoadString(ghInstanceResDll, dwFileFormatOrig, szFmt, ARRAYSIZE(szFmt)); FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY, szFmt, 0, 0, (LPTSTR)&pszIntro, 0, (va_list*)args); lstrcat(szDesktopPath, TEXT("\\")); wsprintf(szLocalFile, TEXT("\"%s\""), (LPTSTR)pszIntro); lstrcpy(szNewFileBuff, szDesktopPath); lstrcat(szNewFileBuff, (LPTSTR)pszIntro); LocalFree(pszIntro); // Check if file already exists if (0xFFFFFFFF != GetFileAttributes(szNewFileBuff)) { // If file exists, create new filename with paranthesis int nCurr = 1; do { wsprintf(szNumber, TEXT("%d"), nCurr++); args[1] = (LPTSTR) szNumber; LoadString(ghInstanceResDll, dwFileFormatCopy, szFmt, ARRAYSIZE(szFmt)); FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY, szFmt, 0, 0, (LPTSTR)&pszIntro, 0, (va_list*)args); lstrcpy(szNewFileBuff, szDesktopPath); wsprintf(szLocalFile, TEXT("\"%s\""), (LPTSTR)pszIntro); lstrcat(szNewFileBuff, (LPTSTR)pszIntro); LocalFree(pszIntro); } while ((0xFFFFFFFF != GetFileAttributes(szNewFileBuff)) && (nCurr <= 100)); } // Copy the file to permanent location HANDLE hFile = CreateFile(szNewFileBuff, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile != INVALID_HANDLE_VALUE) { IICWWalker* pHTMLWalker = NULL; BSTR bstrText = NULL; DWORD dwByte = 0; if (SUCCEEDED(CoCreateInstance(CLSID_ICWWALKER,NULL,CLSCTX_INPROC_SERVER, IID_IICWWalker,(LPVOID*)&pHTMLWalker))) { pHTMLWalker->InitForMSHTML(); pHTMLWalker->AttachToMSHTML(A2W(szSrcFileName)); if (SUCCEEDED(pHTMLWalker->ExtractUnHiddenText(&bstrText)) && bstrText) { #ifdef UNICODE BYTE UNICODE_BYTE_ORDER_MARK[] = {0xFF, 0xFE}; WriteFile(hFile, UNICODE_BYTE_ORDER_MARK, sizeof(UNICODE_BYTE_ORDER_MARK), &dwByte, NULL); #endif ret = WriteFile(hFile, W2A(bstrText), lstrlen(W2A(bstrText))* sizeof(TCHAR), &dwByte, NULL); SysFreeString(bstrText); } pHTMLWalker->TermForMSHTML(); pHTMLWalker->Release(); } CloseHandle(hFile); } // Display message according to the state of CopyFile if (!ret) { DeleteFile(szNewFileBuff); //let the user know there was not enough disk space TCHAR szTemp [MAX_RES_LEN] = TEXT("\0"); TCHAR szCaption [MAX_RES_LEN] = TEXT("\0"); LoadString(ghInstanceResDll, IDS_NOT_ENOUGH_DISKSPACE, szTemp, ARRAYSIZE(szTemp)); LoadString(ghInstanceResDll, IDS_APPNAME, szCaption, ARRAYSIZE(szCaption)); MessageBox(hwndParent, szTemp, szCaption, MB_OK | MB_ICONEXCLAMATION | MB_APPLMODAL); } else { // Display the confirmation DisplayConfirmationDialog(hwndParent, dwFileType, szLocalFile); } return ret; } #if defined (DBG) BOOL HtmlSaveAs( HWND hwndParent, TCHAR* szFileName, TCHAR* szTargetFileName) { ASSERT(hwndParent); ASSERT(szFileName); OPENFILENAME ofn; TCHAR szNewFileBuff [MAX_PATH + 1]; TCHAR szDesktopPath [MAX_PATH + 1] = TEXT("\0"); TCHAR szWorkingDir [MAX_PATH + 1] = TEXT("\0"); TCHAR szFilter [255] = TEXT("\0"); LPITEMIDLIST lpItemDList = NULL; HRESULT hr = E_FAIL; //don't assume success IMalloc *pMalloc = NULL; BOOL ret = TRUE; GetCurrentDirectory(ARRAYSIZE(szWorkingDir), szWorkingDir); hr = SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP,&lpItemDList); //Get the "DESKTOP" dir ASSERT(SUCCEEDED(hr)); if (SUCCEEDED(hr)) { SHGetPathFromIDList(lpItemDList, szDesktopPath); // Free up the memory allocated for LPITEMIDLIST if (SUCCEEDED (SHGetMalloc (&pMalloc))) { pMalloc->Free (lpItemDList); pMalloc->Release (); } } if (szTargetFileName != NULL) { lstrcpy(szNewFileBuff, szDesktopPath); lstrcat(szNewFileBuff, TEXT("\\")); lstrcat(szNewFileBuff, szTargetFileName); // Copy temporary file to permanent location ret = CopyFile(szFileName, szNewFileBuff, FALSE); } else { //Setup the filter LoadString(ghInstanceResDll, IDS_DEFAULT_TOS_FILTER, szFilter, ARRAYSIZE(szFilter)); // "HTML Files" //Setup the default file name if(!LoadString(ghInstanceResDll, IDS_DEFAULT_TOS_FILENAME, szNewFileBuff, ARRAYSIZE(szNewFileBuff))) // "terms" lstrcpy(szNewFileBuff, TEXT("terms")); lstrcat(szNewFileBuff, TEXT(".htm")); //init the filename struct ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hwndParent; ofn.lpstrFilter = szFilter; ofn.lpstrFile = szNewFileBuff; ofn.nMaxFile = sizeof(szNewFileBuff); ofn.lpstrFileTitle = NULL; ofn.lpstrInitialDir = szDesktopPath; ofn.lpstrTitle = NULL; ofn.lpstrCustomFilter = (LPTSTR) NULL; ofn.nMaxCustFilter = 0L; ofn.nFileOffset = 0; ofn.nFileExtension = 0; ofn.lpstrDefExt = TEXT("*.htm"); ofn.lCustData = 0; ofn.nFilterIndex = 1L; ofn.nMaxFileTitle = 0; ofn.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_EXPLORER | OFN_LONGNAMES | OFN_OVERWRITEPROMPT; //Call the SaveAs common dlg if(TRUE == GetSaveFileName(&ofn)) { HANDLE hFile = CreateFile(ofn.lpstrFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile != INVALID_HANDLE_VALUE) { IICWWalker* pHTMLWalker = NULL; BSTR bstrText = NULL; DWORD dwByte = 0; if (SUCCEEDED(CoCreateInstance(CLSID_ICWWALKER,NULL,CLSCTX_INPROC_SERVER, IID_IICWWalker,(LPVOID*)&pHTMLWalker))) { pHTMLWalker->InitForMSHTML(); pHTMLWalker->AttachToMSHTML(A2W(szFileName)); if (SUCCEEDED(pHTMLWalker->ExtractUnHiddenText(&bstrText)) && bstrText) { ret = WriteFile(hFile, W2A(bstrText), lstrlen(W2A(bstrText)), &dwByte, NULL); SysFreeString(bstrText); } pHTMLWalker->TermForMSHTML(); pHTMLWalker->Release(); } CloseHandle(hFile); } if (!ret) { DeleteFile(ofn.lpstrFile); //let the user know there was not enough disk space TCHAR szTemp [MAX_RES_LEN] = TEXT("\0"); TCHAR szCaption [MAX_RES_LEN] = TEXT("\0"); LoadString(ghInstanceResDll, IDS_NOT_ENOUGH_DISKSPACE, szTemp, ARRAYSIZE(szTemp)); LoadString(ghInstanceResDll, IDS_APPNAME, szCaption, ARRAYSIZE(szCaption)); MessageBox(hwndParent, szTemp, szCaption, MB_OK | MB_ICONEXCLAMATION | MB_APPLMODAL); } } } SetCurrentDirectory(szWorkingDir); return ret; } #endif