|
|
// *********************************************************************************
//
// Copyright (c) Microsoft Corporation
//
// Module Name:
//
// parseAndshow.cpp
//
// Abstract:
//
// This module implements the command-line parsing and validating the filters
//
// Author:
//
// Sunil G.V.N. Murali ([email protected]) 27-Dec-2000
//
// Revision History:
//
// Sunil G.V.N. Murali ([email protected]) 27-Dec-2000 : Created It.
//
// *********************************************************************************
#include "pch.h"
#include "systeminfo.h"
//
// local function prototypes
//
// ***************************************************************************
// Routine Description:
// processes and validates the command line inputs
//
// Arguments:
// [ in ] argc : no. of input arguments specified
// [ in ] argv : input arguments specified at command prompt
//
// Return Value:
// TRUE : if inputs are valid
// FALSE : if inputs were errorneously specified
//
// ***************************************************************************
BOOL CSystemInfo::ProcessOptions( DWORD argc, LPCTSTR argv[] ) { // local variables
CHString strFormat; BOOL bNoHeader = FALSE; PTCMDPARSER pcmdOptions = NULL;
// temporary local variables
LPWSTR pwszFormat = NULL; LPWSTR pwszServer = NULL; LPWSTR pwszUserName = NULL; LPWSTR pwszPassword = NULL; PTCMDPARSER pOption = NULL; PTCMDPARSER pOptionServer = NULL; PTCMDPARSER pOptionUserName = NULL; PTCMDPARSER pOptionPassword = NULL;
//
// prepare the command options
pcmdOptions = new TCMDPARSER[ MAX_OPTIONS ]; if ( pcmdOptions == NULL ) { SetLastError( E_OUTOFMEMORY ); SaveLastError(); return FALSE; } else { ZeroMemory( pcmdOptions, MAX_OPTIONS * sizeof( TCMDPARSER ) ); }
try { // get the internal buffers
pwszFormat = strFormat.GetBufferSetLength( MAX_STRING_LENGTH ); pwszServer = m_strServer.GetBufferSetLength( MAX_STRING_LENGTH ); pwszUserName = m_strUserName.GetBufferSetLength( MAX_STRING_LENGTH ); pwszPassword = m_strPassword.GetBufferSetLength( MAX_STRING_LENGTH );
// init the password contents with '*'
lstrcpy( pwszPassword, L"*" ); } catch( ... ) { SetLastError( E_OUTOFMEMORY ); SaveLastError(); return FALSE; }
// -?
pOption = pcmdOptions + OI_USAGE; pOption->dwCount = 1; pOption->dwActuals = 0; pOption->dwFlags = CP_USAGE; pOption->pValue = &m_bUsage; pOption->pFunction = NULL; pOption->pFunctionData = NULL; lstrcpy( pOption->szValues, NULL_STRING ); lstrcpy( pOption->szOption, OPTION_USAGE );
// -s
pOption = pcmdOptions + OI_SERVER; pOption->dwCount = 1; pOption->dwActuals = 0; pOption->pValue = pwszServer; pOption->pFunction = NULL; pOption->pFunctionData = NULL; pOption->dwFlags = CP_TYPE_TEXT | CP_VALUE_MANDATORY; lstrcpy( pOption->szValues, NULL_STRING ); lstrcpy( pOption->szOption, OPTION_SERVER );
// -u
pOption = pcmdOptions + OI_USERNAME; pOption->dwCount = 1; pOption->dwActuals = 0; pOption->dwFlags = CP_TYPE_TEXT | CP_VALUE_MANDATORY; pOption->pValue = pwszUserName; pOption->pFunction = NULL; pOption->pFunctionData = NULL; lstrcpy( pOption->szValues, NULL_STRING ); lstrcpy( pOption->szOption, OPTION_USERNAME );
// -p
pOption = pcmdOptions + OI_PASSWORD; pOption->dwCount = 1; pOption->dwActuals = 0; pOption->dwFlags = CP_TYPE_TEXT | CP_VALUE_OPTIONAL; pOption->pValue = pwszPassword; pOption->pFunction = NULL; pOption->pFunctionData = NULL; lstrcpy( pOption->szValues, NULL_STRING ); lstrcpy( pOption->szOption, OPTION_PASSWORD );
// -format
pOption = pcmdOptions + OI_FORMAT; pOption->dwCount = 1; pOption->dwActuals = 0; pOption->dwFlags = CP_TYPE_TEXT | CP_VALUE_MANDATORY | CP_MODE_VALUES; pOption->pValue = pwszFormat; pOption->pFunction = NULL; pOption->pFunctionData = NULL; lstrcpy( pOption->szValues, OVALUES_FORMAT ); lstrcpy( pOption->szOption, OPTION_FORMAT );
// -noheader
pOption = pcmdOptions + OI_NOHEADER; pOption->dwCount = 1; pOption->dwActuals = 0; pOption->dwFlags = 0; pOption->pValue = &bNoHeader; pOption->pFunction = NULL; pOption->pFunctionData = NULL; lstrcpy( pOption->szValues, NULL_STRING ); lstrcpy( pOption->szOption, OPTION_NOHEADER );
//
// now, check the mutually exclusive options
pOptionServer = pcmdOptions + OI_SERVER; pOptionUserName = pcmdOptions + OI_USERNAME; pOptionPassword = pcmdOptions + OI_PASSWORD;
//
// do the parsing
if ( DoParseParam( argc, argv, MAX_OPTIONS, pcmdOptions ) == FALSE ) { RELEASE_MEMORY_EX( pcmdOptions ); // clear memory
return FALSE; // invalid syntax
}
// release the buffers
strFormat.ReleaseBuffer(); m_strServer.ReleaseBuffer(); m_strUserName.ReleaseBuffer(); m_strPassword.ReleaseBuffer();
// check the usage option
if ( m_bUsage && ( argc > 2 ) ) { // no other options are accepted along with -? option
SetLastError( MK_E_SYNTAX ); SetReason( ERROR_INVALID_USAGE_REQUEST ); RELEASE_MEMORY_EX( pcmdOptions ); // clear memory
return FALSE; } else if ( m_bUsage == TRUE ) { // should not do the furthur validations
RELEASE_MEMORY_EX( pcmdOptions ); // clear memory
return TRUE; }
// empty server name is not valid
if ( pOptionServer->dwActuals != 0 && m_strServer.GetLength() == 0 ) { SetReason( ERROR_SERVERNAME_EMPTY ); RELEASE_MEMORY_EX( pcmdOptions ); // clear memory
return FALSE; // indicate failure
}
// empty user is not valid
if ( pOptionUserName->dwActuals != 0 && m_strUserName.GetLength() == 0 ) { SetReason( ERROR_USERNAME_EMPTY ); RELEASE_MEMORY_EX( pcmdOptions ); // clear memory
return FALSE; }
// "-u" should not be specified without machine names
if ( pOptionServer->dwActuals == 0 && pOptionUserName->dwActuals != 0 ) { // invalid syntax
SetReason( ERROR_USERNAME_BUT_NOMACHINE ); RELEASE_MEMORY_EX( pcmdOptions ); // clear memory
return FALSE; // indicate failure
}
// "-p" should not be specified without "-u"
if ( pOptionUserName->dwActuals == 0 && pOptionPassword->dwActuals != 0 ) { // invalid syntax
SetReason( ERROR_PASSWORD_BUT_NOUSERNAME ); RELEASE_MEMORY_EX( pcmdOptions ); // clear memory
return FALSE; // indicate failure
}
// determine the format in which the process information has to be displayed
m_dwFormat = SR_FORMAT_LIST; // default format
if ( strFormat.CompareNoCase( TEXT_FORMAT_LIST ) == 0 ) m_dwFormat = SR_FORMAT_LIST; else if ( strFormat.CompareNoCase( TEXT_FORMAT_TABLE ) == 0 ) m_dwFormat = SR_FORMAT_TABLE; else if ( strFormat.CompareNoCase( TEXT_FORMAT_CSV ) == 0 ) m_dwFormat = SR_FORMAT_CSV;
// user might have given no header option for a LIST format which is invalid
if ( bNoHeader == TRUE && m_dwFormat == SR_FORMAT_LIST ) { // invalid syntax
SetReason( ERROR_NH_NOTSUPPORTED ); RELEASE_MEMORY_EX( pcmdOptions ); // clear memory
return FALSE; // indicate failure
}
// check for the no header info and apply to the format variable
if ( bNoHeader == TRUE ) m_dwFormat |= SR_NOHEADER;
// check whether caller should accept the password or not
// if user has specified -s (or) -u and no "-p", then utility should accept password
// the user will be prompter for the password only if establish connection
// is failed without the credentials information
if ( pOptionPassword->dwActuals != 0 && m_strPassword.Compare( L"*" ) == 0 ) { // user wants the utility to prompt for the password before trying to connect
m_bNeedPassword = TRUE; } else if ( (pOptionPassword->dwActuals == 0 && (pOptionServer->dwActuals != 0 || pOptionUserName->dwActuals != 0)) ) { // utility needs to try to connect first and if it fails then prompt for the password
m_bNeedPassword = TRUE; m_strPassword.Empty(); }
// command-line parsing is successfull
RELEASE_MEMORY_EX( pcmdOptions ); // clear memory
return TRUE; }
// ***************************************************************************
// Routine Description:
// show the system configuration information
//
// Arguments:
// NONE
//
// Return Value:
// NONE
//
// ***************************************************************************
VOID CSystemInfo::ShowOutput( DWORD dwStart, DWORD dwEnd ) { // local variables
PTCOLUMNS pColumn = NULL;
// dynamically show / hide columns on need basis
for( DWORD dw = 0; dw < MAX_COLUMNS; dw++ ) { // point to the column info
pColumn = m_pColumns + dw;
// remove the hide flag from the column
pColumn->dwFlags &= ~( SR_HIDECOLUMN );
// now if the column should not be shown, set the hide flag)
if ( dw < dwStart || dw > dwEnd ) pColumn->dwFlags |= SR_HIDECOLUMN; }
// if the data is being displayed from the first line onwards,
// add a blank line
if ( dwStart == 0 ) ShowMessage( stdout, L"\n" );
//
// display the results
ShowResults( MAX_COLUMNS, m_pColumns, m_dwFormat, m_arrData ); }
// ***************************************************************************
// Routine Description:
// This function fetches usage information from resource file and shows it
//
// Arguments:
// NONE
//
// Return Value:
// NONE
// ***************************************************************************
VOID CSystemInfo::ShowUsage() { // local variables
DWORD dw = 0;
// start displaying the usage
for( dw = ID_HELP_START; dw <= ID_HELP_END; dw++ ) ShowMessage( stdout, GetResString( dw ) ); }
|