Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

577 lines
16 KiB

/*
****************************************************************************
| Copyright (C) 2001 Microsoft Corporation
|
| Module Name:
|
| UI.cpp
|
| Abstract:
| This is the UI code for the IIS6 Monitor tool
|
| Author:
| Ivo Jeglov (ivelinj)
|
| Revision History:
| November 2001
|
****************************************************************************
*/
#include "stdafx.h"
#include "resource.h"
#include <windowsx.h>
#include "UI.h"
#include "Utils.h"
// Property pages DLG procs
INT_PTR CALLBACK WelcomeDlgProc ( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam );
INT_PTR CALLBACK LicenseDlgProc ( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam );
INT_PTR CALLBACK PolicyDlgProc ( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam );
INT_PTR CALLBACK SettingsDlgProc ( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam );
INT_PTR CALLBACK InstallDlgProc ( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam );
INT_PTR CALLBACK ResultDlgProc ( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam );
// Other DLG procs
INT_PTR CALLBACK FatDlgProc ( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam );
INT_PTR CALLBACK ProgressDlgProc ( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam );
// Helpers
BOOL CheckForFAT ( HINSTANCE hInst, HWND hwndParent );
// Shared data for all the wizard pages
struct _FontData
{
HFONT hTitle;
HFONT hTips;
};
// Settings data
struct _Settings
{
BOOL bEnableTrail;
DWORD dwKeepFilesPeriod;
};
struct _SharedData
{
_FontData Fonts;
_Settings Settings;
LPCTSTR szError;
HINSTANCE hInst;
};
// Helpers
void LoadTextInCtrl ( UINT nResID, HWND hCtrl );
void AjustLicenseWizBtn ( HWND hwndPage );
void InitFonts ( _FontData& FontData );
void SetWndFontFromLPARAM ( HWND hwndCtrl, LPARAM lParam, BOOL bTitle );
void DoInstallUI( HINSTANCE hInstance )
{
const BYTE PAGE_COUNT = 6;
PROPSHEETPAGEW psp = { 0 }; // Defines the property sheet pages
HPROPSHEETPAGE ahPsp[ PAGE_COUNT ] = { 0 }; // An array to hold the page's HPROPSHEETPAGE handles
PROPSHEETHEADERW psh = { 0 }; // Defines the property sheet
_SharedData WizData = { 0 }; // The settings data structure
// Create the fonts
InitFonts( /*r*/WizData.Fonts );
WizData.hInst = hInstance;
// Create the Wizard pages
///////////////////////////////////////////////////////////////////
// Welcome page
psp.dwSize = sizeof( psp );
psp.dwFlags = PSP_DEFAULT | PSP_HIDEHEADER | PSP_USETITLE;
psp.hInstance = hInstance;
psp.lParam = reinterpret_cast<LPARAM>( &WizData );
psp.pfnDlgProc = WelcomeDlgProc;
psp.pszTemplate = MAKEINTRESOURCEW( IDD_WPAGE_WELCOME );
psp.pszTitle = MAIN_TITLE;
ahPsp[ 0 ] = ::CreatePropertySheetPageW( &psp );
// License page
psp.pfnDlgProc = LicenseDlgProc;
psp.pszTemplate = MAKEINTRESOURCEW( IDD_WPAGE_LICENSE );
ahPsp[ 1 ] = ::CreatePropertySheetPageW( &psp );
// Policy page
psp.pfnDlgProc = PolicyDlgProc;
psp.pszTemplate = MAKEINTRESOURCEW( IDD_WPAGE_POLICY );
ahPsp[ 2 ] = ::CreatePropertySheetPageW( &psp );
// Settings Page
psp.pszTemplate = MAKEINTRESOURCEW( IDD_WPAGE_SETUP );
psp.pfnDlgProc = SettingsDlgProc;
ahPsp[ 3 ] = ::CreatePropertySheetPageW( &psp );
// Install Page
psp.pszTemplate = MAKEINTRESOURCEW( IDD_WPAGE_INSTALL );
psp.pfnDlgProc = InstallDlgProc;
ahPsp[ 4 ] = ::CreatePropertySheetPageW( &psp );
// Result page
psp.pszTemplate = MAKEINTRESOURCEW( IDD_WPAGE_RESULT );
psp.pfnDlgProc = ResultDlgProc;
ahPsp[ 5 ] = ::CreatePropertySheetPageW( &psp );
// Create the property sheet
psh.dwSize = sizeof( psh );
psh.hInstance = hInstance;
psh.hwndParent = NULL;
psh.phpage = ahPsp;
psh.dwFlags = PSH_DEFAULT | PSH_NOCONTEXTHELP | PSH_WIZARD97 | PSH_USEICONID;
psh.pszIcon = MAKEINTRESOURCEW( IDI_SETUP );
psh.nStartPage = 0;
psh.nPages = PAGE_COUNT;
// Show the wizard.
VERIFY( ::PropertySheetW( &psh ) != -1 );
::DeleteObject( WizData.Fonts.hTips );
::DeleteObject( WizData.Fonts.hTitle );
}
INT_PTR CALLBACK WelcomeDlgProc( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam )
{
static _SharedData* pData = NULL;
switch( uMsg )
{
case WM_INITDIALOG:
// Set the title font
SetWndFontFromLPARAM( ::GetDlgItem( hwndDlg, IDC_TITLE ), lParam, TRUE );
SetWndFontFromLPARAM( ::GetDlgItem( hwndDlg, IDC_TIP ), lParam, FALSE );
// Load the info text
LoadTextInCtrl( IDR_INFO, ::GetDlgItem( hwndDlg, IDC_INFO ) );
// Init the shared data here
_ASSERT( NULL == pData );
pData = reinterpret_cast<_SharedData*>( reinterpret_cast<PROPSHEETPAGE*>( lParam )->lParam );
break;
case WM_NOTIFY:
switch ( reinterpret_cast<NMHDR*>( lParam )->code )
{
case PSN_SETACTIVE:
PropSheet_SetWizButtons( ::GetParent( hwndDlg ), PSWIZB_NEXT );
break;
case PSN_WIZNEXT:
// Here is the place to test the requirements
_ASSERT( pData != NULL );
pData->szError = CanInstall();
// If no error - check if on FAT
if ( ( NULL == pData->szError ) && !CheckForFAT( pData->hInst, hwndDlg ) )
{
// If we are here - the user don't want to install IISMon on FAT
pData->szError = _T("Installation canceled by the user");
}
if ( pData->szError != NULL )
{
// Error - Go to the result page
PropSheet_SetCurSel( ::GetParent( hwndDlg ), NULL, 5 );
}
break;
};
break;
case WM_CTLCOLORDLG:
case WM_CTLCOLORSTATIC:
// Change the dlg background to white
return reinterpret_cast<INT_PTR>( ::GetStockObject( WHITE_BRUSH ) );
break;
};
return 0;
}
INT_PTR CALLBACK LicenseDlgProc( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam )
{
switch( uMsg )
{
case WM_INITDIALOG:
// Load the License text into the edit control
LoadTextInCtrl( IDR_LICENSE, ::GetDlgItem( hwndDlg, IDC_LICENSE ) );
break;
case WM_COMMAND:
// Will handle only the state changes of the check box button
if ( HIWORD( wParam ) == BN_CLICKED )
{
AjustLicenseWizBtn( hwndDlg );
}
break;
case WM_NOTIFY:
LPNMHDR pNM = reinterpret_cast<NMHDR*>( lParam );
switch( pNM->code )
{
case PSN_SETACTIVE:
AjustLicenseWizBtn( hwndDlg );
break;
}
break;
};
return 0;
}
INT_PTR CALLBACK PolicyDlgProc( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam )
{
switch( uMsg )
{
case WM_INITDIALOG:
// Load the License text into the edit control
LoadTextInCtrl( IDR_POLICY, ::GetDlgItem( hwndDlg, IDC_POLICY ) );
break;
};
return 0;
}
INT_PTR CALLBACK SettingsDlgProc( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam )
{
int i = 0;
static LPCTSTR aszEntries[] = { _T("One week"),
_T("Two weeks"),
_T("One month" ),
_T("Two months" ),
_T("Never" ) };
// How many days represent each of the combo box options above
static UINT anAuditFilesTime[] = { 7, 14, 30, 60, 0 };
_ASSERT( ARRAY_SIZE( anAuditFilesTime ) == ARRAY_SIZE( aszEntries ) );
static _SharedData* pData = NULL;
switch( uMsg )
{
case WM_INITDIALOG:
// Fill the combo box
for ( i = 0; i < ARRAY_SIZE( aszEntries ); ++i )
{
VERIFY( ::SendMessage( ::GetDlgItem( hwndDlg, IDC_KEEPFILES ),
CB_ADDSTRING,
0,
reinterpret_cast<LPARAM>( aszEntries[ i ] ) ) != CB_ERR );
}
// Set the default selection to the first one
VERIFY( ::SendMessage( ::GetDlgItem( hwndDlg, IDC_KEEPFILES ),
CB_SETCURSEL,
0,
0 ) != CB_ERR );
SetWndFontFromLPARAM( ::GetDlgItem( hwndDlg, IDC_WARNING ), lParam, FALSE );
// Enable the audit trail
::SendMessage( ::GetDlgItem( hwndDlg, IDC_ENABLE_TRAIL ),
BM_SETCHECK,
BST_CHECKED,
0 );
// Init the shared data here
_ASSERT( NULL == pData );
pData = reinterpret_cast<_SharedData*>( reinterpret_cast<PROPSHEETPAGE*>( lParam )->lParam );
break;
case WM_COMMAND:
if ( HIWORD( wParam ) == BN_CLICKED )
{
// Enable/ Disable the combo box depending on the 'Enable trail' state
BOOL bChecked = ( ::IsDlgButtonChecked( hwndDlg, IDC_ENABLE_TRAIL ) == BST_CHECKED );
::EnableWindow( ::GetDlgItem( hwndDlg, IDC_KEEPFILES ), bChecked );
}
break;
case WM_NOTIFY:
LPNMHDR pNM = reinterpret_cast<NMHDR*>( lParam );
switch( pNM->code )
{
case PSN_SETACTIVE:
// For this dialog both Next and Back are enabled
PropSheet_SetWizButtons( ::GetParent( hwndDlg ), PSWIZB_NEXT | PSWIZB_BACK );
break;
case PSN_WIZNEXT:
// Store the settings in the shared data struct
_ASSERT( pData != NULL );
pData->Settings.bEnableTrail = ( ::IsDlgButtonChecked( hwndDlg, IDC_ENABLE_TRAIL ) == BST_CHECKED );
if ( pData->Settings.bEnableTrail )
{
LRESULT nSel = ::SendMessage( ::GetDlgItem( hwndDlg, IDC_KEEPFILES ),
CB_GETCURSEL,
0,
0 );
_ASSERT( nSel != CB_ERR );
_ASSERT( nSel < ARRAY_SIZE( anAuditFilesTime ) );
pData->Settings.dwKeepFilesPeriod = anAuditFilesTime[ nSel ];
}
else
{
pData->Settings.dwKeepFilesPeriod = 0;
}
break;
}
break;
};
return 0;
}
INT_PTR CALLBACK InstallDlgProc( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam )
{
static LPCWSTR _WARNING =
L"The World Wide Web Publishing Service (W3SVC) is either stopped or disabled on your server. W3SVC provides \
Web conectivity and administration through IIS. If you do not plan to run W3SVC, you should not install IIS 6.0 \
Monitor. To cancel installation, click Cancel.\n\nTo complete the installation of the IIS 6.0 Monitor, \
click Next.\n\nIf you would like to modify your audit trail settings, click Back.";
// If W3SVC is not running or if it is disabled - add a warning
if ( ( WM_INITDIALOG == uMsg ) && !IsW3SVCEnabled() )
{
RECT rc;
VERIFY( ::GetWindowRect( ::GetDlgItem( hwndDlg, IDC_FRAME ), &rc ) );
VERIFY( ::SetWindowTextW( ::GetDlgItem( hwndDlg, IDC_INFO ), _WARNING ) );
VERIFY( ::SetWindowPos( ::GetDlgItem( hwndDlg, IDC_FRAME ),
NULL,
0,
0,
rc.right - rc.left,
rc.bottom - rc.top + 60,
SWP_NOMOVE | SWP_NOZORDER ) );
}
return 0;
}
INT_PTR CALLBACK ResultDlgProc( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam )
{
_SharedData* pData = NULL;
switch( uMsg )
{
case WM_INITDIALOG:
// Init the shared data here
_ASSERT( NULL == pData );
pData = reinterpret_cast<_SharedData*>( reinterpret_cast<PROPSHEETPAGE*>( lParam )->lParam );
// Set the title font
SetWndFontFromLPARAM( ::GetDlgItem( hwndDlg, IDC_RESULT ), lParam, TRUE );
// If a previous error - set it. Else - try to install
if ( NULL == pData->szError )
{
// Show the status window
HWND hwndStatus = ::CreateDialog( pData->hInst, MAKEINTRESOURCE( IDD_PROGRESS ), hwndDlg, ProgressDlgProc );
::ShowWindow( hwndStatus, SW_SHOW );
::RedrawWindow( hwndStatus, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW );
_ASSERT( hwndStatus != NULL );
pData->szError = Install( pData->hInst, pData->Settings.bEnableTrail, pData->Settings.dwKeepFilesPeriod );
// Hide the status window
::DestroyWindow( hwndStatus );
}
if ( pData->szError != NULL )
{
TCHAR szBuffer[ 2048 ];
::_stprintf( szBuffer,
_T("IIS 6.0 Monitor installation failed because of the following error:\n\n%s"),
pData->szError );
VERIFY( ::SetWindowText( ::GetDlgItem( hwndDlg, IDC_RESULT ), _T("Installation Unsuccessful!") ) );
VERIFY( ::SetWindowText( ::GetDlgItem( hwndDlg, IDC_INFO ), szBuffer ) );
}
break;
case WM_NOTIFY:
if ( PSN_SETACTIVE == reinterpret_cast<NMHDR*>( lParam )->code )
{
// Change the Next button to Finish. Back is not enabled - this is a result screen
PropSheet_SetWizButtons( ::GetParent( hwndDlg ), PSWIZB_FINISH );
}
break;
case WM_CTLCOLORDLG:
case WM_CTLCOLORSTATIC:
// Change the dlg background to white
return reinterpret_cast<INT_PTR>( ::GetStockObject( WHITE_BRUSH ) );
};
return 0;
}
INT_PTR CALLBACK FatDlgProc( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam )
{
RECT rc;
const UINT nNoDetailsHeight = 170;
const UINT nWithDetailsHeight = 310;
VERIFY( ::GetWindowRect( hwndDlg, &rc ) );
switch( uMsg )
{
case WM_INITDIALOG:
LoadTextInCtrl( IDR_FATDETAILS, ::GetDlgItem( hwndDlg, IDC_DETAILS ) );
::SetWindowPos( hwndDlg, NULL, 0, 0, rc.right - rc.left, nNoDetailsHeight, SWP_NOMOVE | SWP_NOZORDER );
break;
case WM_COMMAND:
switch( LOWORD( wParam ) )
{
case IDOK:
case IDCANCEL:
::EndDialog( hwndDlg, LOWORD( wParam ) );
break;
case IDC_TOGGLE:
// Alter current state ( current state is obtained using the window height )
bool bDetailsVisible = !( ( rc.bottom - rc.top ) > nNoDetailsHeight );
VERIFY( ::SetWindowText( ::GetDlgItem( hwndDlg, IDC_TOGGLE ),
bDetailsVisible ? _T("Details <<") : _T("Details >>" ) ) );
::SetWindowPos( hwndDlg,
NULL,
0,
0,
rc.right - rc.left,
bDetailsVisible ? nWithDetailsHeight : nNoDetailsHeight,
SWP_NOMOVE | SWP_NOZORDER );
break;
}
break;
};
return FALSE;
}
INT_PTR CALLBACK ProgressDlgProc( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam )
{
// Nothing to do here
return FALSE;
}
BOOL CheckForFAT( HINSTANCE hInst, HWND hwndParent )
{
BOOL bRes = TRUE;
// If the file system is FAT - warn the user
if ( !IsNTFS() )
{
INT_PTR nDlgRes = ::DialogBox( hInst, MAKEINTRESOURCE( IDD_FAT_WARNING ), hwndParent, FatDlgProc );
bRes = ( IDOK == nDlgRes );
}
return bRes;
}
void LoadTextInCtrl( UINT nResID, HWND hwndCtrl )
{
_ASSERT( hwndCtrl != NULL );
HRSRC hRes = ::FindResource( NULL, MAKEINTRESOURCE( nResID ), RT_RCDATA );
_ASSERT( hRes != NULL );
// Get the resource data
HGLOBAL hData = ::LoadResource( NULL, hRes );
_ASSERT( hData != NULL );
LPVOID pvData = ::LockResource( hData );
_ASSERT( pvData != NULL );
// The text is ANSI!
VERIFY( ::SetWindowTextA( hwndCtrl, reinterpret_cast<LPCSTR>( pvData ) ) );
}
void AjustLicenseWizBtn( HWND hwndPage )
{
// Enable / Disable the next button depending ot check box state
bool bChecked = ( ::IsDlgButtonChecked( hwndPage, IDC_ACCEPT ) == BST_CHECKED );
PropSheet_SetWizButtons( ::GetParent( hwndPage ), bChecked ? PSWIZB_NEXT | PSWIZB_BACK : PSWIZB_BACK );
}
void InitFonts( _FontData& FontData )
{
// Create the font for the wizard title texts and for the text of tipd
NONCLIENTMETRICS ncm = { 0 };
ncm.cbSize = sizeof( ncm );
::SystemParametersInfo( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0 );
LOGFONT TitleLogFont = ncm.lfMessageFont;
TitleLogFont.lfWeight = FW_BOLD;
lstrcpy( TitleLogFont.lfFaceName, _T("Verdana Bold") );
// Create the tips font
FontData.hTips = ::CreateFontIndirect( &TitleLogFont );
// Create the intro/end title font
HDC hdc = ::GetDC(NULL); // Gets the screen DC
INT FontSize = 12;
TitleLogFont.lfHeight = 0 - GetDeviceCaps( hdc, LOGPIXELSY ) * FontSize / 72;
FontData.hTitle = ::CreateFontIndirect( &TitleLogFont );
::ReleaseDC( NULL, hdc );
}
void SetWndFontFromLPARAM( HWND hwndCtrl, LPARAM lParam, BOOL bTitle )
{
PROPSHEETPAGE* pPage = reinterpret_cast<PROPSHEETPAGE*>( lParam );
_FontData Fonts = reinterpret_cast<_SharedData*>( pPage->lParam )->Fonts;
SetWindowFont( hwndCtrl, bTitle ? Fonts.hTitle : Fonts.hTips, TRUE );
}