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.
 
 
 
 
 
 

455 lines
12 KiB

//----------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2001.
//
// File: Snppage.cpp
//
// Contents: WiF Policy Snapin
//
//
// History: TaroonM
// 10/30/01
//
//----------------------------------------------------------------------------
#include "stdafx.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSnapPage property page base class
IMPLEMENT_DYNCREATE(CSnapPage, CPropertyPage)
BEGIN_MESSAGE_MAP(CSnapPage, CPropertyPage)
//{{AFX_MSG_MAP(CSnapPage)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
CSnapPage::CSnapPage (UINT nIDTemplate, BOOL bWiz97, UINT nNextIDD) : CPropertyPage(nIDTemplate)
{
m_pspiResultItem = NULL;
m_pDefaultCallback = NULL;
m_bDoRefresh = TRUE;
m_bModified = FALSE;
m_bInitializing = FALSE;
#ifdef _DEBUG
m_bDebugNewState = false;
#endif
// if they set this to begin with, but note that calling InitWiz97 turns this on anyway
m_bWiz97 = bWiz97;
m_nIDD = nIDTemplate;
m_nNextIDD = nNextIDD;
#ifdef WIZ97WIZARDS
// copy the base class m_psp to ours
m_psp.dwSize = sizeof (CPropertyPage::m_psp);
memcpy (&m_psp, &(CPropertyPage::m_psp), CPropertyPage::m_psp.dwSize);
m_psp.dwSize = sizeof (PROPSHEETPAGE);
m_pWiz97Sheet = NULL;
m_pHeaderTitle = NULL;
m_pHeaderSubTitle = NULL;
m_pstackWiz97Pages = NULL;
#endif
}
CSnapPage::~CSnapPage ()
{
// guess we are done with the m_pspiResultItem, decrement its reference count
if (m_pspiResultItem)
{
m_pspiResultItem->Release();
m_pspiResultItem = NULL;
}
// Page's parent or caller will delete these objs
m_pstackWiz97Pages = NULL;
#ifdef WIZ97WIZARDS
DELETE_OBJECT(m_pHeaderTitle);
DELETE_OBJECT(m_pHeaderSubTitle);
#endif
}
UINT CALLBACK CSnapPage::PropertyPageCallback (HWND hwnd, UINT uMsg, LPPROPSHEETPAGE ppsp)
{
// get our psuedo this pointer
CSnapPage* pThis = (CSnapPage*) ppsp->lParam;
// get the default callback pointer
UINT (CALLBACK* pDefaultCallback) (HWND hwnd, UINT uMsg, LPPROPSHEETPAGE ppsp) = pThis->m_pDefaultCallback;
switch (uMsg)
{
case PSPCB_RELEASE:
{
// Delete ourself
AFX_MANAGE_STATE(AfxGetStaticModuleState());
delete pThis;
break;
}
}
// call the default cleanup function if there was one (because we are using
// mfc and it always puts in a callback for itself there should be one... or
// we block the page from coming up)
if (pDefaultCallback)
{
return pDefaultCallback (hwnd, uMsg, ppsp);
}
// There should be a default callback to handle creation, otherwise page will not
// be created because we return 0.
ASSERT( PSPCB_CREATE != uMsg );
// to create the page 1 allows it and 0 says 'no way'
return 0;
}
#ifdef WIZ97WIZARDS
BOOL CSnapPage::OnSetActive()
{
// NOTE: we only ever want to do this if it is a wizard, otherwise the
// cancel button gets the default focus!
if (m_bWiz97)
{
// now we can set our buttons correctly
GetParent()->SendMessage(PSM_SETWIZBUTTONS, 0, m_dwWizButtonFlags);
}
return CPropertyPage::OnSetActive();
}
LRESULT CSnapPage::OnWizardBack()
{
// use the snapitem to help us keep track of wizard state
if (m_pspiResultItem)
{
// pop to the last page
return m_pspiResultItem->PopWiz97Page ();
}
else if (NULL != m_pstackWiz97Pages)
{
// Or, use our own stack, if we have one
return PopWiz97Page();
}
return CPropertyPage::OnWizardBack();
}
LRESULT CSnapPage::OnWizardNext()
{
// use the snapitem to help us keep track of wizard state
if (m_pspiResultItem)
{
// push our id, in case they need to use the 'back' button
m_pspiResultItem->PushWiz97Page (m_nIDD);
}
else if (NULL != m_pstackWiz97Pages)
{
// Or, use our own stack, if we have one
PushWiz97Page( m_nIDD );
}
// If we have the ID of the next page, return it, otherwise return default
return ((m_nNextIDD != -1) ? m_nNextIDD : CPropertyPage::OnWizardNext());
}
int CSnapPage::PopWiz97Page ()
{
ASSERT( NULL != m_pstackWiz97Pages );
// There better be something on the stack if we're popping it
ASSERT( m_pstackWiz97Pages->size() );
int i;
i = m_pstackWiz97Pages->top();
m_pstackWiz97Pages->pop();
return i;
}
void CSnapPage::PushWiz97Page (int nIDD)
{
ASSERT( NULL != m_pstackWiz97Pages );
m_pstackWiz97Pages->push(nIDD);
}
BOOL CSnapPage::InitWiz97( CComObject<CSecPolItem> *pSecPolItem, DWORD dwFlags, DWORD dwWizButtonFlags, UINT nHeaderTitle, UINT nSubTitle )
{
CommonInitWiz97( pSecPolItem, dwFlags, dwWizButtonFlags, nHeaderTitle, nSubTitle );
// Use our own callback.
SetCallback( CSnapPage::PropertyPageCallback );
return S_OK;
}
BOOL CSnapPage::InitWiz97( LPFNPSPCALLBACK pfnCallback, CComObject<CSecPolItem> *pSecPolItem, DWORD dwFlags, DWORD dwWizButtonFlags /*= 0*/, UINT nHeaderTitle /*= 0*/, UINT nSubTitle /*= 0*/, STACK_INT *pstackPages /*=NULL*/)
{
CommonInitWiz97( pSecPolItem, dwFlags, dwWizButtonFlags, nHeaderTitle, nSubTitle );
// Use the caller's callback which should call ours after it does whatever it does.
SetCallback( pfnCallback );
// Use the stack owned by our parent sheet
m_pstackWiz97Pages = pstackPages;
return S_OK;
}
void CSnapPage::CommonInitWiz97( CComObject<CSecPolItem> *pSecPolItem, DWORD dwFlags, DWORD dwWizButtonFlags, UINT nHeaderTitle, UINT nSubTitle )
{
m_psp.dwFlags |= dwFlags;
// they called us this way, so ... they must expect ...
m_bWiz97 = TRUE;
// get strings
CString str;
str.LoadString (nHeaderTitle);
m_pHeaderTitle = (TCHAR*) malloc ((str.GetLength()+1)*sizeof(TCHAR));
if (m_pHeaderTitle)
{
lstrcpy (m_pHeaderTitle, str.GetBuffer(20));
} else
{
m_pHeaderTitle = _T("\0");
}
str.ReleaseBuffer(-1);
str.LoadString (nSubTitle);
m_pHeaderSubTitle = (TCHAR*) malloc ((str.GetLength()+1)*sizeof(TCHAR));
if (m_pHeaderSubTitle)
{
lstrcpy (m_pHeaderSubTitle, str.GetBuffer(20));
} else
{
m_pHeaderSubTitle = _T("\0");
}
m_psp.pszHeaderTitle = m_pHeaderTitle;
m_psp.pszHeaderSubTitle = m_pHeaderSubTitle;
// save off the button flags
m_dwWizButtonFlags = dwWizButtonFlags;
// save the snapitem
SetResultObject(pSecPolItem);
}
void CSnapPage::SetCallback( LPFNPSPCALLBACK pfnCallback )
{
// attempt the wilder CSnapPage mmc stuff
// store the existing Callback information (if any)
if (m_psp.dwFlags |= PSP_USECALLBACK)
{
m_pDefaultCallback = m_psp.pfnCallback;
}
// hook up our callback function
m_psp.dwFlags |= PSP_USECALLBACK;
m_psp.lParam = reinterpret_cast<LONG_PTR>(this);
m_psp.pfnCallback = pfnCallback;
// IF WE SWITCH TO DLL VERSION OF MFC WE NEED THIS
// hook up mmc (this is an mmc hack to avoid an issue with AFX_MANAGE_STATE in MFC)
HRESULT hr = ::MMCPropPageCallback (&m_psp);
ASSERT (hr == S_OK);
}
#endif
void CSnapPage::SetPostRemoveFocus( int nListSel, UINT nAddId, UINT nRemoveId, CWnd *pwndPrevFocus )
{
ASSERT( 0 != nAddId );
ASSERT( 0 != nRemoveId );
// Fix up focus, if necessary
SET_POST_REMOVE_FOCUS<CDialog>( this, nListSel, nAddId, nRemoveId, pwndPrevFocus );
}
BOOL CSnapPage::OnWizardFinish()
{
return CPropertyPage::OnWizardFinish();
}
HRESULT CSnapPage::Initialize( CComObject<CSecPolItem> *pSecPolItem)
{
HRESULT hr = S_OK;
// turn on an hourglass
CWaitCursor waitCursor;
// store the snap object
ASSERT( NULL == m_pspiResultItem );
SetResultObject(pSecPolItem);
ASSERT( NULL != m_pspiResultItem );
// store the existing Callback information (if any)
if (m_psp.dwFlags |= PSP_USECALLBACK)
{
m_pDefaultCallback = m_psp.pfnCallback;
}
// hook up our callback function
m_psp.dwFlags |= PSP_USECALLBACK;
m_psp.lParam = reinterpret_cast<LONG_PTR>(this);
m_psp.pfnCallback = CSnapPage::PropertyPageCallback;
// IF WE SWITCH TO DLL VERSION OF MFC WE NEED THIS
// hook up mmc (this is an mmc hack to avoid an issue with AFX_MANAGE_STATE in MFC)
hr = ::MMCPropPageCallback (&m_psp);
ASSERT (hr == S_OK);
return hr;
};
void CSnapPage::SetModified( BOOL bChanged /*= TRUE*/ )
{
// Ignore modifications made during dialog initialization, its not
// the user doing anything.
if (!HandlingInitDialog())
{
m_bModified = bChanged;
if (bChanged && m_spManager.p)
m_spManager->SetModified(TRUE);
}
CPropertyPage::SetModified( bChanged );
}
/////////////////////////////////////////////////////////////////////////////
// CSnapPage message handlers
BOOL CSnapPage::OnInitDialog()
{
m_bInitializing = TRUE;
#ifdef _DEBUG
if (m_bDebugNewState)
{
// Page should be unmodified, unless its explicitly set new.
ASSERT( m_bModified );
}
else
{
ASSERT( !m_bModified );
}
#endif
// add context help to the style bits
if (GetParent())
{
//GetParent()->ModifyStyleEx (0, WS_EX_CONTEXTHELP, 0);
}
// call base class and dis-regard return value as per the docs
CPropertyPage::OnInitDialog();
return TRUE;
}
BOOL CSnapPage::OnApply()
{
BOOL fRet = TRUE;
if (!m_bWiz97) //$review do we need this bool check here?
{
m_bModified = FALSE;
if (m_spManager.p && m_spManager->IsModified()) //to avoid call mutliple times
{
//the manager will force other pages in the sheet to apply
fRet = m_spManager->OnApply();
}
}
if (fRet)
{
return CPropertyPage::OnApply();
}
else
{
//Some page refuse to apply, we set this page back to dirty (will also
// in turn set the property sheet manager to dirty)
SetModified();
}
return fRet;
}
void CSnapPage::OnCancel()
{
if (m_spManager.p)
{
m_spManager->OnCancel();
}
// pass to base class
CPropertyPage::OnCancel();
}
void CSnapPage::OnDestroy()
{
CPropertyPage::OnDestroy();
}
BOOL CSnapPage::ActivateThisPage()
{
BOOL bRet = FALSE;
// Activate this page so it is visible. Return TRUE if successful.
// if the page is in a wizard, it wont have a property sheet manager
if (m_spManager.p)
{
CPropertySheet * pSheet = m_spManager->PropertySheet();
if (pSheet)
{
pSheet->SetActivePage(this);
bRet = TRUE;
}
}
return bRet;
}
BOOL CSnapPage::CancelApply()
{
// This function should be called from OnApply when changes made
// to the page are being rejected.
// Return FALSE to abort the OnApply
return FALSE;
}
IMPLEMENT_DYNCREATE(CSnapinPropPage, CSnapPage)
//Check whether the Cancel button of the property sheet is disabled by CancelToClose
BOOL CSnapPage::IsCancelEnabled()
{
BOOL fRet = TRUE;
CWnd * pWnd = GetParent()->GetDlgItem(IDCANCEL);
ASSERT(pWnd);
if (pWnd)
{
fRet = pWnd->IsWindowEnabled();
}
return fRet;
}