windows-nt/Source/XPSP1/NT/base/ntsetup/opktools/setupmgr/main/cmdlines.c
2020-09-26 16:20:57 +08:00

617 lines
15 KiB
C

//----------------------------------------------------------------------------
//
// Copyright (c) 1997-1999 Microsoft Corporation
// All rights reserved.
//
// File Name:
// cmdlines.c
//
// Description:
// Dialog proc for the cmdlines.txt page
//
//----------------------------------------------------------------------------
#include "pch.h"
#include "resource.h"
#define MAX_CMDLINE 1024
#define CMD_FILENAME _T("cmdlines.txt")
static NAMELIST CmdLinesList = { 0 };
//----------------------------------------------------------------------------
//
// Function: SetPathToCmdlines
//
// Purpose: Determines the path to the cmdlines.txt and set PathBuffer to it.
// PathBuffer is assumed to be MAX_PATH long
//
// Arguments: OUT TCHAR *PathBuffer - path to cmdlines.txt
//
// Returns: VOID
//
//----------------------------------------------------------------------------
static VOID
SetPathToCmdlines( OUT TCHAR *PathBuffer, DWORD cbPath )
{
if( WizGlobals.iProductInstall == PRODUCT_SYSPREP )
{
TCHAR szDrive[MAX_PATH];
TCHAR szSysprepPath[MAX_PATH] = _T("");
ExpandEnvironmentStrings( _T("%SystemDrive%"),
szDrive,
MAX_PATH );
ConcatenatePaths( szSysprepPath,
szDrive,
_T("\\sysprep\\i386\\$oem$"),
NULL );
EnsureDirExists( szSysprepPath );
lstrcpyn( PathBuffer, szSysprepPath, cbPath );
}
else
{
lstrcpyn( PathBuffer, WizGlobals.OemFilesPath, cbPath );
}
}
//----------------------------------------------------------------------------
//
// Function: LoadCmdLinesFile
//
// Purpose: Loads the contents of cmdlines.txt into memory.
//
//----------------------------------------------------------------------------
VOID LoadCmdLinesFile(HWND hwnd)
{
FILE *fp;
TCHAR CmdLineBuffer[MAX_CMDLINE + 1];
TCHAR PathBuffer[MAX_PATH];
ResetNameList(&CmdLinesList);
SetPathToCmdlines( PathBuffer, AS(PathBuffer) );
ConcatenatePaths(PathBuffer, CMD_FILENAME, NULL);
if ( (fp = My_fopen(PathBuffer, _T("r") )) == NULL )
return;
//
// Add all the entries to the namelist except for the [Commands] line
//
while( My_fgets(CmdLineBuffer, MAX_CMDLINE, fp) != NULL ) {
if( _tcsstr( CmdLineBuffer, _T("[Commands]") ) == NULL ) {
AddNameToNameList( &CmdLinesList,
CleanSpaceAndQuotes( CmdLineBuffer ) );
}
}
My_fclose(fp);
}
//----------------------------------------------------------------------------
//
// Function: WriteCmdLinesFile
//
// Purpose: Writes the contents of our in-memory cmdlines to disk.
//
//----------------------------------------------------------------------------
VOID WriteCmdLinesFile(HWND hwnd)
{
UINT i, nNames;
UINT iNumCmdLinesEntries;
FILE *fp;
TCHAR PathBuffer[MAX_PATH], *pCommand;
//
// If there are no command lines to write then don't create the
// cmdlines.txt file.
//
iNumCmdLinesEntries = GetNameListSize( &CmdLinesList );
if( iNumCmdLinesEntries == 0 ) {
return;
}
//
// Keep trying to open cmdlines.txt until it's open or until the
// user gives up
//
SetPathToCmdlines( PathBuffer, AS(PathBuffer) );
ConcatenatePaths(PathBuffer, CMD_FILENAME, NULL);
do {
if ( (fp = My_fopen(PathBuffer, _T("w") )) == NULL ) {
UINT iRet = ReportErrorId(
hwnd,
MSGTYPE_RETRYCANCEL | MSGTYPE_WIN32,
IDS_OPEN_CMDLINES_FAILED,
PathBuffer);
if ( iRet != IDRETRY )
return;
} else
break;
} while ( TRUE );
//
// ISSUE-2002/02/28-stelo- Check return value from fputs
//
My_fputs( _T("[Commands]\n"), fp );
//
// Write out each command in CmdLinesList
//
for ( i = 0, nNames = GetNameListSize(&CmdLinesList);
i < nNames;
i++ ) {
pCommand = GetNameListName(&CmdLinesList, i);
My_fputs( _T("\""), fp );
My_fputs(pCommand, fp);
My_fputs( _T("\"\n"), fp );
}
My_fclose(fp);
}
//----------------------------------------------------------------------------
//
// Function: GreyCmdLinesPage
//
// Purpose: Greys out the remove button if nothing selected
//
//----------------------------------------------------------------------------
VOID GreyCmdLinesPage(HWND hwnd)
{
INT_PTR idx;
HWND hCtrl = GetDlgItem(hwnd, IDC_REMOVECMD);
idx = SendDlgItemMessage(hwnd,
IDC_CMDLIST,
LB_GETCURSEL,
(WPARAM) 0,
(LPARAM) 0);
//
// Grey the remove button unless something is selected
//
EnableWindow(hCtrl, idx != LB_ERR);
}
//----------------------------------------------------------------------------
//
// Function: OnSelChangeCmdLines
//
// Purpose: Called when user selects an item on the cmd list. We need
// to ungrey the remove button
//
//----------------------------------------------------------------------------
VOID OnCmdLinesSelChange(HWND hwnd)
{
SetArrows( hwnd,
IDC_CMDLIST,
IDC_BUT_MOVE_UP,
IDC_BUT_MOVE_DOWN );
GreyCmdLinesPage(hwnd);
}
//----------------------------------------------------------------------------
//
// Function: OnSetActiveCmdLines
//
// Purpose: Called at SETACTIVE time. We load the current contents
// of cmdline.txt into memory and display it. We read the
// file at SETACTIVE time so that the user has a way of
// refreshing the display.
//
//----------------------------------------------------------------------------
VOID OnSetActiveCmdLines(HWND hwnd)
{
UINT i, nNames;
LPTSTR pNextName;
//
// Load cmdlines.txt into memory
//
LoadCmdLinesFile(hwnd);
//
// Reset the display to match what is in memory
//
SendDlgItemMessage(hwnd,
IDC_CMDLIST,
LB_RESETCONTENT,
(WPARAM) 0,
(LPARAM) 0);
for ( i = 0, nNames = GetNameListSize(&CmdLinesList);
i < nNames;
i++ ) {
pNextName = GetNameListName(&CmdLinesList, i);
SendDlgItemMessage(hwnd,
IDC_CMDLIST,
LB_ADDSTRING,
(WPARAM) 0,
(LPARAM) pNextName);
}
GreyCmdLinesPage(hwnd);
}
//----------------------------------------------------------------------------
//
// Function: OnAddCmdLine
//
// Purpose: Called when user pushes ADD button. Get command from
// edit field and add it to the in-memory list.
//
//----------------------------------------------------------------------------
VOID OnAddCmdLine(HWND hwnd)
{
TCHAR CmdBuffer[MAX_CMDLINE + 1];
//
// get the command the user typed in
//
GetDlgItemText(hwnd, IDT_CMDLINE, CmdBuffer, MAX_CMDLINE);
//
// Don't add a blank command
//
if( CmdBuffer[0] == _T('\0') )
{
return;
}
//
// display what the user typed-in in the listbox
// and clear out the name the user typed
//
SendDlgItemMessage(hwnd,
IDC_CMDLIST,
LB_ADDSTRING,
(WPARAM) 0,
(LPARAM) CmdBuffer);
SetArrows( hwnd,
IDC_CMDLIST,
IDC_BUT_MOVE_UP,
IDC_BUT_MOVE_DOWN );
SetDlgItemText( hwnd, IDT_CMDLINE, _T("") );
SetFocus(GetDlgItem(hwnd, IDT_CMDLINE));
}
//----------------------------------------------------------------------------
//
// Function: OnRemoveCmdLine
//
// Purpose: Called when user pushes REMOVE button. Get selected command
// and remove it from display and memory.
//
//----------------------------------------------------------------------------
VOID OnRemoveCmdLine(HWND hwnd)
{
TCHAR CmdBuffer[MAX_CMDLINE + 1];
INT_PTR idx, Count;
//
// Get users selection of the command to remove
//
idx = SendDlgItemMessage(hwnd,
IDC_CMDLIST,
LB_GETCURSEL,
(WPARAM) 0,
(LPARAM) 0);
if ( idx == LB_ERR )
return;
//
// Retrieve the name to remove from listbox
//
SendDlgItemMessage(hwnd,
IDC_CMDLIST,
LB_GETTEXT,
(WPARAM) idx,
(LPARAM) CmdBuffer);
//
// Remove it from the listbox display
//
SendDlgItemMessage(hwnd,
IDC_CMDLIST,
LB_DELETESTRING,
(WPARAM) idx,
(LPARAM) 0);
//
// Have to set a new selection.
//
Count = SendDlgItemMessage(hwnd,
IDC_CMDLIST,
LB_GETCOUNT,
(WPARAM) 0,
(LPARAM) 0);
if ( Count ) {
if ( idx >= Count )
idx--;
SendDlgItemMessage(hwnd,
IDC_CMDLIST,
LB_SETCURSEL,
(WPARAM) idx,
(LPARAM) 0);
}
SetArrows( hwnd,
IDC_CMDLIST,
IDC_BUT_MOVE_UP,
IDC_BUT_MOVE_DOWN );
//
// There might be nothing selected now
//
GreyCmdLinesPage(hwnd);
}
//----------------------------------------------------------------------------
//
// Function: OnCommandLinesInitDialog
//
// Purpose:
//
// Arguments: IN HWND hwnd - handle to the dialog
//
// Returns: VOID
//
//----------------------------------------------------------------------------
VOID
OnCommandLinesInitDialog( IN HWND hwnd )
{
//
// Set text limit
//
SendDlgItemMessage(hwnd,
IDT_CMDLINE,
EM_LIMITTEXT,
(WPARAM) MAX_CMDLINE,
(LPARAM) 0);
SetArrows( hwnd,
IDC_CMDLIST,
IDC_BUT_MOVE_UP,
IDC_BUT_MOVE_DOWN );
}
//----------------------------------------------------------------------------
//
// Function: OnWizNextCmdLines
//
// Purpose: Called when user pushes NEXT button. Write the file out.
//
//----------------------------------------------------------------------------
VOID OnWizNextCmdLines(HWND hwnd)
{
INT_PTR i;
INT_PTR iRetVal;
INT_PTR iNumItems;
TCHAR CmdBuffer[MAX_CMDLINE + 1];
BOOL bStayHere = FALSE;
//
// If the user typed something into the command field but failed to
// ADD it, auto-add it
//
GetDlgItemText(hwnd, IDT_CMDLINE, CmdBuffer, MAX_CMDLINE + 1);
if ( CmdBuffer[0] != _T('\0') )
OnAddCmdLine(hwnd);
//
// Store all the entries in the list box into the Command Lines namelist
//
iNumItems = SendDlgItemMessage( hwnd,
IDC_CMDLIST,
LB_GETCOUNT,
(WPARAM) 0,
(LPARAM) 0 );
ResetNameList( &CmdLinesList );
for( i = 0; i < iNumItems; i++ )
{
iRetVal = SendDlgItemMessage( hwnd,
IDC_CMDLIST,
LB_GETTEXT,
(WPARAM) i,
(LPARAM) CmdBuffer );
if( iRetVal == LB_ERR )
{
AssertMsg( FALSE,
"Error adding items to namelist." );
break;
}
AddNameToNameList(&CmdLinesList, CmdBuffer);
}
//
// Write the cmd lines file and move the wizard on
//
WriteCmdLinesFile(hwnd);
}
//----------------------------------------------------------------------------
//
// Function: DlgCommandLinesPage
//
// Purpose: Dlg proc.
//
//----------------------------------------------------------------------------
INT_PTR CALLBACK DlgCommandLinesPage(
IN HWND hwnd,
IN UINT uMsg,
IN WPARAM wParam,
IN LPARAM lParam)
{
BOOL bStatus = TRUE;
switch (uMsg) {
case WM_INITDIALOG:
OnCommandLinesInitDialog( hwnd );
break;
case WM_COMMAND:
{
int nButtonId;
switch ( nButtonId = LOWORD(wParam) ) {
case IDC_ADDCMD:
if ( HIWORD(wParam) == BN_CLICKED )
OnAddCmdLine(hwnd);
break;
case IDC_REMOVECMD:
if ( HIWORD(wParam) == BN_CLICKED )
OnRemoveCmdLine(hwnd);
break;
case IDC_CMDLIST:
if ( HIWORD(wParam) == LBN_SELCHANGE )
OnCmdLinesSelChange(hwnd);
break;
case IDC_BUT_MOVE_UP:
OnUpButtonPressed( hwnd, IDC_CMDLIST );
SetArrows( hwnd,
IDC_CMDLIST,
IDC_BUT_MOVE_UP,
IDC_BUT_MOVE_DOWN );
break;
case IDC_BUT_MOVE_DOWN:
OnDownButtonPressed( hwnd, IDC_CMDLIST );
SetArrows( hwnd,
IDC_CMDLIST,
IDC_BUT_MOVE_UP,
IDC_BUT_MOVE_DOWN );
break;
default:
bStatus = FALSE;
break;
}
}
break;
case WM_NOTIFY:
{
LPNMHDR pnmh = (LPNMHDR)lParam;
switch( pnmh->code ) {
case PSN_QUERYCANCEL:
WIZ_CANCEL(hwnd);
break;
case PSN_SETACTIVE:
g_App.dwCurrentHelp = IDH_ADDL_CMND;
if ( WizGlobals.iProductInstall == PRODUCT_UNATTENDED_INSTALL )
WIZ_BUTTONS(hwnd, PSWIZB_BACK | PSWIZB_FINISH);
else
WIZ_BUTTONS(hwnd, PSWIZB_BACK | PSWIZB_NEXT);
OnSetActiveCmdLines(hwnd);
break;
case PSN_WIZBACK:
bStatus = FALSE;
break;
case PSN_WIZNEXT:
OnWizNextCmdLines(hwnd);
bStatus = FALSE;
break;
case PSN_HELP:
WIZ_HELP();
break;
default:
bStatus = FALSE;
break;
}
}
break;
default:
bStatus = FALSE;
break;
}
return bStatus;
}