435 lines
16 KiB
C++
435 lines
16 KiB
C++
|
//**********************************************************************
|
||
|
// 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;
|
||
|
}
|