windows-nt/Source/XPSP1/NT/base/cluster/admin/cluadmin/waitdlg.cpp
2020-09-26 16:20:57 +08:00

534 lines
13 KiB
C++

/////////////////////////////////////////////////////////////////////////////
//
// 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()