534 lines
13 KiB
C++
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()
|