//********************************************************************** // File name: ICWCONN.cpp // // Main source file for the Internet Connection Wizard extension DLL // // Functions: // // Copyright (c) 1992 - 1998 Microsoft Corporation. All rights reserved. //********************************************************************** #include "pre.h" #include "webvwids.h" // local function prototypes BOOL AllocDialogIDList( void ); BOOL DialogIDAlreadyInUse( UINT uDlgID ); BOOL SetDialogIDInUse( UINT uDlgID, BOOL fInUse ); #pragma data_seg(".data") WIZARDSTATE *gpWizardState=NULL; // pointer to global wizard state struct IICWWebView *gpICWWebView[2]; #ifdef NEED_EXTENSION DWORD *g_pdwDialogIDList = NULL; DWORD g_dwDialogIDListSize = 0; UINT g_uICWCONN1UIFirst, g_uICWCONN1UILast; BOOL g_fICWCONN1UILoaded = FALSE; CICWExtension *g_pCICW50Extension = NULL; #endif // // Table of data for each wizard page // // This includes the dialog template ID and pointers to functions for // each page. Pages need only provide pointers to functions when they // want non-default behavior for a certain action (init,next/back,cancel, // dlg ctrl). // PAGEINFO PageInfo[NUM_WIZARD_PAGES] = { { IDD_PAGE_ISPSELECT, TRUE, ISPSelectInitProc, NULL, ISPSelectOKProc, NULL, NULL, ISPSelectNotifyProc, 0, 0, IDA_ISPSELECT, NULL, NULL }, { IDD_PAGE_NOOFFER, TRUE, NoOfferInitProc, NULL, NoOfferOKProc, NULL, NULL, NULL, 0, 0, 0, NULL, NULL }, { IDD_PAGE_USERINFO, FALSE, UserInfoInitProc, NULL, UserInfoOKProc, NULL, NULL, NULL, IDS_STEP2_TITLE, 0, 0, NULL, NULL }, { IDD_PAGE_BILLINGOPT, TRUE, BillingOptInitProc, NULL, BillingOptOKProc, NULL, NULL, NULL, IDS_STEP2_TITLE, 0, IDA_BILLINGOPT, NULL, NULL }, { IDD_PAGE_PAYMENT, FALSE, PaymentInitProc, NULL, PaymentOKProc, PaymentCmdProc, NULL, NULL, IDS_STEP2_TITLE, 0, IDA_PAYMENT, NULL, NULL }, { IDD_PAGE_ISPDIAL, FALSE, ISPDialInitProc, ISPDialPostInitProc, ISPDialOKProc, NULL, ISPDialCancelProc, NULL, IDS_STEP2_TITLE, 0, 0, NULL, NULL }, { IDD_PAGE_ISPDATA, TRUE, ISPPageInitProc, NULL, ISPPageOKProc, ISPCmdProc, NULL, NULL, IDS_STEP2_TITLE, 0, IDA_ISPDATA, NULL, NULL }, { IDD_PAGE_OLS, TRUE, OLSInitProc, NULL, OLSOKProc, NULL, NULL, NULL, IDS_OLS_TITLE, 0, 0, NULL, NULL }, { IDD_PAGE_DIALERROR, FALSE, DialErrorInitProc, NULL, DialErrorOKProc, DialErrorCmdProc, NULL, NULL, IDS_DIALING_ERROR_TITLE,0, IDA_DIALERROR, NULL, NULL }, { IDD_PAGE_SERVERROR, FALSE, ServErrorInitProc, NULL, ServErrorOKProc, ServErrorCmdProc, NULL, NULL, IDS_SERVER_ERROR_TITLE, 0, IDA_SERVERROR, NULL, NULL }, { IDD_PAGE_ACFG_ISP, TRUE, ISPAutoSelectInitProc, NULL, ISPAutoSelectOKProc,NULL, NULL, ISPAutoSelectNotifyProc, IDS_STEP1_TITLE, 0, IDA_ACFG_ISP, NULL, NULL }, { IDD_PAGE_ACFG_NOOFFER, TRUE, ACfgNoofferInitProc, NULL, ACfgNoofferOKProc, NULL, NULL, NULL, IDS_MANUAL_TITLE, 0, 0, NULL, NULL }, { IDD_PAGE_ISDN_NOOFFER, TRUE, ISDNNoofferInitProc, NULL, ISDNNoofferOKProc, NULL, NULL, NULL, 0, 0, 0, NULL, NULL }, { IDD_PAGE_OEMOFFER, TRUE, OEMOfferInitProc, NULL, OEMOfferOKProc, OEMOfferCmdProc, NULL, NULL, IDS_STEP1_TITLE, 0, IDA_OEMOFFER, NULL, NULL } }; BOOL gfQuitWizard = FALSE; // global flag used to signal that we want to terminate the wizard ourselves BOOL gfUserCancelled = FALSE; // global flag used to signal that the user cancelled BOOL gfISPDialCancel = FALSE; // global flag used to signal that the user cancelled BOOL gfUserBackedOut = FALSE; // global flag used to signal that the user pressed Back on the first page BOOL gfUserFinished = FALSE; // global flag used to signal that the user pressed Finish on the final page BOOL gfBackedUp = FALSE; BOOL gfReboot = FALSE; BOOL g_bMalformedPage = FALSE; #pragma data_seg() BOOL CleanupWizardState(WIZARDSTATE * pWizardState); /******************************************************************* NAME: InitWizardState SYNOPSIS: Initializes wizard state structure ********************************************************************/ BOOL InitWizardState(WIZARDSTATE * pWizardState) { HRESULT hr; ASSERT(pWizardState); //register the Native font control so the dialog won't fail //although it's registered in the exe this is a "just in case" INITCOMMONCONTROLSEX iccex; iccex.dwSize = sizeof(INITCOMMONCONTROLSEX); iccex.dwICC = ICC_NATIVEFNTCTL_CLASS; if (!InitCommonControlsEx(&iccex)) return FALSE; // zero out structure ZeroMemory(pWizardState,sizeof(WIZARDSTATE)); // set starting page pWizardState->uCurrentPage = ORD_PAGE_ISPSELECT; pWizardState->fNeedReboot = FALSE; pWizardState->bISDNMode = FALSE; pWizardState->himlIspSelect = NULL; pWizardState->uNumTierOffer = 0; for (UINT i=0; i < MAX_OEM_MUTI_TIER; i++) pWizardState->lpOEMISPInfo[i] = NULL; // Instansiate ICWHELP objects hr = CoCreateInstance(CLSID_UserInfo,NULL,CLSCTX_INPROC_SERVER, IID_IUserInfo,(LPVOID *)&pWizardState->pUserInfo); if (FAILED(hr)) goto InitWizardStateError; hr = CoCreateInstance(CLSID_RefDial,NULL,CLSCTX_INPROC_SERVER, IID_IRefDial,(LPVOID *)&pWizardState->pRefDial); if (FAILED(hr)) goto InitWizardStateError; hr = CoCreateInstance(CLSID_WebGate,NULL,CLSCTX_INPROC_SERVER, IID_IWebGate,(LPVOID *)&pWizardState->pWebGate); if (FAILED(hr)) goto InitWizardStateError; hr = CoCreateInstance(CLSID_INSHandler,NULL,CLSCTX_INPROC_SERVER, IID_IINSHandler,(LPVOID *)&pWizardState->pINSHandler); if (FAILED(hr)) goto InitWizardStateError; hr = CoCreateInstance(CLSID_ICWWEBVIEW,NULL,CLSCTX_INPROC_SERVER, IID_IICWWebView,(LPVOID *)&pWizardState->pICWWebView); if (FAILED(hr)) goto InitWizardStateError; hr = CoCreateInstance(CLSID_ICWWALKER,NULL,CLSCTX_INPROC_SERVER, IID_IICWWalker,(LPVOID *)&pWizardState->pHTMLWalker); if (FAILED(hr)) goto InitWizardStateError; hr = CoCreateInstance(CLSID_ICWGIFCONVERT,NULL,CLSCTX_INPROC_SERVER, IID_IICWGifConvert,(LPVOID *)&pWizardState->pGifConvert); if (FAILED(hr)) goto InitWizardStateError; hr = CoCreateInstance(CLSID_ICWISPDATA,NULL,CLSCTX_INPROC_SERVER, IID_IICWISPData,(LPVOID *)&pWizardState->pISPData); if (FAILED(hr)) goto InitWizardStateError; if ( !pWizardState->pUserInfo || !pWizardState->pWebGate || !pWizardState->pINSHandler || !pWizardState->pHTMLWalker || !pWizardState->pRefDial || !pWizardState->pICWWebView || !pWizardState->pGifConvert || !pWizardState->pISPData || !pWizardState->pHTMLWalker) { goto InitWizardStateError; } // Init the walker for use with trident hr = pWizardState->pHTMLWalker->InitForMSHTML(); if (FAILED(hr)) goto InitWizardStateError; if ((pWizardState->pStorage = new CStorage) == NULL) { goto InitWizardStateError; } pWizardState->hEventWebGateDone = CreateEvent(NULL, FALSE, FALSE, NULL); if (!pWizardState->hEventWebGateDone) goto InitWizardStateError; // Success error return path return TRUE; InitWizardStateError: // Free any co-created objects CleanupWizardState(pWizardState); return FALSE; } BOOL CleanupWizardState(WIZARDSTATE * pWizardState) { if (pWizardState->pHTMLWalker) { pWizardState->pHTMLWalker->TermForMSHTML(); pWizardState->pHTMLWalker->Release(); pWizardState->pHTMLWalker = NULL; } if (pWizardState->pICWWebView) { pWizardState->pICWWebView->Release(); pWizardState->pICWWebView = NULL; } if (gpICWWebView[0]) { gpICWWebView[0]->Release(); gpICWWebView[0] = NULL; } if (gpICWWebView[1]) { gpICWWebView[1]->Release(); gpICWWebView[1] = NULL; } if (NULL != gpWizardState->himlIspSelect) { ImageList_Destroy(gpWizardState->himlIspSelect); gpWizardState->himlIspSelect = NULL; } if (pWizardState->pGifConvert) { pWizardState->pGifConvert->Release(); pWizardState->pGifConvert = NULL; } if (pWizardState->pISPData) { pWizardState->pISPData->Release(); pWizardState->pISPData = NULL; } if (pWizardState->pUserInfo) { BOOL bRetVal; // Before releasing the userinfo object, we should persist the user data if // necessary if (!gfUserCancelled && gpWizardState->bWasNoUserInfo && gpWizardState->bUserEnteredData) pWizardState->pUserInfo->PersistRegisteredUserInfo(&bRetVal); pWizardState->pUserInfo->Release(); pWizardState->pUserInfo = NULL; } if (pWizardState->pRefDial) { pWizardState->pRefDial->Release(); pWizardState->pRefDial = NULL; } if (pWizardState->pWebGate) { pWizardState->pWebGate->Release(); pWizardState->pWebGate = NULL; } if (pWizardState->pINSHandler) { pWizardState->pINSHandler->Release(); pWizardState->pINSHandler = NULL; } if (pWizardState->pStorage) { delete pWizardState->pStorage; } for (UINT i=0; i < pWizardState->uNumTierOffer; i++) { if (pWizardState->lpOEMISPInfo[i]) { // Prevent deleting it twice if (pWizardState->lpOEMISPInfo[i] != pWizardState->lpSelectedISPInfo) { delete pWizardState->lpOEMISPInfo[i]; pWizardState->lpOEMISPInfo[i] = NULL; } } } if (pWizardState->lpSelectedISPInfo) { delete pWizardState->lpSelectedISPInfo; } if (pWizardState->hEventWebGateDone) { CloseHandle(pWizardState->hEventWebGateDone); pWizardState->hEventWebGateDone = 0; } // Kill the idle timer just in case. KillIdleTimer(); return TRUE; } #ifdef NEED_EXTENSION //+---------------------------------------------------------------------------- // // Function AllocDialogIDList // // Synopsis Allocates memory for the g_pdwDialogIDList variable large enough // to maintain 1 bit for every valid external dialog ID // // Arguments None // // Returns TRUE if allocation succeeds // FALSE otherwise // // History 4/23/97 jmazner created // //----------------------------------------------------------------------------- BOOL AllocDialogIDList( void ) { ASSERT( NULL == g_pdwDialogIDList ); if( g_pdwDialogIDList ) { TraceMsg(TF_ICWCONN,"ICWCONN: AllocDialogIDList called with non-null g_pdwDialogIDList!"); return FALSE; } // determine maximum number of external dialogs we need to track UINT uNumExternDlgs = EXTERNAL_DIALOGID_MAXIMUM - EXTERNAL_DIALOGID_MINIMUM + 1; // we're going to need one bit for each dialogID. // Find out how many DWORDS it'll take to get this many bits. UINT uNumDWORDsNeeded = (uNumExternDlgs / ( 8 * sizeof(DWORD) )) + 1; // set global var with length of the array g_dwDialogIDListSize = uNumDWORDsNeeded; g_pdwDialogIDList = (DWORD *) GlobalAlloc(GPTR, uNumDWORDsNeeded * sizeof(DWORD)); if( !g_pdwDialogIDList ) { TraceMsg(TF_ICWCONN,"ICWCONN: AllocDialogIDList unable to allocate space for g_pdwDialogIDList!"); return FALSE; } return TRUE; } //+---------------------------------------------------------------------------- // // Function DialogIDAlreadyInUse // // Synopsis Checks whether a given dialog ID is marked as in use in the // global array pointed to by g_pdwDialogIDList // // Arguments uDlgID -- Dialog ID to check // // Returns TRUE if -- DialogID is out of range defined by EXTERNAL_DIALOGID_* // -- DialogID is marked as in use // FALSE if DialogID is not marked as in use // // History 4/23/97 jmazner created // //----------------------------------------------------------------------------- BOOL DialogIDAlreadyInUse( UINT uDlgID ) { if( (uDlgID < EXTERNAL_DIALOGID_MINIMUM) || (uDlgID > EXTERNAL_DIALOGID_MAXIMUM) ) { // this is an out-of-range ID, don't want to accept it. TraceMsg(TF_ICWCONN,"ICWCONN: DialogIDAlreadyInUse received an out of range DialogID, %d", uDlgID); return TRUE; } // find which bit we need UINT uBitToCheck = uDlgID - EXTERNAL_DIALOGID_MINIMUM; UINT bitsInADword = 8 * sizeof(DWORD); UINT baseIndex = uBitToCheck / bitsInADword; ASSERT( (baseIndex < g_dwDialogIDListSize)); DWORD dwBitMask = 0x1 << uBitToCheck%bitsInADword; BOOL fBitSet = g_pdwDialogIDList[baseIndex] & (dwBitMask); return( fBitSet ); } //+---------------------------------------------------------------------------- // // Function SetDialogIDInUse // // Synopsis Sets or clears the in use bit for a given DialogID // // Arguments uDlgID -- Dialog ID for which to change status // fInUse -- New value for the in use bit. // // Returns TRUE if status change succeeded. // FALSE if DialogID is out of range defined by EXTERNAL_DIALOGID_* // // History 4/23/97 jmazner created // //----------------------------------------------------------------------------- BOOL SetDialogIDInUse( UINT uDlgID, BOOL fInUse ) { if( (uDlgID < EXTERNAL_DIALOGID_MINIMUM) || (uDlgID > EXTERNAL_DIALOGID_MAXIMUM) ) { // this is an out-of-range ID, don't want to accept it. TraceMsg(TF_ICWCONN,"ICWCONN: SetDialogIDInUse received an out of range DialogID, %d", uDlgID); return FALSE; } // find which bit we need UINT uBitToCheck = uDlgID - EXTERNAL_DIALOGID_MINIMUM; UINT bitsInADword = 8 * sizeof(DWORD); UINT baseIndex = uBitToCheck / bitsInADword; ASSERT( (baseIndex < g_dwDialogIDListSize)); DWORD dwBitMask = 0x1 << uBitToCheck%bitsInADword; if( fInUse ) { g_pdwDialogIDList[baseIndex] |= (dwBitMask); } else { g_pdwDialogIDList[baseIndex] &= ~(dwBitMask); } return TRUE; } #endif DWORD WINAPI GetICWCONNVersion() { return ICW_DOWNLOADABLE_COMPONENT_VERSION; }