windows-nt/Source/XPSP1/NT/termsrv/reskit/tsver/exe/startfinish.cpp
2020-09-26 16:20:57 +08:00

417 lines
9 KiB
C++

/*++
Copyright (c) 1999 Microsoft Corporation
Module Name:
ListCtrl.cpp
Abstract:
Functions for "Welcome" and "Finish" pages of the wizard.
Author:
Sergey Kuzin (a-skuzin@microsoft.com) 09-August-1999
Environment:
Revision History:
--*/
#include "tsverui.h"
#include "resource.h"
void OnFinish(HWND hwndDlg, LPSHAREDWIZDATA pdata);
void ShowErrorBox(HWND hwndDlg, DWORD dwError);
/*++
Routine Description :
dialog box procedure for the "Welcome" page.
Arguments :
IN HWND hwndDlg - handle to dialog box.
IN UINT uMsg - message to be acted upon.
IN WPARAM wParam - value specific to wMsg.
IN LPARAM lParam - value specific to wMsg.
Return Value :
TRUE if it processed the message
FALSE if it did not.
--*/
INT_PTR CALLBACK
StartPageProc (
HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
//Process messages from the Welcome page
//Retrieve the shared user data from GWL_USERDATA
LPSHAREDWIZDATA pdata = (LPSHAREDWIZDATA) GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
switch (uMsg)
{
case WM_INITDIALOG :
{
//Get the shared data from PROPSHEETPAGE lParam value
//and load it into GWL_USERDATA
pdata = (LPSHAREDWIZDATA) ((LPPROPSHEETPAGE) lParam) -> lParam;
SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (DWORD_PTR) pdata);
//It's an intro/end page, so get the title font
//from the shared data and use it for the title control
HWND hwndControl = GetDlgItem(hwndDlg, IDC_TITLE);
SetWindowFont(hwndControl,pdata->hTitleFont, TRUE);
break;
}
case WM_NOTIFY :
{
LPNMHDR lpnm = (LPNMHDR) lParam;
switch (lpnm->code)
{
case PSN_SETACTIVE : //Enable the Next button
PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_NEXT);
break;
case PSN_WIZNEXT :
//Handle a Next button click here
if(IsDlgButtonChecked(hwndDlg,IDC_NOWELLCOME)==BST_CHECKED){
pdata->bNoWellcome=TRUE;
}
break;
case PSN_RESET :
//Handle a Cancel button click, if necessary
break;
default :
break;
}
}
break;
default:
break;
}
return 0;
}
/*++
Routine Description :
dialog box procedure for the "Finish" page.
Arguments :
IN HWND hwndDlg - handle to dialog box.
IN UINT uMsg - message to be acted upon.
IN WPARAM wParam - value specific to wMsg.
IN LPARAM lParam - value specific to wMsg.
Return Value :
TRUE if it processed the message
FALSE if it did not.
--*/
INT_PTR CALLBACK FinishPageProc (
HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
//Process messages from the Completion page
//Retrieve the shared user data from GWL_USERDATA
LPSHAREDWIZDATA pdata = (LPSHAREDWIZDATA) GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
switch (uMsg)
{
case WM_INITDIALOG :
{
//Get the shared data from PROPSHEETPAGE lParam value
//and load it into GWL_USERDATA
pdata = (LPSHAREDWIZDATA) ((LPPROPSHEETPAGE) lParam) -> lParam;
SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (DWORD_PTR) pdata);
//It's an intro/end page, so get the title font
//from userdata and use it on the title control
HWND hwndControl = GetDlgItem(hwndDlg, IDC_TITLE);
SetWindowFont(hwndControl,pdata->hTitleFont, TRUE);
break;
}
case WM_NOTIFY :
{
LPNMHDR lpnm = (LPNMHDR) lParam;
switch (lpnm->code)
{
case PSN_SETACTIVE : //Enable the correct buttons on for the active page
PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_FINISH);
break;
case PSN_WIZBACK :
//If the checkbox was checked, jump back
//to the first interior page, not the second
if(!pdata->bCheckingEnabled)
{
SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, IDD_VERSION_CHECKING);
return TRUE;
}
break;
case PSN_WIZFINISH :
//Handle a Finish button click, if necessary
OnFinish(hwndDlg,pdata);
break;
case PSN_RESET :
//Handle a Cancel button click, if necessary
break;
default :
break;
}
}
break;
default:
break;
}
return 0;
}
/*++
Routine Description :
writes all data into the registry.
Arguments :
IN HWND hwndDlg - handle to dialog box.
IN LPSHAREDWIZDATA pdata - pointer to the data struct.
Return Value :
none
--*/
void
OnFinish(
HWND hwndDlg,
LPSHAREDWIZDATA pdata)
{
LONG lResult;
//
if(pdata->bNoWellcome){
lResult=SetRegKey(HKEY_USERS, szConstraintsKeyPath,
KeyName[NOWELLCOME], 1);
if(lResult!=ERROR_SUCCESS){
ShowErrorBox(hwndDlg,lResult);
return;
}
}
//
if (pdata->bCheckingEnabled){
lResult=SetRegKey(HKEY_LOCAL_MACHINE, szKeyPath,
KeyName[ASYNCHRONOUS], 0);
if(lResult!=ERROR_SUCCESS){
ShowErrorBox(hwndDlg,lResult);
return;
}
lResult=SetRegKey(HKEY_LOCAL_MACHINE, szKeyPath,
KeyName[IMPERSONATE], 0);
if(lResult!=ERROR_SUCCESS){
ShowErrorBox(hwndDlg,lResult);
return;
}
lResult=SetRegKeyString(HKEY_LOCAL_MACHINE,
TEXT("tsver.dll"),szKeyPath, KeyName[DLLNAME]);
if(lResult!=ERROR_SUCCESS){
ShowErrorBox(hwndDlg,lResult);
return;
}
lResult=SetRegKeyString(HKEY_LOCAL_MACHINE,
TEXT("TsVerEventStartup"), szKeyPath, KeyName[STARTUP]);
if(lResult!=ERROR_SUCCESS){
ShowErrorBox(hwndDlg,lResult);
return;
}
} else { // delete all the keys
for (int i = 0; i < 4; i++){
lResult=DeleteRegKey(HKEY_LOCAL_MACHINE, szKeyPath, KeyName[i]);
if(lResult!=ERROR_SUCCESS){
ShowErrorBox(hwndDlg,lResult);
return;
}
}
//do not save other members, they are not valid!
return;
}
//write message
if (pdata->bMessageEnabled)
{
lResult=SetRegKey(HKEY_USERS, szConstraintsKeyPath, KeyName[USE_MSG], 1);
if(lResult!=ERROR_SUCCESS){
ShowErrorBox(hwndDlg,lResult);
return;
}
} else {
lResult=DeleteRegKey(HKEY_USERS, szConstraintsKeyPath, KeyName[USE_MSG]);
if(lResult!=ERROR_SUCCESS){
ShowErrorBox(hwndDlg,lResult);
return;
}
}
// write constraints string
if (pdata->pszConstraints&&_tcslen(pdata->pszConstraints)){
lResult=SetRegKeyString(HKEY_USERS, pdata->pszConstraints,
szConstraintsKeyPath,
KeyName[CONSTRAINTS]);
if(lResult!=ERROR_SUCCESS){
ShowErrorBox(hwndDlg,lResult);
return;
}
} else {
lResult=DeleteRegKey(HKEY_USERS,
szConstraintsKeyPath,
KeyName[CONSTRAINTS]);
if(lResult!=ERROR_SUCCESS){
ShowErrorBox(hwndDlg,lResult);
return;
}
}
// write title string
if (pdata->pszMessageTitle&&_tcslen(pdata->pszMessageTitle)){
lResult=SetRegKeyString(HKEY_USERS, pdata->pszMessageTitle,
szConstraintsKeyPath,
KeyName[MSG_TITLE]);
if(lResult!=ERROR_SUCCESS){
ShowErrorBox(hwndDlg,lResult);
return;
}
} else {
lResult=DeleteRegKey(HKEY_USERS,
szConstraintsKeyPath,
KeyName[MSG_TITLE]);
if(lResult!=ERROR_SUCCESS){
ShowErrorBox(hwndDlg,lResult);
return;
}
}
// write message string
if (pdata->pszMessageText&&_tcslen(pdata->pszMessageText)){
lResult=SetRegKeyString(HKEY_USERS, pdata->pszMessageText,
szConstraintsKeyPath,
KeyName[MSG]);
if(lResult!=ERROR_SUCCESS){
ShowErrorBox(hwndDlg,lResult);
return;
}
} else {
lResult=DeleteRegKey(HKEY_USERS,
szConstraintsKeyPath,
KeyName[MSG]);
if(lResult!=ERROR_SUCCESS){
ShowErrorBox(hwndDlg,lResult);
return;
}
}
}
/*++
Routine Description :
shows MessageBox with error message.
Arguments :
IN HWND hwndDlg - handle to dialog box.
IN DWORD dwError - error code.
Return Value :
none
--*/
void
ShowErrorBox(
HWND hwndDlg,
DWORD dwError)
{
LPTSTR MsgBuf=NULL;
DWORD dwFlags=FORMAT_MESSAGE_FROM_SYSTEM|
FORMAT_MESSAGE_ALLOCATE_BUFFER|
FORMAT_MESSAGE_IGNORE_INSERTS;
if(!FormatMessage(
dwFlags,
NULL, dwError,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR)&MsgBuf, 0, NULL )){
MsgBuf=(LPTSTR)LocalAlloc(LPTR,2*sizeof(TCHAR));
if(MsgBuf == NULL) {
return;
}
MsgBuf[0]=' ';
}
TCHAR szTemplate[256];
LoadString(g_hInst,IDS_SAVE_ERROR,szTemplate,255);
LPTSTR szErrorMsg=new TCHAR[_tcslen(MsgBuf)+_tcslen(szTemplate)+1];
if(szErrorMsg == NULL) {
return;
}
wsprintf(szErrorMsg,szTemplate,MsgBuf);
MessageBox(hwndDlg,szErrorMsg,NULL,MB_OK|MB_ICONERROR);
delete szErrorMsg;
LocalFree(MsgBuf);
}