|
|
//----------------------------------------------------------------------------
//
// 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; }
|