318 lines
4.5 KiB
C++
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)
|
||
|
//
|
||
|
}
|