windows-nt/Source/XPSP1/NT/base/ntsetup/opktools/setupmgr/oem/screens2.c

344 lines
12 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/****************************************************************************\
SCREENS2.C / OPK Wizard (OPKWIZ.EXE)
Microsoft Confidential
Copyright (c) Microsoft Corporation 1998
All rights reserved
Source file for the OPK Wizard that contains the external and internal
functions used by the "screenstwo" wizard page.
10/99 - Stephen Lodwick (A-STELO)
Added this page
09/2000 - Stephen Lodwick (STELO)
Ported OPK Wizard to Whistler
\****************************************************************************/
//
// Include File(s):
//
#include "pch.h"
#include "wizard.h"
#include "resource.h"
#include "screens2.h"
//
// Internal Defined Value(s):
//
#define INI_KEY_REGIONAL _T("INTL_Settings")
#define INI_KEY_TIMEZONE _T("TimeZone")
#define INI_KEY_TIMEZONEVALUE _T("TimeZoneValue")
#define INI_SEC_TIMEZONES _T("TimeZones")
#define INI_KEY_DEFAULTLOCALE _T("DefaultLanguage")
#define INI_SEC_LOCALE _T("Languages")
#define INI_KEY_DEFAULTREGION _T("DefaultRegion")
#define INI_SEC_REGION _T("Regions")
#define INI_KEY_DEFAULTKEYBD _T("DefaultKeyboard")
#define INI_SEC_KEYBD _T("Keyboards")
//
// Internal Structure(s):
//
typedef struct _OOBEOPTIONS
{
INT ListBox;
LPTSTR lpDefaultKey;
LPTSTR lpAlternateSection;
LPTSTR lpOutputFormat;
LPLONGRES lplrListItems;
INT dwListSize;
} OOBEOPTIONS, *LPOOBEOPTIONS;
//
// Global Define(s):
//
static OOBEOPTIONS g_OobeOptions [] =
{
{ IDC_TIMEZONE, INI_KEY_TIMEZONEVALUE, INI_SEC_TIMEZONES, _T("%03lu"), lr_timezone_default, AS(lr_timezone_default) },
{ IDC_LOCALE, INI_KEY_DEFAULTLOCALE, INI_SEC_LOCALE, _T("%x"), lr_location_default, AS(lr_location_default) },
{ IDC_REGION, INI_KEY_DEFAULTREGION, INI_SEC_REGION, _T("%d"), lr_region_default, AS(lr_region_default) },
{ IDC_KEYBOARD, INI_KEY_DEFAULTKEYBD, INI_SEC_KEYBD, _T("%x"), lr_keyboard_default, AS(lr_keyboard_default) },
};
//
// Internal Function Prototype(s):
//
static BOOL OnInit(HWND, HWND, LPARAM);
static void OnNext(HWND);
static void LoadListBox(HWND, OOBEOPTIONS);
//
// External Function(s):
//
LRESULT CALLBACK ScreensTwoDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
HANDLE_MSG(hwnd, WM_INITDIALOG, OnInit);
case WM_NOTIFY:
switch ( ((NMHDR FAR *) lParam)->code )
{
case PSN_KILLACTIVE:
case PSN_RESET:
case PSN_WIZBACK:
case PSN_WIZFINISH:
break;
case PSN_WIZNEXT:
OnNext(hwnd);
break;
case PSN_QUERYCANCEL:
WIZ_CANCEL(hwnd);
break;
case PSN_SETACTIVE:
g_App.dwCurrentHelp = IDH_SCREENSTWO;
WIZ_BUTTONS(hwnd, PSWIZB_BACK | PSWIZB_NEXT);
// Press next if the user is in auto mode
//
WIZ_NEXTONAUTO(hwnd, PSBTN_NEXT);
break;
case PSN_HELP:
WIZ_HELP();
break;
default:
return FALSE;
}
break;
default:
return FALSE;
}
return TRUE;
}
//
// Internal Function(s):
//
static BOOL OnInit(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
INT i;
// Decide if we check Regional Settings checkbox
//
if (( GetPrivateProfileInt(INI_SEC_OPTIONS, INI_KEY_REGIONAL, 0, GET_FLAG(OPK_BATCHMODE) ? g_App.szOpkWizIniFile : g_App.szOobeInfoIniFile) == 1 ) )
CheckDlgButton(hwnd, IDC_SCREEN_REGIONAL, TRUE);
// Decide if we check Time Zone Settings checkbox
//
if (( GetPrivateProfileInt(INI_SEC_OPTIONS, INI_KEY_TIMEZONE, 1, GET_FLAG(OPK_BATCHMODE) ? g_App.szOpkWizIniFile : g_App.szOobeInfoIniFile) == 1 ) )
CheckDlgButton(hwnd, IDC_SCREEN_TIMEZONE, TRUE);
// Loop through each of the list boxes and load them
//
for( i = 0; i < AS(g_OobeOptions); i++)
{
// Load the list box using the items in the global oobe structure
//
LoadListBox(hwnd, g_OobeOptions[i]);
}
// Always return false to WM_INITDIALOG.
//
return FALSE;
}
static void OnNext(HWND hwnd)
{
INT iReturn,
i;
LONG lItemData = -1;
TCHAR szItemData[MAX_PATH] = NULLSTR;
HRESULT hrPrintf;
// Loop through each of the OOBE options and save them off
//
for( i = 0; i < AS(g_OobeOptions); i++)
{
// Set the default values
//
lItemData = -1;
szItemData[0] = NULLCHR;
// Check to see what the current item selection is
//
if ( (iReturn = (INT) SendDlgItemMessage(hwnd, g_OobeOptions[i].ListBox, CB_GETCURSEL, (WPARAM) 0, (LPARAM) 0)) != CB_ERR )
{
// Get the DefaultLocale
//
lItemData = (INT) SendDlgItemMessage(hwnd, g_OobeOptions[i].ListBox, CB_GETITEMDATA, (WPARAM) iReturn, (LPARAM) 0);
// Convert the item data from a long to a string
//
if ( lItemData != CB_ERR )
hrPrintf=StringCchPrintf(szItemData, AS(szItemData), g_OobeOptions[i].lpOutputFormat, lItemData);
}
// Write out the settings to the INF files
//
WritePrivateProfileString(INI_SEC_OPTIONS, g_OobeOptions[i].lpDefaultKey, szItemData, g_App.szOobeInfoIniFile);
WritePrivateProfileString(INI_SEC_OPTIONS, g_OobeOptions[i].lpDefaultKey, szItemData, g_App.szOpkWizIniFile);
}
// Write regional settings to the INF files
//
WritePrivateProfileString(INI_SEC_OPTIONS, INI_KEY_REGIONAL, ( IsDlgButtonChecked(hwnd, IDC_SCREEN_REGIONAL) == BST_CHECKED ) ? STR_ONE : STR_ZERO, g_App.szOobeInfoIniFile);
WritePrivateProfileString(INI_SEC_OPTIONS, INI_KEY_REGIONAL, ( IsDlgButtonChecked(hwnd, IDC_SCREEN_REGIONAL) == BST_CHECKED ) ? STR_ONE : STR_ZERO, g_App.szOpkWizIniFile);
// Write time zone settings to the INF files
//
WritePrivateProfileString(INI_SEC_OPTIONS, INI_KEY_TIMEZONE, ( IsDlgButtonChecked(hwnd, IDC_SCREEN_TIMEZONE) == BST_CHECKED ) ? STR_ONE : STR_ZERO, g_App.szOobeInfoIniFile);
WritePrivateProfileString(INI_SEC_OPTIONS, INI_KEY_TIMEZONE, ( IsDlgButtonChecked(hwnd, IDC_SCREEN_TIMEZONE) == BST_CHECKED ) ? STR_ONE : STR_ZERO, g_App.szOpkWizIniFile);
}
static void LoadListBox(HWND hwnd, OOBEOPTIONS OobeOptions)
{
INT index = -1,
iReturn;
LPTSTR lpBuffer = NULL;
HINF hInf = NULL;
LONG lReturn = 0;
DWORD dwErr = 0,
dwItemsAdded = 0;
BOOL bLoop = 0;
INFCONTEXT InfContext;
TCHAR szBuffer[MAX_PATH] = NULLSTR,
szDefaultIndex[MAX_PATH]= NULLSTR,
szTemp[MAX_PATH] = NULLSTR;
HRESULT hrPrintf;
// If we don't have any of the following values, we must return
//
if ( !hwnd || !OobeOptions.ListBox || !OobeOptions.lplrListItems || !OobeOptions.dwListSize || !OobeOptions.lpDefaultKey )
return;
// Get the default value for this field from the INF file
//
GetPrivateProfileString(INI_SEC_OPTIONS, OobeOptions.lpDefaultKey, NULLSTR, szDefaultIndex, AS(szDefaultIndex), GET_FLAG(OPK_BATCHMODE) ? g_App.szOpkWizIniFile : g_App.szOobeInfoIniFile);
// We need to always add the default key, "User Default"
//
if ( lpBuffer = AllocateString(NULL, OobeOptions.lplrListItems[0].uId) )
{
// If we allocated the string add the item to the list
//
if ( (iReturn = (INT) SendDlgItemMessage(hwnd, OobeOptions.ListBox, CB_ADDSTRING, (WPARAM) 0, (LPARAM) lpBuffer)) >= 0 )
{
SendDlgItemMessage(hwnd, OobeOptions.ListBox, CB_SETCURSEL, (WPARAM) iReturn, (LPARAM) 0);
// Add associated data along with the string to the combo box
//
SendDlgItemMessage(hwnd, OobeOptions.ListBox, CB_SETITEMDATA, (WPARAM) iReturn, (LPARAM) OobeOptions.lplrListItems[0].Index);
}
FREE(lpBuffer);
}
// Open the inf file and determine if the section that we're looking for is there.
//
if ( OobeOptions.lpAlternateSection && *(OobeOptions.lpAlternateSection) && (hInf = SetupOpenInfFile(g_App.szOpkInputInfFile, NULL, INF_STYLE_OLDNT | INF_STYLE_WIN4, &dwErr)) != INVALID_HANDLE_VALUE )
{
// Loop through each item in the list
//
for ( bLoop = SetupFindFirstLine(hInf, OobeOptions.lpAlternateSection, NULL, &InfContext);
bLoop;
bLoop = SetupFindNextLine(&InfContext, &InfContext) )
{
// Get the string field and the number representing it and add it to the list
//
if ( (SetupGetStringField(&InfContext, 1, szBuffer, AS(szBuffer), NULL)) && (szBuffer[0]) &&
(SetupGetIntField(&InfContext, 2, &index)) && ( index >= 0 ) &&
((iReturn = (INT) SendDlgItemMessage(hwnd, OobeOptions.ListBox, CB_ADDSTRING, (WPARAM) 0, (LPARAM) szBuffer)) >= 0)
)
{
// Add associated data along with the string to the combo box
//
SendDlgItemMessage(hwnd, OobeOptions.ListBox, CB_SETITEMDATA, (WPARAM) iReturn, (LPARAM) index);
// Format the current value so that we can compare it to the default value
//
hrPrintf=StringCchPrintf(szTemp, AS(szTemp), OobeOptions.lpOutputFormat, index);
// Compare the default value to the current value just added to the list box
//
if ( lstrcmpi(szTemp, szDefaultIndex) == 0 )
{
// Set this as the default value
//
SendDlgItemMessage(hwnd, OobeOptions.ListBox, CB_SETCURSEL, (WPARAM) iReturn, (LPARAM) 0);
}
dwItemsAdded++;
}
}
SetupCloseInfFile(hInf);
}
// If we didn't add items through the inf, use the defaults in the resource
//
if ( !dwItemsAdded )
{
// Loop through each of the items in the list
//
for ( index=1; index < (OobeOptions.dwListSize); index++ )
{
// Allocate a string for the resource identifier and add it to the list
//
if ( (lpBuffer = AllocateString(NULL, OobeOptions.lplrListItems[index].uId)) &&
((iReturn = (INT) SendDlgItemMessage(hwnd, OobeOptions.ListBox, CB_ADDSTRING, (WPARAM) 0, (LPARAM) lpBuffer)) >= 0))
{
// Add associated data along with the string to the combo box
//
SendDlgItemMessage(hwnd, OobeOptions.ListBox, CB_SETITEMDATA, (WPARAM) iReturn, (LPARAM) OobeOptions.lplrListItems[index].Index);
// Format the current value so that we can compare it to the default value
//
hrPrintf=StringCchPrintf(szTemp, AS(szTemp), OobeOptions.lpOutputFormat, OobeOptions.lplrListItems[index].Index);
// Compare the default value to the current value just added to the list box
//
if ( lstrcmpi(szTemp, szDefaultIndex) == 0 )
{
// Set this as the default value
//
SendDlgItemMessage(hwnd, OobeOptions.ListBox, CB_SETCURSEL, (WPARAM) iReturn, (LPARAM) 0);
}
}
// Clean up the allocated string
//
FREE(lpBuffer);
}
}
}