Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

396 lines
11 KiB

/****************************************************************************
*
* ICWESTSN.cpp
*
* Microsoft Confidential
* Copyright (c) Microsoft Corporation 1992-1997
* All rights reserved
*
* This module provides the implementation of the methods for
* the CICWExtension class.
*
* 4/24/97 jmazner Created
*
***************************************************************************/
#include "wizard.h"
#include "icwextsn.h"
#include "icwaprtc.h"
#include "imnext.h"
// in propmgr.cpp
extern BOOL DialogIDAlreadyInUse( UINT uDlgID );
extern BOOL SetDialogIDInUse( UINT uDlgID, BOOL fInUse );
/*** Class definition, for reference only ***
(actual definition is in icwextsn.h)
class CICWExtension : public IICWExtension
{
public:
virtual BOOL STDMETHODCALLTYPE AddExternalPage(HPROPSHEETPAGE hPage, UINT uDlgID);
virtual BOOL STDMETHODCALLTYPE RemoveExternalPage(HPROPSHEETPAGE hPage, UINT uDlgID);
virtual BOOL STDMETHODCALLTYPE ExternalCancel(CANCELTYPE type);
virtual BOOL STDMETHODCALLTYPE SetFirstLastPage(UINT uFirstPageDlgID, UINT uLastPageDlgID);
virtual HRESULT STDMETHODCALLTYPE QueryInterface( REFIID theGUID, void** retPtr );
virtual ULONG STDMETHODCALLTYPE AddRef( void );
virtual ULONG STDMETHODCALLTYPE Release( void );
HWND m_hWizardHWND;
private:
LONG m_lRefCount;
};
****/
//+----------------------------------------------------------------------------
//
// Function CICWExtension::AddExternalPage
//
// Synopsis Adds a page created via CreatePropertySheetPage to the main
// property sheet/wizard.
//
//
// Arguments hPage -- page handle returned from CreatePropertySheetPage
// uDlgID -- the dialog ID of the page to be added, as defined
// the resource file of the page's owner.
//
//
// Returns FALSE is the dlgID is already in use in the Wizard
// TRUE otherwise
//
// Notes: PropSheet_AddPage does not return a usefull error code. Thus
// the assumption here is that every AddPage will succeed. But, even
// though it is not enforced by PropSheet_AddPage, every page in the
// PropSheet must have a unique dialog ID. Thus, if the uDlgID passed
// in has previously been added to the PropSheet, we'll return FALSE.
//
// History 4/23/97 jmazner created
//
//-----------------------------------------------------------------------------
BOOL CICWExtension::AddExternalPage( HPROPSHEETPAGE hPage, UINT uDlgID )
{
LRESULT lResult= 0;
if ( (uDlgID < EXTERNAL_DIALOGID_MINIMUM) || (EXTERNAL_DIALOGID_MAXIMUM < uDlgID) )
{
DEBUGMSG("SetFirstLastPage: uDlgID %d is out of range!", uDlgID);
return( FALSE );
}
if( !DialogIDAlreadyInUse(uDlgID) )
{
SetDialogIDInUse( uDlgID, TRUE );
lResult = PropSheet_AddPage(m_hWizardHWND, hPage);
DEBUGMSG("propmgr: PS_AddPage DlgID %d", uDlgID);
return(TRUE);
}
else
{
DEBUGMSG("AddExternalPage DlgID %d is already in use, rejecting this page!", uDlgID);
return(FALSE);
}
}
//+----------------------------------------------------------------------------
//
// Function CICWExtension::RemoveExternalPage
//
// Synopsis Removes a page added via ::AddExternalPage to the main
// property sheet/wizard.
//
//
// Arguments hPage -- page handle returned from CreatePropertySheetPage
// uDlgID -- the dialog ID of the page to be removed, as defined
// the resource file of the page's owner.
//
//
// Returns FALSE is the dlgID is not already in use in the Wizard
// TRUE otherwise
//
// Notes: PropSheet_RemovePage does not return a usefull error code. Thus
// the assumption here is that every RemovePage will succeed if that
// dialog id is currently in the property sheet
//
// History 4/23/97 jmazner created
//
//-----------------------------------------------------------------------------
BOOL CICWExtension::RemoveExternalPage( HPROPSHEETPAGE hPage, UINT uDlgID )
{
if ( (uDlgID < EXTERNAL_DIALOGID_MINIMUM) || (EXTERNAL_DIALOGID_MAXIMUM < uDlgID) )
{
DEBUGMSG("SetFirstLastPage: uDlgID %d is out of range!", uDlgID);
return( FALSE );
}
if( DialogIDAlreadyInUse(uDlgID) )
{
SetDialogIDInUse( uDlgID, FALSE );
PropSheet_RemovePage(m_hWizardHWND, NULL, hPage);
DEBUGMSG("propmgr: PS_RemovePage DlgID %d", uDlgID);
return(TRUE);
}
else
{
DEBUGMSG("RemoveExternalPage: DlgID %d was not marked as in use!", uDlgID);
return(FALSE);
}
}
//+----------------------------------------------------------------------------
//
// Function CICWExtension::ExternalCancel
//
// Synopsis Notifies the wizard that the user has cancelled while in the
// apprentice pages
//
//
// Arguments uCancelType -- tells the wizard whether it should immediately
// quit out, or whether it should show the confirmation
// dialog (as though the user had hit Cancel within the
// wizard itself.)
//
//
// Returns TRUE if we're about to exit the wizard
// FALSE if not.
//
//
// History 4/23/97 jmazner created
//
//-----------------------------------------------------------------------------
BOOL CICWExtension::ExternalCancel( CANCELTYPE uCancelType )
{
DEBUGMSG("propmgr.cpp: received ExternalCancel callback");
switch( uCancelType )
{
case CANCEL_PROMPT:
gfUserCancelled = (MsgBox(m_hWizardHWND,IDS_QUERYCANCEL,
MB_ICONQUESTION,MB_YESNO |
MB_DEFBUTTON2) == IDYES);
if( gfUserCancelled )
{
PropSheet_PressButton( m_hWizardHWND, PSBTN_CANCEL );
gfQuitWizard = TRUE;
return( TRUE );
}
else
{
return( FALSE );
}
break;
case CANCEL_SILENT:
PropSheet_PressButton( m_hWizardHWND, PSBTN_CANCEL );
gfQuitWizard = TRUE;
return( TRUE );
break;
case CANCEL_REBOOT:
PropSheet_PressButton( m_hWizardHWND, PSBTN_CANCEL );
gfQuitWizard = TRUE;
gpWizardState->fNeedReboot = TRUE;
return( TRUE );
break;
default:
DEBUGMSG("ExternalCancel got an unkown CancelType!");
return( FALSE );
}
}
//+----------------------------------------------------------------------------
//
// Function CICWExtension::SetFirstLastPage
//
// Synopsis Lets the apprentice notify the wizard of the dialog IDs of the
// first and last pages in the apprentice
//
//
// Arguments uFirstPageDlgID -- DlgID of first page in apprentice.
// uLastPageDlgID -- DlgID of last page in apprentice
//
//
// Returns FALSE if the parameters passed in are out of range
// 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
//
//-----------------------------------------------------------------------------
BOOL CICWExtension::SetFirstLastPage(UINT uFirstPageDlgID, UINT uLastPageDlgID)
{
// validation code galore!
if( (0 == uFirstPageDlgID) && (0 == uLastPageDlgID) )
{
DEBUGMSG("SetFirstLastPage: both IDs are 0!");
return( FALSE );
}
if( (0 != uFirstPageDlgID) )
{
if ( (uFirstPageDlgID < EXTERNAL_DIALOGID_MINIMUM) || (EXTERNAL_DIALOGID_MAXIMUM < uFirstPageDlgID) )
{
DEBUGMSG("SetFirstLastPage: uFirstPageDlgID %d is out of range!", uFirstPageDlgID);
return( FALSE );
}
if( !DialogIDAlreadyInUse(uFirstPageDlgID) )
{
DEBUGMSG("SetFirstLastPage: uFirstPageDlgID %d not marked as in use!", uFirstPageDlgID);
return( FALSE );
}
}
if( (0 != uLastPageDlgID) )
{
if ( (uLastPageDlgID < EXTERNAL_DIALOGID_MINIMUM) || (EXTERNAL_DIALOGID_MAXIMUM < uLastPageDlgID) )
{
DEBUGMSG("SetFirstLastPage: uLastPageDlgID %d is out of range!", uFirstPageDlgID);
return( FALSE );
}
if( !DialogIDAlreadyInUse(uLastPageDlgID) )
{
DEBUGMSG("SetFirstLastPage: uLastPageDlgID %d not marked as in use!", uFirstPageDlgID);
return( FALSE );
}
}
if( 0 != uFirstPageDlgID )
g_uAcctMgrUIFirst = uFirstPageDlgID;
if( 0 != uLastPageDlgID )
g_uAcctMgrUILast = uLastPageDlgID;
DEBUGMSG("SetFirstLastPage: updating mail, first = %d, last = %d",
uFirstPageDlgID, uLastPageDlgID);
return TRUE;
}
//+----------------------------------------------------------------------------
//
// Function CICWExtension::QueryInterface
//
// Synopsis This is the standard QI, with support for
// IID_Unknown, IICW_Extension and IID_ICWApprentice
// (Taken from Inside COM, chapter 7)
//
// History 4/23/97 jmazner created
//
//-----------------------------------------------------------------------------
HRESULT CICWExtension::QueryInterface( REFIID riid, void** ppv )
{
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 CICWExtension::AddRef
//
// Synopsis This is the standard AddRef
//
// History 4/23/97 jmazner created
//
//-----------------------------------------------------------------------------
ULONG CICWExtension::AddRef( void )
{
DEBUGMSG("CICWExtension::AddRef called %d", m_lRefCount + 1);
return InterlockedIncrement(&m_lRefCount) ;
}
//+----------------------------------------------------------------------------
//
// Function CICWExtension::Release
//
// Synopsis This is the standard Release
//
// History 4/23/97 jmazner created
//
//-----------------------------------------------------------------------------
ULONG CICWExtension::Release( void )
{
ASSERT( m_lRefCount > 0 );
InterlockedDecrement(&m_lRefCount);
DEBUGMSG("CICWExtension::Release called %d", m_lRefCount);
if( 0 == m_lRefCount )
{
delete( this );
return( 0 );
}
else
{
return( m_lRefCount );
}
}
//+----------------------------------------------------------------------------
//
// Function CICWExtension::CICWExtension
//
// Synopsis The constructor. Initializes member variables to NULL.
//
// History 4/23/97 jmazner created
//
//-----------------------------------------------------------------------------
CICWExtension::CICWExtension( void )
{
DEBUGMSG("CICWExtension constructor called");
m_lRefCount = 0;
m_hWizardHWND = NULL;
}
//+----------------------------------------------------------------------------
//
// Function CICWExtension::CICWExtension
//
// Synopsis The constructor. Since there was no fancy initialization,
// there's nothing to do here.
//
// History 4/23/97 jmazner created
//
//-----------------------------------------------------------------------------
CICWExtension::~CICWExtension( void )
{
DEBUGMSG("CICWExtension destructor called with ref count of %d", m_lRefCount);
}