///////////////////////////////////////////////////////////////////////////// // // Copyright (c) 1996-1998 Microsoft Corporation // // Module Name: // ClusCfgCommands // // Abstract: // This file contains functions for handling commands passed to cluscfg.exe // either via a command line option of via entries in an answer file. // // Author: // C. Brent Thomas a-brentt // // Revision History: // 30 Sep 1998 original // // Notes: // ///////////////////////////////////////////////////////////////////////////// #include #include #include #include "ClusCfgCommands.h" ///////////////////////////////////////////////////////////////////////////// //++ // // CClusCfgCommand // // Routine Description: // This is the default constructor for the CClusCfgConnand class. // // Arguments: // None // // Return Value: // None // //-- ///////////////////////////////////////////////////////////////////////////// CClusCfgCommand::CClusCfgCommand( void ) { m_pNextCommand = NULL; m_dwCommandStringId = 0L; m_ptszCommandString = NULL; m_dwCommandSubStringId = 0L; m_ptszCommandSubString = NULL; } ///////////////////////////////////////////////////////////////////////////// //++ // // CClusCfgCommand // // Routine Description: // This constructor initializes the string Id data members of a CClusCfgCommand object. // // Arguments: // dwStringId - the string Id of the command string // dwSubStringId - the string Id of the minimum substring of a command // // Return Value: // None // //-- ///////////////////////////////////////////////////////////////////////////// CClusCfgCommand::CClusCfgCommand( DWORD dwStringId, DWORD dwSubStringId ) { m_pNextCommand = NULL; m_dwCommandStringId = dwStringId; m_ptszCommandString = NULL; m_dwCommandSubStringId = dwSubStringId; m_ptszCommandSubString = NULL; } ///////////////////////////////////////////////////////////////////////////// //++ // // ~CClusCfgCommand // // Routine Description: // This is the destructor for the CClusCfgCommand class. // // Arguments: // None // // Return Value: // None // //-- ///////////////////////////////////////////////////////////////////////////// CClusCfgCommand::~CClusCfgCommand( void ) { if ( m_pNextCommand != NULL ) { delete m_pNextCommand; } if ( m_ptszCommandString != NULL ) { delete m_ptszCommandString; } if ( m_ptszCommandSubString != NULL ) { delete m_ptszCommandSubString; } } ///////////////////////////////////////////////////////////////////////////// //++ // // InitializeCommandSubString // // Routine Description: // This function sets the m_dwCommandSubStringId and m_ptszCommandSubString members // of a CClusCfgCommand object. // // Arguments: // hInstance = the instance handle of the executable image // dwCommandSubStringId = the string Id of the command Sub string // // // Return Value: // TRUE - indicates success // FALSE - indicates that an error occured // //-- ///////////////////////////////////////////////////////////////////////////// BOOL CClusCfgCommand::InitializeCommandSubString( HINSTANCE hInstance, DWORD dwCommandSubStringId ) { BOOL fReturnValue; // Assume that no valid command will be longer than the maximum length of an answer file entry. TCHAR tszString[MAX_INF_STRING_LENGTH]; // Is the command string Id meaningfull? if ( dwCommandSubStringId != 0L ) { // Set the command string Id. SetCommandSubStringId( dwCommandSubStringId ); // Read the command string from the STRINGTABLE. if ( LoadString( hInstance, m_dwCommandSubStringId, tszString, MAX_INF_STRING_LENGTH ) > 0 ) { // tszString is the command string. // Allocate memory for the string and save its' address. SetCommandSubStringPointer( new TCHAR[_tcslen( tszString ) +1] ); // Store the command string. _tcscpy( GetCommandSubStringPointer(), tszString ); fReturnValue = TRUE; } else { // Set the command string to empty. if ( GetCommandSubStringPointer() != NULL ) { delete GetCommandSubStringPointer(); } SetCommandSubStringPointer( NULL ); fReturnValue = FALSE; } // string loaded from STRINGTABLE? } else { // Set the command string to empty. if ( GetCommandSubStringPointer() != NULL ) { delete GetCommandSubStringPointer(); } SetCommandSubStringPointer( NULL ); fReturnValue = FALSE; } // String Id meaningfull? return ( fReturnValue ); } ///////////////////////////////////////////////////////////////////////////// //++ // // InitializeCommandSubString // // Routine Description: // This function sets the m_ptszCommandSubString member of a CClusCfgCommand object // based on the contents of the m_dwCommandSubStringId member. // // Arguments: // hInstance = the instance handle of the executable image // // Return Value: // TRUE - indicates success // FALSE - indicates that an error occured // //-- ///////////////////////////////////////////////////////////////////////////// BOOL CClusCfgCommand::InitializeCommandSubString( HINSTANCE hInstance ) { BOOL fReturnValue; // Assume that no valid command will be longer than the maximum length of an answer file entry. TCHAR tszString[MAX_INF_STRING_LENGTH]; // Is the command string Id meaningfull? if ( GetCommandSubStringId() != 0L ) { // Read the command string from the STRINGTABLE. if ( LoadString( hInstance, m_dwCommandSubStringId, tszString, MAX_INF_STRING_LENGTH ) > 0 ) { // tszString is the command string. // Allocate memory for the string and save its' address. SetCommandSubStringPointer( new TCHAR[_tcslen(tszString) + 1] ); // Store the command string. _tcscpy( GetCommandSubStringPointer(), tszString ); fReturnValue = TRUE; } else { // Set the command string to empty. if ( GetCommandSubStringPointer() != NULL ) { delete GetCommandSubStringPointer(); } SetCommandSubStringPointer( NULL ); fReturnValue = FALSE; } // string loaded from STRINGTABLE? } else { // Set the command string to empty. if ( GetCommandSubStringPointer() != NULL ) { delete GetCommandSubStringPointer(); } SetCommandSubStringPointer( NULL ); fReturnValue = FALSE; } // String Id meaningfull? return ( fReturnValue ); } ///////////////////////////////////////////////////////////////////////////// //++ // // InitializeCommandString // // Routine Description: // This function sets the m_dwCommandStringId and m_ptszCommandString members // of a CClusCfgCommand object. // // Arguments: // hInstance = the instance handle of the executable image // dwCommandStringId = the string Id of the command string // // // Return Value: // TRUE - indicates success // FALSE - indicates that an error occured // //-- ///////////////////////////////////////////////////////////////////////////// BOOL CClusCfgCommand::InitializeCommandString( HINSTANCE hInstance, DWORD dwCommandStringId ) { BOOL fReturnValue; // Assume that no valid command will be longer than the maximum length of an answer file entry. TCHAR tszString[MAX_INF_STRING_LENGTH]; // Is the command string Id meaningfull? if ( dwCommandStringId != 0L ) { // Set the command string Id. SetCommandStringId( dwCommandStringId ); // Read the command string from the STRINGTABLE. if ( LoadString( hInstance, m_dwCommandStringId, tszString, MAX_INF_STRING_LENGTH ) > 0 ) { // tszString is the command string. // Allocate memory for the string and save its' address. SetCommandStringPointer( new TCHAR[_tcslen(tszString) + 1] ); // Store the command string. _tcscpy( GetCommandStringPointer(), tszString ); fReturnValue = TRUE; } else { // Set the command string to empty. if ( GetCommandStringPointer() != NULL ) { delete GetCommandStringPointer(); } SetCommandStringPointer( NULL ); fReturnValue = FALSE; } // string loaded from STRINGTABLE? } else { // Set the command string to empty. if ( GetCommandStringPointer() != NULL ) { delete GetCommandStringPointer(); } SetCommandStringPointer( NULL ); fReturnValue = FALSE; } // String Id meaningfull? return ( fReturnValue ); } ///////////////////////////////////////////////////////////////////////////// //++ // // InitializeCommandString // // Routine Description: // This function sets the m_ptszCommandString member of a CClusCfgCommand object // based on the contents of the m_dwCommandStringId member. // // Arguments: // hInstance = the instance handle of the executable image // // Return Value: // TRUE - indicates success // FALSE - indicates that an error occured // //-- ///////////////////////////////////////////////////////////////////////////// BOOL CClusCfgCommand::InitializeCommandString( HINSTANCE hInstance ) { BOOL fReturnValue; // Assume that no valid command will be longer than the maximum length of an answer file entry. TCHAR tszString[MAX_INF_STRING_LENGTH]; // Is the command string Id meaningfull? if ( GetCommandStringId() != 0L ) { // Read the command string from the STRINGTABLE. if ( LoadString( hInstance, m_dwCommandStringId, tszString, MAX_INF_STRING_LENGTH ) > 0 ) { // tszString is the command string. // Allocate memory for the string and save its' address. SetCommandStringPointer( new TCHAR[_tcslen(tszString) + 1] ); // Store the command string. _tcscpy( GetCommandStringPointer(), tszString ); fReturnValue = TRUE; } else { // Set the command string to empty. if ( GetCommandStringPointer() != NULL ) { delete GetCommandStringPointer(); } SetCommandStringPointer( NULL ); fReturnValue = FALSE; } // string loaded from STRINGTABLE? } else { // Set the command string to empty. if ( GetCommandStringPointer() != NULL ) { delete GetCommandStringPointer(); } SetCommandStringPointer( NULL ); fReturnValue = FALSE; } // String Id meaningfull? return ( fReturnValue ); } ///////////////////////////////////////////////////////////////////////////// //++ // // SetNextCommandPointer // // Routine Description: // This function sets the m_pNextCommand member of a CClusCfgCommand object. // // Arguments: // pNextCommand - points to a CClusCfgCommand object // // Return Value: // TRUE - indicates success // FALSE - indicates that an error occured // //-- ///////////////////////////////////////////////////////////////////////////// BOOL CClusCfgCommand::SetNextCommandPointer( CClusCfgCommand * pNextCommand ) { BOOL fReturnValue; m_pNextCommand = pNextCommand; fReturnValue = TRUE; return ( fReturnValue ); } ///////////////////////////////////////////////////////////////////////////// //++ // // GetNextCommandPointer // // Routine Description: // This function returns the m_pNextCommand member of a CClusCfgCommand object. // // Arguments: // None // // Return Value: // The contents of the m_pNextCommand member. // //-- ///////////////////////////////////////////////////////////////////////////// CClusCfgCommand * CClusCfgCommand::GetNextCommandPointer( void ) { return ( m_pNextCommand ); } ///////////////////////////////////////////////////////////////////////////// //++ // // BuildClusCfgCommandList // // Routine Description: // This function builds a singly linked list of CClusCfgCommand objects // and initializes the elements of the list based on the entries in a // table of CLUSCFG_COMMAND_IDS structures. // // Arguments: // hInstance - the instance handle of the executable // pClusCfgCommandIds - points to a table of CLUSCFG_COMMAND_IDS structures. // // Return Value: // A pointer to the head of a singly linked list of CClusCfgCommand objects. // //-- ///////////////////////////////////////////////////////////////////////////// BOOL CClusCfgCommand::BuildClusCfgCommandList( HINSTANCE hInstance, CLUSCFG_COMMAND_IDS * pClusCfgCommandIds ) { BOOL fReturnValue; // Is the pointer to the table of string resource IDs meaningfull? if ( pClusCfgCommandIds != NULL ) { // Is the table non-empty? if ( (pClusCfgCommandIds->dwCommandStringId != 0L) && (pClusCfgCommandIds->dwCommandSubStringId != 0L) ) { // Initialize the first CClusCfgCommand object. if ( (InitializeCommandString( hInstance, pClusCfgCommandIds->dwCommandStringId ) == TRUE) && (InitializeCommandSubString( hInstance, pClusCfgCommandIds->dwCommandSubStringId ) == TRUE) ) { // Initialize the parameter counts. SetNumRequiredParameters( pClusCfgCommandIds->xNumRequiredParameters ); SetNumOptionalParameters( pClusCfgCommandIds->xNumOptionalParameters ); // Point to the next element in the table. pClusCfgCommandIds++; // Create and initialize the rest of the list. CClusCfgCommand * pClusCfgCommand; pClusCfgCommand = this; BOOL fError = FALSE; while ( (pClusCfgCommandIds->dwCommandStringId != 0L) && (pClusCfgCommandIds->dwCommandSubStringId != 0L) && (fError == FALSE) ) { // Create an object. pClusCfgCommand->SetNextCommandPointer( new CClusCfgCommand( pClusCfgCommandIds->dwCommandStringId, pClusCfgCommandIds->dwCommandSubStringId ) ); // Adjust the pointer to the new command object. pClusCfgCommand = pClusCfgCommand->GetNextCommandPointer(); // Initialize it. if ( (pClusCfgCommand != NULL ) && (pClusCfgCommand->InitializeCommandString( hInstance ) == TRUE) && (pClusCfgCommand->InitializeCommandSubString( hInstance ) == TRUE) ) { // Initialize the parameter counts. pClusCfgCommand->SetNumRequiredParameters( pClusCfgCommandIds->xNumRequiredParameters ); pClusCfgCommand->SetNumOptionalParameters( pClusCfgCommandIds->xNumOptionalParameters ); // Point to the next entry in the table. pClusCfgCommandIds++; } else { // Could not initialize the object. Terminate the loop. fError = TRUE; } // Current object initialized? } // end of "while" loop // Was the list built and initialized successfully? if ( fError == FALSE ) { fReturnValue = TRUE; } else { // An error occured. Delete the list. delete GetNextCommandPointer(); SetNextCommandPointer( NULL ); fReturnValue = FALSE; } } else { // The first CClusCfgCommand object could not be initialized. delete GetNextCommandPointer(); SetNextCommandPointer( NULL ); fReturnValue = FALSE; } // First string initialized succesfully? } else { // The table of string resource Ids is empty. fReturnValue = FALSE; } // Is the table empty } else { // The table of string resource Ids does not exist. fReturnValue = FALSE; } // table of string ids meaningfull? return ( fReturnValue ); } ///////////////////////////////////////////////////////////////////////////// //++ // // GetCommandString // // Routine Description: // This function returns the contents of the m_ptszCommandString member of // a CClusCfgCommand object. // // Arguments: // None // // Return Value: // A pointer to a string that represents a command that can be passed to // ClusCfg.exe. // //-- ///////////////////////////////////////////////////////////////////////////// LPTSTR CClusCfgCommand::GetCommandString( void ) { return ( m_ptszCommandString ); } ///////////////////////////////////////////////////////////////////////////// //++ // // GetCommandSubString // // Routine Description: // This function returns the contents of the m_ptszCommandSubString member of // a CClusCfgCommand object. // // Arguments: // None // // Return Value: // A pointer to a string that represents the smallest substring that can be // recognized as a command that can be passed to ClusCfg.exe. // //-- ///////////////////////////////////////////////////////////////////////////// LPTSTR CClusCfgCommand::GetCommandSubString( void ) { return ( m_ptszCommandSubString ); } ///////////////////////////////////////////////////////////////////////////// //++ // // RecognizeCommandToken // // Routine Description: // This routine attempts to recognize a token as a command that may be // passed to cluscfg.exe. // // Arguments: // ptszToken - points to the token to be recognized // pClusCfgCommandList - points to the singly linked list of CClusCfgCommand // objects that describe the set of valid commands that // may be passed to cluscfg.exe // // Return Value: // TRUE - indicates that the token was recognized as a command // FALSE - indicates that the token was not recognized as a command // //-- ///////////////////////////////////////////////////////////////////////////// BOOL CClusCfgCommand::RecognizeCommandToken( LPCTSTR ptszToken, CClusCfgCommand * pClusCfgCommandList ) { BOOL fReturnValue = FALSE; // Are the parameters meaningfull? if ( (ptszToken != NULL) && (*ptszToken != TEXT('\0')) && (pClusCfgCommandList != NULL) ) { BOOL fTokenRecognized = FALSE; CClusCfgCommand * pTempCommand; // Starting at the head of the list compare the token to the command strings // and command sub-strings. pTempCommand = pClusCfgCommandList; // The token will be "recognized" if it is a sub-string of the "command string" // and the command sub-string is a sub-string of the token. This must be a case // insensitive comparison. LPTSTR ptszUpperCaseTokenCopy; // Allocate memory for an upper case copy of the token. ptszUpperCaseTokenCopy = new TCHAR[_tcslen( ptszToken ) + 1]; _tcscpy( ptszUpperCaseTokenCopy, ptszToken ); // Convert it to upper case. _tcsupr( ptszUpperCaseTokenCopy ); // Starting at the head of the list compare the token to the command strings. do { // Allocate memory for an upper case copy of the command string. LPTSTR ptszUpperCaseCommandStringCopy; ptszUpperCaseCommandStringCopy = new TCHAR[_tcslen( pTempCommand->GetCommandString() ) +1]; _tcscpy( ptszUpperCaseCommandStringCopy, pTempCommand->GetCommandString() ); // Convert it to upper case. _tcsupr( ptszUpperCaseCommandStringCopy ); // Is the token a sub-string of the command string? if ( _tcsstr( ptszUpperCaseCommandStringCopy, ptszUpperCaseTokenCopy ) == ptszUpperCaseCommandStringCopy ) { // The token is a sub-string of the command string. Now determine whether // the command sub-string is a sub-string of the token. // Allocate memory for a upper case copy of the command sub-string. LPTSTR ptszUpperCaseCommandSubStringCopy; ptszUpperCaseCommandSubStringCopy = new TCHAR[_tcslen( pTempCommand->GetCommandSubString() ) +1]; _tcscpy( ptszUpperCaseCommandSubStringCopy, pTempCommand->GetCommandSubString() ); // Convert it to upper case. _tcsupr( ptszUpperCaseCommandSubStringCopy ); // Is the command sub-string a sub-string of the token? if ( _tcsstr( ptszUpperCaseTokenCopy, ptszUpperCaseCommandSubStringCopy ) == ptszUpperCaseTokenCopy ) { LPTSTR string; // The token is recognized. Make a copy of the all the contents // so we don't try to free the same chunk of memory // twice. Technically, we should check to see memory is already // allocated and free it. SetCommandStringId( pTempCommand->GetCommandStringId() ); string = pTempCommand->GetCommandString(); if ( string != NULL ) { // Allocate space for the copy SetCommandStringPointer( new TCHAR[_tcslen( string ) +1] ); // Store the command string. _tcscpy( GetCommandStringPointer(), string ); } SetCommandSubStringId( pTempCommand->GetCommandSubStringId() ); string = pTempCommand->GetCommandSubString(); if ( string != NULL ) { // Allocate space for the copy SetCommandSubStringPointer( new TCHAR[_tcslen( string ) +1] ); // Store the command string. _tcscpy( GetCommandSubStringPointer(), string ); } SetNumRequiredParameters( pTempCommand->GetNumRequiredParameters() ); SetNumOptionalParameters( pTempCommand->GetNumOptionalParameters() ); SetNextCommandPointer( NULL ); fTokenRecognized = TRUE; fReturnValue = TRUE; } else { // Test the next command. pTempCommand = pTempCommand->GetNextCommandPointer(); } // Free the upper case copy of the command sub-string. delete ptszUpperCaseCommandSubStringCopy; } else { // Test the next command. pTempCommand = pTempCommand->GetNextCommandPointer(); } // Is the token a sub-string of the command string? // Free the upper case copy of the command string. delete ptszUpperCaseCommandStringCopy; } while ( (pTempCommand != NULL) && (fTokenRecognized == FALSE) ); // Free the memory for the upper case copy of the token. delete ptszUpperCaseTokenCopy; } else { // At least one parameter was invalid. fReturnValue = FALSE; } // parameters meaningfull? return ( fReturnValue ); } ///////////////////////////////////////////////////////////////////////////// //++ // // SetNumRequiredParameters // // Routine Description: // This function sets the m_xNumRequiredParameters member of a CClusCfgCommand // object. // // Arguments: // xNumRequiredParameters - the number of parameters required by the command // which is described by the CClusCfgCommand object. // // Return Value: // None // //-- ///////////////////////////////////////////////////////////////////////////// void CClusCfgCommand::SetNumRequiredParameters( int xNumRequiredParameters ) { m_xNumRequiredParameters = xNumRequiredParameters; } ///////////////////////////////////////////////////////////////////////////// //++ // // GetNumRequiredParameters // // Routine Description: // This function returns the contents of the m_xNumRequiredParameters // member of a CClusCfgCommand object. // // Arguments: // None // // Return Value: // the number of parameters required by the command which is described by the // CClusCfgCommand object. // //-- ///////////////////////////////////////////////////////////////////////////// int CClusCfgCommand::GetNumRequiredParameters( void ) { return ( m_xNumRequiredParameters ); } ///////////////////////////////////////////////////////////////////////////// //++ // // SetNumOptionalParameters // // Routine Description: // This function sets the m_xNumOptionalParameters member of a CClusCfgCommand // object. // // Arguments: // xNumOptionalParameters - the number of parameters accepted by the command // which is described by the CClusCfgCommand object. // // Return Value: // None // //-- ///////////////////////////////////////////////////////////////////////////// void CClusCfgCommand::SetNumOptionalParameters( int xNumOptionalParameters ) { m_xNumOptionalParameters = xNumOptionalParameters; } ///////////////////////////////////////////////////////////////////////////// //++ // // GetNumOptionalParameters // // Routine Description: // This function returns the contents of the m_xNumOptionalParameters // member of a CClusCfgCommand object. // // Arguments: // None // // Return Value: // the number of parameters accepted by the command which is described by the // CClusCfgCommand object. // //-- ///////////////////////////////////////////////////////////////////////////// int CClusCfgCommand::GetNumOptionalParameters( void ) { return ( m_xNumOptionalParameters ); } ///////////////////////////////////////////////////////////////////////////// //++ // // Reset // // Routine Description: // This function sets all datamembers of a CClusCfgCommand object to zero. // // Arguments: // None // // Return Value: // None // //-- ///////////////////////////////////////////////////////////////////////////// void CClusCfgCommand::Reset( void ) { SetNextCommandPointer( NULL ); SetCommandStringId( 0L ); SetCommandStringPointer( NULL ); SetCommandSubStringId( 0L ); SetCommandSubStringPointer( NULL ); SetNumRequiredParameters( 0 ); SetNumOptionalParameters( 0 ); } ///////////////////////////////////////////////////////////////////////////// //++ // // GetCommandStringId // // Routine Description: // This function returns the m_dwCommandStringId member of a CClusCfgCommand object. // // Arguments: // None // // Return Value: // A DWORD indicating the string resource ID of the command string. // //-- ///////////////////////////////////////////////////////////////////////////// DWORD CClusCfgCommand::GetCommandStringId( void ) { return ( m_dwCommandStringId ); } ///////////////////////////////////////////////////////////////////////////// //++ // // SetCommandStringId // // Routine Description: // This function sets the m_dwCommandStringId member of a CClusCfgCommand object. // // Arguments: // dwCommandStringId - the string resource ID of the command string. // // Return Value: // TRUE - indicates success // //-- ///////////////////////////////////////////////////////////////////////////// BOOL CClusCfgCommand::SetCommandStringId( DWORD dwCommandStringId ) { BOOL fReturnValue = TRUE; m_dwCommandStringId = dwCommandStringId; return ( fReturnValue ); } ///////////////////////////////////////////////////////////////////////////// //++ // // GetCommandSubStringId // // Routine Description: // This function returns the m_dwCommandSubStringId member of a CClusCfgCommand object. // // Arguments: // None // // Return Value: // A DWORD indicating the string resource ID of the command sub-string. // //-- ///////////////////////////////////////////////////////////////////////////// DWORD CClusCfgCommand::GetCommandSubStringId( void ) { return ( m_dwCommandSubStringId ); } ///////////////////////////////////////////////////////////////////////////// //++ // // SetCommandSubStringId // // Routine Description: // This function sets the m_dwCommandSubStringId member of a CClusCfgCommand object. // // Arguments: // dwCommandSubStringId - the string resource ID of the command string. // // Return Value: // TRUE - indicates success // //-- ///////////////////////////////////////////////////////////////////////////// BOOL CClusCfgCommand::SetCommandSubStringId( DWORD dwCommandSubStringId ) { BOOL fReturnValue = TRUE; m_dwCommandSubStringId = dwCommandSubStringId; return ( fReturnValue ); } ///////////////////////////////////////////////////////////////////////////// //++ // // SetCommandStringPointer // // Routine Description: // This function sets the m_ptszCommandString member of a CClusCfgCommand object. // // Arguments: // pAddress - the value to which the command string pointer should be set. // // Return Value: // TRUE - indicates success // // Note: // IT IS THE CALLER'S RESPONSIBILITY TO AVOID MEMORY LEAKS WHEN USING THIS FUNCTION! // //-- ///////////////////////////////////////////////////////////////////////////// BOOL CClusCfgCommand::SetCommandStringPointer( LPTSTR pAddress ) { BOOL fReturnValue = TRUE; m_ptszCommandString = pAddress; return ( fReturnValue ); } ///////////////////////////////////////////////////////////////////////////// //++ // // SetCommandSubStringPointer // // Routine Description: // This function sets the m_ptszCommandSubString member of a CClusCfgCommand object. // // Arguments: // pAddress - the value to which the command sub-string pointer should be set. // // Return Value: // TRUE - indicates success // // Note: // IT IS THE CALLER'S RESPONSIBILITY TO AVOID MEMORY LEAKS WHEN USING THIS FUNCTION! // //-- ///////////////////////////////////////////////////////////////////////////// BOOL CClusCfgCommand::SetCommandSubStringPointer( LPTSTR pAddress ) { BOOL fReturnValue = TRUE; m_ptszCommandSubString = pAddress; return ( fReturnValue ); } ///////////////////////////////////////////////////////////////////////////// //++ // // GetCommandSubStringPointer // // Routine Description: // This function returns the m_ptszCommandSubString member of a CClusCfgCommand object. // // Arguments: // None // // Return Value: // The contents of the m_ptszCommandSubString member // //-- ///////////////////////////////////////////////////////////////////////////// LPTSTR CClusCfgCommand::GetCommandSubStringPointer( void ) { return ( m_ptszCommandSubString ); } ///////////////////////////////////////////////////////////////////////////// //++ // // GetCommandStringPointer // // Routine Description: // This function returns the m_ptszCommandString member of a CClusCfgCommand object. // // Arguments: // None // // Return Value: // The contents of the m_ptszCommandString member // //-- ///////////////////////////////////////////////////////////////////////////// LPTSTR CClusCfgCommand::GetCommandStringPointer( void ) { return ( m_ptszCommandString ); }