505 lines
11 KiB
C++
505 lines
11 KiB
C++
|
//+------------------------------------------------------------------
|
||
|
//
|
||
|
// Project: Windows NT4 DS Client Setup Wizard
|
||
|
//
|
||
|
// Purpose: Installs the Windows NT4 DS Client Files
|
||
|
//
|
||
|
// File: wizard.cpp
|
||
|
//
|
||
|
// History: March 1998 Zeyong Xu Created
|
||
|
// Jan 2000 Jeff Jones (JeffJon) Modified
|
||
|
// - changed to be an NT setup
|
||
|
//
|
||
|
//------------------------------------------------------------------
|
||
|
|
||
|
#include <windows.h>
|
||
|
#include <windowsx.h>
|
||
|
#include <prsht.h>
|
||
|
#include "resource.h"
|
||
|
#include "dscsetup.h"
|
||
|
#include "doinst.h"
|
||
|
#include "wizard.h"
|
||
|
|
||
|
|
||
|
extern SInstallVariables g_sInstVar;
|
||
|
|
||
|
|
||
|
// welcome page DlgProc of wizard
|
||
|
BOOL CALLBACK WelcomeDialogProc(HWND hWnd,
|
||
|
UINT nMessage,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam)
|
||
|
{
|
||
|
BOOL bReturn = FALSE;
|
||
|
LPNMHDR lpNotifyMsg;
|
||
|
|
||
|
switch (nMessage)
|
||
|
{
|
||
|
case WM_INITDIALOG:
|
||
|
{
|
||
|
RECT rc;
|
||
|
|
||
|
// set font of title text
|
||
|
SetWindowFont(GetDlgItem(hWnd, IDC_STATIC_WELCOME_TITLE),
|
||
|
g_sInstVar.m_hBigBoldFont,
|
||
|
TRUE);
|
||
|
|
||
|
// Position the dialog
|
||
|
if (GetWindowRect(GetParent(hWnd), &rc))
|
||
|
{
|
||
|
SetWindowPos(GetParent(hWnd),
|
||
|
HWND_TOP,
|
||
|
(GetSystemMetrics(SM_CXSCREEN) / 2) -
|
||
|
((rc.right - rc.left) / 2),
|
||
|
(GetSystemMetrics(SM_CYSCREEN) / 2) -
|
||
|
((rc.bottom - rc.top) / 2),
|
||
|
rc.right - rc.left,
|
||
|
rc.bottom - rc.top,
|
||
|
SWP_NOOWNERZORDER);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
case WM_NOTIFY:
|
||
|
|
||
|
lpNotifyMsg = (NMHDR FAR*) lParam;
|
||
|
switch (lpNotifyMsg->code)
|
||
|
{
|
||
|
// user click cancel
|
||
|
case PSN_QUERYCANCEL:
|
||
|
|
||
|
// cancel confirm?
|
||
|
if(!ConfirmCancelWizard(hWnd))
|
||
|
{
|
||
|
SetWindowLongPtr(hWnd, DWL_MSGRESULT, TRUE);
|
||
|
bReturn = TRUE;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case PSN_WIZNEXT:
|
||
|
break;
|
||
|
|
||
|
case PSN_SETACTIVE:
|
||
|
|
||
|
PropSheet_SetWizButtons(GetParent(hWnd), PSWIZB_NEXT);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return bReturn;
|
||
|
}
|
||
|
|
||
|
/* ntbug#337931: remove license page
|
||
|
// License page DlgProc of wizard
|
||
|
BOOL CALLBACK LicenseDialogProc(HWND hWnd,
|
||
|
UINT nMessage,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam)
|
||
|
{
|
||
|
BOOL bReturn = FALSE;
|
||
|
LPNMHDR lpNotifyMsg;
|
||
|
HFONT hLicenseTextFont;
|
||
|
|
||
|
switch (nMessage)
|
||
|
{
|
||
|
case WM_INITDIALOG:
|
||
|
|
||
|
if(!CheckDiskSpace() || // check disk space
|
||
|
!LoadLicenseFile(hWnd)) // Load license file
|
||
|
{
|
||
|
g_sInstVar.m_nSetupResult = SETUP_ERROR;
|
||
|
PropSheet_PressButton(GetParent(hWnd), PSBTN_FINISH); // close wizard
|
||
|
}
|
||
|
|
||
|
// use a ANSI_FIXED_FONT (Couirer) font for EULA to replace the default
|
||
|
// font - MS Shell Dlg in order to fix the bug in Hebrew Win95
|
||
|
if(g_sInstVar.m_bWin95)
|
||
|
{
|
||
|
hLicenseTextFont = (HFONT) GetStockObject(ANSI_FIXED_FONT);
|
||
|
if(hLicenseTextFont)
|
||
|
{
|
||
|
SetWindowFont(GetDlgItem(hWnd, IDC_LICENSE_TEXT),
|
||
|
hLicenseTextFont,
|
||
|
TRUE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bReturn = TRUE;
|
||
|
break;
|
||
|
|
||
|
case WM_NOTIFY:
|
||
|
|
||
|
lpNotifyMsg = (NMHDR FAR*) lParam;
|
||
|
switch (lpNotifyMsg->code)
|
||
|
{
|
||
|
// user click cancel
|
||
|
case PSN_QUERYCANCEL:
|
||
|
|
||
|
// cancel confirm?
|
||
|
if(!ConfirmCancelWizard(hWnd))
|
||
|
{
|
||
|
SetWindowLongPtr(hWnd, DWL_MSGRESULT, TRUE);
|
||
|
bReturn = TRUE;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case PSN_WIZNEXT:
|
||
|
break;
|
||
|
|
||
|
case PSN_SETACTIVE:
|
||
|
{
|
||
|
HWND hButton;
|
||
|
hButton = GetDlgItem(hWnd, IDC_RADIO_ACCEPTED);
|
||
|
// get radio button check status
|
||
|
if( hButton &&
|
||
|
BST_CHECKED == SendMessage(hButton, BM_GETCHECK, 0, 0L) )
|
||
|
PropSheet_SetWizButtons(GetParent(hWnd),
|
||
|
PSWIZB_BACK | PSWIZB_NEXT);
|
||
|
else
|
||
|
PropSheet_SetWizButtons(GetParent(hWnd),
|
||
|
PSWIZB_BACK);
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case WM_COMMAND: // button click
|
||
|
{
|
||
|
HWND hButton;
|
||
|
hButton = GetDlgItem(hWnd, IDC_RADIO_ACCEPTED);
|
||
|
// get radio button check status
|
||
|
if( hButton && BST_CHECKED ==
|
||
|
SendMessage(hButton, BM_GETCHECK, 0, 0L) )
|
||
|
PropSheet_SetWizButtons(GetParent(hWnd),
|
||
|
PSWIZB_BACK | PSWIZB_NEXT);
|
||
|
else
|
||
|
PropSheet_SetWizButtons(GetParent(hWnd),
|
||
|
PSWIZB_BACK);
|
||
|
}
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
return bReturn;
|
||
|
}
|
||
|
*/
|
||
|
|
||
|
// Confirm page DlgProc of wizard
|
||
|
BOOL CALLBACK ConfirmDialogProc(HWND hWnd,
|
||
|
UINT nMessage,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam)
|
||
|
{
|
||
|
BOOL bReturn = FALSE;
|
||
|
LPNMHDR lpNotifyMsg;
|
||
|
|
||
|
switch (nMessage)
|
||
|
{
|
||
|
case WM_INITDIALOG:
|
||
|
|
||
|
if(!CheckDiskSpace()) // check disk space
|
||
|
{
|
||
|
g_sInstVar.m_nSetupResult = SETUP_ERROR;
|
||
|
PropSheet_PressButton(GetParent(hWnd), PSBTN_FINISH); // close wizard
|
||
|
}
|
||
|
|
||
|
// check if DSClient has been installed
|
||
|
if(CheckDSClientInstalled())
|
||
|
{
|
||
|
// load string and dispaly it in textitem
|
||
|
TCHAR szMessage[MAX_MESSAGE + 1];
|
||
|
LoadString(g_sInstVar.m_hInstance,
|
||
|
IDS_REINSTALL_MSG,
|
||
|
szMessage,
|
||
|
MAX_MESSAGE);
|
||
|
SetDlgItemText(hWnd,
|
||
|
IDC_STATIC_CONFIRM_INSTALL,
|
||
|
szMessage);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case WM_NOTIFY:
|
||
|
|
||
|
lpNotifyMsg = (NMHDR FAR*) lParam;
|
||
|
switch (lpNotifyMsg->code)
|
||
|
{
|
||
|
// user click cancel
|
||
|
case PSN_QUERYCANCEL:
|
||
|
|
||
|
// cancel confirm?
|
||
|
if(!ConfirmCancelWizard(hWnd))
|
||
|
{
|
||
|
SetWindowLongPtr(hWnd, DWL_MSGRESULT, TRUE);
|
||
|
bReturn = TRUE;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case PSN_WIZNEXT:
|
||
|
break;
|
||
|
|
||
|
case PSN_SETACTIVE:
|
||
|
PropSheet_SetWizButtons(GetParent(hWnd),
|
||
|
PSWIZB_BACK | PSWIZB_NEXT);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
return bReturn;
|
||
|
}
|
||
|
|
||
|
|
||
|
// wizard dialog callback function
|
||
|
BOOL CALLBACK InstallDialogProc(HWND hWnd,
|
||
|
UINT nMessage,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam)
|
||
|
{
|
||
|
BOOL bReturn = FALSE;
|
||
|
LPNMHDR lpMsg;
|
||
|
|
||
|
switch (nMessage)
|
||
|
{
|
||
|
case WM_INITDIALOG:
|
||
|
{
|
||
|
DWORD dwThreadId;
|
||
|
|
||
|
// get the handle of install progress bar and file name item
|
||
|
g_sInstVar.m_hProgress = GetDlgItem(hWnd, IDC_INSTALL_PROGRESS);
|
||
|
g_sInstVar.m_hFileNameItem = GetDlgItem(hWnd, IDC_STATIC_FILENAME);
|
||
|
|
||
|
// start to do installation
|
||
|
g_sInstVar.m_hInstallThread = CreateThread(NULL,
|
||
|
0,
|
||
|
DoInstallationProc,
|
||
|
hWnd,
|
||
|
0,
|
||
|
&dwThreadId);
|
||
|
|
||
|
// if CreateThread() failed
|
||
|
if(!g_sInstVar.m_hInstallThread)
|
||
|
{
|
||
|
g_sInstVar.m_nSetupResult = SETUP_ERROR;
|
||
|
PropSheet_PressButton(GetParent(hWnd), PSBTN_FINISH); // close wizard
|
||
|
}
|
||
|
|
||
|
bReturn = TRUE;
|
||
|
break;
|
||
|
}
|
||
|
case WM_NOTIFY:
|
||
|
{
|
||
|
lpMsg = (NMHDR FAR*) lParam;
|
||
|
switch(lpMsg->code)
|
||
|
{
|
||
|
// cancel to do nothing
|
||
|
case PSN_QUERYCANCEL:
|
||
|
|
||
|
// block
|
||
|
EnterCriticalSection(&g_sInstVar.m_oCriticalSection);
|
||
|
|
||
|
// cancel confirm?
|
||
|
if(!ConfirmCancelWizard(hWnd))
|
||
|
{
|
||
|
SetWindowLongPtr(hWnd, DWL_MSGRESULT, TRUE);
|
||
|
bReturn = TRUE;
|
||
|
}
|
||
|
|
||
|
// unblock
|
||
|
LeaveCriticalSection(&g_sInstVar.m_oCriticalSection);
|
||
|
|
||
|
break;
|
||
|
|
||
|
case PSN_WIZFINISH:
|
||
|
break;
|
||
|
|
||
|
case PSN_WIZBACK:
|
||
|
break;
|
||
|
|
||
|
case PSN_SETACTIVE:
|
||
|
|
||
|
PropSheet_SetWizButtons(GetParent(hWnd), 0);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return bReturn;
|
||
|
}
|
||
|
|
||
|
// Completion page DlgProc of wizard
|
||
|
BOOL CALLBACK CompletionDialogProc(HWND hWnd,
|
||
|
UINT nMessage,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam)
|
||
|
{
|
||
|
BOOL bReturn = FALSE;
|
||
|
LPNMHDR lpNotifyMsg;
|
||
|
|
||
|
switch (nMessage)
|
||
|
{
|
||
|
case WM_INITDIALOG:
|
||
|
{
|
||
|
TCHAR szMessage[MAX_MESSAGE + 1];
|
||
|
RECT rc;
|
||
|
|
||
|
// load string and dispaly it in textitem
|
||
|
switch (g_sInstVar.m_nSetupResult)
|
||
|
{
|
||
|
case SETUP_SUCCESS:
|
||
|
|
||
|
LoadString(g_sInstVar.m_hInstance,
|
||
|
IDS_SETUP_SUCCESS_TITLE,
|
||
|
szMessage,
|
||
|
MAX_MESSAGE);
|
||
|
SetDlgItemText(hWnd, IDC_STATIC_COMPLETION_TITLE, szMessage);
|
||
|
LoadString(g_sInstVar.m_hInstance,
|
||
|
IDS_SETUP_SUCCESS,
|
||
|
szMessage,
|
||
|
MAX_MESSAGE);
|
||
|
SetDlgItemText(hWnd, IDC_STATIC_COMPLETION, szMessage);
|
||
|
break;
|
||
|
|
||
|
case SETUP_CANCEL:
|
||
|
|
||
|
LoadString(g_sInstVar.m_hInstance,
|
||
|
IDS_SETUP_CANCEL_TITLE,
|
||
|
szMessage,
|
||
|
MAX_MESSAGE);
|
||
|
SetDlgItemText(hWnd, IDC_STATIC_COMPLETION_TITLE, szMessage);
|
||
|
LoadString(g_sInstVar.m_hInstance,
|
||
|
IDS_SETUP_CANCEL,
|
||
|
szMessage,
|
||
|
MAX_MESSAGE);
|
||
|
SetDlgItemText(hWnd, IDC_STATIC_COMPLETION, szMessage);
|
||
|
break;
|
||
|
|
||
|
case SETUP_ERROR:
|
||
|
|
||
|
LoadString(g_sInstVar.m_hInstance,
|
||
|
IDS_SETUP_ERROR_TITLE,
|
||
|
szMessage,
|
||
|
MAX_MESSAGE);
|
||
|
SetDlgItemText(hWnd, IDC_STATIC_COMPLETION_TITLE, szMessage);
|
||
|
LoadString(g_sInstVar.m_hInstance,
|
||
|
IDS_SETUP_ERROR,
|
||
|
szMessage,
|
||
|
MAX_MESSAGE);
|
||
|
SetDlgItemText(hWnd, IDC_STATIC_COMPLETION, szMessage);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// set font of title text
|
||
|
SetWindowFont(GetDlgItem(hWnd, IDC_STATIC_COMPLETION_TITLE),
|
||
|
g_sInstVar.m_hBigBoldFont,
|
||
|
TRUE);
|
||
|
|
||
|
// Position the dialog
|
||
|
if (GetWindowRect(GetParent(hWnd), &rc))
|
||
|
{
|
||
|
SetWindowPos(GetParent(hWnd),
|
||
|
HWND_TOP,
|
||
|
(GetSystemMetrics(SM_CXSCREEN) / 2) -
|
||
|
((rc.right - rc.left) / 2),
|
||
|
(GetSystemMetrics(SM_CYSCREEN) / 2) -
|
||
|
((rc.bottom - rc.top) / 2),
|
||
|
rc.right - rc.left,
|
||
|
rc.bottom - rc.top,
|
||
|
SWP_NOOWNERZORDER);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
case WM_NOTIFY:
|
||
|
|
||
|
lpNotifyMsg = (NMHDR FAR*) lParam;
|
||
|
switch (lpNotifyMsg->code)
|
||
|
{
|
||
|
case PSN_QUERYCANCEL:
|
||
|
break;
|
||
|
|
||
|
case PSN_WIZFINISH:
|
||
|
break;
|
||
|
|
||
|
case PSN_SETACTIVE:
|
||
|
|
||
|
// set wizard button
|
||
|
PropSheet_SetWizButtons(GetParent(hWnd), PSWIZB_FINISH);
|
||
|
PropSheet_CancelToClose(GetParent(hWnd));
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return bReturn;
|
||
|
}
|
||
|
|
||
|
// ask if you want to cancel the wizard
|
||
|
BOOL ConfirmCancelWizard(HWND hWnd)
|
||
|
{
|
||
|
TCHAR szMsg[MAX_MESSAGE + 1];
|
||
|
TCHAR szTitle[MAX_TITLE + 1];
|
||
|
|
||
|
LoadString(g_sInstVar.m_hInstance, IDS_CANCEL_TITLE, szTitle, MAX_TITLE);
|
||
|
LoadString(g_sInstVar.m_hInstance, IDS_CANCEL_MSG, szMsg, MAX_MESSAGE);
|
||
|
|
||
|
if (IDYES == MessageBox(hWnd,
|
||
|
szMsg,
|
||
|
szTitle,
|
||
|
MB_YESNO | MB_TOPMOST | MB_ICONQUESTION))
|
||
|
{
|
||
|
// kill timer
|
||
|
if(g_sInstVar.m_uTimerID)
|
||
|
KillTimer(hWnd, g_sInstVar.m_uTimerID);
|
||
|
|
||
|
// set m_nSetupResult to SETUP_CANCEL, in order to stop the inatllation
|
||
|
g_sInstVar.m_nSetupResult = SETUP_CANCEL;
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
// do installation proc
|
||
|
DWORD WINAPI DoInstallationProc(LPVOID lpVoid)
|
||
|
{
|
||
|
HWND hWnd = (HWND)lpVoid;
|
||
|
|
||
|
// do installation
|
||
|
g_sInstVar.m_nSetupResult = DoInstallation(hWnd);
|
||
|
|
||
|
// Close install page of the setup wizard
|
||
|
PropSheet_PressButton(GetParent(hWnd), PSBTN_FINISH);
|
||
|
|
||
|
return g_sInstVar.m_nSetupResult;
|
||
|
}
|