|
|
//////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2001 Microsoft Corporation
//
// Module Name:
// CSAccountPage.cpp
//
// Maintained By:
// David Potter (DavidP) 22-MAR-2001
// Geoffrey Pease (GPease) 12-MAY-2000
//
//////////////////////////////////////////////////////////////////////////////
#include "Pch.h"
#include "CSAccountPage.h"
DEFINE_THISCLASS("CCSAccountPage");
//////////////////////////////////////////////////////////////////////////////
//++
//
// CCSAccountPage::CCSAccountPage(
// IServiceProvider * pspIn,
// ECreateAddMode ecamCreateAddModeIn,
// BSTR * pbstrUsernameIn,
// BSTR * pbstrPasswordIn,
// BSTR * pbstrDomainIn,
// BSTR * pbstrClusterNameIn
// )
//
//--
//////////////////////////////////////////////////////////////////////////////
CCSAccountPage::CCSAccountPage( IServiceProvider * pspIn, ECreateAddMode ecamCreateAddModeIn, BSTR * pbstrUsernameIn, BSTR * pbstrPasswordIn, BSTR * pbstrDomainIn, BSTR * pbstrClusterNameIn ) { TraceFunc( "" );
// m_hwnd
THR( pspIn->TypeSafeQI( IServiceProvider, &m_psp ) ); m_ecamCreateAddMode = ecamCreateAddModeIn;
m_pbstrUsername = pbstrUsernameIn; m_pbstrPassword = pbstrPasswordIn; m_pbstrDomain = pbstrDomainIn; m_pbstrClusterName = pbstrClusterNameIn;
m_cRef = 0; m_ptgd = NULL;
Assert( m_pbstrUsername != NULL ); Assert( m_pbstrPassword != NULL ); Assert( m_pbstrDomain != NULL ); Assert( m_pbstrClusterName != NULL );
TraceFuncExit();
} //*** CCSAccountPage::CCSAccountPage()
//////////////////////////////////////////////////////////////////////////////
//++
//
// CCSAccountPage::~CCSAccountPage( void )
//
//--
//////////////////////////////////////////////////////////////////////////////
CCSAccountPage::~CCSAccountPage( void ) { TraceFunc( "" );
if ( m_psp != NULL ) { m_psp->Release(); }
if ( m_ptgd != NULL ) { // Make sure we don't get called anymore.
THR( m_ptgd->SetCallback( NULL ) );
m_ptgd->Release(); }
Assert( m_cRef == 0 );
TraceFuncExit();
} //*** CCSAccountPage::~CCSAccountPage()
//////////////////////////////////////////////////////////////////////////////
//++
//
// LRESULT
// CCSAccountPage::OnInitDialog( void )
//
//--
//////////////////////////////////////////////////////////////////////////////
LRESULT CCSAccountPage::OnInitDialog( void ) { TraceFunc( "" );
BOOL bRet; HRESULT hr;
BSTR bstrDomain = NULL;
IUnknown * punk = NULL; ITaskManager * ptm = NULL;
LRESULT lr = FALSE;
//
// (jfranco, bug #377545) Limit user name length to MAX_USERNAME_LENGTH
//
// according to msdn, EM_(SET)LIMITTEXT does not return a value, so ignore what SendDlgItemMessage returns
SendDlgItemMessage( m_hwnd, IDC_CSACCOUNT_E_USERNAME, EM_SETLIMITTEXT, MAX_USERNAME_LENGTH, 0 );
//
// Create the task to get the domains.
//
hr = THR( m_psp->TypeSafeQS( CLSID_TaskManager, ITaskManager, &ptm ) ); if ( FAILED( hr ) ) goto Cleanup;
hr = THR( ptm->CreateTask( TASK_GetDomains, &punk ) ); if ( FAILED( hr ) ) goto Cleanup;
// TraceMoveFromMemoryList( punk, g_GlobalMemoryList );
hr = THR( punk->TypeSafeQI( ITaskGetDomains, &m_ptgd ) ); if ( FAILED( hr ) ) goto Cleanup;
hr = THR( m_ptgd->SetCallback( static_cast< ITaskGetDomainsCallback * >( this ) ) ); if ( FAILED( hr ) ) goto Cleanup;
hr = THR( ptm->SubmitTask( m_ptgd ) ); if ( FAILED( hr ) ) goto Cleanup;
//
// Default to the script supplied information.
//
SetDlgItemText( m_hwnd, IDC_CSACCOUNT_E_USERNAME, *m_pbstrUsername ); SetDlgItemText( m_hwnd, IDC_CSACCOUNT_E_PASSWORD, *m_pbstrPassword ); SetDlgItemText( m_hwnd, IDC_CSACCOUNT_CB_DOMAIN, *m_pbstrDomain );
//
// Get the domain of the current computer.
//
hr = THR( HrGetComputerName( ComputerNameDnsDomain, &bstrDomain ) ); if ( FAILED( hr ) ) goto Cleanup;
SetDlgItemText( m_hwnd, IDC_CSACCOUNT_CB_DOMAIN, bstrDomain );
Cleanup: THR( HrUpdateWizardButtons( FALSE ) );
if ( punk != NULL ) { punk->Release(); }
if ( ptm != NULL ) { ptm->Release(); }
TraceSysFreeString( bstrDomain );
RETURN( lr );
} //*** CCSAccountPage::OnInitDialog()
//////////////////////////////////////////////////////////////////////////////
//++
//
// LRESULT
// CCSAccountPage::OnCommand(
// UINT idNotificationIn,
// UINT idControlIn,
// HWND hwndSenderIn
// )
//
//--
//////////////////////////////////////////////////////////////////////////////
LRESULT CCSAccountPage::OnCommand( UINT idNotificationIn, UINT idControlIn, HWND hwndSenderIn ) { TraceFunc( "" );
LRESULT lr = FALSE;
switch ( idControlIn ) { case IDC_CSACCOUNT_E_PASSWORD: case IDC_CSACCOUNT_E_USERNAME: if ( idNotificationIn == EN_CHANGE ) { THR( HrUpdateWizardButtons( FALSE ) ); lr = TRUE; } break;
case IDC_CSACCOUNT_CB_DOMAIN: if ( idNotificationIn == CBN_EDITCHANGE ) { THR( HrUpdateWizardButtons( FALSE ) ); lr = TRUE; } else if ( idNotificationIn == CBN_SELCHANGE ) { THR( HrUpdateWizardButtons( TRUE ) ); lr = TRUE; } break;
}
RETURN( lr );
} //*** CCSAccountPage::OnCommand()
//////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// CCSAccountPage::HrUpdateWizardButtons(
// BOOL fIgnoreComboxBoxIn
// )
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT CCSAccountPage::HrUpdateWizardButtons( BOOL fIgnoreComboxBoxIn ) { TraceFunc( "" );
DWORD dwLen;
HRESULT hr = S_OK; DWORD dwFlags = PSWIZB_BACK | PSWIZB_NEXT;
dwLen = GetWindowTextLength( GetDlgItem( m_hwnd, IDC_CSACCOUNT_E_USERNAME ) ); if ( dwLen == 0 ) { dwFlags &= ~PSWIZB_NEXT; }
//
// It is valid to have a blank password. No need to check it.
//
if ( !fIgnoreComboxBoxIn ) { LRESULT lr;
dwLen = GetWindowTextLength( GetDlgItem( m_hwnd, IDC_CSACCOUNT_CB_DOMAIN ) ); lr = ComboBox_GetCurSel( GetDlgItem( m_hwnd, IDC_CSACCOUNT_CB_DOMAIN ) ); if ( lr == CB_ERR ) { if ( dwLen == 0 ) { dwFlags &= ~PSWIZB_NEXT; } } else if ( dwLen == 0 ) { dwFlags &= ~PSWIZB_NEXT; } }
PropSheet_SetWizButtons( GetParent( m_hwnd ), dwFlags );
HRETURN( hr );
} //*** CCSAccountPage::HrUpdateWizardButtons()
//////////////////////////////////////////////////////////////////////////////
//++
//
// LRESULT
// CCSAccountPage::OnNotifyQueryCancel( void )
//
//--
//////////////////////////////////////////////////////////////////////////////
LRESULT CCSAccountPage::OnNotifyQueryCancel( void ) { TraceFunc( "" );
LRESULT lr = TRUE;
int iRet;
iRet = MessageBoxFromStrings( m_hwnd, IDS_QUERY_CANCEL_TITLE, IDS_QUERY_CANCEL_TEXT, MB_YESNO );
if ( iRet == IDNO ) { SetWindowLongPtr( m_hwnd, DWLP_MSGRESULT, -1 ); }
RETURN( lr );
} //*** CCSAccountPage::OnNotifyQueryCancel()
//////////////////////////////////////////////////////////////////////////////
//++
//
// LRESULT
// CCSAccountPage::OnNotifySetActive( void )
//
//--
//////////////////////////////////////////////////////////////////////////////
LRESULT CCSAccountPage::OnNotifySetActive( void ) { TraceFunc( "" );
HRESULT hr;
OBJECTCOOKIE cookieDummy;
LRESULT lr = TRUE;
IUnknown * punk = NULL; IClusCfgClusterInfo * pccci = NULL; IClusCfgCredentials * piccc = NULL; IObjectManager * pom = NULL;
BSTR bstrUsername = NULL; BSTR bstrPassword = NULL; BSTR bstrDomain = NULL;
if ( m_ecamCreateAddMode == camADDING ) { Assert( *m_pbstrClusterName != NULL );
//
// See if the cluster configuration information has something
// different.
//
hr = THR( m_psp->TypeSafeQS( CLSID_ObjectManager, IObjectManager, &pom ) ); if ( FAILED( hr ) ) goto Cleanup;
hr = THR( pom->FindObject( CLSID_ClusterConfigurationType, NULL, *m_pbstrClusterName, DFGUID_ClusterConfigurationInfo, &cookieDummy, &punk ) ); if ( FAILED( hr ) ) goto Cleanup;
hr = THR( punk->TypeSafeQI( IClusCfgClusterInfo, &pccci ) ); if ( FAILED( hr ) ) goto Cleanup;
hr = THR( pccci->GetClusterServiceAccountCredentials( &piccc ) ); if ( FAILED( hr ) ) goto Cleanup;
hr = THR( piccc->GetCredentials( &bstrUsername, &bstrDomain, &bstrPassword ) ); if ( FAILED( hr ) ) goto Cleanup;
SetDlgItemText( m_hwnd, IDC_CSACCOUNT_E_USERNAME, bstrUsername ); SetDlgItemText( m_hwnd, IDC_CSACCOUNT_CB_DOMAIN, bstrDomain );
//
// Only update the password if we actually received something from GetCredentials().
// When we first enter this page, this will not be the case and we would nuke the
// scripted password.
//
if ( ( bstrPassword != NULL ) && ( *bstrPassword != L'\0' ) ) SetDlgItemText( m_hwnd, IDC_CSACCOUNT_E_PASSWORD, bstrPassword );
//
// Disable the username and domain windows.
//
EnableWindow( GetDlgItem( m_hwnd, IDC_CSACCOUNT_E_USERNAME ), FALSE ); EnableWindow( GetDlgItem( m_hwnd, IDC_CSACCOUNT_CB_DOMAIN ), FALSE ); }
Cleanup: THR( HrUpdateWizardButtons( FALSE ) );
if ( punk != NULL ) { punk->Release(); }
if ( pom != NULL ) { pom->Release(); }
if ( piccc != NULL ) { piccc->Release(); }
if ( pccci != NULL ) { pccci->Release(); }
TraceSysFreeString( bstrUsername ); TraceSysFreeString( bstrPassword ); TraceSysFreeString( bstrDomain );
RETURN( lr );
} //*** CCSAccountPage::OnNotifySetActive()
//////////////////////////////////////////////////////////////////////////////
//++
//
// LRESULT
// CCSAccountPage::OnNotifyWizNext( void )
//
//--
//////////////////////////////////////////////////////////////////////////////
LRESULT CCSAccountPage::OnNotifyWizNext( void ) { TraceFunc( "" );
HRESULT hr; HWND hwnd; DWORD dwLen;
BSTR bstrUsername = NULL; BSTR bstrPassword = NULL; BSTR bstrDomain = NULL;
OBJECTCOOKIE cookieDummy;
LRESULT lr = TRUE;
IUnknown * punk = NULL; IObjectManager * pom = NULL; IClusCfgClusterInfo * pccci = NULL; IClusCfgCredentials * piccc = NULL;
//
// Get the username from the UI.
//
hwnd = GetDlgItem( m_hwnd, IDC_CSACCOUNT_E_USERNAME ); Assert( hwnd != NULL );
dwLen = GetWindowTextLength( hwnd ); Assert( dwLen != 0 ); dwLen ++;
bstrUsername = TraceSysAllocStringByteLen( NULL, sizeof(WCHAR) * ( dwLen + 1 ) ); if ( bstrUsername == NULL ) goto OutOfMemory;
GetWindowText( hwnd, bstrUsername, dwLen );
//
// Get the password from the UI.
//
hwnd = GetDlgItem( m_hwnd, IDC_CSACCOUNT_E_PASSWORD ); Assert( hwnd != NULL );
dwLen = GetWindowTextLength( hwnd ); dwLen ++;
bstrPassword = TraceSysAllocStringByteLen( NULL, sizeof(WCHAR) * ( dwLen + 1 ) ); if ( bstrPassword == NULL ) goto OutOfMemory;
GetWindowText( hwnd, bstrPassword, dwLen );
//
// Get the domain from the UI.
//
hwnd = GetDlgItem( m_hwnd, IDC_CSACCOUNT_CB_DOMAIN ); Assert( hwnd != NULL );
dwLen = GetWindowTextLength( hwnd ); Assert( dwLen != 0 ); dwLen ++;
bstrDomain = TraceSysAllocStringByteLen( NULL, sizeof(WCHAR) * ( dwLen + 1 ) ); if ( bstrDomain == NULL ) goto OutOfMemory;
GetWindowText( hwnd, bstrDomain, dwLen );
//
// Release the old strings (if any).
//
TraceSysFreeString( *m_pbstrUsername ); TraceSysFreeString( *m_pbstrPassword ); TraceSysFreeString( *m_pbstrDomain );
//
// Give ownership away.
//
*m_pbstrUsername = bstrUsername; *m_pbstrPassword = bstrPassword; *m_pbstrDomain = bstrDomain;
bstrUsername = NULL; bstrPassword = NULL; bstrDomain = NULL;
//
// Grab the object manager.
//
hr = THR( m_psp->TypeSafeQS( CLSID_ObjectManager, IObjectManager, &pom ) ); if ( FAILED( hr ) ) goto Error;
//
// Get the cluster configuration info.
//
hr = THR( pom->FindObject( CLSID_ClusterConfigurationType, NULL, *m_pbstrClusterName, DFGUID_ClusterConfigurationInfo, &cookieDummy, &punk ) ); if ( FAILED( hr ) ) goto Error;
hr = THR( punk->TypeSafeQI( IClusCfgClusterInfo, &pccci ) ); if ( FAILED( hr ) ) goto Cleanup;
//
// Set the cluster service account credentials...
//
hr = THR( pccci->GetClusterServiceAccountCredentials( &piccc ) ); if ( FAILED( hr ) ) goto Error;
hr = THR( piccc->SetCredentials( *m_pbstrUsername, *m_pbstrDomain, *m_pbstrPassword ) ); if ( FAILED( hr ) ) goto Error;
Cleanup: if ( punk != NULL ) { punk->Release(); }
TraceSysFreeString( bstrUsername ); TraceSysFreeString( bstrPassword ); TraceSysFreeString( bstrDomain );
if ( piccc != NULL ) { piccc->Release(); }
if ( pccci != NULL ) { pccci->Release(); }
if ( pom != NULL ) { pom->Release(); }
RETURN( lr );
Error: SetWindowLongPtr( m_hwnd, DWLP_MSGRESULT, -1 ); goto Cleanup;
OutOfMemory: goto Error;
} //*** CCSAccountPage::OnNotifyWizNext()
//////////////////////////////////////////////////////////////////////////////
//++
//
// LRESULT
// CCSAccountPage::OnNotify(
// WPARAM idCtrlIn,
// LPNMHDR pnmhdrIn
// )
//
//--
//////////////////////////////////////////////////////////////////////////////
LRESULT CCSAccountPage::OnNotify( WPARAM idCtrlIn, LPNMHDR pnmhdrIn ) { TraceFunc( "" );
LRESULT lr = TRUE;
SetWindowLongPtr( m_hwnd, DWLP_MSGRESULT, 0 );
switch( pnmhdrIn->code ) { case PSN_SETACTIVE: lr = OnNotifySetActive(); break;
case PSN_WIZNEXT: lr = OnNotifyWizNext(); break;
case PSN_QUERYCANCEL: lr = OnNotifyQueryCancel(); break; }
RETURN( lr );
} //*** CCSAccountPage::OnNotify()
//////////////////////////////////////////////////////////////////////////////
//++
//
// INT_PTR
// CALLBACK
// CCSAccountPage::S_DlgProc(
// HWND hDlgIn,
// UINT MsgIn,
// WPARAM wParam,
// LPARAM lParam
// )
//
//--
//////////////////////////////////////////////////////////////////////////////
INT_PTR CALLBACK CCSAccountPage::S_DlgProc( HWND hDlgIn, UINT MsgIn, WPARAM wParam, LPARAM lParam ) { // Don't do TraceFunc because every mouse movement
// will cause this function to be called.
WndMsg( hDlgIn, MsgIn, wParam, lParam );
LRESULT lr = FALSE;
CCSAccountPage * pPage = reinterpret_cast< CCSAccountPage *> ( GetWindowLongPtr( hDlgIn, GWLP_USERDATA ) );
if ( MsgIn == WM_INITDIALOG ) { PROPSHEETPAGE * ppage = reinterpret_cast< PROPSHEETPAGE * >( lParam ); SetWindowLongPtr( hDlgIn, GWLP_USERDATA, (LPARAM) ppage->lParam ); pPage = reinterpret_cast< CCSAccountPage * >( ppage->lParam ); pPage->m_hwnd = hDlgIn; }
if ( pPage != NULL ) { Assert( hDlgIn == pPage->m_hwnd );
switch( MsgIn ) { case WM_INITDIALOG: lr = pPage->OnInitDialog(); break;
case WM_NOTIFY: lr = pPage->OnNotify( wParam, reinterpret_cast< LPNMHDR >( lParam ) ); break;
case WM_COMMAND: lr= pPage->OnCommand( HIWORD( wParam ), LOWORD( wParam ), (HWND) lParam ); break;
// no default clause needed
} }
return lr;
} //*** CCSAccountPage::S_DlgProc()
// ************************************************************************
//
// IUnknown
//
// ************************************************************************
//////////////////////////////////////////////////////////////////////////////
//++
//
// STDMETHODIMP
// CCSAccountPage::QueryInterface(
// REFIID riidIn,
// LPVOID * ppvOut
// )
//
//--
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CCSAccountPage::QueryInterface( REFIID riidIn, LPVOID * ppvOut ) { TraceQIFunc( riidIn, ppvOut );
HRESULT hr = E_NOINTERFACE;
if ( IsEqualIID( riidIn, IID_IUnknown ) ) { *ppvOut = static_cast< ITaskGetDomainsCallback * >( this ); hr = S_OK; } // if: IUnknown
else if ( IsEqualIID( riidIn, IID_ITaskGetDomainsCallback ) ) { *ppvOut = TraceInterface( __THISCLASS__, ITaskGetDomainsCallback, this, 0 ); hr = S_OK; } // else if: ITaskGetDomainsCallback
if ( SUCCEEDED( hr ) ) { ((IUnknown*) *ppvOut)->AddRef(); } // if: success
QIRETURN_IGNORESTDMARSHALLING( hr, riidIn );
} //*** CCSAccountPage::QueryInterface()
//////////////////////////////////////////////////////////////////////////////
//++
//
// STDMETHODIMP_( ULONG )
// CCSAccountPage::AddRef( void )
//
//--
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_( ULONG ) CCSAccountPage::AddRef( void ) { TraceFunc( "[IUnknown]" );
InterlockedIncrement( &m_cRef );
RETURN( m_cRef );
} //*** CCSAccountPage::AddRef()
//////////////////////////////////////////////////////////////////////////////
//++
//
// STDMETHODIMP_( ULONG )
// CCSAccountPage::Release( void )
//
//--
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_( ULONG ) CCSAccountPage::Release( void ) { TraceFunc( "[IUnknown]" );
InterlockedDecrement( &m_cRef );
if ( m_cRef ) RETURN( m_cRef );
// TraceDo( delete this );
RETURN(0);
} //*** CCSAccountPage::Release()
//****************************************************************************
//
// ITaskGetDomainsCallback
//
//****************************************************************************
//////////////////////////////////////////////////////////////////////////////
//++
//
// STDMETHODIMP
// CCSAccountPage::ReceiveDomainResult(
// HRESULT hrIn
// )
//
//--
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CCSAccountPage::ReceiveDomainResult( HRESULT hrIn ) { TraceFunc( "[ITaskGetDomainsCallback]" );
HRESULT hr;
hr = THR( m_ptgd->SetCallback( NULL ) );
HRETURN( hr );
} //*** CCSAccountPage::ReceiveResult()
//////////////////////////////////////////////////////////////////////////////
//++
//
// STDMETHODIMP
// CCSAccountPage::ReceiveDomainName(
// LPCWSTR pcszDomainIn
// )
//
//--
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CCSAccountPage::ReceiveDomainName( LPCWSTR pcszDomainIn ) { TraceFunc( "[ITaskGetDomainsCallback]" );
HRESULT hr = S_OK;
ComboBox_AddString( GetDlgItem( m_hwnd, IDC_CSACCOUNT_CB_DOMAIN ), pcszDomainIn );
HRETURN( hr );
} //*** CCSAccountPage::ReceiveName()
|