WindowsXP-SP1/inetcore/connectionwizard/inetcfg/icwaprtc.cpp
2020-09-30 16:53:49 +02:00

739 lines
21 KiB
C++

/****************************************************************************
*
* ICWAPRTC.cpp
*
* Microsoft Confidential
* Copyright (c) Microsoft Corporation 1992-1997
* All rights reserved
*
* This module provides the implementation of the methods for
* the CICWApprentice class.
*
* 5/1/97 jmazner Created
*
***************************************************************************/
#include "wizard.h"
#include "icwextsn.h"
#include "icwaprtc.h"
#include "imnext.h"
#include "pagefcns.h"
#include "icwcfg.h"
UINT g_uExternUIPrev, g_uExternUINext;
IICWExtension *g_pExternalIICWExtension = NULL;
BOOL g_fConnectionInfoValid = FALSE;
//defined/allocated in propmgr.cpp
extern PAGEINFO PageInfo[NUM_WIZARD_PAGES];
extern INT_PTR CALLBACK GenDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,
LPARAM lParam);
extern VOID InitWizardState(WIZARDSTATE * pWizardState, DWORD dwFlags);
extern VOID InitUserInfo(USERINFO * pUserInfo);
//define in rnacall.cpp
extern void InitRasEntry(LPRASENTRY lpEntry);
//defined in endui.cpp
extern BOOL CommitConfigurationChanges(HWND hDlg);
/*** Class definition, for reference only ***
(actual definition is in icwaprtc.h)
class CICWApprentice : public IICWApprentice
{
public:
virtual HRESULT STDMETHODCALLTYPE Initialize(IICWExtension *pExt);
virtual HRESULT STDMETHODCALLTYPE AddWizardPages(DWORD dwFlags);
virtual HRESULT STDMETHODCALLTYPE GetConnectionInformation(CONNECTINFO *pInfo);
virtual HRESULT STDMETHODCALLTYPE SetConnectionInformation(CONNECTINFO *pInfo);
virtual HRESULT STDMETHODCALLTYPE Save(HWND hwnd, DWORD *pdwError);
virtual HRESULT STDMETHODCALLTYPE SetPrevNextPage(UINT uPrevPageDlgID, UINT uNextPageDlgID);
virtual HRESULT STDMETHODCALLTYPE QueryInterface( REFIID theGUID, void** retPtr );
virtual ULONG STDMETHODCALLTYPE AddRef( void );
virtual ULONG STDMETHODCALLTYPE Release( void );
CICWApprentice( void );
~CICWApprentice( void );
IICWExtension *m_pIICWExt;
private:
LONG m_lRefCount;
};
****/
//+----------------------------------------------------------------------------
//
// Function CICWApprentice::Initialize
//
// Synopsis Called by the main Wizard to initialize class members and
// globals
//
// Arguments [in] pExt -- pointer the Wizard's IICWExtension interface, which
// encapsulates the functionality needed to add wizard
// pages.
//
// Returns E_OUTOFMEMORY -- unable to allocate global vars.
// S_OK indicates success
//
// History 4/23/97 jmazner created
//
//-----------------------------------------------------------------------------
HRESULT CICWApprentice::Initialize(IICWExtension *pExt)
{
DEBUGMSG("CICWApprentice::Initialize");
ASSERT( pExt );
m_pIICWExt = pExt;
m_pIICWExt->AddRef();
// various page OKProcs will need this pointer in order
// to call SetFirstLastPage
ASSERT( NULL == g_pExternalIICWExtension );
g_pExternalIICWExtension = pExt;
g_fConnectionInfoValid = FALSE;
if( !gpWizardState)
{
gpWizardState = new WIZARDSTATE;
}
if( !gpUserInfo )
{
gpUserInfo = new USERINFO;
}
if( !gpRasEntry )
{
gdwRasEntrySize = sizeof(RASENTRY);
gpRasEntry = (LPRASENTRY) GlobalAlloc(GPTR,gdwRasEntrySize);
}
if( !gpRasEntry || !gpWizardState || !gpUserInfo )
{
DEBUGMSG("CICWApprentice::Initialize couldn't initialize the globals!");
return E_OUTOFMEMORY;
}
// stolen from RunSignupWizard in propmgr.cpp
// initialize the rasentry structure
InitRasEntry(gpRasEntry);
// initialize the app state structure
InitWizardState(gpWizardState, RSW_APPRENTICE);
gpWizardState->dwRunFlags |= RSW_APPRENTICE;
// initialize user data structure
InitUserInfo(gpUserInfo);
//
// 6/2/97 jmazner Olympus #4542
// default to CONNECT_RAS
//
gpUserInfo->uiConnectionType = CONNECT_RAS;
return S_OK;
}
//+----------------------------------------------------------------------------
//
// Function CICWApprentice::AddWizardPages
//
// Synopsis Creates a series of Property Sheet pages, and adds them to the
// main wizard via the m_pIICWExt interface pointer. Note that
// we add every page in the global PageInfo struct, even though the
// Apprentice may not use some pages (eg, CONNECTEDOK)
//
// Arguments [] dwFlags -- currently unused
//
// Returns S_OK indicates success
// E_FAIL indicates failure. If for any reason all pages can not be
// added, we will attempt to remove any pages that had been
// added prior to the failure.
//
// History 4/23/97 jmazner created
//
//-----------------------------------------------------------------------------
HRESULT CICWApprentice::AddWizardPages(DWORD dwFlags)
{
HPROPSHEETPAGE hWizPage[NUM_WIZARD_PAGES]; // array to hold handles to pages
PROPSHEETPAGE psPage; // struct used to create prop sheet pages
UINT nPageIndex;
HRESULT hr = S_OK;
unsigned long ulNumItems = 0;
DEBUGMSG("CICWApprentice::AddWizardPages");
gpWizardState->dwRunFlags |= RSW_APPRENTICE;
ZeroMemory(&hWizPage,sizeof(hWizPage)); // hWizPage is an array
ZeroMemory(&psPage,sizeof(PROPSHEETPAGE));
if (dwFlags & WIZ_USE_WIZARD97)
g_fIsExternalWizard97 = TRUE;
// fill out common data property sheet page struct
psPage.dwSize = sizeof(psPage);
psPage.hInstance = ghInstance;
psPage.pfnDlgProc = GenDlgProc;
// create a property sheet page for each page in the wizard
for (nPageIndex = 0; nPageIndex < NUM_WIZARD_PAGES; nPageIndex++)
{
UINT uDlgID;
psPage.dwFlags = PSP_DEFAULT | PSP_HASHELP;
if (g_fIsExternalWizard97)
{
psPage.dwFlags |= PSP_USETITLE;
psPage.pszTitle= gpWizardState->cmnStateData.szWizTitle;
uDlgID = PageInfo[nPageIndex].uDlgID97External;
}
else
uDlgID = PageInfo[nPageIndex].uDlgID;
psPage.pszTemplate = MAKEINTRESOURCE(uDlgID);
// set a pointer to the PAGEINFO struct as the private data for this
// page
psPage.lParam = (LPARAM) &PageInfo[nPageIndex];
if (g_fIsExternalWizard97 && PageInfo[nPageIndex].nIdTitle)
{
psPage.dwFlags |= PSP_USEHEADERTITLE | (PageInfo[nPageIndex].nIdSubTitle ? PSP_USEHEADERSUBTITLE : 0);
psPage.pszHeaderTitle = MAKEINTRESOURCE(PageInfo[nPageIndex].nIdTitle);
psPage.pszHeaderSubTitle = MAKEINTRESOURCE(PageInfo[nPageIndex].nIdSubTitle);
}
hWizPage[nPageIndex] = CreatePropertySheetPage(&psPage);
if (!hWizPage[nPageIndex])
{
DEBUGTRAP("Failed to create property sheet page");
MsgBox(NULL,IDS_ERROutOfMemory,MB_ICONEXCLAMATION,MB_OK);
hr = E_FAIL;
// creating page failed, free any pages already created and bail
goto AddWizardPagesErrorExit;
}
hr = m_pIICWExt->AddExternalPage( hWizPage[nPageIndex], uDlgID);
if( FAILED(hr) )
{
// free any pages already created and bail
goto AddWizardPagesErrorExit;
}
}
if (((dwFlags & WIZ_HOST_ICW_LAN) || (dwFlags & WIZ_HOST_ICW_PHONE)) ||
(dwFlags & WIZ_HOST_ICW_MPHONE))
{
UINT uNextPage;
BOOL bDummy;
g_fIsICW = TRUE;
if (!InitWizard(0))
{
hr = E_FAIL;
DeinitWizard(RSW_NOREBOOT);
}
else
{
if (S_OK != ProcessCustomFlags(dwFlags))
{
DeinitWizard(RSW_NOREBOOT);
hr = E_FAIL;
}
}
}
else
{
// of course, we have no idea what the last page will really be.
// so make a guess here, and update it later when we know for sure.
if (g_fIsExternalWizard97)
m_pIICWExt->SetFirstLastPage( IDD_PAGE_HOWTOCONNECT97, IDD_PAGE_HOWTOCONNECT97 );
else
m_pIICWExt->SetFirstLastPage( IDD_PAGE_HOWTOCONNECT, IDD_PAGE_HOWTOCONNECT );
}
return hr;
AddWizardPagesErrorExit:
UINT nFreeIndex;
for (nFreeIndex=0;nFreeIndex<nPageIndex;nFreeIndex++)
{
UINT uDlgID;
if (g_fIsExternalWizard97)
uDlgID = PageInfo[nPageIndex].uDlgID97External;
else
uDlgID = PageInfo[nPageIndex].uDlgID;
DestroyPropertySheetPage(hWizPage[nFreeIndex]);
m_pIICWExt->RemoveExternalPage( hWizPage[nFreeIndex], uDlgID );
}
return hr;
}
//+----------------------------------------------------------------------------
//
// Function CICWApprentice::GetConnectionInformation
//
// Synopsis Fills the passed in CONNECTINFO structure with the connection
// information entered by the user.
//
// Arguments [in] pInfo -- pointer to a CONNECTINFO structure
// [out] pInfo -- the indicated structure will contain the user's
// connection information.
//
// Returns S_OK indicates success
// E_POINTER -- the pInfo pointer is not valid
// E_FAIL -- the user has not entered any connection info. This
// error will occur if the function is called before
// the user has completed the apprentice.
//
// History 4/23/97 jmazner created
//
//-----------------------------------------------------------------------------
HRESULT CICWApprentice::GetConnectionInformation(CONNECTINFO *pInfo)
{
DEBUGMSG("CICWApprentice::GetConnectionInformation");
ASSERTSZ(pInfo, "CONNECTINFO *pInfo is NULL!");
if( !pInfo )
{
return E_POINTER;
}
if( !g_fConnectionInfoValid )
{
DEBUGMSG("CICWApprentice::GetConnectionInformation: haven't gathered any connection info yet!");
return E_FAIL;
}
else
{
pInfo->cbSize = sizeof( CONNECTINFO );
#ifdef UNICODE
wcstombs(pInfo->szConnectoid, TEXT("Uninitialized\0"), MAX_PATH);
#else
lstrcpy( pInfo->szConnectoid, TEXT("Uninitialized\0"));
#endif
pInfo->type = gpUserInfo->uiConnectionType;
if( CONNECT_RAS == pInfo->type )
{
#ifdef UNICODE
wcstombs(pInfo->szConnectoid, gpUserInfo->szISPName, MAX_PATH);
#else
lstrcpy( pInfo->szConnectoid, gpUserInfo->szISPName);
#endif
}
}
return S_OK;
}
//+----------------------------------------------------------------------------
//
// Function CICWApprentice::SetConnectionInformation
//
// Synopsis Sets the default connectoin information for the Apprentice
//
// Arguments [in] pInfo -- pointer to a CONNECTINFO structure containing the
// defaults to use.
//
// Returns S_OK indicates success
// E_POINTER -- the pInfo pointer is not valid
// E_INVALIDARG -- pInfo appears to point a different CONNECTINO
// structure than the one we know about (based on
// the cbSize member).
//
// History 4/23/97 jmazner created
//
//-----------------------------------------------------------------------------
HRESULT CICWApprentice::SetConnectionInformation(CONNECTINFO *pInfo)
{
DEBUGMSG("CICWApprentice::SetConnectionInformation");
ASSERTSZ(pInfo, "CONNECTINFO *pInfo is NULL!");
if( !pInfo )
{
return E_POINTER;
}
if( !(sizeof( CONNECTINFO ) == pInfo->cbSize) )
{
DEBUGMSG("CICWApprentice::SetConnectionInformation pInfo->cbSize is unknown!");
return E_INVALIDARG;
}
gpUserInfo->uiConnectionType = pInfo->type;
if( CONNECT_RAS == pInfo->type )
{
#ifdef UNICODE
mbstowcs(gpUserInfo->szISPName, pInfo->szConnectoid, MAX_PATH);
#else
lstrcpy( gpUserInfo->szISPName, pInfo->szConnectoid);
#endif
}
return S_OK;
}
//+----------------------------------------------------------------------------
//
// Function CICWApprentice::Save
//
// Synopsis Called by the Wizard to commit changes
//
// Arguments [in] hwnd -- hwnd of Wizard window, used to display modal msgs
// [out] pdwError -- implementation specfic error code. Not used.
//
// Returns S_OK indicates success
// Otherwise, returns E_FAIL.
//
//
// History 4/23/97 jmazner created
//
//-----------------------------------------------------------------------------
HRESULT CICWApprentice::Save(HWND hwnd, DWORD *pdwError)
{
DEBUGMSG("CICWApprentice::Save");
if( CommitConfigurationChanges(hwnd) )
{
return S_OK;
}
else
{
return E_FAIL;
}
}
HRESULT CICWApprentice::SetDlgHwnd(HWND hDlg)
{
m_hwndDlg = hDlg;
return S_OK;
}
//+----------------------------------------------------------------------------
//
// Function CICWApprentice::SetPrevNextPage
//
// Synopsis Lets the apprentice notify the wizard of the dialog IDs of the
// first and last pages in the apprentice
//
//
// Arguments uPrevPageDlgID -- DlgID of wizard page to back up to
// uNextPageDlgID -- DlgID of wizard page to go forwards into
//
//
// Returns FALSE if both parameters are 0
// TRUE if the update succeeded.
//
// Notes: If either variable is set to 0, the function will not update
// that information, i.e. a value of 0 means "ignore me". If both
// variables are 0, the function immediately returns FALSE.
//
// History 4/23/97 jmazner created
//
//-----------------------------------------------------------------------------
HRESULT CICWApprentice::SetPrevNextPage(UINT uPrevPageDlgID, UINT uNextPageDlgID)
{
DEBUGMSG("CICWApprentice::SetPrevNextPage: updating prev = %d, next = %d",
uPrevPageDlgID, uNextPageDlgID);
if( (0 == uPrevPageDlgID) && (0 == uNextPageDlgID) )
{
DEBUGMSG("SetFirstLastPage: both IDs are 0!");
return( E_INVALIDARG );
}
if( 0 != uPrevPageDlgID )
g_uExternUIPrev = uPrevPageDlgID;
if( 0 != uNextPageDlgID )
g_uExternUINext = uNextPageDlgID;
return S_OK;
}
//+----------------------------------------------------------------------------
//
// Function CICWApprentice::ProcessCustomFlags
//
// Synopsis Lets the apprentice know that there is a special modification
// to this set of apprentice pages after it is loaded
//
// Arguments dwFlags -- info needed to pass to the external pages
//
//
// Returns FALSE if both parameters are 0
// TRUE if the update succeeded.
//
// History 9/23/97 vyung created
//
//-----------------------------------------------------------------------------
HRESULT CICWApprentice::ProcessCustomFlags(DWORD dwFlags)
{
UINT uNextPage;
BOOL bDummy;
HRESULT hr = S_OK;
if (gpUserInfo)
gpUserInfo->uiConnectionType = (dwFlags & WIZ_HOST_ICW_LAN) ? CONNECT_LAN : CONNECT_RAS;
g_bSkipMultiModem = (BOOL) (dwFlags & WIZ_HOST_ICW_PHONE);
if (gpWizardState)
{
gpWizardState->cmnStateData.dwFlags = 0;
if (dwFlags & (WIZ_NO_MAIL_ACCT | WIZ_NO_NEWS_ACCT))
{
gpWizardState->dwRunFlags |= RSW_NOIMN;
}
}
if (!HowToConnectOKProc(m_hwndDlg, TRUE, &uNextPage, &bDummy))
{
if (g_bReboot && gpWizardState && g_fIsICW)
{
// Set a registry value indicating that we messed with the desktop
DWORD dwFlags = 0x00800000;//ICW_CFGFLAG_SMARTREBOOT_MANUAL;
DWORD dwDisposition;
HKEY hkey = 0;
if (ERROR_SUCCESS == RegCreateKeyEx(HKEY_CURRENT_USER,
ICW_REGPATHSETTINGS,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hkey,
&dwDisposition))
{
DWORD dwDesktopChanged = 1;
RegSetValueEx(hkey,
ICW_REGKEYERROR,
0,
REG_DWORD,
(LPBYTE)&dwFlags,
sizeof(DWORD));
RegCloseKey(hkey);
}
g_bRebootAtExit = FALSE;
}
hr = E_FAIL;
}
else
{
switch( uNextPage )
{
case ORD_PAGE_USEPROXY:
m_pIICWExt->SetFirstLastPage( IDD_PAGE_USEPROXY97, IDD_PAGE_USEPROXY97 );
break;
case ORD_PAGE_SETUP_PROXY:
m_pIICWExt->SetFirstLastPage( IDD_PAGE_SETUP_PROXY97, IDD_PAGE_SETUP_PROXY97 );
break;
case ORD_PAGE_CHOOSEMODEM:
m_pIICWExt->SetFirstLastPage( IDD_PAGE_CHOOSEMODEM97, IDD_PAGE_CHOOSEMODEM97 );
break;
case ORD_PAGE_PHONENUMBER:
case ORD_PAGE_CONNECTION:
m_pIICWExt->SetFirstLastPage( IDD_PAGE_PHONENUMBER97, IDD_PAGE_PHONENUMBER97 );
break;
default:
m_pIICWExt->SetFirstLastPage( 0, 0 );
break;
} // end of switch
}
return hr;
}
HRESULT CICWApprentice::SetStateDataFromExeToDll(LPCMNSTATEDATA lpData)
{
ASSERT(gpWizardState);
memcpy(&gpWizardState->cmnStateData, lpData, sizeof(CMNSTATEDATA));
return S_OK;
}
//converse of the previous function
HRESULT CICWApprentice::SetStateDataFromDllToExe(LPCMNSTATEDATA lpData)
{
ASSERT(gpWizardState);
memcpy(lpData, &gpWizardState->cmnStateData, sizeof(CMNSTATEDATA));
return (S_OK);
}
//+----------------------------------------------------------------------------
//
// Function CICWApprentice::QueryInterface
//
// Synopsis This is the standard QI, with support for
// IID_Unknown, IICW_Extension and IID_ICWApprentice
// (stolen from Inside COM, chapter 7)
//
// History 4/23/97 jmazner created
//
//-----------------------------------------------------------------------------
HRESULT CICWApprentice::QueryInterface( REFIID riid, void** ppv )
{
DEBUGMSG("CICWApprentice::QueryInterface");
if (ppv == NULL)
return(E_INVALIDARG);
*ppv = NULL;
// IID_IICWApprentice
if (IID_IICWApprentice == riid)
*ppv = (void *)(IICWApprentice *)this;
// IID_IICWApprenticeEx
else if (IID_IICWApprenticeEx == riid)
*ppv = (void *)(IICWApprenticeEx *)this;
// IID_IICWExtension
else if (IID_IICWExtension == riid)
*ppv = (void *)(IICWExtension *)this;
// IID_IUnknown
else if (IID_IUnknown == riid)
*ppv = (void *)this;
else
return(E_NOINTERFACE);
((LPUNKNOWN)*ppv)->AddRef();
return(S_OK);
}
//+----------------------------------------------------------------------------
//
// Function CICWApprentice::AddRef
//
// Synopsis This is the standard AddRef
//
// History 4/23/97 jmazner created
//
//-----------------------------------------------------------------------------
ULONG CICWApprentice::AddRef( void )
{
DEBUGMSG("CICWApprentice::AddRef %d", m_lRefCount + 1);
return InterlockedIncrement(&m_lRefCount) ;
}
//+----------------------------------------------------------------------------
//
// Function CICWApprentice::Release
//
// Synopsis This is the standard Release
//
// History 4/23/97 jmazner created
//
//-----------------------------------------------------------------------------
ULONG CICWApprentice::Release( void )
{
ASSERT( m_lRefCount > 0 );
InterlockedDecrement(&m_lRefCount);
DEBUGMSG("CICWApprentice::Release %d", m_lRefCount);
if( 0 == m_lRefCount )
{
m_pIICWExt->Release();
m_pIICWExt = NULL;
delete( this );
return( 0 );
}
else
{
return( m_lRefCount );
}
}
//+----------------------------------------------------------------------------
//
// Function CICWApprentice::CICWApprentice
//
// Synopsis This is the constructor, nothing fancy
//
// History 4/23/97 jmazner created
//
//-----------------------------------------------------------------------------
CICWApprentice::CICWApprentice( void )
{
DEBUGMSG("CICWApprentice constructor called");
m_lRefCount = 0;
m_pIICWExt = NULL;
}
//+----------------------------------------------------------------------------
//
// Function CICWApprentice::~CICWApprentice
//
// Synopsis This is the destructor. We want to clean up all the memory
// we allocated in ::Initialize
//
// History 4/23/97 jmazner created
//
//-----------------------------------------------------------------------------
CICWApprentice::~CICWApprentice( void )
{
DEBUGMSG("CICWApprentice destructor called with ref count of %d", m_lRefCount);
if (gpImnApprentice)
{
gpImnApprentice->Release(); // DeinitWizard is called in Release()
gpImnApprentice = NULL;
}
if( g_fIsICW ) // if ICW, we need to clean up, otherwise, leave cleanup later
DeinitWizard(0);
if( m_pIICWExt )
{
m_pIICWExt->Release();
m_pIICWExt = NULL;
}
g_pExternalIICWExtension = NULL;
g_fConnectionInfoValid = FALSE;
if( gpWizardState)
{
delete gpWizardState;
gpWizardState = NULL;
}
if( gpUserInfo )
{
delete gpUserInfo;
gpUserInfo = NULL;
}
if( gpRasEntry )
{
GlobalFree(gpRasEntry);
gpRasEntry = NULL;
}
}