///////////////////////////////////////////////////////////////////////////// // // Copyright (c) 1996-2000 Microsoft Corporation // // Module Name: // WaitDlg.cpp // // Abstract: // Implementation of the CWaitDlg class. // // Author: // David Potter (davidp) 07-NOV-2000 // // Notes: // ///////////////////////////////////////////////////////////////////////////// #include "StdAfx.h" #include "CluAdmin.h" #include "WaitDlg.h" #include "ExcOper.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // Constant Definitions ///////////////////////////////////////////////////////////////////////////// #define WAIT_DLG_TIMER_ID 10 #define WAIT_DLG_WAIT_TIME 500 #define WAIT_DLG_SKIP_COUNT 6 #define PROGRESS_ICON_COUNT 12 ///////////////////////////////////////////////////////////////////////////// // CWaitDlg dialog ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // Message Maps ///////////////////////////////////////////////////////////////////////////// BEGIN_MESSAGE_MAP( CWaitDlg, CDialog ) //{{AFX_MSG_MAP(CWaitDlg) ON_BN_CLICKED(IDCANCEL, OnCancel) ON_WM_CLOSE() ON_WM_TIMER() ON_COMMAND(IDCANCEL, OnClose) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// //++ // // CWaitDlg::CWaitDlg // // Routine Description: // Default constructor. // // Arguments: // pcszMessageIn -- Message to display. // idsTitleIn -- Title of the dialog. // pwndParentIn -- Parent window for the dialog. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// CWaitDlg::CWaitDlg( LPCTSTR pcszMessageIn, UINT idsTitleIn, // = 0 CWnd * pwndParentIn // = NULL ) : CDialog( IDD, pwndParentIn ) , m_idsTitle( idsTitleIn ) , m_nTickCounter( WAIT_DLG_SKIP_COUNT ) , m_nTotalTickCount( 0 ) , m_timerId( 0 ) { //{{AFX_DATA_INIT(CWaitDlg) //}}AFX_DATA_INIT m_strMessage = pcszMessageIn; if ( m_idsTitle == 0 ) { m_idsTitle = IDS_WAIT_TITLE; } } //*** CWaitDlg::CWaitDlg() ///////////////////////////////////////////////////////////////////////////// //++ // // CWaitDlg::DoDataExchange // // Routine Description: // Do data exchange between the dialog and the class. // // Arguments: // pDX [IN OUT] Data exchange object // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CWaitDlg::DoDataExchange( CDataExchange * pDX ) { CDialog::DoDataExchange( pDX ); //{{AFX_DATA_MAP(CWaitDlg) DDX_Control(pDX, IDC_W_MESSAGE, m_staticMessage); DDX_Control(pDX, IDC_W_PROGRESS, m_iconProgress); DDX_Text(pDX, IDC_W_MESSAGE, m_strMessage); //}}AFX_DATA_MAP } //*** CWaitDlg::DoDataExchange() ///////////////////////////////////////////////////////////////////////////// //++ // // CWaitDlg::OnInitDialog // // Routine Description: // Handler for the WM_INITDIALOG message. // // Arguments: // None. // // Return Value: // TRUE Focus not set yet. // FALSE Focus already set. // //-- ///////////////////////////////////////////////////////////////////////////// BOOL CWaitDlg::OnInitDialog(void) { CString strSubTitle; CDialog::OnInitDialog(); // Start the timer. m_timerId = SetTimer( WAIT_DLG_TIMER_ID, WAIT_DLG_WAIT_TIME, NULL ); // Set the title of the dialog. strSubTitle.LoadString( m_idsTitle ); m_strTitle.Format( _T("%s - %s"), AfxGetApp()->m_pszAppName, strSubTitle ); SetWindowText( m_strTitle ); // Update the progress indicator. UpdateIndicator(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } //*** CWaitDlg::OnInitDialog() ///////////////////////////////////////////////////////////////////////////// //++ // // CWaitDlg::OnClose // // Routine Description: // Handler for the BN_CLICKED message on the Cancel push button and // for the WM_CLOSE message. // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CWaitDlg::OnClose( void ) { CloseTimer(); CDialog::OnClose(); } //*** CWaitDlg::OnClose() ///////////////////////////////////////////////////////////////////////////// //++ // // CWaitDlg::CloseTimer // // Routine Description: // Close the timer down. // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CWaitDlg::CloseTimer( void ) { if ( m_timerId != 0 ) { KillTimer( m_timerId ); } // if: timer is active m_timerId = 0; } //*** CWaitDlg::CloseTimer() ///////////////////////////////////////////////////////////////////////////// //++ // // CWaitDlg::OnTimer // // Routine Description: // Handler for the WM_TIMER message.. // // Arguments: // nIDTimer // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CWaitDlg::OnTimer( UINT nIDTimer ) { // // Don't do anything if it isn't our timer. // if ( nIDTimer != WAIT_DLG_TIMER_ID ) goto Cleanup; // // Advance the progress indicator. // UpdateIndicator(); // // No need to continue if we're just amusing the user. // if ( --m_nTickCounter > 0 ) goto Cleanup; m_nTickCounter = WAIT_DLG_SKIP_COUNT; // // Check here to see if we can exit out. // This method is typically overridden. // OnTimerTick(); Cleanup: return; } //*** CWaitDlg::OnTimer() ///////////////////////////////////////////////////////////////////////////// //++ // // CWaitDlg::UpdateIndicator // // Routine Description: // Update the indicator control. // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CWaitDlg::UpdateIndicator( void ) { if ( m_nTotalTickCount % (1000 / WAIT_DLG_WAIT_TIME) == 0 ) { int nTempTickCount = m_nTotalTickCount / (1000 / WAIT_DLG_WAIT_TIME); HICON hIcon; hIcon = AfxGetApp()->LoadIcon( IDI_PROGRESS_0 + (nTempTickCount % PROGRESS_ICON_COUNT) ); m_iconProgress.SetIcon( hIcon ); } // if: advancing to the next image m_nTotalTickCount++; } //*** CWaitDlg::UpdateIndicator() //*************************************************************************// ///////////////////////////////////////////////////////////////////////////// // CWaitForResourceOfflineDlg dialog ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // Message Maps ///////////////////////////////////////////////////////////////////////////// BEGIN_MESSAGE_MAP( CWaitForResourceOfflineDlg, CWaitDlg ) //{{AFX_MSG_MAP(CWaitForResourceOfflineDlg) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// //++ // // CWaitForResourceOfflineDlg::CWaitForResourceOfflineDlg // // Routine Description: // Constructor. // // Arguments: // pResIn -- Resource to wait on. // pwndParentIn -- Parent window for the dialog. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// CWaitForResourceOfflineDlg::CWaitForResourceOfflineDlg( CResource const * pResIn, CWnd * pwndParentIn // = NULL ) : CWaitDlg( NULL, IDS_WAIT_FOR_OFFLINE_TITLE, pwndParentIn ) , m_pRes( pResIn ) { ASSERT( pResIn != NULL ); //{{AFX_DATA_INIT(CWaitForResourceOfflineDlg) //}}AFX_DATA_INIT } //*** CWaitForResourceOfflineDlg::CWaitForResourceOfflineDlg() ///////////////////////////////////////////////////////////////////////////// //++ // // CWaitForResourceOfflineDlg::OnInitDialog // // Routine Description: // Handler for the WM_INITDIALOG message. // // Arguments: // None. // // Return Value: // TRUE Focus not set yet. // FALSE Focus already set. // //-- ///////////////////////////////////////////////////////////////////////////// BOOL CWaitForResourceOfflineDlg::OnInitDialog( void ) { m_strMessage.Format( IDS_WAIT_FOR_OFFLINE_MESSAGE, m_pRes->StrName() ); return CWaitDlg::OnInitDialog(); } //*** CWaitForResourceOfflineDlg::OnInitDialog() ///////////////////////////////////////////////////////////////////////////// //++ // // CWaitForResourceOfflineDlg::OnTimerTick // // Routine Description: // Determine whether the timer should be terminated. // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CWaitForResourceOfflineDlg::OnTimerTick( void ) { DWORD dwStatus; CLUSTER_RESOURCE_STATE crs; // Get the state of the resource in a loop until either the resource // is no longer in a pending state or the maximum number of retries // is exceeded. // Get the state of the resource. crs = GetClusterResourceState( m_pRes->Hresource(), NULL, NULL, NULL, NULL ); if ( crs == ClusterResourceStateUnknown ) { dwStatus = GetLastError(); CloseTimer(); CDialog::OnCancel(); ThrowStaticException( dwStatus, IDS_GET_RESOURCE_STATE_ERROR, m_pRes->StrName() ); } // if: error getting resource state // See if we reached a stable state. if ( crs < ClusterResourcePending ) { CloseTimer(); CDialog::OnOK(); } } //*** CWaitForResourceOfflineDlg::OnTimerTick() //*************************************************************************// ///////////////////////////////////////////////////////////////////////////// // CWaitForResourceOnlineDlg dialog ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // Message Maps ///////////////////////////////////////////////////////////////////////////// BEGIN_MESSAGE_MAP( CWaitForResourceOnlineDlg, CWaitDlg ) //{{AFX_MSG_MAP(CWaitForResourceOnlineDlg) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// //++ // // CWaitForResourceOnlineDlg::CWaitForResourceOnlineDlg // // Routine Description: // Constructor. // // Arguments: // pResIn -- Resource to wait on. // pwndParentIn -- Parent window for the dialog. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// CWaitForResourceOnlineDlg::CWaitForResourceOnlineDlg( CResource const * pResIn, CWnd * pwndParentIn // = NULL ) : CWaitDlg( NULL, IDS_WAIT_FOR_ONLINE_TITLE, pwndParentIn ) , m_pRes( pResIn ) { ASSERT( pResIn != NULL ); //{{AFX_DATA_INIT(CWaitForResourceOnlineDlg) //}}AFX_DATA_INIT } //*** CWaitForResourceOnlineDlg::CWaitForResourceOnlineDlg() ///////////////////////////////////////////////////////////////////////////// //++ // // CWaitForResourceOnlineDlg::OnInitDialog // // Routine Description: // Handler for the WM_INITDIALOG message. // // Arguments: // None. // // Return Value: // TRUE Focus not set yet. // FALSE Focus already set. // //-- ///////////////////////////////////////////////////////////////////////////// BOOL CWaitForResourceOnlineDlg::OnInitDialog( void ) { m_strMessage.Format( IDS_WAIT_FOR_ONLINE_MESSAGE, m_pRes->StrName() ); return CWaitDlg::OnInitDialog(); } //*** CWaitForResourceOnlineDlg::OnInitDialog() ///////////////////////////////////////////////////////////////////////////// //++ // // CWaitForResourceOnlineDlg::OnTimerTick // // Routine Description: // Determine whether the timer should be terminated. // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CWaitForResourceOnlineDlg::OnTimerTick( void ) { DWORD dwStatus; CLUSTER_RESOURCE_STATE crs; // Get the state of the resource in a loop until either the resource // is no longer in a pending state or the maximum number of retries // is exceeded. // Get the state of the resource. crs = GetClusterResourceState( m_pRes->Hresource(), NULL, NULL, NULL, NULL ); if ( crs == ClusterResourceStateUnknown ) { dwStatus = GetLastError(); CloseTimer(); CDialog::OnCancel(); ThrowStaticException( dwStatus, IDS_GET_RESOURCE_STATE_ERROR, m_pRes->StrName() ); } // if: error getting resource state // See if we reached a stable state. if ( crs < ClusterResourcePending ) { CloseTimer(); CDialog::OnOK(); } } //*** CWaitForResourceOnlineDlg::OnTimerTick()