windows-nt/Source/XPSP1/NT/inetsrv/iis/ui/admin/mmc/sdprg.cpp
2020-09-26 16:20:57 +08:00

318 lines
4.5 KiB
C++

/*++
Copyright (c) 1994-1998 Microsoft Corporation
Module Name :
sdprg.h
Abstract:
IIS Shutdown/restart dialog definitions
Author:
Ronald Meijer (ronaldm)
Project:
Internet Services Manager
Revision History:
--*/
//
// Include Files
//
#include "stdafx.h"
#include "inetmgr.h"
#include "sdprg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//
// Timer ID and values
//
#define ID_TIMER (1)
#define A_SECOND (1000L)
CShutProgressDlg::CShutProgressDlg(
IN IISCOMMAND * pCommand
)
/*++
Routine Description:
Constructor for shutdown progress dialog
Arguments:
IISCOMMAND * pCommand : Command structure
Return Value:
N/A
--*/
: CDialog(CShutProgressDlg::IDD, pCommand->pParent),
m_pCommand(pCommand),
m_uTimeoutSec(pCommand->dwMilliseconds / A_SECOND)
{
//{{AFX_DATA_INIT(CShutProgressDlg)
//}}AFX_DATA_INIT
}
void
CShutProgressDlg::DoDataExchange(
IN CDataExchange * pDX
)
/*++
Routine Description:
Initialise/Store control data
Arguments:
CDataExchange * pDX - DDX/DDV control structure
Return Value:
None
--*/
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CShutProgressDlg)
DDX_Control(pDX, IDC_STATIC_PROGRESS, m_static_ProgressMsg);
DDX_Control(pDX, IDC_PROGRESS_SHUTDOWN, m_prgShutdown);
//}}AFX_DATA_MAP
}
//
// Message Map
//
BEGIN_MESSAGE_MAP(CShutProgressDlg, CDialog)
//{{AFX_MSG_MAP(CShutProgressDlg)
ON_WM_TIMER()
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//
// Message Handlers
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
BOOL
CShutProgressDlg::OnInitDialog()
/*++
Routine Description:
WM_INITDIALOG handler. Initialize the dialog.
Arguments:
None.
Return Value:
TRUE if no focus is to be set automatically, FALSE if the focus
is already set.
--*/
{
CDialog::OnInitDialog();
VERIFY(m_strProgress.LoadString(IDS_SHUTDOWN_PROGRESS));
m_nProgress = 0;
#if _MFC_VER >= 0x0600
m_prgShutdown.SetRange32(0, m_uTimeoutSec);
#else
m_prgShutdown.SetRange(0, m_uTimeoutSec);
#endif
m_prgShutdown.SetPos(m_nProgress);
m_prgShutdown.SetStep(1);
//
// Start the progress bar ticking, once per second.
//
UINT_PTR nID = SetTimer(ID_TIMER, A_SECOND, NULL);
if (nID != ID_TIMER)
{
//
// Failed to create the timer. Pop up an error, and
// cancel the dialog.
//
CError err(ERROR_NO_SYSTEM_RESOURCES);
err.MessageBox();
EndDialog(IDCANCEL);
}
return TRUE;
}
void
CShutProgressDlg::OnTimer(
IN UINT nIDEvent
)
/*++
Routine Description:
Timer handler. Upgrade the progressbar with another second on the clock
Arguments:
UINT nIDEvent : Timer id
Return Value:
None
--*/
{
ASSERT(nIDEvent == ID_TIMER);
m_prgShutdown.SetPos(++m_nProgress);
//
// Display progress on the tick marker
//
CString str;
str.Format(m_strProgress, m_uTimeoutSec - (UINT)m_nProgress + 1);
m_static_ProgressMsg.SetWindowText(str);
//
// Check to see if the stop thread has finished its action already
//
BOOL fFinished;
EnterCriticalSection(&m_pCommand->cs);
fFinished = m_pCommand->fFinished;
LeaveCriticalSection(&m_pCommand->cs);
if (fFinished)
{
//
// The worker thread has finished, so there's no reason to
// keep the user in suspense -- dismiss the dialog
//
EndDialog(IDCANCEL);
}
if ((UINT)m_nProgress > m_uTimeoutSec)
{
//
// We've timed out -- tell the main thread to Kill!()
//
OnOK();
}
//
// I doubt there's any default processing here, but anyway...
//
CDialog::OnTimer(nIDEvent);
}
void
CShutProgressDlg::OnDestroy()
/*++
Routine Description:
Handle dialog destruction, kill the timer.
Arguments:
None
Return Value:
None
--*/
{
CDialog::OnDestroy();
KillTimer(ID_TIMER);
}
void
CShutProgressDlg::OnOK()
/*++
Routine Description:
OK handler -- ok button maps to "Kill Now!"
Arguments:
None
Return Value:
None
--*/
{
//
// Kill!
//
EndDialog(IDOK);
}
void
CShutProgressDlg::OnCancel()
/*++
Routine Description:
Cancel button handler. This dialog cannot be cancelled, so the cancel
notification is eaten.
Arguments:
None
Return Value:
None
--*/
{
//
// Eat cancel command (user pressed escape)
//
}