6250 lines
178 KiB
C++
6250 lines
178 KiB
C++
/****************************************************************************
|
|
Copyright information : Copyright (c) 1998-1999 Microsoft Corporation
|
|
File Name : ParserEngine.cpp
|
|
Project Name : WMI Command Line
|
|
Author Name : Ch. Sriramachandramurthy
|
|
Date of Creation (dd/mm/yy) : 27th-September-2000
|
|
Version Number : 1.0
|
|
Brief Description : This class encapsulates the functionality needed
|
|
for parsing the command string entered as input
|
|
and validating the same.
|
|
Revision History :
|
|
Last Modified By : Ch. Sriramachandramurthy
|
|
Last Modified Date : 18th-December-2000
|
|
*****************************************************************************/
|
|
|
|
// include files
|
|
#include "Precomp.h"
|
|
#include "GlobalSwitches.h"
|
|
#include "CommandSwitches.h"
|
|
#include "HelpInfo.h"
|
|
#include "ErrorLog.h"
|
|
#include "ParsedInfo.h"
|
|
#include "CmdTokenizer.h"
|
|
#include "CmdAlias.h"
|
|
#include "ParserEngine.h"
|
|
#include "WMICliXMLLog.h"
|
|
#include "ErrorInfo.h"
|
|
#include "FormatEngine.h"
|
|
#include "ExecEngine.h"
|
|
#include "WmiCmdLn.h"
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :CParserEngine
|
|
Synopsis :This function initializes the member variables when an
|
|
object of the class type is instantiated.
|
|
Type :Constructor
|
|
Input Parameter(s):None
|
|
Output parameters :None
|
|
Return Type :None
|
|
Global Variables :None
|
|
Calling Syntax :None
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
CParserEngine::CParserEngine()
|
|
{
|
|
m_pIWbemLocator = NULL;
|
|
m_pITargetNS = NULL;
|
|
m_bAliasName = FALSE;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :~CParserEngine
|
|
Synopsis :This function uninitializes the member variables when an
|
|
object of the class type goes out of scope.
|
|
Type :Destructor
|
|
Input Parameter(s):None
|
|
Output parameters :None
|
|
Return Type :None
|
|
Global Variables :None
|
|
Calling Syntax :None
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
CParserEngine::~CParserEngine()
|
|
{
|
|
SAFEIRELEASE(m_pITargetNS);
|
|
SAFEIRELEASE(m_pIWbemLocator);
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :GetCmdTokenizer
|
|
Synopsis :This function returns a reference to the CCmdTokenizer
|
|
object, a data member of this class.
|
|
Type :Member Function
|
|
Input Parameter(s):None
|
|
Output parameters :None
|
|
Return Type :CCmdTokenizer&
|
|
Global Variables :None
|
|
Calling Syntax :GetCmdTokenizer()
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
CCmdTokenizer& CParserEngine::GetCmdTokenizer()
|
|
{
|
|
return m_CmdTknzr;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :Initialize
|
|
Synopsis :This function initializes the neeeded data members of
|
|
this class.
|
|
Type :Member Function
|
|
Input Parameter(s):None
|
|
Output parameters :None
|
|
Return Type :void
|
|
Global Variables :None
|
|
Calling Syntax :Initialize()
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
void CParserEngine::Initialize()
|
|
{
|
|
m_bAliasName = FALSE;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :Uninitialize
|
|
Synopsis :This function uninitializes the member variables when
|
|
the execution of a command string issued on the command
|
|
line is completed and then the parser engine variables
|
|
are also uninitialized.
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
bFinal - boolean value which when set indicates that the program
|
|
Output parameters :None
|
|
Return Type :void
|
|
Global Variables :None
|
|
Calling Syntax :Uninitialize()
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
void CParserEngine::Uninitialize(BOOL bFinal)
|
|
{
|
|
m_bAliasName = FALSE;
|
|
m_CmdTknzr.Uninitialize();
|
|
m_CmdAlias.Uninitialize();
|
|
if (bFinal)
|
|
{
|
|
m_CmdAlias.Uninitialize(TRUE);
|
|
SAFEIRELEASE(m_pITargetNS);
|
|
SAFEIRELEASE(m_pIWbemLocator);
|
|
}
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :SetLocatorObject
|
|
Synopsis :This function sets the WMI Locator Object to the
|
|
m_pIWbemLocator.
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
pIWbemLocator - pointer to IWbemLocator interface .
|
|
Output parameters :None
|
|
Return Type :BOOL
|
|
Global Variables :None
|
|
Calling Syntax :SetLocatorObject(pIWbemLocator)
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
BOOL CParserEngine::SetLocatorObject(IWbemLocator* pIWbemLocator)
|
|
{
|
|
static BOOL bFirst = TRUE;
|
|
BOOL bRet = TRUE;
|
|
if (bFirst)
|
|
{
|
|
if (pIWbemLocator != NULL)
|
|
{
|
|
SAFEIRELEASE(m_pIWbemLocator);
|
|
m_pIWbemLocator = pIWbemLocator;
|
|
m_pIWbemLocator->AddRef();
|
|
}
|
|
else
|
|
bRet = FALSE;
|
|
bFirst = FALSE;
|
|
}
|
|
return bRet;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ProcessTokens
|
|
Synopsis :This function does the processing of the tokens. It
|
|
checks for the presence of switches and calls the
|
|
appropriate Parsing function and updates the CParsedInfo
|
|
object passed to it.
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Output parameters :
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE - enumerated data type
|
|
Global Variables :None
|
|
Calling Syntax :ProcessTokens(rParsedInfo)
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ProcessTokens(CParsedInfo& rParsedInfo)
|
|
{
|
|
BOOL bContinue = TRUE;
|
|
RETCODE retCode = PARSER_EXECCOMMAND;
|
|
|
|
// Obtain the token vector.
|
|
CHARVECTOR cvTokens = m_CmdTknzr.GetTokenVector();
|
|
|
|
//the iterator to span throuh the vector variable
|
|
CHARVECTOR::iterator theIterator = NULL;
|
|
|
|
// Check for the presence of tokens. Absence of tokens indicates
|
|
// no command string is fed as input.
|
|
if (!cvTokens.empty())
|
|
{
|
|
// Obtain the pointer to the beginning of the token vector.
|
|
theIterator = cvTokens.begin();
|
|
|
|
// Check for the presence of the global switches and
|
|
// store the values specified with them (if any) in the
|
|
// CGlobalSwitches object. Global switches are followed
|
|
// '/' character.
|
|
if (IsOption(*theIterator))
|
|
{
|
|
retCode = ParseGlobalSwitches(cvTokens,
|
|
theIterator, rParsedInfo);
|
|
if (retCode == PARSER_CONTINUE)
|
|
{
|
|
// If no more tokens are present
|
|
if (theIterator >= cvTokens.end())
|
|
{
|
|
retCode = PARSER_MESSAGE;
|
|
bContinue = FALSE;
|
|
}
|
|
}
|
|
else
|
|
bContinue = FALSE;
|
|
}
|
|
|
|
if (bContinue)
|
|
{
|
|
// Suppress Information Msg before Executing command.
|
|
rParsedInfo.GetCmdSwitchesObject().SetInformationCode(0);
|
|
|
|
// Check for the presence of the CLASS keyword
|
|
if (CompareTokens(*theIterator, CLI_TOKEN_CLASS))
|
|
{
|
|
// Move to next token, and check its validity
|
|
retCode = GetNextToken(cvTokens, theIterator,
|
|
rParsedInfo, CLASS,
|
|
IDS_E_INVALID_CLASS_SYNTAX);
|
|
|
|
if (retCode == PARSER_CONTINUE)
|
|
{
|
|
// NOTE: Indicates direct escaping to WMI schema
|
|
// Parse and interpret the remaining tokens following
|
|
// the CLASS keyword
|
|
retCode = ParseClassInfo(cvTokens, theIterator,
|
|
rParsedInfo);
|
|
}
|
|
}
|
|
// Check for the presence of the PATH keyword
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_PATH))
|
|
{
|
|
//NOTE: Indicates PATH clause without an alias name
|
|
// Move to next token
|
|
retCode = GetNextToken(cvTokens, theIterator,
|
|
rParsedInfo, PATH,
|
|
IDS_E_INVALID_PATH_SYNTAX);
|
|
if (retCode == PARSER_CONTINUE)
|
|
// Parse and interpret the remaining tokens
|
|
// following the PATH clause
|
|
retCode = ParsePathInfo(cvTokens, theIterator,
|
|
rParsedInfo);
|
|
}
|
|
// Check for the presence of the CONTEXT keyword
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_CONTEXT))
|
|
{
|
|
if (GetNextToken(cvTokens, theIterator))
|
|
{
|
|
retCode = ParseContextInfo(cvTokens,
|
|
theIterator, rParsedInfo);
|
|
}
|
|
else
|
|
{
|
|
rParsedInfo.GetGlblSwitchesObject().SetHelpFlag(TRUE);
|
|
rParsedInfo.GetHelpInfoObject().SetHelp(GLBLCONTEXT, TRUE);
|
|
retCode = PARSER_DISPHELP;
|
|
}
|
|
}
|
|
// If the token value does not match against the
|
|
// pre-defiend keywords, it is considered as an alias.
|
|
else
|
|
{
|
|
// Validate the alias name and parse the remaining
|
|
// tokens following the <alias> name.
|
|
retCode = ParseAliasInfo(cvTokens,
|
|
theIterator, rParsedInfo);
|
|
|
|
if (retCode == PARSER_EXECCOMMAND)
|
|
{
|
|
try
|
|
{
|
|
_bstr_t bstrTrgtClass;
|
|
_TCHAR *pszClass = NULL;
|
|
|
|
// Check the validity of the path expression w.r.t the
|
|
// alias specified using the following steps:
|
|
// (i.e to check for alias - path conflict)
|
|
// step1: Obtain the alias target class.
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
GetClassOfAliasTarget(bstrTrgtClass);
|
|
|
|
// step2: Obtain the explicitly specified class.
|
|
pszClass = rParsedInfo.GetCmdSwitchesObject().
|
|
GetClassPath();
|
|
if (!(!bstrTrgtClass) && (pszClass != NULL))
|
|
{
|
|
// If both are not same, set the errata code
|
|
if(!CompareTokens((_TCHAR*)bstrTrgtClass,pszClass))
|
|
{
|
|
// Set the error code
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_I_ALIAS_PATH_CONFLICT);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
}
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
_com_issue_error(e.Error());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Indicates NULL string specified as input on the WMI Command Line.
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_BLANK_COMMAND_MESSAGE);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
|
|
// Get the Property qualifiers information from the alias - SET and CREATE.
|
|
if ((retCode == PARSER_EXECCOMMAND) &&
|
|
((CompareTokens(rParsedInfo.GetCmdSwitchesObject().GetVerbName(),
|
|
CLI_TOKEN_SET)) ||
|
|
(CompareTokens(rParsedInfo.GetCmdSwitchesObject().GetVerbName(),
|
|
CLI_TOKEN_CREATE))))
|
|
{
|
|
if (m_bAliasName)
|
|
{
|
|
if (FAILED(m_CmdAlias.ObtainAliasPropDetails(rParsedInfo)))
|
|
retCode = PARSER_ERRMSG;
|
|
}
|
|
}
|
|
|
|
if ( retCode == PARSER_DISPHELP )
|
|
{
|
|
if ( m_bAliasName ||
|
|
rParsedInfo.GetCmdSwitchesObject().GetClassPath() != NULL )
|
|
{
|
|
ObtainMethodsAvailableFlag(rParsedInfo);
|
|
ObtainWriteablePropsAvailailableFlag(rParsedInfo);
|
|
}
|
|
|
|
if ( m_bAliasName == TRUE )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetLISTFormatsAvailable(
|
|
m_CmdAlias.ObtainAliasFormat(rParsedInfo, TRUE));
|
|
}
|
|
}
|
|
|
|
if ( retCode == PARSER_EXECCOMMAND || retCode == PARSER_DISPHELP )
|
|
{
|
|
retCode = ProcessOutputAndAppendFiles(rParsedInfo, retCode, FALSE);
|
|
}
|
|
else if (rParsedInfo.GetCmdSwitchesObject().GetOutputSwitchFlag() == TRUE
|
|
&& retCode == PARSER_MESSAGE)
|
|
rParsedInfo.GetCmdSwitchesObject().SetOutputSwitchFlag(FALSE);
|
|
|
|
return retCode;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ParseClassInfo
|
|
Synopsis :This function does the parsing and interprets if command
|
|
has CLASS keyword specified in it. It parses the
|
|
remaining tokens following and updates the same in
|
|
CParsedInfo object passed to it.
|
|
Type :Member Function
|
|
Input Parameter(s) :
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Output parameter(s):
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE - enumerated data type
|
|
Global Variables :None
|
|
Calling Syntax :ParseClassInfo(cvTokens,theIterator,rParsedInfo)
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ParseClassInfo(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo )
|
|
{
|
|
// BNF: CLASS <class path expression> [<verb clause>]
|
|
BOOL bContinue = TRUE;
|
|
RETCODE retCode = PARSER_EXECCOMMAND;
|
|
|
|
// If option
|
|
if (IsOption(*theIterator))
|
|
{
|
|
// Check for help
|
|
retCode = IsHelp(cvTokens, theIterator, rParsedInfo, CLASS,
|
|
IDS_E_INVALID_HELP_SYNTAX, LEVEL_ONE);
|
|
if (retCode != PARSER_CONTINUE)
|
|
bContinue = FALSE;
|
|
}
|
|
else
|
|
{
|
|
// Store the class path in the CCommandSwitches object.
|
|
if(!rParsedInfo.GetCmdSwitchesObject().SetClassPath(*theIterator))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(OUT_OF_MEMORY);
|
|
bContinue = FALSE;
|
|
retCode = PARSER_OUTOFMEMORY;
|
|
}
|
|
else if ( IsValidClass(rParsedInfo) == FALSE )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_CLASS);
|
|
retCode = PARSER_ERROR;
|
|
bContinue = FALSE;
|
|
}
|
|
|
|
if(bContinue)
|
|
{
|
|
// Move to next token
|
|
if (!GetNextToken(cvTokens, theIterator))
|
|
{
|
|
// i.e. <verb clause> is not specified.
|
|
bContinue = FALSE;
|
|
retCode = PARSER_EXECCOMMAND;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (bContinue)
|
|
{
|
|
// Check for the presence of /?
|
|
if (IsOption(*theIterator))
|
|
{
|
|
// Check for help
|
|
retCode = IsHelp(cvTokens, theIterator, rParsedInfo, CLASS,
|
|
IDS_E_INVALID_HELP_SYNTAX, LEVEL_ONE);
|
|
}
|
|
else
|
|
{
|
|
// Parse and interpret the verb tokens that follow
|
|
retCode = ParseVerbInfo(cvTokens,theIterator,rParsedInfo);
|
|
if (retCode == PARSER_EXECCOMMAND)
|
|
{
|
|
// Check for verb switches
|
|
if (GetNextToken(cvTokens, theIterator))
|
|
retCode = ParseVerbSwitches(cvTokens, theIterator,
|
|
rParsedInfo);
|
|
}
|
|
}
|
|
}
|
|
return retCode;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ParseAliasInfo
|
|
Synopsis :This function does the parsing and interprets if command
|
|
has <alias> name in it.It Validate the alias name and
|
|
parses the remaining tokens following the <alias> name.
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Output parameter(s):
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE - enumerated data type
|
|
Global Variables :None
|
|
Calling Syntax :ParseAliasInfo(cvTokens,theIterator,rParsedInfo)
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ParseAliasInfo(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo)
|
|
{
|
|
//BNF: (<alias> | [<WMI object>] | [<alias>] <path where>) [<verb clause>]
|
|
RETCODE retCode = PARSER_EXECCOMMAND;
|
|
HRESULT hr = S_OK;
|
|
BOOL bContinue = TRUE;
|
|
RETCODE tRetCode = PARSER_ERROR;
|
|
|
|
// Store the AliasName in the CommandSwitches object.
|
|
if(!rParsedInfo.GetCmdSwitchesObject().SetAliasName(*theIterator))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(OUT_OF_MEMORY);
|
|
retCode = PARSER_OUTOFMEMORY;
|
|
}
|
|
else
|
|
{
|
|
m_bAliasName = TRUE;
|
|
|
|
// Move to next token
|
|
retCode = GetNextToken(cvTokens, theIterator,
|
|
rParsedInfo, CmdAllInfo, IDS_E_INVALID_COMMAND);
|
|
if (retCode == PARSER_ERROR)
|
|
tRetCode = PARSER_EXECCOMMAND;
|
|
|
|
else if(retCode == PARSER_DISPHELP &&
|
|
rParsedInfo.GetGlblSwitchesObject().GetInteractiveStatus() == TRUE)
|
|
{
|
|
tRetCode = PARSER_EXECCOMMAND;
|
|
rParsedInfo.GetGlblSwitchesObject().SetHelpFlag(FALSE);
|
|
rParsedInfo.GetHelpInfoObject().SetHelp(CmdAllInfo, FALSE);
|
|
}
|
|
|
|
// Connect to alias and retrieve the alias information
|
|
try
|
|
{
|
|
// Connect to the AliasNamespace.
|
|
hr = m_CmdAlias.ConnectToAlias(rParsedInfo, m_pIWbemLocator);
|
|
ONFAILTHROWERROR(hr);
|
|
|
|
// Obtain the alias information ( Target, Namespace,...)
|
|
retCode = m_CmdAlias.ObtainAliasInfo(rParsedInfo);
|
|
if((retCode == PARSER_OUTOFMEMORY) || (retCode == PARSER_ERRMSG))
|
|
{
|
|
if (retCode == PARSER_OUTOFMEMORY)
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(OUT_OF_MEMORY);
|
|
retCode = PARSER_OUTOFMEMORY;
|
|
}
|
|
bContinue = FALSE;
|
|
}
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
retCode = PARSER_ERRMSG;
|
|
bContinue = FALSE;
|
|
_com_issue_error(e.Error());
|
|
}
|
|
|
|
if (bContinue && tRetCode != PARSER_EXECCOMMAND)
|
|
{
|
|
// Check for the presence of the PATH keyword
|
|
if (CompareTokens(*theIterator, CLI_TOKEN_PATH))
|
|
{
|
|
// NOTE: Indicates PATH clause preceded by an alias name
|
|
// Move to next token
|
|
retCode = GetNextToken(cvTokens, theIterator,
|
|
rParsedInfo, PATH, IDS_E_INVALID_PATH);
|
|
if (retCode == PARSER_CONTINUE)
|
|
// Parse and interpret the remaining tokens following
|
|
// the PATH clause
|
|
retCode = ParsePathInfo(cvTokens, theIterator,
|
|
rParsedInfo);
|
|
}
|
|
// Check for the presence of the WHERE keyword
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_WHERE))
|
|
{
|
|
// NOTE: Indicates WHERE clause preceded by an alias name
|
|
// Move to next token
|
|
retCode = GetNextToken(cvTokens, theIterator, rParsedInfo,
|
|
WHERE, IDS_E_INVALID_QUERY);
|
|
if (retCode == PARSER_CONTINUE)
|
|
// Parse and interpret the remaining tokens following
|
|
// the WHERE clause
|
|
retCode = ParseWhereInfo(cvTokens, theIterator,
|
|
rParsedInfo);
|
|
}
|
|
// Check for the presence of the '('
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_LEFT_PARAN))
|
|
{
|
|
// Frame the parameterized WHERE expression
|
|
if (!ParsePWhereExpr(cvTokens, theIterator, rParsedInfo,
|
|
TRUE))
|
|
{
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
else
|
|
{
|
|
// Move to next token
|
|
if (theIterator >= cvTokens.end())
|
|
{
|
|
// PARSER_ERROR if no more tokens are present
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_COMMAND);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
else
|
|
{
|
|
if (CompareTokens(*theIterator, CLI_TOKEN_RIGHT_PARAN))
|
|
{
|
|
// Move to next token
|
|
if (!GetNextToken(cvTokens, theIterator))
|
|
{
|
|
// if no more tokens are present.
|
|
retCode = PARSER_EXECCOMMAND;
|
|
}
|
|
else
|
|
{
|
|
if (IsOption(*theIterator))
|
|
{
|
|
retCode = IsHelp(cvTokens,
|
|
theIterator,
|
|
rParsedInfo,
|
|
PWhere,
|
|
IDS_E_INVALID_HELP_SYNTAX,
|
|
LEVEL_ONE);
|
|
if ( retCode == PARSER_DISPHELP )
|
|
{
|
|
if (FAILED(m_CmdAlias.
|
|
ObtainAliasVerbDetails(rParsedInfo)))
|
|
retCode = PARSER_ERRMSG;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
retCode = ParseVerbInfo(cvTokens,
|
|
theIterator, rParsedInfo);
|
|
// Parse and interpret the verb tokens
|
|
// that follow
|
|
if (retCode == PARSER_EXECCOMMAND)
|
|
{
|
|
if(GetNextToken(cvTokens,
|
|
theIterator))
|
|
// check for the common verb
|
|
// switches /INTERACTIVE,
|
|
// /NOINTERACTIVE
|
|
retCode = ParseVerbSwitches(
|
|
cvTokens,
|
|
theIterator,
|
|
rParsedInfo);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// PARSER_ERROR if no more tokens are present
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_COMMAND);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (IsOption(*theIterator))
|
|
{
|
|
// Check for help
|
|
retCode = IsHelp(cvTokens, theIterator, rParsedInfo,
|
|
CmdAllInfo, IDS_E_INVALID_HELP_SYNTAX,
|
|
LEVEL_ONE);
|
|
|
|
if (retCode == PARSER_DISPHELP)
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
AddToAlsFrnNmsOrTrnsTblMap(
|
|
CharUpper(rParsedInfo.GetCmdSwitchesObject().
|
|
GetAliasName()),
|
|
rParsedInfo.GetCmdSwitchesObject().GetAliasDesc());
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (bContinue)
|
|
{
|
|
// Frame the parameterized WHERE expression
|
|
if (!ParsePWhereExpr(cvTokens, theIterator,
|
|
rParsedInfo, FALSE))
|
|
{
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
else
|
|
{
|
|
if ( theIterator >= cvTokens.end() )
|
|
retCode = PARSER_EXECCOMMAND;
|
|
else
|
|
{
|
|
// Parse the verb.
|
|
if (IsOption(*theIterator))
|
|
{
|
|
retCode = IsHelp(cvTokens,
|
|
theIterator,
|
|
rParsedInfo,
|
|
PWhere,
|
|
IDS_E_INVALID_HELP_SYNTAX,
|
|
LEVEL_ONE);
|
|
|
|
if ( retCode == PARSER_DISPHELP )
|
|
{
|
|
if (FAILED(m_CmdAlias.
|
|
ObtainAliasVerbDetails(rParsedInfo)))
|
|
retCode = PARSER_ERRMSG;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
retCode = ParseVerbInfo(cvTokens,
|
|
theIterator, rParsedInfo);
|
|
if (retCode == PARSER_EXECCOMMAND)
|
|
{
|
|
if (GetNextToken(cvTokens, theIterator))
|
|
// check for the common verb switches
|
|
// /INTERACTIVE, /NOINTERACTIVE
|
|
retCode = ParseVerbSwitches(cvTokens,
|
|
theIterator,
|
|
rParsedInfo);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if(tRetCode == PARSER_EXECCOMMAND)
|
|
{
|
|
if ((retCode != PARSER_ERRMSG) && (retCode != PARSER_OUTOFMEMORY))
|
|
{
|
|
retCode = tRetCode;
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(0);
|
|
}
|
|
}
|
|
return retCode;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ParseWhereInfo
|
|
Synopsis :This function does the parsing and interprets if command
|
|
has alias, with where clause also specified it.It parses
|
|
the remaining tokens following and updates the same in
|
|
CParsedInfo object passed to it.
|
|
Type :Member Function
|
|
Input Parameter(s) :
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Output parameter(s) :
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE - enumerated data type
|
|
Global Variables :None
|
|
Calling Syntax :ParseWhereInfo(cvTokens,theIterator,rParsedInfo)
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ParseWhereInfo(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo)
|
|
{
|
|
RETCODE retCode = PARSER_EXECCOMMAND;
|
|
BOOL bContinue = TRUE;
|
|
|
|
rParsedInfo.GetCmdSwitchesObject().SetExplicitWhereExprFlag(TRUE);
|
|
|
|
if (IsOption(*theIterator))
|
|
{
|
|
// Check for help
|
|
retCode = IsHelp(cvTokens, theIterator, rParsedInfo,
|
|
WHERE, IDS_E_INVALID_WHERE_SYNTAX, LEVEL_ONE);
|
|
if (retCode != PARSER_CONTINUE)
|
|
bContinue = FALSE;
|
|
}
|
|
|
|
if (bContinue)
|
|
{
|
|
if ( !m_bAliasName && rParsedInfo.GetCmdSwitchesObject().
|
|
GetClassPath() == NULL )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_ALIAS_OR_PATH_SHOULD_PRECEED_WHERE);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
// Store the WHERE expression in the CCommandSwitches object.
|
|
else if(!rParsedInfo.GetCmdSwitchesObject().SetWhereExpression(
|
|
*theIterator))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(OUT_OF_MEMORY);
|
|
retCode = PARSER_OUTOFMEMORY;
|
|
|
|
}
|
|
else
|
|
{
|
|
// Move to next token
|
|
if (!GetNextToken(cvTokens, theIterator))
|
|
{
|
|
// If no more tokens are present. i.e no verb clause is present
|
|
retCode = PARSER_EXECCOMMAND;
|
|
}
|
|
else
|
|
{
|
|
if (IsOption(*theIterator))
|
|
{
|
|
retCode = IsHelp(cvTokens, theIterator, rParsedInfo, WHERE,
|
|
IDS_E_INVALID_HELP_SYNTAX, LEVEL_ONE);
|
|
}
|
|
else
|
|
{
|
|
// Parse and interpret the verb tokens that follow
|
|
// Handled for /verb to verb
|
|
retCode = ParseVerbInfo(cvTokens, theIterator,
|
|
rParsedInfo);
|
|
if (retCode == PARSER_EXECCOMMAND)
|
|
{
|
|
if (GetNextToken(cvTokens, theIterator))
|
|
//check for the common verb switches /INTERACTIVE,
|
|
// /NOINTERACTIVE
|
|
retCode = ParseVerbSwitches(cvTokens, theIterator,
|
|
rParsedInfo);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return retCode;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ParsePathInfo
|
|
Synopsis :This function does the parsing and interprets if command
|
|
has alias with path clause also specified it.It parses
|
|
the remaining tokens following and updates the same in
|
|
CParsedInfo object passed to it.
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Output Parameter(s) :
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE - enumerated data type
|
|
Global Variables :None
|
|
Calling Syntax :ParsePathInfo(cvTokens,theIterator,rParsedInfo)
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ParsePathInfo(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo)
|
|
{
|
|
RETCODE retCode = PARSER_EXECCOMMAND;
|
|
BOOL bContinue = TRUE;
|
|
|
|
if (IsOption(*theIterator))
|
|
{
|
|
retCode = IsHelp(cvTokens, theIterator, rParsedInfo,
|
|
PATH, IDS_E_INVALID_PATH_SYNTAX, LEVEL_ONE);
|
|
if (retCode != PARSER_CONTINUE)
|
|
bContinue = FALSE;
|
|
}
|
|
|
|
if (bContinue)
|
|
{
|
|
// Store the object PATH expression in the CCommandSwitches object.
|
|
if(!rParsedInfo.GetCmdSwitchesObject().SetPathExpression(*theIterator))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(OUT_OF_MEMORY);
|
|
retCode = PARSER_OUTOFMEMORY;
|
|
}
|
|
else
|
|
{
|
|
//Extract the classname and where expression given path expression
|
|
_TCHAR pszPathExpr[MAX_BUFFER] = NULL_STRING;
|
|
lstrcpy(pszPathExpr,CLI_TOKEN_NULL);
|
|
lstrcpy(pszPathExpr, rParsedInfo.GetCmdSwitchesObject().
|
|
GetPathExpression());
|
|
if (!ExtractClassNameandWhereExpr(pszPathExpr, rParsedInfo))
|
|
retCode = PARSER_ERROR;
|
|
// Move to next token
|
|
else if ( IsValidClass(rParsedInfo) == FALSE )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_CLASS);
|
|
bContinue = FALSE;
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
else if (!GetNextToken(cvTokens, theIterator))
|
|
// If no more tokens are present. i.e no verb clause is present
|
|
retCode = PARSER_EXECCOMMAND;
|
|
else
|
|
{
|
|
if ( CompareTokens(*theIterator, CLI_TOKEN_WHERE) )
|
|
{
|
|
if ( rParsedInfo.GetCmdSwitchesObject().
|
|
GetWhereExpression() != NULL )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_KEY_CLASS_NOT_ALLOWED_WITH_PATHWHERE);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
else
|
|
{
|
|
retCode = GetNextToken(cvTokens, theIterator,
|
|
rParsedInfo, WHERE,
|
|
IDS_E_INVALID_WHERE_SYNTAX);
|
|
if (retCode == PARSER_CONTINUE)
|
|
// Parse and interpret the remaining tokens
|
|
// following the WHERE clause
|
|
retCode = ParseWhereInfo(cvTokens, theIterator,
|
|
rParsedInfo);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (IsOption(*theIterator))
|
|
{
|
|
retCode = IsHelp(cvTokens, theIterator, rParsedInfo,
|
|
PATH, IDS_E_INVALID_HELP_SYNTAX,
|
|
LEVEL_ONE);
|
|
}
|
|
else
|
|
{
|
|
// Parse and interpret the verb tokens that follow
|
|
// Handled for /verb => verb.
|
|
retCode = ParseVerbInfo(cvTokens,theIterator,rParsedInfo);
|
|
if (retCode == PARSER_EXECCOMMAND)
|
|
{
|
|
if (GetNextToken(cvTokens, theIterator))
|
|
//check for the common verb switches /INTERACTIVE,
|
|
///NOINTERACTIVE
|
|
retCode = ParseVerbSwitches(cvTokens, theIterator,
|
|
rParsedInfo);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return retCode;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ParseVerbInfo
|
|
Synopsis :This function does the parsing and interprets if command
|
|
has verb clause specified in it.It parses the remaining
|
|
tokens following the verb and updates the same in
|
|
CParsedInfo object passed to it.
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Output Parameter(s):
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE - enumerated data type
|
|
Global Variables :None
|
|
Calling Syntax :ParseVerbInfo(cvTokens,theIterator,rParsedInfo)
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ParseVerbInfo(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo)
|
|
{
|
|
RETCODE retCode = PARSER_EXECCOMMAND;
|
|
BOOL bContinue = TRUE;
|
|
|
|
// STORE the verb name in the CCommandSwitches object
|
|
if ( rParsedInfo.GetCmdSwitchesObject().SetVerbName(*theIterator)
|
|
== FALSE )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(IDS_E_MEMALLOC_FAIL);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
// Check for the presence of the following standard verbs:
|
|
// 1.GET 2.SHOW 3.SET 4.CALL 5.ASSOC 6. CREATE 7. DELETE
|
|
// GET verb specified
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_GET))
|
|
{
|
|
retCode = ParseGETVerb(cvTokens, theIterator, rParsedInfo);
|
|
}
|
|
// LIST verb specified
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_LIST))
|
|
{
|
|
if (m_bAliasName == FALSE)
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_LIST_USAGE);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
else
|
|
retCode = ParseLISTVerb(cvTokens, theIterator, rParsedInfo);
|
|
}
|
|
// SET | CREATE verb specified
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_SET) ||
|
|
CompareTokens(*theIterator, CLI_TOKEN_CREATE))
|
|
{
|
|
// <path expression> and <where expression> cannot be specified with
|
|
// CREATE verb. Only <class expression> should be specified.
|
|
if (CompareTokens(*theIterator, CLI_TOKEN_CREATE)
|
|
&& rParsedInfo.GetCmdSwitchesObject().
|
|
GetExplicitWhereExprFlag())
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_CREATE_EXPRESSION);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
else
|
|
{
|
|
HELPTYPE helpType =
|
|
CompareTokens(*theIterator, CLI_TOKEN_CREATE)
|
|
? CREATEVerb : SETVerb;
|
|
retCode = ParseSETorCREATEVerb(cvTokens, theIterator,
|
|
rParsedInfo, helpType);
|
|
}
|
|
}
|
|
// CALL verb specified
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_CALL))
|
|
{
|
|
retCode = ParseCALLVerb(cvTokens, theIterator, rParsedInfo);
|
|
}
|
|
// ASSOC verb specified
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_ASSOC))
|
|
{
|
|
retCode = ParseASSOCVerb(cvTokens, theIterator, rParsedInfo);
|
|
}
|
|
// DELETE verb specified.
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_DELETE))
|
|
{
|
|
retCode = PARSER_EXECCOMMAND;
|
|
//ParseDELETEVerb(cvTokens, theIterator, rParsedInfo);
|
|
}
|
|
// User defined verb
|
|
else if (m_bAliasName)
|
|
{
|
|
// User defined verbs can only be associated with alias
|
|
retCode = ParseMethodInfo(cvTokens, theIterator, rParsedInfo);
|
|
if (retCode == PARSER_CONTINUE)
|
|
retCode = PARSER_EXECCOMMAND;
|
|
}
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(IDS_E_INVALID_VERB);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
return retCode;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ParseMethodInfo
|
|
Synopsis :This function parses the tokens following the user
|
|
defined verb and updates the info in CParsedInfo object
|
|
passed to it.
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Output Parameter(s):
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE - enumerated data type
|
|
Global Variables :None
|
|
Calling Syntax :ParseMethodInfo(cvTokens,theIterator,rParsedInfo)
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ParseMethodInfo(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo)
|
|
{
|
|
RETCODE retCode = PARSER_EXECCOMMAND;
|
|
BOOL bContinue = TRUE;
|
|
|
|
// Store the method name
|
|
if(!rParsedInfo.GetCmdSwitchesObject().SetMethodName(*theIterator))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(OUT_OF_MEMORY);
|
|
retCode = PARSER_OUTOFMEMORY;
|
|
}
|
|
else
|
|
{
|
|
if(m_bAliasName)
|
|
{
|
|
if (FAILED(m_CmdAlias.ObtainAliasVerbDetails(rParsedInfo)))
|
|
{
|
|
retCode = PARSER_ERRMSG;
|
|
bContinue =FALSE;
|
|
}
|
|
else
|
|
{
|
|
VERBTYPE vtVerbType =
|
|
rParsedInfo.GetCmdSwitchesObject().GetVerbType();
|
|
_TCHAR* pszVerbDerivation =
|
|
rParsedInfo.GetCmdSwitchesObject().GetVerbDerivation();
|
|
|
|
if ( rParsedInfo.GetCmdSwitchesObject().GetMethDetMap().empty())
|
|
{
|
|
DisplayMessage(*theIterator, CP_OEMCP, TRUE, TRUE);
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_ALIAS_VERB);
|
|
retCode = PARSER_ERROR;
|
|
bContinue = FALSE;
|
|
}
|
|
else if ( pszVerbDerivation == NULL )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_VERB_DERV_NOT_AVAIL_IN_ALIAS);
|
|
retCode = PARSER_ERROR;
|
|
bContinue = FALSE;
|
|
}
|
|
else if ( vtVerbType == CLASSMETHOD )
|
|
{
|
|
if (!rParsedInfo.GetCmdSwitchesObject().SetMethodName(
|
|
pszVerbDerivation))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(OUT_OF_MEMORY);
|
|
retCode = PARSER_OUTOFMEMORY;
|
|
bContinue = FALSE;
|
|
}
|
|
}
|
|
else if ( vtVerbType == STDVERB )
|
|
{
|
|
(*theIterator) = pszVerbDerivation;
|
|
// Parse and interpret the verb tokens that follow
|
|
// Handled for /verb => verb.
|
|
retCode = ParseVerbInfo(cvTokens,theIterator,rParsedInfo);
|
|
if (retCode == PARSER_EXECCOMMAND)
|
|
{
|
|
if (GetNextToken(cvTokens, theIterator))
|
|
retCode = ParseVerbSwitches(cvTokens, theIterator,
|
|
rParsedInfo);
|
|
}
|
|
bContinue =FALSE;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (!ObtainClassMethods(rParsedInfo))
|
|
{
|
|
retCode = PARSER_ERRMSG;
|
|
bContinue =FALSE;
|
|
}
|
|
else if (rParsedInfo.GetCmdSwitchesObject().GetMethDetMap().empty())
|
|
{
|
|
DisplayMessage(*theIterator, CP_OEMCP, TRUE, TRUE);
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_CLASS_METHOD);
|
|
retCode = PARSER_ERROR;
|
|
bContinue =FALSE;
|
|
}
|
|
}
|
|
|
|
// Move to next token
|
|
if ( bContinue == TRUE && !GetNextToken(cvTokens, theIterator) )
|
|
{
|
|
// indicates method with no parameters
|
|
retCode = PARSER_EXECCOMMAND;
|
|
bContinue =FALSE;
|
|
}
|
|
|
|
if (bContinue)
|
|
{
|
|
if (IsOption(*theIterator))
|
|
{
|
|
retCode = IsHelp(cvTokens, theIterator, rParsedInfo, AliasVerb,
|
|
IDS_E_INVALID_EXPRESSION, LEVEL_TWO);
|
|
|
|
if (retCode == PARSER_CONTINUE)
|
|
// To facilitate ParseVerbSwitches to continue
|
|
theIterator = theIterator - 2;
|
|
else if (retCode == PARSER_DISPHELP)
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().GetMethDetMap().
|
|
clear();
|
|
if(m_bAliasName)
|
|
{
|
|
if (FAILED(m_CmdAlias.ObtainAliasVerbDetails(
|
|
rParsedInfo)))
|
|
retCode = PARSER_ERRMSG;
|
|
}
|
|
else if (!ObtainClassMethods(rParsedInfo))
|
|
retCode = PARSER_ERRMSG;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
BOOL bNamedParamList;
|
|
// Check for NamedParamList or UnnamedParamList.
|
|
if ( (theIterator + 1) < cvTokens.end() &&
|
|
CompareTokens(*(theIterator + 1), CLI_TOKEN_EQUALTO ) )
|
|
{
|
|
retCode = ParseSETorCREATEOrNamedParamInfo(cvTokens,
|
|
theIterator,
|
|
rParsedInfo,
|
|
CALLVerb);
|
|
if ( retCode == PARSER_EXECCOMMAND )
|
|
retCode = ValidateVerbOrMethodParams(rParsedInfo);
|
|
|
|
bNamedParamList = TRUE;
|
|
}
|
|
else
|
|
{
|
|
retCode = ParseUnnamedParamList(cvTokens, theIterator,
|
|
rParsedInfo);
|
|
bNamedParamList = FALSE;
|
|
}
|
|
|
|
rParsedInfo.GetCmdSwitchesObject().SetNamedParamListFlag(
|
|
bNamedParamList);
|
|
}
|
|
}
|
|
}
|
|
return retCode;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ParseSETorCREATEVerb
|
|
Synopsis :This function parses the tokens following SET|CREATE verb
|
|
and updates the info in CParsedInfo object passed to it.
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
HELPTYPE - helpType
|
|
Output Parameter(s):
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE - enumerated data type
|
|
Global Variables :None
|
|
Calling Syntax :ParseSETorCREATEVerb(cvTokens,theIterator,rParsedInfo)
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ParseSETorCREATEVerb(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo,
|
|
HELPTYPE helpType)
|
|
{
|
|
RETCODE retCode = PARSER_EXECCOMMAND;
|
|
BOOL bContinue = TRUE;
|
|
|
|
try
|
|
{
|
|
retCode = GetNextToken(cvTokens, theIterator, rParsedInfo,
|
|
helpType, IDS_E_INCOMPLETE_COMMAND);
|
|
|
|
if (retCode == PARSER_CONTINUE)
|
|
{
|
|
if (IsOption(*theIterator))
|
|
{
|
|
retCode = IsHelp(cvTokens, theIterator, rParsedInfo, helpType,
|
|
IDS_E_INVALID_COMMAND, LEVEL_ONE);
|
|
|
|
if (retCode == PARSER_DISPHELP)
|
|
{
|
|
if (m_bAliasName)
|
|
{
|
|
if (FAILED(m_CmdAlias.
|
|
ObtainAliasPropDetails(rParsedInfo)))
|
|
retCode = PARSER_ERRMSG;
|
|
}
|
|
else
|
|
{
|
|
if (!ObtainClassProperties(rParsedInfo))
|
|
retCode = PARSER_ERRMSG;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
retCode = ParseSETorCREATEOrNamedParamInfo(cvTokens,
|
|
theIterator, rParsedInfo, helpType);
|
|
}
|
|
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
retCode = PARSER_ERROR;
|
|
_com_issue_error(e.Error());
|
|
}
|
|
|
|
return retCode;
|
|
}
|
|
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ParseGETVerb
|
|
Synopsis :This function parses the tokens following the GET verb
|
|
and updates the info in CParsedInfo.
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Output Parameter(s):
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE - enumerated data type
|
|
Global Variables :None
|
|
Calling Syntax :ParseGETVerb(cvTokens,theIterator,rParsedInfo)
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ParseGETVerb(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo)
|
|
{
|
|
BOOL bPropList = FALSE;
|
|
RETCODE retCode = PARSER_EXECCOMMAND;
|
|
BOOL bContinue = TRUE;
|
|
_TCHAR *pszNewEntry = NULL;
|
|
|
|
// Move to next token
|
|
if (!GetNextToken(cvTokens, theIterator))
|
|
{
|
|
// GET format | switches not specified.
|
|
retCode = PARSER_EXECCOMMAND;
|
|
}
|
|
else
|
|
{
|
|
BOOL bClass = FALSE;
|
|
if(IsClassOperation(rParsedInfo))
|
|
{
|
|
bClass = TRUE;
|
|
}
|
|
|
|
if(!bClass)
|
|
{
|
|
// Process the property list specified
|
|
if (!IsOption(*theIterator))
|
|
{
|
|
bPropList = TRUE;
|
|
// Obtain the list of properties specified.
|
|
while (TRUE)
|
|
{
|
|
// Add the property to the property vector of the
|
|
// CCommandSwitches object
|
|
if(!rParsedInfo.GetCmdSwitchesObject().
|
|
AddToPropertyList(*theIterator))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_ADD_TO_PROP_LIST_FAILURE);
|
|
bPropList = FALSE;
|
|
bContinue = FALSE;
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
|
|
// Move to next token
|
|
if (!GetNextToken(cvTokens, theIterator))
|
|
{
|
|
// set the return code as PARSER_EXECCOMMAND
|
|
// if no more tokens are present
|
|
retCode = PARSER_EXECCOMMAND;
|
|
bContinue = FALSE;
|
|
break;
|
|
}
|
|
|
|
// Check for the presence of ',' token
|
|
if (CompareTokens(*theIterator, CLI_TOKEN_COMMA))
|
|
{
|
|
if (!GetNextToken(cvTokens, theIterator))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_EXPRESSION);
|
|
retCode = PARSER_ERROR;
|
|
bContinue = FALSE;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (bContinue)
|
|
{
|
|
// alias|class get param1,param2... /getswitches
|
|
if (IsOption(*theIterator))
|
|
{
|
|
retCode = IsHelp(cvTokens, theIterator, rParsedInfo, GETVerb,
|
|
IDS_E_INVALID_EXPRESSION, LEVEL_TWO);
|
|
|
|
if (retCode != PARSER_CONTINUE)
|
|
{
|
|
if (retCode == PARSER_DISPHELP)
|
|
{
|
|
if (m_bAliasName)
|
|
{
|
|
if (FAILED(m_CmdAlias.
|
|
ObtainAliasPropDetails(rParsedInfo)))
|
|
retCode = PARSER_ERRMSG;
|
|
}
|
|
else
|
|
{
|
|
if (!ObtainClassProperties(rParsedInfo))
|
|
retCode = PARSER_ERRMSG;
|
|
}
|
|
}
|
|
bContinue = FALSE;
|
|
}
|
|
|
|
if (bContinue)
|
|
retCode = ParseGETSwitches(cvTokens, theIterator,
|
|
rParsedInfo);
|
|
}
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_GET_EXPRESSION);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
}
|
|
|
|
// If property names are specified then replace them with their
|
|
// derivations.
|
|
if ( retCode == PARSER_EXECCOMMAND )
|
|
{
|
|
if (m_bAliasName)
|
|
{
|
|
if (FAILED(m_CmdAlias.
|
|
ObtainAliasPropDetails(rParsedInfo)))
|
|
retCode = PARSER_ERRMSG;
|
|
}
|
|
else
|
|
{
|
|
if (!ObtainClassProperties(rParsedInfo))
|
|
retCode = PARSER_ERRMSG;
|
|
}
|
|
|
|
PROPDETMAP pdmPropDet = rParsedInfo.GetCmdSwitchesObject().
|
|
GetPropDetMap();
|
|
PROPDETMAP::iterator itrPropDet = NULL;
|
|
CHARVECTOR cvPropsSpecified = rParsedInfo.
|
|
GetCmdSwitchesObject().
|
|
GetPropertyList();
|
|
CHARVECTOR::iterator theIterator = NULL;
|
|
CHARVECTOR cvPropDerivations;
|
|
for ( theIterator = cvPropsSpecified.begin();
|
|
theIterator != cvPropsSpecified.end();
|
|
theIterator++ )
|
|
{
|
|
try
|
|
{
|
|
BOOL bFind = Find(pdmPropDet, *theIterator, itrPropDet);
|
|
_bstr_t bstrPropDerivation;
|
|
if ( bFind )
|
|
bstrPropDerivation = _bstr_t(
|
|
(*itrPropDet).second.Derivation);
|
|
else
|
|
bstrPropDerivation = _bstr_t(*theIterator);
|
|
_TCHAR* pszNewEntry =
|
|
new _TCHAR[bstrPropDerivation.length()+1];
|
|
|
|
if (pszNewEntry == NULL)
|
|
_com_issue_error(WBEM_E_OUT_OF_MEMORY);
|
|
|
|
lstrcpy(pszNewEntry, bstrPropDerivation);
|
|
cvPropDerivations.push_back(pszNewEntry);
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
SAFEDELETE(pszNewEntry);
|
|
retCode = PARSER_ERROR;
|
|
CleanUpCharVector(cvPropDerivations);
|
|
_com_issue_error(e.Error());
|
|
}
|
|
}
|
|
|
|
rParsedInfo.GetCmdSwitchesObject().ClearPropertyList();
|
|
for ( theIterator = cvPropDerivations.begin();
|
|
theIterator != cvPropDerivations.end();
|
|
theIterator++ )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
AddToPropertyList(*theIterator);
|
|
}
|
|
CleanUpCharVector(cvPropDerivations);
|
|
}
|
|
}
|
|
return retCode;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ParseLISTVerb
|
|
Synopsis :This function parses the tokens following the LIST verb
|
|
and updates the info in CParsedInfo.
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Output Parameter(s) :
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE - enumerated data type
|
|
Global Variables :None
|
|
Calling Syntax :ParseLISTVerb(cvTokens,theIterator,rParsedInfo)
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ParseLISTVerb(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo)
|
|
{
|
|
RETCODE retCode = PARSER_EXECCOMMAND;
|
|
BOOL bContinue = TRUE;
|
|
HRESULT hr = S_OK;
|
|
BOOL bSetDefaultFormat = TRUE;
|
|
|
|
// Set the default LIST format
|
|
if(!rParsedInfo.GetCmdSwitchesObject().SetListFormat(CLI_TOKEN_FULL))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(OUT_OF_MEMORY);
|
|
retCode = PARSER_OUTOFMEMORY;
|
|
}
|
|
|
|
if (bContinue)
|
|
{
|
|
// If <list format> <list switches> specified.
|
|
if (GetNextToken(cvTokens, theIterator))
|
|
{
|
|
// Check for LIST formats (LIST formats are not preceded by '/')
|
|
if (!IsOption(*theIterator))
|
|
{
|
|
// If token is not followed by "/" or "-" then it is LIST format.
|
|
if(!rParsedInfo.GetCmdSwitchesObject().
|
|
SetListFormat(*theIterator))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(OUT_OF_MEMORY);
|
|
retCode = PARSER_OUTOFMEMORY;
|
|
bContinue = FALSE;
|
|
}
|
|
|
|
// If list format explicitly specified then do not set
|
|
// default format.
|
|
bSetDefaultFormat = FALSE;
|
|
|
|
// Get all the properties from alias definition for the format
|
|
// specified
|
|
if (bContinue)
|
|
{
|
|
// no more tokens are present.
|
|
if (!GetNextToken(cvTokens, theIterator))
|
|
{
|
|
bContinue = FALSE;
|
|
retCode = PARSER_EXECCOMMAND;
|
|
}
|
|
else
|
|
rParsedInfo.GetHelpInfoObject().SetHelp(
|
|
LISTSwitchesOnly, TRUE);
|
|
}
|
|
}
|
|
|
|
if (bContinue == TRUE )
|
|
{
|
|
if ( IsOption(*theIterator) )
|
|
{
|
|
retCode = IsHelp(cvTokens, theIterator, rParsedInfo, LISTVerb,
|
|
IDS_E_INVALID_EXPRESSION, LEVEL_TWO);
|
|
|
|
// If more tokens are present.
|
|
if (retCode == PARSER_CONTINUE)
|
|
{
|
|
BOOL bFormatSwitchSpecified;
|
|
// Parse for LIST switches.
|
|
retCode = ParseLISTSwitches(cvTokens, theIterator,
|
|
rParsedInfo,
|
|
bFormatSwitchSpecified);
|
|
// If /format is specified in list switches then
|
|
// do not set default format.
|
|
if ( bFormatSwitchSpecified == TRUE )
|
|
bSetDefaultFormat = FALSE;
|
|
}
|
|
else if ( retCode == PARSER_DISPHELP )
|
|
{
|
|
if ( rParsedInfo.GetHelpInfoObject().
|
|
GetHelp(LISTSwitchesOnly) == FALSE )
|
|
{
|
|
hr = m_CmdAlias.PopulateAliasFormatMap(
|
|
rParsedInfo);
|
|
ONFAILTHROWERROR(hr);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_LIST_EXPRESSION);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (retCode == PARSER_EXECCOMMAND)
|
|
{
|
|
// Obtain all properties from alias definition
|
|
if (!m_CmdAlias.ObtainAliasFormat(rParsedInfo))
|
|
{
|
|
// If failed to obtain the alias properties return PARSER_ERROR
|
|
if (rParsedInfo.GetCmdSwitchesObject().GetErrataCode() == 0)
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_LIST_FORMAT);
|
|
}
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
|
|
if ( bSetDefaultFormat == TRUE )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().ClearXSLTDetailsVector();
|
|
XSLTDET xdXSLTDet;
|
|
g_wmiCmd.GetFileFromKey(CLI_TOKEN_TABLE, xdXSLTDet.FileName);
|
|
if (!FrameFileAndAddToXSLTDetVector(xdXSLTDet, rParsedInfo))
|
|
retCode = PARSER_ERRMSG;
|
|
}
|
|
}
|
|
return retCode;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ParseASSOCVerb
|
|
Synopsis :This function parses the tokens following the ASSOC verb
|
|
and updates the info in CParsedInfo.
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Output Parameter(s):
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE - enumerated data type
|
|
Global Variables :None
|
|
Calling Syntax :ParseASSOCVerb(cvTokens,theIterator,rParsedInfo)
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ParseASSOCVerb(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo)
|
|
{
|
|
RETCODE retCode = PARSER_EXECCOMMAND;
|
|
BOOL bContinue = TRUE;
|
|
|
|
// Move to next token
|
|
if (!GetNextToken(cvTokens, theIterator))
|
|
{
|
|
retCode = PARSER_EXECCOMMAND;
|
|
}
|
|
// If it is followed by a ":" <assoc format specifier is given
|
|
// Move to next token
|
|
else
|
|
{
|
|
if (CompareTokens(*theIterator, CLI_TOKEN_COLON))
|
|
{
|
|
// Move to next token
|
|
if (!GetNextToken(cvTokens, theIterator))
|
|
{
|
|
// PARSER_ERROR if <format specifier> is missing
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_ASSOC_FORMATSPECIFIER);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
else if (IsOption(*theIterator))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_ASSOC_FORMATSPECIFIER);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().ClearXSLTDetailsVector();
|
|
|
|
BOOL bFrameXSLFile = TRUE;
|
|
XSLTDET xdXSLTDet;
|
|
xdXSLTDet.FileName = *theIterator;
|
|
if(!g_wmiCmd.GetFileFromKey(*theIterator, xdXSLTDet.FileName))
|
|
bFrameXSLFile = FALSE;
|
|
|
|
if ( bFrameXSLFile == TRUE )
|
|
{
|
|
if (!FrameFileAndAddToXSLTDetVector(xdXSLTDet,
|
|
rParsedInfo))
|
|
retCode = PARSER_ERRMSG;
|
|
}
|
|
else
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
AddToXSLTDetailsVector(xdXSLTDet);
|
|
}
|
|
|
|
GetNextToken(cvTokens, theIterator);
|
|
rParsedInfo.GetHelpInfoObject().SetHelp(ASSOCSwitchesOnly, TRUE);
|
|
|
|
}///END for check of ":"
|
|
|
|
if ( retCode == PARSER_EXECCOMMAND &&
|
|
theIterator < cvTokens.end() )
|
|
{
|
|
if (IsOption(*theIterator))
|
|
{
|
|
retCode = IsHelp(cvTokens, theIterator, rParsedInfo, ASSOCVerb,
|
|
IDS_E_INVALID_COMMAND,LEVEL_TWO);
|
|
|
|
// If more tokens are present.
|
|
if (retCode == PARSER_CONTINUE)
|
|
{
|
|
//Parse for Assoc switches.
|
|
retCode = ParseAssocSwitches(cvTokens, theIterator,
|
|
rParsedInfo);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_ASSOC_SYNTAX);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
}
|
|
}
|
|
|
|
return retCode;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ParseCALLVerb
|
|
Synopsis :This function parses the tokens following the CALL verb
|
|
and updates the info in CParsedInfo.
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Output Parameter(s):
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE - enumerated data type
|
|
Global Variables :None
|
|
Calling Syntax :ParseCALLVerb(cvTokens,theIterator,rParsedInfo)
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ParseCALLVerb(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo)
|
|
{
|
|
RETCODE retCode = PARSER_EXECCOMMAND;
|
|
BOOL bContinue = TRUE;
|
|
|
|
// Move to next token
|
|
retCode = GetNextToken(cvTokens, theIterator, rParsedInfo,
|
|
CALLVerb, IDS_E_INCOMPLETE_COMMAND);
|
|
|
|
if (retCode == PARSER_CONTINUE)
|
|
{
|
|
if (IsOption(*theIterator))
|
|
{
|
|
retCode = IsHelp(cvTokens, theIterator, rParsedInfo, CALLVerb,
|
|
IDS_E_INVALID_EXPRESSION, LEVEL_TWO);
|
|
if (retCode != PARSER_CONTINUE)
|
|
{
|
|
if (retCode == PARSER_DISPHELP)
|
|
{
|
|
if(m_bAliasName)
|
|
{
|
|
if (FAILED(m_CmdAlias.ObtainAliasVerbDetails(rParsedInfo)))
|
|
retCode = PARSER_ERRMSG;
|
|
}
|
|
else
|
|
{
|
|
if (!ObtainClassMethods(rParsedInfo))
|
|
retCode = PARSER_ERRMSG;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_VERB_OR_METHOD_NOT_SPECIFIED);
|
|
retCode = PARSER_ERROR;
|
|
/* theIterator = theIterator-2;
|
|
retCode = PARSER_EXECCOMMAND;
|
|
*/ }
|
|
}
|
|
else
|
|
{
|
|
retCode = ParseMethodInfo(cvTokens, theIterator, rParsedInfo);
|
|
if (retCode == PARSER_CONTINUE)
|
|
retCode = PARSER_EXECCOMMAND;
|
|
}
|
|
}
|
|
else if (retCode == PARSER_DISPHELP)
|
|
{
|
|
if(m_bAliasName)
|
|
{
|
|
if (FAILED(m_CmdAlias.ObtainAliasVerbDetails(rParsedInfo)))
|
|
retCode = PARSER_ERRMSG;
|
|
}
|
|
else
|
|
{
|
|
if (!ObtainClassMethods(rParsedInfo))
|
|
retCode = PARSER_ERRMSG;
|
|
}
|
|
}
|
|
|
|
return retCode;
|
|
}
|
|
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ParseGlobalSwitches
|
|
Synopsis :This function does the parsing and interprets if command
|
|
has global switches specified in it. It parses the
|
|
remaining tokens following and updates the same in
|
|
CParsedInfo.
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Output Parameter(s):
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE - enumerated data type
|
|
Global Variables :None
|
|
Calling Syntax :ParseGlobalSwitches(cvTokens,theIterator,rParsedInfo)
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ParseGlobalSwitches(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo &rParsedInfo)
|
|
{
|
|
RETCODE retCode = PARSER_CONTINUE;
|
|
BOOL bContinue = TRUE;
|
|
BOOL bPassFlag = FALSE;
|
|
BOOL bUserFlag = FALSE;
|
|
BOOL bOpenOutFileInWriteMode = FALSE;
|
|
|
|
while (TRUE)
|
|
{
|
|
// Move to next token
|
|
retCode = GetNextToken(cvTokens, theIterator, rParsedInfo,
|
|
IDS_E_INVALID_GLOBAL_SWITCH);
|
|
if (retCode != PARSER_CONTINUE)
|
|
break;
|
|
|
|
// Check for the presence of NAMESPACE global switch
|
|
if (CompareTokens(*theIterator, CLI_TOKEN_NAMESPACE))
|
|
{
|
|
retCode = ValidateGlobalSwitchValue(cvTokens, theIterator,
|
|
IDS_E_INCORRECT_NAMESPACE,
|
|
rParsedInfo,
|
|
IDS_E_INVALID_NAMESPACE_SYNTAX,
|
|
Namespace);
|
|
if (retCode == PARSER_CONTINUE)
|
|
{
|
|
LONG lPresNamespaceLen =
|
|
lstrlen(rParsedInfo.GetGlblSwitchesObject().GetNameSpace());
|
|
LONG lUserInputNamespaceLen = lstrlen(*theIterator);
|
|
_TCHAR *pszNamespaceToBeUpdated = new _TCHAR[
|
|
// +2 for '\' and '\0'
|
|
lUserInputNamespaceLen + lPresNamespaceLen + 2];
|
|
if (pszNamespaceToBeUpdated == NULL)
|
|
throw OUT_OF_MEMORY;
|
|
|
|
lstrcpy(pszNamespaceToBeUpdated,
|
|
rParsedInfo.GetGlblSwitchesObject().GetNameSpace());
|
|
|
|
FrameNamespace(*theIterator, pszNamespaceToBeUpdated);
|
|
|
|
if (!CompareTokens(pszNamespaceToBeUpdated, CLI_TOKEN_NULL) &&
|
|
rParsedInfo.GetGlblSwitchesObject().
|
|
GetInteractiveStatus() == TRUE)
|
|
{
|
|
if (!ValidateNodeOrNS(pszNamespaceToBeUpdated, FALSE))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_NAMESPACE);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(!rParsedInfo.GetGlblSwitchesObject().
|
|
SetNameSpace(pszNamespaceToBeUpdated))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(OUT_OF_MEMORY);
|
|
retCode = PARSER_OUTOFMEMORY;
|
|
break;
|
|
}
|
|
|
|
SAFEDELETE(pszNamespaceToBeUpdated);
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
// Check for the presence of ROLE global switch
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_ROLE))
|
|
{
|
|
retCode = ValidateGlobalSwitchValue(cvTokens, theIterator,
|
|
IDS_E_INVALID_ROLE,
|
|
rParsedInfo,
|
|
IDS_E_INVALID_ROLE_SYNTAX,
|
|
Role);
|
|
if (retCode == PARSER_CONTINUE)
|
|
{
|
|
LONG lPresRoleLen =
|
|
lstrlen(rParsedInfo.GetGlblSwitchesObject().GetRole());
|
|
LONG lUserInputRoleLen = lstrlen(*theIterator);
|
|
_TCHAR *pszRoleToBeUpdated = new _TCHAR[
|
|
// +2 one for '\' and one for '\0'
|
|
lPresRoleLen + lUserInputRoleLen + 2];
|
|
if (pszRoleToBeUpdated == NULL)
|
|
throw OUT_OF_MEMORY;
|
|
|
|
lstrcpy(pszRoleToBeUpdated,
|
|
rParsedInfo.GetGlblSwitchesObject().GetRole());
|
|
|
|
FrameNamespace(*theIterator, pszRoleToBeUpdated);
|
|
|
|
if (!CompareTokens(pszRoleToBeUpdated, CLI_TOKEN_NULL) &&
|
|
rParsedInfo.GetGlblSwitchesObject().
|
|
GetInteractiveStatus() == TRUE)
|
|
{
|
|
if (!ValidateNodeOrNS(pszRoleToBeUpdated, FALSE))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_ROLE);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(!rParsedInfo.GetGlblSwitchesObject().
|
|
SetRole(pszRoleToBeUpdated))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(OUT_OF_MEMORY);
|
|
retCode = PARSER_OUTOFMEMORY;
|
|
break;
|
|
}
|
|
SAFEDELETE(pszRoleToBeUpdated);
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_NODE))
|
|
{
|
|
retCode = ValidateGlobalSwitchValue(cvTokens, theIterator,
|
|
IDS_E_INVALID_MACHINE_NAME,
|
|
rParsedInfo,
|
|
IDS_E_INVALID_NODE_SYNTAX,
|
|
Node);
|
|
|
|
if (retCode == PARSER_CONTINUE)
|
|
{
|
|
BOOL bBreakOuterLoop = FALSE;
|
|
BOOL bGetValidNode = FALSE;
|
|
BOOL bNodeListCleared = FALSE;
|
|
|
|
while ( TRUE )
|
|
{
|
|
try
|
|
{
|
|
CHString chsNodeName(*theIterator);
|
|
chsNodeName.TrimLeft();
|
|
chsNodeName.TrimRight();
|
|
|
|
lstrcpy(*theIterator, (LPCWSTR) chsNodeName);
|
|
}
|
|
catch(CHeap_Exception)
|
|
{
|
|
_com_issue_error(WBEM_E_OUT_OF_MEMORY);
|
|
}
|
|
|
|
if ( *theIterator[0] == _T('@') )
|
|
{
|
|
retCode = ParseNodeListFile(cvTokens, theIterator,
|
|
rParsedInfo);
|
|
if ( retCode != PARSER_CONTINUE )
|
|
{
|
|
bBreakOuterLoop = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// If interactive mode then check for the validity of
|
|
// nodes
|
|
if(rParsedInfo.GetGlblSwitchesObject().
|
|
GetInteractiveStatus())
|
|
{
|
|
BOOL bNodeExist = TRUE;
|
|
if ( rParsedInfo.GetGlblSwitchesObject().
|
|
GetFailFast() == TRUE )
|
|
{
|
|
bNodeExist =
|
|
IsFailFastAndNodeExist(rParsedInfo, *theIterator);
|
|
}
|
|
else
|
|
bNodeExist = ValidateNodeOrNS(*theIterator, TRUE);
|
|
|
|
if( bNodeExist == FALSE)
|
|
{
|
|
// Display error message for invalid node
|
|
DisplayString(IDS_E_INVALID_NODE,
|
|
::GetOEMCP(), *theIterator, TRUE);
|
|
if ( !GetNextToken(cvTokens, theIterator))
|
|
{
|
|
// If no more tokens are present then stop
|
|
// further processing
|
|
bBreakOuterLoop = TRUE;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
// If multiple nodes are defined then check
|
|
// tokens
|
|
if (CompareTokens(*theIterator,
|
|
CLI_TOKEN_COMMA))
|
|
{
|
|
// If invalid node syntax given then report
|
|
// error
|
|
if ( !GetNextToken(cvTokens, theIterator) )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_NODE_SYNTAX);
|
|
retCode=PARSER_ERROR;
|
|
bBreakOuterLoop = TRUE;
|
|
break;
|
|
}
|
|
else if ( IsOption (*theIterator) )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_NODE_SYNTAX);
|
|
retCode=PARSER_ERROR;
|
|
bBreakOuterLoop = TRUE;
|
|
break;
|
|
}
|
|
|
|
//Skip adding this invalid node to node list
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
// If no more node present
|
|
theIterator--;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
// Set flag for valid node
|
|
bGetValidNode = TRUE;
|
|
|
|
// If valid node(s) are present and list is not
|
|
// already cleared then clear it
|
|
if(bGetValidNode && !bNodeListCleared)
|
|
{
|
|
if (!rParsedInfo.GetGlblSwitchesObject().
|
|
ClearNodesList())
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(OUT_OF_MEMORY);
|
|
retCode = PARSER_OUTOFMEMORY;
|
|
break;
|
|
}
|
|
bNodeListCleared = TRUE;
|
|
}
|
|
}
|
|
else if( bNodeListCleared == FALSE )
|
|
{
|
|
// If not in interactive mode then clear
|
|
// previous node list
|
|
if (!rParsedInfo.GetGlblSwitchesObject().
|
|
ClearNodesList())
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(OUT_OF_MEMORY);
|
|
retCode = PARSER_OUTOFMEMORY;
|
|
break;
|
|
}
|
|
bNodeListCleared = TRUE;
|
|
}
|
|
|
|
if (rParsedInfo.GetGlblSwitchesObject().
|
|
AddToNodesList(*theIterator))
|
|
{
|
|
if ( GetNextToken(cvTokens, theIterator) )
|
|
{
|
|
if (CompareTokens(*theIterator, CLI_TOKEN_COMMA))
|
|
{
|
|
if ( !GetNextToken(cvTokens, theIterator) )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_NODE_SYNTAX);
|
|
retCode=PARSER_ERROR;
|
|
bBreakOuterLoop = TRUE;
|
|
}
|
|
else if ( IsOption (*theIterator) )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_NODE_SYNTAX);
|
|
retCode=PARSER_ERROR;
|
|
bBreakOuterLoop = TRUE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
theIterator--;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
bBreakOuterLoop = TRUE;
|
|
}
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(OUT_OF_MEMORY);
|
|
retCode = PARSER_OUTOFMEMORY;
|
|
bBreakOuterLoop = FALSE;
|
|
}
|
|
|
|
if ( bBreakOuterLoop == TRUE )
|
|
break;
|
|
}
|
|
|
|
if ( bBreakOuterLoop == TRUE )
|
|
break;
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_IMPLEVEL))
|
|
{
|
|
retCode = ValidateGlobalSwitchValue(cvTokens, theIterator,
|
|
IDS_E_INVALID_IMP_LEVEL,
|
|
rParsedInfo,
|
|
IDS_E_INVALID_IMP_LEVEL_SYNTAX,
|
|
Level);
|
|
if (retCode == PARSER_CONTINUE)
|
|
{
|
|
if (!rParsedInfo.GetGlblSwitchesObject().
|
|
SetImpersonationLevel(*theIterator))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_IMP_LEVEL);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_AUTHLEVEL))
|
|
{
|
|
retCode = ValidateGlobalSwitchValue(cvTokens, theIterator,
|
|
IDS_E_INVALID_AUTH_LEVEL,
|
|
rParsedInfo,
|
|
IDS_E_INVALID_AUTH_LEVEL_SYNTAX,
|
|
AuthLevel);
|
|
|
|
if (retCode == PARSER_CONTINUE)
|
|
{
|
|
if (!rParsedInfo.GetGlblSwitchesObject().
|
|
SetAuthenticationLevel(*theIterator))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_AUTH_LEVEL);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_LOCALE))
|
|
{
|
|
retCode = ValidateGlobalSwitchValue(cvTokens, theIterator,
|
|
IDS_E_INVALID_LOCALE,
|
|
rParsedInfo,
|
|
IDS_E_INVALID_LOCALE_SYNTAX,
|
|
Locale);
|
|
if (retCode == PARSER_CONTINUE)
|
|
{
|
|
if(!rParsedInfo.GetGlblSwitchesObject().SetLocale(*theIterator))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(OUT_OF_MEMORY);
|
|
retCode = PARSER_OUTOFMEMORY;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_PRIVILEGES))
|
|
{
|
|
retCode = ValidateGlobalSwitchValue(cvTokens, theIterator,
|
|
IDS_E_INVALID_PRIVILEGES_OPTION,
|
|
rParsedInfo,
|
|
IDS_E_INVALID_PRIVILEGES_SYNTAX,
|
|
Privileges);
|
|
if (retCode == PARSER_CONTINUE)
|
|
{
|
|
if (CompareTokens(*theIterator, CLI_TOKEN_ENABLE))
|
|
rParsedInfo.GetGlblSwitchesObject().SetPrivileges(TRUE);
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_DISABLE))
|
|
rParsedInfo.GetGlblSwitchesObject().SetPrivileges(FALSE);
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_PRIVILEGES_OPTION);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_TRACE))
|
|
{
|
|
retCode = ValidateGlobalSwitchValue(cvTokens, theIterator,
|
|
IDS_E_INVALID_TRACE_OPTION,
|
|
rParsedInfo,
|
|
IDS_E_INVALID_TRACE_SYNTAX,
|
|
Trace);
|
|
if (retCode == PARSER_CONTINUE)
|
|
{
|
|
if (CompareTokens(*theIterator, CLI_TOKEN_ON))
|
|
rParsedInfo.GetGlblSwitchesObject().SetTraceMode(TRUE);
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_OFF))
|
|
rParsedInfo.GetGlblSwitchesObject().SetTraceMode(FALSE);
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_TRACE_OPTION);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_RECORD))
|
|
{
|
|
retCode = ValidateGlobalSwitchValue(cvTokens, theIterator,
|
|
IDS_E_INVALID_RECORD_PATH,
|
|
rParsedInfo,
|
|
IDS_E_INVALID_RECORD_SYNTAX,
|
|
RecordPath);
|
|
if (retCode == PARSER_CONTINUE)
|
|
{
|
|
// TRUE for getting output file name.
|
|
_TCHAR* pszOutputFileName = rParsedInfo.
|
|
GetGlblSwitchesObject().
|
|
GetOutputOrAppendFileName(TRUE);
|
|
|
|
if ( pszOutputFileName != NULL &&
|
|
CompareTokens(*theIterator, pszOutputFileName) )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_RECORD_FILE_ALREADY_OPEN_FOR_OUTPUT);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
|
|
// FALSE for getting append file name.
|
|
_TCHAR* pszAppendFileName = rParsedInfo.
|
|
GetGlblSwitchesObject().
|
|
GetOutputOrAppendFileName(FALSE);
|
|
|
|
if ( pszAppendFileName != NULL &&
|
|
CompareTokens(*theIterator, pszAppendFileName) )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_RECORD_FILE_ALREADY_OPEN_FOR_APPEND);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
|
|
// /record:"" indicates stop logging.
|
|
if (!CompareTokens(*theIterator, CLI_TOKEN_NULL))
|
|
{
|
|
if ( IsValidFile(*theIterator) == FALSE )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_FILENAME);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(!rParsedInfo.GetGlblSwitchesObject().
|
|
SetRecordPath(*theIterator))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(OUT_OF_MEMORY);
|
|
retCode = PARSER_OUTOFMEMORY;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_INTERACTIVE))
|
|
{
|
|
retCode = ValidateGlobalSwitchValue(cvTokens, theIterator,
|
|
IDS_E_INVALID_INTERACTIVE_OPTION,
|
|
rParsedInfo,
|
|
IDS_E_INVALID_INTERACTIVE_SYNTAX,
|
|
Interactive);
|
|
if (retCode == PARSER_CONTINUE)
|
|
{
|
|
if (CompareTokens(*theIterator, CLI_TOKEN_ON))
|
|
{
|
|
if (rParsedInfo.GetGlblSwitchesObject().GetInteractiveStatus())
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetInformationCode(IDS_I_INTERACTIVE_ALREADY_SET);
|
|
|
|
}
|
|
else
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetInformationCode(IDS_I_INTERACTIVE_SET);
|
|
rParsedInfo.GetGlblSwitchesObject().SetInteractiveMode(TRUE);
|
|
|
|
}
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_OFF))
|
|
{
|
|
if (!rParsedInfo.GetGlblSwitchesObject().GetInteractiveStatus())
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetInformationCode(IDS_I_INTERACTIVE_ALREADY_RESET);
|
|
|
|
}
|
|
else
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetInformationCode(IDS_I_INTERACTIVE_RESET);
|
|
rParsedInfo.GetGlblSwitchesObject().SetInteractiveMode(FALSE);
|
|
|
|
}
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_INTERACTIVE_OPTION);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_FAILFAST))
|
|
{
|
|
retCode = ValidateGlobalSwitchValue(cvTokens, theIterator,
|
|
IDS_E_INVALID_FAILFAST_OPTION,
|
|
rParsedInfo,
|
|
IDS_E_INVALID_FAILFAST_SYNTAX,
|
|
FAILFAST);
|
|
if (retCode == PARSER_CONTINUE)
|
|
{
|
|
if (CompareTokens(*theIterator, CLI_TOKEN_ON))
|
|
{
|
|
if (rParsedInfo.GetGlblSwitchesObject().GetFailFast())
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetInformationCode(IDS_I_FAILFAST_ALREADY_SET);
|
|
|
|
}
|
|
else
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetInformationCode(IDS_I_FAILFAST_SET);
|
|
rParsedInfo.GetGlblSwitchesObject().SetFailFast(TRUE);
|
|
|
|
}
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_OFF))
|
|
{
|
|
if (!rParsedInfo.GetGlblSwitchesObject().GetFailFast())
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetInformationCode(IDS_I_FAILFAST_ALREADY_RESET);
|
|
|
|
}
|
|
else
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetInformationCode(IDS_I_FAILFAST_RESET);
|
|
rParsedInfo.GetGlblSwitchesObject().SetFailFast(FALSE);
|
|
|
|
}
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_FAILFAST_OPTION);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_USER))
|
|
{
|
|
retCode = ValidateGlobalSwitchValue(cvTokens, theIterator,
|
|
IDS_E_INVALID_USER_ID,
|
|
rParsedInfo,
|
|
IDS_E_INVALID_USER_SYNTAX,
|
|
User);
|
|
if (retCode == PARSER_CONTINUE)
|
|
{
|
|
if(!rParsedInfo.GetGlblSwitchesObject().SetUser(*theIterator))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(OUT_OF_MEMORY);
|
|
retCode = PARSER_OUTOFMEMORY;
|
|
break;
|
|
}
|
|
|
|
bUserFlag = TRUE;
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_PASSWORD))
|
|
{
|
|
retCode = ValidateGlobalSwitchValue(cvTokens, theIterator,
|
|
IDS_E_INVALID_PASSWORD,
|
|
rParsedInfo,
|
|
IDS_E_INVALID_PASSWORD_SYNTAX,
|
|
Password);
|
|
if (retCode == PARSER_CONTINUE)
|
|
{
|
|
if(!rParsedInfo.GetGlblSwitchesObject().SetPassword(*theIterator))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(OUT_OF_MEMORY);
|
|
retCode=PARSER_OUTOFMEMORY;
|
|
break;
|
|
}
|
|
|
|
bPassFlag = TRUE;
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_OUTPUT))
|
|
{
|
|
retCode = ValidateGlobalSwitchValue(cvTokens, theIterator,
|
|
IDS_E_INVALID_OUTPUT_OPTION,
|
|
rParsedInfo,
|
|
IDS_E_INVALID_OUTPUT_SYNTAX,
|
|
OUTPUT);
|
|
if (retCode == PARSER_CONTINUE)
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetOutputSwitchFlag(TRUE);
|
|
|
|
if (CompareTokens(*theIterator, CLI_TOKEN_STDOUT))
|
|
{
|
|
|
|
// TRUE for setting output file.
|
|
rParsedInfo.GetGlblSwitchesObject().SetOutputOrAppendOption(
|
|
STDOUT, TRUE);
|
|
rParsedInfo.GetGlblSwitchesObject().
|
|
SetOutputOrAppendFileName(NULL, TRUE);
|
|
}
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_CLIPBOARD))
|
|
{
|
|
// TRUE for setting output file.
|
|
rParsedInfo.GetGlblSwitchesObject().SetOutputOrAppendOption(
|
|
CLIPBOARD, TRUE);
|
|
rParsedInfo.GetGlblSwitchesObject().
|
|
SetOutputOrAppendFileName(NULL, TRUE);
|
|
}
|
|
else if ( CompareTokens(*theIterator, CLI_TOKEN_NULL))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_FILENAME);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
// FALSE for getting append file name.
|
|
_TCHAR* pszAppendFileName = rParsedInfo.
|
|
GetGlblSwitchesObject().
|
|
GetOutputOrAppendFileName(FALSE);
|
|
|
|
if ( pszAppendFileName != NULL &&
|
|
CompareTokens(*theIterator, pszAppendFileName) )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_OUTPUT_FILE_ALREADY_OPEN_FOR_APPEND);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
|
|
_TCHAR* pszRecordFileName = rParsedInfo.
|
|
GetGlblSwitchesObject().
|
|
GetRecordPath();
|
|
|
|
if ( pszRecordFileName != NULL &&
|
|
CompareTokens(*theIterator, pszRecordFileName) )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_OUTPUT_FILE_ALREADY_OPEN_FOR_RECORD);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
|
|
if ( CloseOutputFile() == TRUE )
|
|
{
|
|
// TRUE for getting output file name.
|
|
_TCHAR* pszOutputFileName = rParsedInfo.
|
|
GetGlblSwitchesObject().
|
|
GetOutputOrAppendFileName(TRUE);
|
|
|
|
if ( pszOutputFileName == NULL ||
|
|
( pszOutputFileName != NULL &&
|
|
!CompareTokens(*theIterator, pszOutputFileName)))
|
|
{
|
|
retCode = IsValidFile(*theIterator);
|
|
if ( retCode == PARSER_ERROR )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_FILENAME);
|
|
break;
|
|
}
|
|
else if ( retCode == PARSER_ERRMSG )
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
retCode = PARSER_ERRMSG;
|
|
break;
|
|
}
|
|
|
|
// TRUE for setting output file.
|
|
if(!rParsedInfo.GetGlblSwitchesObject().
|
|
SetOutputOrAppendFileName(*theIterator, TRUE))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(OUT_OF_MEMORY);
|
|
retCode=PARSER_OUTOFMEMORY;
|
|
break;
|
|
}
|
|
rParsedInfo.GetGlblSwitchesObject().SetOutputOrAppendOption(FILEOUTPUT,
|
|
TRUE);
|
|
bOpenOutFileInWriteMode = TRUE;
|
|
}
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_APPEND))
|
|
{
|
|
retCode = ValidateGlobalSwitchValue(cvTokens, theIterator,
|
|
IDS_E_INVALID_APPEND_OPTION,
|
|
rParsedInfo,
|
|
IDS_E_INVALID_APPEND_SYNTAX,
|
|
APPEND);
|
|
if (retCode == PARSER_CONTINUE)
|
|
{
|
|
if ( CompareTokens(*theIterator, CLI_TOKEN_STDOUT) )
|
|
{
|
|
// FALSE for setting append file.
|
|
rParsedInfo.GetGlblSwitchesObject().
|
|
SetOutputOrAppendFileName(NULL, FALSE);
|
|
rParsedInfo.GetGlblSwitchesObject().SetOutputOrAppendOption(STDOUT,
|
|
FALSE);
|
|
|
|
}
|
|
else if ( CompareTokens(*theIterator, CLI_TOKEN_CLIPBOARD) )
|
|
{
|
|
// FALSE for setting append file.
|
|
rParsedInfo.GetGlblSwitchesObject().
|
|
SetOutputOrAppendFileName(NULL, FALSE);
|
|
rParsedInfo.GetGlblSwitchesObject().SetOutputOrAppendOption(CLIPBOARD,
|
|
FALSE);
|
|
}
|
|
else if ( CompareTokens(*theIterator, CLI_TOKEN_NULL))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_FILENAME);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
// TRUE for getting output file name.
|
|
_TCHAR* pszOutputFileName = rParsedInfo.
|
|
GetGlblSwitchesObject().
|
|
GetOutputOrAppendFileName(TRUE);
|
|
if ( pszOutputFileName != NULL &&
|
|
CompareTokens(*theIterator, pszOutputFileName) )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_APPEND_FILE_ALREADY_OPEN_FOR_OUTPUT);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
|
|
_TCHAR* pszRecordFileName = rParsedInfo.
|
|
GetGlblSwitchesObject().
|
|
GetRecordPath();
|
|
|
|
if ( pszRecordFileName != NULL &&
|
|
CompareTokens(*theIterator, pszRecordFileName) )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_APPEND_FILE_ALREADY_OPEN_FOR_RECORD);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
|
|
if ( CloseAppendFile() == TRUE )
|
|
{
|
|
// FALSE for getting append file name.
|
|
_TCHAR* pszAppendFileName = rParsedInfo.
|
|
GetGlblSwitchesObject().
|
|
GetOutputOrAppendFileName(FALSE);
|
|
|
|
if ( pszAppendFileName == NULL ||
|
|
( pszAppendFileName != NULL &&
|
|
!CompareTokens(*theIterator, pszAppendFileName)))
|
|
{
|
|
retCode = IsValidFile(*theIterator);
|
|
if ( retCode == PARSER_ERROR )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_FILENAME);
|
|
break;
|
|
}
|
|
else if ( retCode == PARSER_ERRMSG )
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
retCode = PARSER_ERRMSG;
|
|
break;
|
|
}
|
|
|
|
// FALSE for setting append file.
|
|
if (!rParsedInfo.GetGlblSwitchesObject().
|
|
SetOutputOrAppendFileName(*theIterator, FALSE))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(OUT_OF_MEMORY);
|
|
retCode = PARSER_OUTOFMEMORY;
|
|
break;
|
|
}
|
|
rParsedInfo.GetGlblSwitchesObject().SetOutputOrAppendOption(FILEOUTPUT,
|
|
FALSE);
|
|
|
|
}
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
else if (CompareTokens(*theIterator,CLI_TOKEN_AGGREGATE))
|
|
{
|
|
retCode = ValidateGlobalSwitchValue(cvTokens, theIterator,
|
|
IDS_E_INVALID_AGGREGATE_OPTION,
|
|
rParsedInfo,
|
|
IDS_E_INVALID_AGGREGATE_SYNTAX,
|
|
Aggregate);
|
|
if(retCode == PARSER_CONTINUE)
|
|
{
|
|
if(CompareTokens(*theIterator, CLI_TOKEN_ON))
|
|
rParsedInfo.GetGlblSwitchesObject().SetAggregateFlag(TRUE);
|
|
else if(CompareTokens(*theIterator, CLI_TOKEN_OFF))
|
|
rParsedInfo.GetGlblSwitchesObject().SetAggregateFlag(FALSE);
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_AGGREGATE_OPTION);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_HELP))
|
|
{
|
|
retCode = ParseHelp(cvTokens, theIterator, rParsedInfo, TRUE);
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_GLOBAL_SWITCH);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
|
|
// Move to next token
|
|
if (!GetNextToken(cvTokens, theIterator))
|
|
// Break the loop if no more tokens are present
|
|
break;
|
|
// Break the loop if no more global switches are present
|
|
if (!IsOption(*theIterator))
|
|
break;
|
|
}
|
|
|
|
if ( bUserFlag == TRUE && bPassFlag == FALSE )
|
|
rParsedInfo.GetGlblSwitchesObject().SetAskForPassFlag(TRUE);
|
|
|
|
if ( rParsedInfo.GetGlblSwitchesObject().GetPassword() != NULL &&
|
|
rParsedInfo.GetGlblSwitchesObject().GetUser() == NULL )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_PASSWORD_WITHOUT_USER);
|
|
rParsedInfo.GetGlblSwitchesObject().SetPassword(CLI_TOKEN_NULL);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
|
|
if ( retCode == PARSER_CONTINUE &&
|
|
bOpenOutFileInWriteMode == TRUE )
|
|
retCode = ProcessOutputAndAppendFiles(rParsedInfo, retCode, TRUE);
|
|
|
|
return retCode;
|
|
}
|
|
/*----------------------------------------------------------------------------
|
|
Name :ParseGETSwitches
|
|
Synopsis :This function does the parsing and interprets if command
|
|
has GET as the verb. It parses the remaining tokens
|
|
following and updates the same in CParsedInfo.
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Output Parameter(s):
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE - enumerated data type
|
|
Global Variables :None
|
|
Calling Syntax :ParseGETSwitches(cvTokens,theIterator,rParsedInfo)
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ParseGETSwitches(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo)
|
|
{
|
|
RETCODE retCode = PARSER_EXECCOMMAND;
|
|
BOOL bContinue = TRUE;
|
|
|
|
while ( retCode == PARSER_EXECCOMMAND )
|
|
{
|
|
// Check for the presence of VALUE switch
|
|
if (CompareTokens(*theIterator, CLI_TOKEN_VALUE))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().ClearXSLTDetailsVector();
|
|
XSLTDET xdXSLTDet;
|
|
g_wmiCmd.GetFileFromKey(CLI_TOKEN_VALUE, xdXSLTDet.FileName);
|
|
if (!FrameFileAndAddToXSLTDetVector(xdXSLTDet, rParsedInfo))
|
|
retCode = PARSER_ERRMSG;
|
|
}
|
|
// Check for the presence of ALL switch
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_ALL))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().ClearXSLTDetailsVector();
|
|
XSLTDET xdXSLTDet;
|
|
g_wmiCmd.GetFileFromKey(CLI_TOKEN_TABLE, xdXSLTDet.FileName);
|
|
if (!FrameFileAndAddToXSLTDetVector(xdXSLTDet, rParsedInfo))
|
|
retCode = PARSER_ERRMSG;
|
|
}
|
|
// Check for the presence of FORMAT switch
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_FORMAT))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().ClearXSLTDetailsVector();
|
|
retCode = ParseFORMATSwitch(cvTokens, theIterator, rParsedInfo);
|
|
}
|
|
// Check for the presence of EVERY switch
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_EVERY))
|
|
{
|
|
retCode = ParseEVERYSwitch(cvTokens, theIterator, rParsedInfo);
|
|
}
|
|
// Check for the presence of TRANSLATE switch
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_TRANSLATE))
|
|
{
|
|
retCode = ParseTRANSLATESwitch(cvTokens, theIterator, rParsedInfo);
|
|
}
|
|
// Check whether /REPEAT follows /EVERY
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_REPEAT))
|
|
{
|
|
if (!CompareTokens(*(theIterator-4), CLI_TOKEN_EVERY))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_I_REPEAT_EVERY_RELATED);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
}
|
|
// Check for the presence of HELP switch
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_HELP))
|
|
{
|
|
rParsedInfo.GetHelpInfoObject().SetHelp(GETSwitchesOnly, TRUE);
|
|
retCode = ParseHelp(cvTokens, theIterator, GETVerb, rParsedInfo);
|
|
if ( retCode == PARSER_DISPHELP )
|
|
{
|
|
if (m_bAliasName)
|
|
{
|
|
if (FAILED(m_CmdAlias.
|
|
ObtainAliasPropDetails(rParsedInfo)))
|
|
retCode = PARSER_ERRMSG;
|
|
}
|
|
else
|
|
{
|
|
if (!ObtainClassProperties(rParsedInfo))
|
|
retCode = PARSER_ERRMSG;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_GET_SWITCH);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
|
|
if ( retCode == PARSER_EXECCOMMAND )
|
|
{
|
|
if ( !GetNextToken(cvTokens, theIterator) )
|
|
break;
|
|
|
|
if ( !IsOption(*theIterator) )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_COMMAND);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
|
|
if ( !GetNextToken(cvTokens, theIterator) )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_GET_SWITCH);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return retCode;
|
|
}
|
|
/*----------------------------------------------------------------------------
|
|
Name :ParseLISTSwitches
|
|
Synopsis :This function does the parsing and interprets if command
|
|
has LIST as the verb. It parses the remaining tokens
|
|
following and updates the same in CParsedInfo.
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Output Parameter(s):
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE - enumerated data type
|
|
Global Variables :None
|
|
Calling Syntax :ParseLISTSwitches(cvTokens,theIterator,rParsedInfo,
|
|
bFormatSwitchSpecified)
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ParseLISTSwitches(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo,
|
|
BOOL& bFormatSwitchSpecified)
|
|
{
|
|
RETCODE retCode = PARSER_EXECCOMMAND;
|
|
bFormatSwitchSpecified = FALSE;
|
|
|
|
while ( retCode == PARSER_EXECCOMMAND )
|
|
{
|
|
if (CompareTokens(*theIterator, CLI_TOKEN_TRANSLATE))
|
|
{
|
|
retCode = ParseTRANSLATESwitch(cvTokens, theIterator, rParsedInfo);
|
|
}
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_EVERY))
|
|
{
|
|
retCode = ParseEVERYSwitch(cvTokens, theIterator, rParsedInfo);
|
|
}
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_FORMAT))
|
|
{
|
|
retCode = ParseFORMATSwitch(cvTokens, theIterator, rParsedInfo);
|
|
bFormatSwitchSpecified = TRUE;
|
|
}
|
|
// Check whether /REPEAT follows /EVERY
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_REPEAT))
|
|
{
|
|
if (!CompareTokens(*(theIterator-4), CLI_TOKEN_EVERY))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_I_REPEAT_EVERY_RELATED);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
}
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_HELP))
|
|
{
|
|
rParsedInfo.GetHelpInfoObject().SetHelp(LISTSwitchesOnly, TRUE);
|
|
retCode = ParseHelp(cvTokens, theIterator, LISTVerb, rParsedInfo);
|
|
}
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_LIST_SWITCH);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
|
|
if ( retCode == PARSER_EXECCOMMAND )
|
|
{
|
|
if ( !GetNextToken(cvTokens, theIterator) )
|
|
break;
|
|
|
|
if ( !IsOption(*theIterator) )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_COMMAND);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
|
|
if ( !GetNextToken(cvTokens, theIterator) )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_LIST_SWITCH);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return retCode;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ParseSETorCREATEOrNamedParamInfo
|
|
Synopsis :This function does the parsing and interprets if command
|
|
has SET as the verb. It parses the remaining tokens
|
|
following and updates the same in CParsedInfo.
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Output parameters :
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE - enumerated data type
|
|
Global Variables :None
|
|
Calling Syntax :ParseSETorCREATEOrNamedParamInfo(cvTokens,theIterator,rParsedInfo, helpType)
|
|
Notes :None
|
|
-------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ParseSETorCREATEOrNamedParamInfo(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo,
|
|
HELPTYPE helpType)
|
|
{
|
|
RETCODE retCode = PARSER_EXECCOMMAND;
|
|
_TCHAR *pszProp,*pszVal;
|
|
|
|
try
|
|
{
|
|
// Process the SET|CREATE verb related info i.e properties with new values.
|
|
while (TRUE)
|
|
{
|
|
pszProp = NULL;
|
|
pszVal = NULL;
|
|
|
|
// Tokenize the expression checking for '='
|
|
pszProp = *theIterator;
|
|
if ( GetNextToken(cvTokens, theIterator) &&
|
|
CompareTokens(*theIterator, CLI_TOKEN_EQUALTO) &&
|
|
GetNextToken(cvTokens, theIterator))
|
|
pszVal = *theIterator;
|
|
|
|
if ((pszProp == NULL) || (pszVal == NULL))
|
|
{
|
|
if ( helpType != CALLVerb &&
|
|
IsOption(*(theIterator+1)) &&
|
|
theIterator + 2 < cvTokens.end() &&
|
|
CompareTokens(*(theIterator+2), CLI_TOKEN_HELP) )
|
|
{
|
|
theIterator++;
|
|
theIterator++;
|
|
retCode = ParseHelp(cvTokens, theIterator, helpType, rParsedInfo);
|
|
|
|
if (retCode == PARSER_DISPHELP)
|
|
{
|
|
// Adding to PropertyList only for use in displaying help of
|
|
// properties
|
|
if(!rParsedInfo.GetCmdSwitchesObject().
|
|
AddToPropertyList(pszProp))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_ADD_TO_PROP_LIST_FAILURE);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
|
|
if (m_bAliasName)
|
|
{
|
|
if (FAILED(m_CmdAlias.
|
|
ObtainAliasPropDetails(rParsedInfo)))
|
|
retCode = PARSER_ERRMSG;
|
|
}
|
|
else
|
|
{
|
|
if (!ObtainClassProperties(rParsedInfo))
|
|
retCode = PARSER_ERRMSG;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
UINT nErrID;
|
|
if ( helpType == CALLVerb )
|
|
nErrID = IDS_E_INVALID_NAMED_PARAM_LIST;
|
|
else
|
|
nErrID = IDS_E_INVALID_ASSIGNLIST;
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(nErrID);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
// Unquote the strings
|
|
UnQuoteString(pszProp);
|
|
UnQuoteString(pszVal);
|
|
|
|
// Add to the list of parameters
|
|
if(!rParsedInfo.GetCmdSwitchesObject().
|
|
AddToParameterMap(_bstr_t(pszProp), _bstr_t(pszVal)))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_ADD_TO_PARAM_MAP_FAILURE);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
|
|
// Adding to PropertyList only for use in displaying help of
|
|
// properties
|
|
if(!rParsedInfo.GetCmdSwitchesObject().
|
|
AddToPropertyList(pszProp))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_ADD_TO_PROP_LIST_FAILURE);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
|
|
// Get the next token
|
|
if (GetNextToken(cvTokens, theIterator))
|
|
{
|
|
// If option (i.e either '/' or '-') specified.
|
|
if (IsOption(*theIterator))
|
|
{
|
|
theIterator--;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
if ( helpType != CALLVerb )
|
|
{
|
|
// check for the presence of ','
|
|
if (CompareTokens(*theIterator, CLI_TOKEN_COMMA))
|
|
{
|
|
if (!GetNextToken(cvTokens, theIterator))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_ASSIGNLIST);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_ASSIGNLIST);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
retCode = PARSER_EXECCOMMAND;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
retCode = PARSER_ERROR;
|
|
_com_issue_error(e.Error());
|
|
}
|
|
return retCode;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ParseVerbSwitches
|
|
Synopsis :This function does the parsing and interprets if command
|
|
has verb switches specified. It parses the remaining
|
|
tokens following and updates the same in CParsedInfo.
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Output Parameter(s):
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE - enumerated data type
|
|
Global Variables :None
|
|
Calling Syntax :ParseVerbSwitches(cvTokens,theIterator,rParsedInfo)
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ParseVerbSwitches(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo)
|
|
{
|
|
RETCODE retCode = PARSER_EXECCOMMAND;
|
|
BOOL bInvalidVerbSwitch = FALSE;
|
|
|
|
// Check for the '/' | '-' token
|
|
if (IsOption(*theIterator))
|
|
{
|
|
// Move to next token
|
|
if (!GetNextToken(cvTokens, theIterator))
|
|
bInvalidVerbSwitch = TRUE;
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_INTERACTIVE))
|
|
{
|
|
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetInteractiveMode(INTERACTIVE);
|
|
|
|
_TCHAR *pszVerbName = rParsedInfo.GetCmdSwitchesObject().
|
|
GetVerbName();
|
|
BOOL bInstanceLevel = TRUE;
|
|
|
|
if(CompareTokens(pszVerbName, CLI_TOKEN_CALL)
|
|
|| CompareTokens(pszVerbName, CLI_TOKEN_SET)
|
|
|| CompareTokens(pszVerbName, CLI_TOKEN_DELETE))
|
|
{
|
|
if(IsClassOperation(rParsedInfo))
|
|
{
|
|
bInstanceLevel = FALSE;
|
|
}
|
|
else
|
|
{
|
|
if(CompareTokens(pszVerbName, CLI_TOKEN_CALL))
|
|
{
|
|
if ( rParsedInfo.GetCmdSwitchesObject().
|
|
GetAliasName() != NULL )
|
|
{
|
|
if (rParsedInfo.GetCmdSwitchesObject().
|
|
GetWhereExpression() == NULL)
|
|
{
|
|
bInstanceLevel = FALSE;
|
|
}
|
|
else
|
|
bInstanceLevel = TRUE;
|
|
}
|
|
else
|
|
{
|
|
if ((rParsedInfo.GetCmdSwitchesObject().
|
|
GetPathExpression() != NULL)
|
|
&& (rParsedInfo.GetCmdSwitchesObject().
|
|
GetWhereExpression() == NULL))
|
|
{
|
|
bInstanceLevel = FALSE;
|
|
}
|
|
else
|
|
bInstanceLevel = TRUE;
|
|
}
|
|
}
|
|
else
|
|
bInstanceLevel = TRUE;
|
|
}
|
|
}
|
|
else
|
|
retCode = PARSER_EXECCOMMAND;
|
|
|
|
if(bInstanceLevel)
|
|
{
|
|
retCode = ParseVerbInteractive( cvTokens, theIterator,
|
|
rParsedInfo, bInvalidVerbSwitch);
|
|
}
|
|
else
|
|
retCode = PARSER_EXECCOMMAND;
|
|
}
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_NONINTERACT))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetInteractiveMode(NOINTERACTIVE);
|
|
retCode = PARSER_EXECCOMMAND;
|
|
}
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_HELP))
|
|
{
|
|
retCode = ParseHelp(cvTokens, theIterator, VERBSWITCHES,
|
|
rParsedInfo);
|
|
}
|
|
else
|
|
bInvalidVerbSwitch = TRUE;
|
|
|
|
if ( GetNextToken(cvTokens, theIterator ) )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_COMMAND);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
|
|
}
|
|
else
|
|
bInvalidVerbSwitch = TRUE;
|
|
|
|
if ( bInvalidVerbSwitch == TRUE )
|
|
{
|
|
// no valid <verb switch> type is specified.
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_VERB_SWITCH);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
|
|
return retCode;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :GetNextToken
|
|
Synopsis :This function retrieves the next token from the token
|
|
vector list, returns FALSE if no more tokens are present
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
Output Parameter(s):None
|
|
Return Type :BOOL
|
|
Global Variables :None
|
|
Calling Syntax :GetNextToken(cvTokens,theIterator)
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
BOOL CParserEngine::GetNextToken(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator)
|
|
{
|
|
theIterator++;
|
|
return (theIterator >= cvTokens.end()) ? FALSE : TRUE;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ParsePWhereExpr
|
|
Synopsis :This function does the parsing and interprets if command
|
|
has Path and Where expression It parses the remaining
|
|
tokens following and updates the same in CParsedInfo.
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Output Parameter(s):
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :BOOL
|
|
Global Variables :None
|
|
Calling Syntax :ParsePWhereExpr(cvTokens,theIterator,rParsedInfo)
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
BOOL CParserEngine::ParsePWhereExpr(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo,
|
|
BOOL bIsParan)
|
|
{
|
|
BOOL bRet = TRUE, bContinue = FALSE;
|
|
|
|
try
|
|
{
|
|
while (TRUE)
|
|
{
|
|
if ( bIsParan == TRUE &&
|
|
CompareTokens(*theIterator, CLI_TOKEN_RIGHT_PARAN) )
|
|
break;
|
|
|
|
if ( bIsParan == FALSE &&
|
|
IsStdVerbOrUserDefVerb(*theIterator, rParsedInfo) )
|
|
break;
|
|
|
|
if ( bIsParan == FALSE ||
|
|
!CompareTokens(*theIterator, CLI_TOKEN_LEFT_PARAN))
|
|
{
|
|
if(!rParsedInfo.GetCmdSwitchesObject().
|
|
AddToPWhereParamsList(*theIterator))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_ADD_TO_PARAMS_LIST_FAILURE);
|
|
bRet = FALSE;
|
|
break;
|
|
}
|
|
bContinue = TRUE;
|
|
}
|
|
|
|
if (!GetNextToken(cvTokens, theIterator))
|
|
break;
|
|
|
|
if ( IsOption(*theIterator) )
|
|
{
|
|
bContinue = FALSE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(bRet != FALSE && bContinue == TRUE)
|
|
{
|
|
|
|
CHARVECTOR theParam = rParsedInfo.GetCmdSwitchesObject().
|
|
GetPWhereParamsList();
|
|
CHARVECTOR::iterator theItr = theParam.begin();
|
|
_TCHAR pszPWhere[MAX_BUFFER] = NULL_STRING;
|
|
lstrcpy(pszPWhere, CLI_TOKEN_NULL);
|
|
_TCHAR* pszToken = NULL;;
|
|
CHString sTemp;
|
|
|
|
if ((rParsedInfo.GetCmdSwitchesObject().GetPWhereExpr() != NULL))
|
|
{
|
|
sTemp.Format(rParsedInfo.GetCmdSwitchesObject().
|
|
GetPWhereExpr());
|
|
sTemp.TrimLeft();
|
|
if(!sTemp.IsEmpty())
|
|
{
|
|
|
|
_bstr_t bstrPWhere = _bstr_t(rParsedInfo.
|
|
GetCmdSwitchesObject().
|
|
GetPWhereExpr());
|
|
pszToken = _tcstok((WCHAR*)bstrPWhere,
|
|
CLI_TOKEN_HASH);
|
|
lstrcpy(pszPWhere, CLI_TOKEN_NULL);
|
|
|
|
while (pszToken != NULL)
|
|
{
|
|
lstrcat(pszPWhere, pszToken);
|
|
if (theItr != theParam.end())
|
|
{
|
|
lstrcat(pszPWhere, *theItr);
|
|
theItr++;
|
|
}
|
|
pszToken = _tcstok(NULL, CLI_TOKEN_HASH);
|
|
}
|
|
|
|
if(bRet != FALSE)
|
|
{
|
|
// Set the classpath and where expression
|
|
pszToken = NULL;
|
|
pszToken = _tcstok(pszPWhere, CLI_TOKEN_SPACE);
|
|
if (pszToken != NULL)
|
|
{
|
|
if (CompareTokens(CLI_TOKEN_FROM, pszToken))
|
|
{
|
|
pszToken = _tcstok(NULL, CLI_TOKEN_SPACE);
|
|
if (pszToken != NULL)
|
|
{
|
|
if(!rParsedInfo.GetCmdSwitchesObject().
|
|
SetClassPath(pszToken))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(OUT_OF_MEMORY);
|
|
bRet = FALSE;
|
|
}
|
|
|
|
}
|
|
if(bRet != FALSE)
|
|
pszToken = _tcstok(NULL, CLI_TOKEN_SPACE);
|
|
}
|
|
|
|
if (CompareTokens(CLI_TOKEN_WHERE, pszToken))
|
|
{
|
|
pszToken = _tcstok(NULL, CLI_TOKEN_NULL);
|
|
if (pszToken != NULL)
|
|
{
|
|
if(!rParsedInfo.GetCmdSwitchesObject().
|
|
SetWhereExpression(pszToken))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(OUT_OF_MEMORY);
|
|
bRet = FALSE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_PWHERE_UNDEF);
|
|
bRet = FALSE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_PWHERE_UNDEF);
|
|
bRet = FALSE;
|
|
}
|
|
}
|
|
if (!bContinue && bIsParan)
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_PWHERE_EXPR);
|
|
bRet = FALSE;
|
|
}
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
bRet = FALSE;
|
|
_com_issue_error(e.Error());
|
|
}
|
|
catch(CHeap_Exception)
|
|
{
|
|
bRet = FALSE;
|
|
_com_issue_error(WBEM_E_OUT_OF_MEMORY);
|
|
}
|
|
return bRet;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ExtractClassNameandWhereExpr
|
|
Synopsis :This function takes the input as a path expression and
|
|
extracts the Class and Where expression part from the
|
|
path expression.
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
pszPathExpr - the path expression
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Output Parameter(s):
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :BOOL
|
|
Global Variables :None
|
|
Calling Syntax :ParsePWhereExpr(cvTokens,theIterator)
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
BOOL CParserEngine::ExtractClassNameandWhereExpr(_TCHAR* pszPathExpr,
|
|
CParsedInfo& rParsedInfo)
|
|
{
|
|
// Frame the class name and where expression based on the object path
|
|
BOOL bRet = TRUE;
|
|
_TCHAR* pszToken = NULL;
|
|
BOOL bFirst = TRUE;
|
|
_TCHAR pszWhere[MAX_BUFFER] = NULL_STRING;
|
|
lstrcpy(pszWhere, CLI_TOKEN_NULL);
|
|
|
|
if (pszPathExpr == NULL)
|
|
bRet = FALSE;
|
|
|
|
try
|
|
{
|
|
if ( bRet == TRUE )
|
|
{
|
|
lstrcpy(pszWhere, CLI_TOKEN_NULL);
|
|
pszToken = _tcstok(pszPathExpr, CLI_TOKEN_DOT);
|
|
if (pszToken != NULL)
|
|
{
|
|
if(!rParsedInfo.GetCmdSwitchesObject().SetClassPath(pszToken))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(OUT_OF_MEMORY);
|
|
bRet = FALSE;
|
|
}
|
|
}
|
|
|
|
if(bRet != FALSE)
|
|
{
|
|
while (pszToken != NULL)
|
|
{
|
|
pszToken = _tcstok(NULL, CLI_TOKEN_COMMA);
|
|
if (pszToken != NULL)
|
|
{
|
|
if (!bFirst)
|
|
lstrcat(pszWhere, CLI_TOKEN_AND);
|
|
lstrcat(pszWhere, pszToken);
|
|
bFirst = FALSE;
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
if (lstrlen(pszWhere))
|
|
{
|
|
if(!rParsedInfo.GetCmdSwitchesObject().SetWhereExpression(pszWhere))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(OUT_OF_MEMORY);
|
|
bRet = FALSE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch(...)
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_PATH);
|
|
bRet = FALSE;
|
|
}
|
|
return bRet;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :GetNextToken
|
|
Synopsis :This function retrieves the next token from the token
|
|
vector list, returns enumerated return code depending
|
|
upon the context.
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
helpType - enumerated help type
|
|
uErrataCode - error string ID.
|
|
Output Parameter(s):
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE - enumerated data type.
|
|
Global Variables :None
|
|
Calling Syntax :GetNextToken(cvTokens, theIterator,
|
|
rParsedInfo, helpType, uErrataCode)
|
|
Notes :overloaded function
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::GetNextToken(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo,
|
|
HELPTYPE helpType,
|
|
UINT uErrataCode)
|
|
{
|
|
RETCODE retCode = PARSER_CONTINUE;
|
|
|
|
// Move to next token
|
|
theIterator++;
|
|
|
|
// If no more tokens are present
|
|
if (theIterator >= cvTokens.end())
|
|
{
|
|
// If interactive mode is set
|
|
if (rParsedInfo.GetGlblSwitchesObject().GetInteractiveStatus())
|
|
{
|
|
rParsedInfo.GetGlblSwitchesObject().SetHelpFlag(TRUE);
|
|
rParsedInfo.GetHelpInfoObject().SetHelp(helpType, TRUE);
|
|
retCode = PARSER_DISPHELP;
|
|
}
|
|
else
|
|
{
|
|
// PARSER_ERROR if no more tokens are present.
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(uErrataCode);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
}
|
|
return retCode;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :GetNextToken
|
|
Synopsis :This function retrieves the next token from the token
|
|
vector list, returns enumerated return code depending
|
|
upon the context.
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
uErrataCode - error string ID.
|
|
Output Parameter(s):
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE - enumerated data type.
|
|
Global Variables :None
|
|
Calling Syntax :GetNextToken(cvTokens, theIterator,
|
|
rParsedInfo, uErrataCode)
|
|
Notes :overloaded function
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::GetNextToken(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo,
|
|
UINT uErrataCode)
|
|
{
|
|
RETCODE retCode = PARSER_CONTINUE;
|
|
|
|
// Move to next token
|
|
theIterator++;
|
|
|
|
// If no more tokens are present
|
|
if (theIterator >= cvTokens.end())
|
|
{
|
|
// PARSER_ERROR if no more tokens are present
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(uErrataCode);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
return retCode;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :IsHelp
|
|
Synopsis :This function retrieves the next token from the token
|
|
vector list, checks if it is '?' and returns enumerated
|
|
return code depending upon the context.
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
helpType - enumerated help type
|
|
uErrataCode - error string ID.
|
|
tokenLevel - token level
|
|
Output Parameter(s):
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE - enumerated data type.
|
|
Global Variables :None
|
|
Calling Syntax :IsHelp(cvTokens, theIterator, rParsedInfo,
|
|
helpType, uErrataCode, tokenLevel)
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::IsHelp(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo,
|
|
HELPTYPE helpType,
|
|
UINT uErrataCode,
|
|
TOKENLEVEL tokenLevel)
|
|
{
|
|
BOOL bContinue = TRUE;
|
|
RETCODE retCode = PARSER_CONTINUE;
|
|
// Move to next token
|
|
if (!GetNextToken(cvTokens, theIterator))
|
|
{
|
|
// Set the retCode as PARSER_ERROR if no more tokens are present.
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(uErrataCode);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
else
|
|
{
|
|
// Is '?'
|
|
if (CompareTokens(*theIterator, CLI_TOKEN_HELP))
|
|
retCode = ParseHelp(cvTokens, theIterator, helpType, rParsedInfo);
|
|
else
|
|
{
|
|
// If LEVEL_ONE token then only allowed is /?, other
|
|
// switches are invalid.
|
|
if (tokenLevel == LEVEL_ONE)
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(uErrataCode);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
else
|
|
retCode = PARSER_CONTINUE;
|
|
}
|
|
}
|
|
return retCode;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ParseHelp
|
|
Synopsis :This function takes care of identifying the appropriate
|
|
help informtion to be displayed using the HELPTYPE
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
bGlobalHelp - global help flag
|
|
Output Parameter(s):
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE
|
|
Global Variables :None
|
|
Calling Syntax :ParseHelp(cvTokens, theIterator, rParsedInfo)
|
|
Notes :overloaded fucntion
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ParseHelp(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo,
|
|
BOOL bGlobalHelp)
|
|
{
|
|
BOOL bContinue = TRUE;
|
|
RETCODE retCode = PARSER_CONTINUE;
|
|
|
|
// Move to next token (if no more tokens are present)
|
|
if (!GetNextToken(cvTokens, theIterator))
|
|
{
|
|
retCode = PARSER_DISPHELP;
|
|
rParsedInfo.GetGlblSwitchesObject().SetHelpFlag(TRUE);
|
|
// Check for "/?"
|
|
if (((theIterator - 2) == cvTokens.begin()) || bGlobalHelp)
|
|
{
|
|
rParsedInfo.GetHelpInfoObject().SetHelp(GlblAllInfo, TRUE);
|
|
if(SUCCEEDED(m_CmdAlias.ConnectToAlias(rParsedInfo,m_pIWbemLocator)))
|
|
{
|
|
if(FAILED(m_CmdAlias.ObtainAliasFriendlyNames(rParsedInfo)))
|
|
retCode = PARSER_ERRMSG;
|
|
}
|
|
else
|
|
rParsedInfo.GetCmdSwitchesObject().FreeCOMError();
|
|
|
|
}
|
|
}
|
|
// Check for the presence of the ':"
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_COLON))
|
|
{
|
|
// Move to next token
|
|
if (!GetNextToken(cvTokens, theIterator, rParsedInfo,
|
|
IDS_E_INVALID_HELP_OPTION))
|
|
// Set the retCode to PARSER_ERROR if no more tokens are specified.
|
|
{
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
else
|
|
{
|
|
if (CompareTokens(*theIterator, CLI_TOKEN_BRIEF))
|
|
rParsedInfo.GetGlblSwitchesObject().SetHelpOption(HELPBRIEF);
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_FULL))
|
|
rParsedInfo.GetGlblSwitchesObject().SetHelpOption(HELPFULL);
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_HELP_OPTION);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
|
|
if ( retCode != PARSER_ERROR )
|
|
{
|
|
if ( GetNextToken(cvTokens, theIterator) )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_COMMAND);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
else
|
|
{
|
|
retCode = PARSER_DISPHELP;
|
|
rParsedInfo.GetGlblSwitchesObject().SetHelpFlag(TRUE);
|
|
// Check for "/?:(BRIEF|FULL)
|
|
if (((theIterator - 3) == cvTokens.begin()) || bGlobalHelp)
|
|
{
|
|
rParsedInfo.GetHelpInfoObject().
|
|
SetHelp(GlblAllInfo, TRUE);
|
|
if(SUCCEEDED(m_CmdAlias.ConnectToAlias
|
|
(rParsedInfo,m_pIWbemLocator)))
|
|
{
|
|
if(FAILED(m_CmdAlias.ObtainAliasFriendlyNames
|
|
(rParsedInfo)))
|
|
{
|
|
retCode = PARSER_ERRMSG;
|
|
}
|
|
}
|
|
else
|
|
rParsedInfo.GetCmdSwitchesObject().FreeCOMError();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_COMMAND);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
return retCode;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ParseHelp
|
|
Synopsis :This function takes care of identifying the appropriate
|
|
help informtion to be displayed using the HELPTYPE
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
htHelp - help type
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
bGlobalHelp - global help flag
|
|
Output Parameter(s):
|
|
rParsedInfo - ref. to CParsedInfo object
|
|
Return Type :RETCODE
|
|
Global Variables :None
|
|
Calling Syntax :ParseHelp(cvTokens, theIterator, htHelp,
|
|
rParsedInfo)
|
|
Notes :overloaded fucntion
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ParseHelp(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
HELPTYPE htHelp,
|
|
CParsedInfo& rParsedInfo,
|
|
BOOL bGlobalHelp)
|
|
{
|
|
rParsedInfo.GetHelpInfoObject().SetHelp(htHelp, TRUE);
|
|
return ParseHelp(cvTokens, theIterator, rParsedInfo, bGlobalHelp);
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ObtainClassProperties
|
|
Synopsis :This function obtains the information about the
|
|
available properties for a given WMI class
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Output Parameter(s):
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :BOOL
|
|
Global Variables :None
|
|
Calling Syntax :ObtainClassProperties(rParsedInfo)
|
|
Notes :If bCheckWritePropsAvail == TRUE then functions checks for
|
|
availibilty of properties.
|
|
----------------------------------------------------------------------------*/
|
|
BOOL CParserEngine::ObtainClassProperties(CParsedInfo& rParsedInfo,
|
|
BOOL bCheckWritePropsAvail)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
IWbemClassObject* pIObject = NULL;
|
|
SAFEARRAY* psaNames = NULL;
|
|
BSTR bstrPropName = NULL;
|
|
BOOL bRet = TRUE;
|
|
BOOL bTrace = FALSE;
|
|
CHString chsMsg;
|
|
ERRLOGOPT eloErrLogOpt = NO_LOGGING;
|
|
DWORD dwThreadId = GetCurrentThreadId();
|
|
BOOL bSetVerb = FALSE;
|
|
BOOL bPropsAvail = FALSE;
|
|
|
|
if (rParsedInfo.GetCmdSwitchesObject().GetVerbName() != NULL)
|
|
{
|
|
if (CompareTokens(rParsedInfo.GetCmdSwitchesObject().GetVerbName(),
|
|
CLI_TOKEN_SET))
|
|
{
|
|
bSetVerb = TRUE;
|
|
}
|
|
}
|
|
|
|
// Obtain the trace flag status
|
|
bTrace = rParsedInfo.GetGlblSwitchesObject().GetTraceStatus();
|
|
|
|
eloErrLogOpt = rParsedInfo.GetErrorLogObject().GetErrLogOption();
|
|
|
|
if (SUCCEEDED(ConnectToNamespace(rParsedInfo)))
|
|
{
|
|
|
|
CHARVECTOR cvPropList;
|
|
BOOL bPropList = FALSE;
|
|
|
|
try
|
|
{
|
|
cvPropList = rParsedInfo.GetCmdSwitchesObject().GetPropertyList();
|
|
if ( cvPropList.size() != 0 )
|
|
bPropList = TRUE;
|
|
|
|
hr = m_pITargetNS->GetObject(_bstr_t(rParsedInfo.
|
|
GetCmdSwitchesObject().GetClassPath()),
|
|
WBEM_FLAG_USE_AMENDED_QUALIFIERS,
|
|
NULL, &pIObject, NULL);
|
|
if (bTrace || eloErrLogOpt)
|
|
{
|
|
chsMsg.Format(L"IWbemServices::GetObject(L\"%s\", "
|
|
L"WBEM_FLAG_USE_AMENDED_QUALIFIERS, 0, NULL, -, -)",
|
|
(rParsedInfo.GetCmdSwitchesObject().GetClassPath())?
|
|
rParsedInfo.GetCmdSwitchesObject().GetClassPath():L"<NULL>");
|
|
WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId,
|
|
rParsedInfo, bTrace);
|
|
}
|
|
ONFAILTHROWERROR(hr);
|
|
|
|
hr = pIObject->GetNames(NULL, WBEM_FLAG_ALWAYS |
|
|
WBEM_FLAG_NONSYSTEM_ONLY, NULL, &psaNames);
|
|
if (bTrace || eloErrLogOpt)
|
|
{
|
|
chsMsg.Format(L"IWbemClassObject::GetNames(NULL, "
|
|
L"WBEM_FLAG_ALWAYS | WBEM_FLAG_NONSYSTEM_ONLY, "
|
|
L"NULL, -)");
|
|
WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId,
|
|
rParsedInfo, bTrace);
|
|
}
|
|
ONFAILTHROWERROR(hr);
|
|
|
|
// Get the number of properties.
|
|
LONG lLower = 0, lUpper = 0;
|
|
hr = SafeArrayGetLBound(psaNames, 1, &lLower);
|
|
if ( eloErrLogOpt )
|
|
{
|
|
chsMsg.Format(L"SafeArrayGetLBound(-, -, -)");
|
|
WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId,
|
|
rParsedInfo, FALSE);
|
|
}
|
|
ONFAILTHROWERROR(hr);
|
|
|
|
hr = SafeArrayGetUBound(psaNames, 1, &lUpper);
|
|
if ( eloErrLogOpt )
|
|
{
|
|
chsMsg.Format(L"SafeArrayGetUBound(-, -, -)");
|
|
WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId,
|
|
rParsedInfo, FALSE);
|
|
}
|
|
ONFAILTHROWERROR(hr);
|
|
|
|
|
|
// For each property obtain the information of our interest
|
|
for (LONG lVar = lLower; lVar <= lUpper; lVar++)
|
|
{
|
|
// Get the property.
|
|
hr = SafeArrayGetElement(psaNames, &lVar, &bstrPropName);
|
|
if ( eloErrLogOpt )
|
|
{
|
|
chsMsg.Format(L"SafeArrayGetElement(-, -, -)");
|
|
WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
|
|
dwThreadId, rParsedInfo, FALSE);
|
|
}
|
|
ONFAILTHROWERROR(hr);
|
|
|
|
CHARVECTOR::iterator tempIterator;
|
|
if ( bPropList == TRUE && !Find(cvPropList,
|
|
_bstr_t(bstrPropName),
|
|
tempIterator))
|
|
{
|
|
SAFEBSTRFREE(bstrPropName);
|
|
continue;
|
|
}
|
|
|
|
PROPERTYDETAILS pdPropDet;
|
|
hr = GetPropertyAttributes(pIObject, bstrPropName,
|
|
pdPropDet,
|
|
rParsedInfo.GetGlblSwitchesObject().GetTraceStatus());
|
|
ONFAILTHROWERROR(hr);
|
|
|
|
if (bSetVerb == TRUE || bCheckWritePropsAvail == TRUE)
|
|
{
|
|
if ( !_tcsstr((_TCHAR*)pdPropDet.Operation, CLI_TOKEN_WRITE) )
|
|
{
|
|
SAFEBSTRFREE(bstrPropName);
|
|
continue;
|
|
}
|
|
}
|
|
|
|
if ( bCheckWritePropsAvail == TRUE )
|
|
{
|
|
bPropsAvail = TRUE;
|
|
SAFEBSTRFREE(bstrPropName);
|
|
break;
|
|
}
|
|
|
|
pdPropDet.Derivation = bstrPropName;
|
|
if(!rParsedInfo.GetCmdSwitchesObject().AddToPropDetMap(
|
|
bstrPropName, pdPropDet))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_ADD_TO_PROP_DET_MAP_FAILURE);
|
|
bRet = FALSE;
|
|
}
|
|
SAFEBSTRFREE(bstrPropName);
|
|
}
|
|
SAFEIRELEASE(pIObject);
|
|
SAFEADESTROY(psaNames);
|
|
SAFEBSTRFREE(bstrPropName);
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
bRet = FALSE;
|
|
SAFEIRELEASE(pIObject);
|
|
SAFEADESTROY(psaNames);
|
|
SAFEBSTRFREE(bstrPropName);
|
|
_com_issue_error(e.Error());
|
|
}
|
|
catch(CHeap_Exception)
|
|
{
|
|
bRet = FALSE;
|
|
SAFEIRELEASE(pIObject);
|
|
SAFEADESTROY(psaNames);
|
|
SAFEBSTRFREE(bstrPropName);
|
|
_com_issue_error(WBEM_E_OUT_OF_MEMORY);
|
|
}
|
|
}
|
|
else
|
|
bRet = FALSE;
|
|
|
|
if ( bCheckWritePropsAvail == TRUE )
|
|
bRet = bPropsAvail;
|
|
|
|
return bRet;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ObtainClassMethods
|
|
Synopsis :This function obtains the information about the
|
|
available methods for a given WMI class
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
rParsedInfo - ref. to CParsedInfo object
|
|
Output Parameter(s):
|
|
rParsedInfo - ref. to CParsedInfo object
|
|
Return Type :BOOL
|
|
Global Variables :None
|
|
Calling Syntax :ObtainClassMethods(rParsedInfo)
|
|
Notes :none
|
|
----------------------------------------------------------------------------*/
|
|
BOOL CParserEngine::ObtainClassMethods(CParsedInfo& rParsedInfo,
|
|
BOOL bCheckForExists)
|
|
{
|
|
BOOL bRet = TRUE;
|
|
BOOL bTrace = FALSE;
|
|
CHString chsMsg;
|
|
ERRLOGOPT eloErrLogOpt = NO_LOGGING;
|
|
DWORD dwThreadId = GetCurrentThreadId();
|
|
BOOL bMethAvail = FALSE;
|
|
_TCHAR* pMethodName = NULL;
|
|
|
|
bTrace = rParsedInfo.GetGlblSwitchesObject().GetTraceStatus();
|
|
eloErrLogOpt = rParsedInfo.GetErrorLogObject().GetErrLogOption();
|
|
|
|
if (SUCCEEDED(ConnectToNamespace(rParsedInfo)))
|
|
{
|
|
HRESULT hr = S_OK;
|
|
IWbemClassObject *pIObject = NULL,*pIInSign = NULL,*pIOutSign = NULL;
|
|
BSTR bstrMethodName = NULL;
|
|
|
|
try
|
|
{
|
|
hr = m_pITargetNS->GetObject(_bstr_t(rParsedInfo.
|
|
GetCmdSwitchesObject().GetClassPath()),
|
|
WBEM_FLAG_USE_AMENDED_QUALIFIERS,
|
|
NULL, &pIObject, NULL);
|
|
|
|
if ( eloErrLogOpt )
|
|
{
|
|
chsMsg.Format(L"IWbemServices::GetObject(L\"%s\", "
|
|
L"WBEM_FLAG_USE_AMENDED_QUALIFIERS, 0, NULL, -, -)",
|
|
rParsedInfo.GetCmdSwitchesObject().GetClassPath());
|
|
WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId,
|
|
rParsedInfo, FALSE);
|
|
}
|
|
ONFAILTHROWERROR(hr);
|
|
|
|
// Begin an enumeration of the methods available for the object.
|
|
hr = pIObject->BeginMethodEnumeration(0);
|
|
if ( eloErrLogOpt )
|
|
{
|
|
WMITRACEORERRORLOG(hr, __LINE__, __FILE__,
|
|
_T("BeginMethodEnumeration(0)"),
|
|
dwThreadId, rParsedInfo, FALSE);
|
|
}
|
|
ONFAILTHROWERROR(hr);
|
|
|
|
|
|
//To get info about only method if method is specified
|
|
pMethodName = rParsedInfo.GetCmdSwitchesObject().
|
|
GetMethodName();
|
|
// Retrieve the next method in the method enumeration
|
|
// sequence
|
|
while ((pIObject->NextMethod(0, &bstrMethodName, &pIInSign,
|
|
&pIOutSign)) != WBEM_S_NO_MORE_DATA)
|
|
{
|
|
if ( bCheckForExists == TRUE )
|
|
{
|
|
bMethAvail = TRUE;
|
|
SAFEBSTRFREE(bstrMethodName);
|
|
SAFEIRELEASE(pIInSign);
|
|
SAFEIRELEASE(pIOutSign);
|
|
break;
|
|
}
|
|
|
|
if(pMethodName != NULL &&
|
|
!CompareTokens(pMethodName, (_TCHAR*)bstrMethodName))
|
|
{
|
|
SAFEBSTRFREE(bstrMethodName);
|
|
SAFEIRELEASE(pIInSign);
|
|
SAFEIRELEASE(pIOutSign);
|
|
continue;
|
|
}
|
|
METHODDETAILS mdMethDet;
|
|
if (pIInSign)
|
|
hr = ObtainMethodParamInfo(pIInSign, mdMethDet, INP,
|
|
rParsedInfo.GetGlblSwitchesObject().GetTraceStatus(),
|
|
rParsedInfo);
|
|
ONFAILTHROWERROR(hr);
|
|
|
|
if (pIOutSign)
|
|
hr = ObtainMethodParamInfo(pIOutSign, mdMethDet, OUTP,
|
|
rParsedInfo.GetGlblSwitchesObject().GetTraceStatus(),
|
|
rParsedInfo);
|
|
ONFAILTHROWERROR(hr);
|
|
|
|
_bstr_t bstrStatus, bstrDesc;
|
|
hr = GetMethodStatusAndDesc(pIObject,
|
|
bstrMethodName, bstrStatus, bstrDesc,
|
|
rParsedInfo.GetGlblSwitchesObject().GetTraceStatus());
|
|
mdMethDet.Status = _bstr_t(bstrStatus);
|
|
mdMethDet.Description = _bstr_t(bstrDesc);
|
|
ONFAILTHROWERROR(hr);
|
|
|
|
|
|
if(!rParsedInfo.GetCmdSwitchesObject().AddToMethDetMap(
|
|
_bstr_t(bstrMethodName),mdMethDet))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_ADD_TO_METH_DET_MAP_FAILURE);
|
|
SAFEBSTRFREE(bstrMethodName);
|
|
SAFEIRELEASE(pIInSign);
|
|
SAFEIRELEASE(pIOutSign);
|
|
bRet = FALSE;
|
|
break;
|
|
}
|
|
|
|
SAFEBSTRFREE(bstrMethodName);
|
|
SAFEIRELEASE(pIInSign);
|
|
SAFEIRELEASE(pIOutSign);
|
|
}
|
|
SAFEIRELEASE(pIObject);
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
SAFEBSTRFREE(bstrMethodName);
|
|
SAFEIRELEASE(pIInSign);
|
|
SAFEIRELEASE(pIOutSign);
|
|
SAFEIRELEASE(pIObject);
|
|
_com_issue_error(e.Error());
|
|
bRet = FALSE;
|
|
}
|
|
catch(CHeap_Exception)
|
|
{
|
|
bRet = FALSE;
|
|
SAFEBSTRFREE(bstrMethodName);
|
|
SAFEIRELEASE(pIInSign);
|
|
SAFEIRELEASE(pIOutSign);
|
|
SAFEIRELEASE(pIObject);
|
|
_com_issue_error(WBEM_E_OUT_OF_MEMORY);
|
|
}
|
|
}
|
|
else
|
|
bRet = FALSE;
|
|
|
|
if ( bCheckForExists == TRUE )
|
|
bRet = bMethAvail;
|
|
|
|
return bRet;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ConnectToNamespace
|
|
Synopsis :This function connects to the WMI namespace on the
|
|
target machine using the supplied user credentials.
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Output Parameter(s):
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :HRESULT
|
|
Global Variables :None
|
|
Calling Syntax :ConnectToNamespace(rParsedInfo)
|
|
Notes :none
|
|
----------------------------------------------------------------------------*/
|
|
HRESULT CParserEngine::ConnectToNamespace(CParsedInfo& rParsedInfo)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
DWORD dwThreadId = GetCurrentThreadId();
|
|
if (rParsedInfo.GetGlblSwitchesObject().GetNameSpaceFlag())
|
|
{
|
|
BOOL bTrace = FALSE;
|
|
CHString chsMsg;
|
|
ERRLOGOPT eloErrLogOpt = NO_LOGGING;
|
|
|
|
// Obtain the trace status
|
|
bTrace = rParsedInfo.GetGlblSwitchesObject().GetTraceStatus();
|
|
eloErrLogOpt = rParsedInfo.GetErrorLogObject().GetErrLogOption();
|
|
|
|
SAFEIRELEASE(m_pITargetNS);
|
|
try
|
|
{
|
|
// Connect to the WMI namespace on the target machine
|
|
// using the supplied user credentials.
|
|
hr = Connect(m_pIWbemLocator, &m_pITargetNS,
|
|
_bstr_t(rParsedInfo.GetNamespace()),
|
|
NULL,
|
|
NULL,
|
|
_bstr_t(rParsedInfo.GetLocale()),
|
|
rParsedInfo);
|
|
|
|
if (bTrace || eloErrLogOpt)
|
|
{
|
|
chsMsg.Format(L"IWbemLocator::ConnectServer(L\"%s\", NULL, "
|
|
L"NULL, L\"%s\", 0L, NULL, NULL, -)",
|
|
rParsedInfo.GetNamespace(),
|
|
rParsedInfo.GetLocale());
|
|
WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId,
|
|
rParsedInfo, bTrace);
|
|
}
|
|
ONFAILTHROWERROR(hr);
|
|
|
|
// set the security privileges at the interface level
|
|
hr = SetSecurity(m_pITargetNS, NULL, NULL, NULL, NULL,
|
|
rParsedInfo.GetGlblSwitchesObject().
|
|
GetAuthenticationLevel(),
|
|
rParsedInfo.GetGlblSwitchesObject().
|
|
GetImpersonationLevel());
|
|
if (bTrace || eloErrLogOpt)
|
|
{
|
|
chsMsg.Format(L"CoSetProxyBlanket(-, RPC_C_AUTHN_WINNT, "
|
|
L"RPC_C_AUTHZ_NONE, NULL, %d, %d, -, EOAC_NONE)",
|
|
rParsedInfo.GetGlblSwitchesObject().
|
|
GetAuthenticationLevel(),
|
|
rParsedInfo.GetGlblSwitchesObject().
|
|
GetImpersonationLevel());
|
|
WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId,
|
|
rParsedInfo, bTrace);
|
|
}
|
|
ONFAILTHROWERROR(hr);
|
|
|
|
rParsedInfo.GetGlblSwitchesObject().SetNameSpaceFlag(FALSE);
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
// execption handling
|
|
_com_issue_error(e.Error());
|
|
}
|
|
catch(CHeap_Exception)
|
|
{
|
|
_com_issue_error(WBEM_E_OUT_OF_MEMORY);
|
|
}
|
|
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ObtainMethodParamInfo
|
|
Synopsis :This function obtains the information about the method
|
|
arguments (both input and output arguments)
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
pIObj - pointer to IWbemClassObject object
|
|
bTrace - trace flag
|
|
ioInOrOut - INOROUT type specifies in or out parameter type.
|
|
Output Parameter(s):
|
|
mdMethDet - method details structure
|
|
Return Type :HRESULT
|
|
Global Variables :None
|
|
Calling Syntax :ObtainMethodParamInfo(pIObj, mdMethDet, IN, bTrace, rParsedInfo)
|
|
Notes :none
|
|
----------------------------------------------------------------------------*/
|
|
HRESULT CParserEngine::ObtainMethodParamInfo(IWbemClassObject* pIObj,
|
|
METHODDETAILS& mdMethDet,
|
|
INOROUT ioInOrOut,
|
|
BOOL bTrace, CParsedInfo& rParsedInfo)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
SAFEARRAY* psaNames = NULL;
|
|
BSTR bstrPropName = NULL;
|
|
CHString chsMsg;
|
|
_TCHAR szNumber[BUFFER512] = NULL_STRING;
|
|
ERRLOGOPT eloErrLogOpt = NO_LOGGING;
|
|
DWORD dwThreadId = GetCurrentThreadId();
|
|
|
|
// Get the property names
|
|
try
|
|
{
|
|
if ( pIObj != NULL )
|
|
{
|
|
hr = pIObj->GetNames(NULL,
|
|
WBEM_FLAG_ALWAYS | WBEM_FLAG_NONSYSTEM_ONLY,
|
|
NULL, &psaNames);
|
|
if (bTrace || eloErrLogOpt)
|
|
{
|
|
chsMsg.Format(L"IWbemClassObject::GetNames(NULL, "
|
|
L"WBEM_FLAG_ALWAYS | WBEM_FLAG_NONSYSTEM_ONLY, "
|
|
L"NULL, -)");
|
|
WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId,
|
|
rParsedInfo, bTrace);
|
|
}
|
|
ONFAILTHROWERROR(hr);
|
|
|
|
// Get the number of properties.
|
|
LONG lLower = 0, lUpper = 0;
|
|
hr = SafeArrayGetLBound(psaNames, 1, &lLower);
|
|
if ( eloErrLogOpt )
|
|
{
|
|
chsMsg.Format(L"SafeArrayGetLBound(-, -, -)");
|
|
WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId,
|
|
rParsedInfo, FALSE);
|
|
}
|
|
ONFAILTHROWERROR(hr);
|
|
|
|
hr = SafeArrayGetUBound(psaNames, 1, &lUpper);
|
|
if ( eloErrLogOpt )
|
|
{
|
|
chsMsg.Format(L"SafeArrayGetUBound(-, -, -)");
|
|
WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId,
|
|
rParsedInfo, FALSE);
|
|
}
|
|
ONFAILTHROWERROR(hr);
|
|
|
|
// For each property obtian the information of our interest
|
|
for (LONG lVar = lLower; lVar <= lUpper; lVar++)
|
|
{
|
|
// Get the property.
|
|
hr = SafeArrayGetElement(psaNames, &lVar, &bstrPropName);
|
|
if ( eloErrLogOpt )
|
|
{
|
|
chsMsg.Format(L"SafeArrayGetElement(-, -, -)");
|
|
WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
|
|
dwThreadId, rParsedInfo, FALSE);
|
|
}
|
|
ONFAILTHROWERROR(hr);
|
|
|
|
PROPERTYDETAILS pdPropDet;
|
|
hr = GetPropertyAttributes(pIObj,
|
|
bstrPropName, pdPropDet, bTrace);
|
|
ONFAILTHROWERROR(hr);
|
|
|
|
// 'ReturnValue' is not a property of our interest as per
|
|
// the expected output given in the sample, hence omitting
|
|
// the same.
|
|
if ( bstrPropName != NULL )
|
|
{
|
|
PROPERTYDETAILS pdIPropDet;
|
|
pdIPropDet.Type = pdPropDet.Type;
|
|
pdIPropDet.InOrOut = ioInOrOut;
|
|
|
|
// Making bstrPropName begin with numbers to maintain
|
|
// the order of method arguments in map.
|
|
// while displaying remove numbers and display the
|
|
// parameters in case of help only.
|
|
_bstr_t bstrNumberedPropName;
|
|
if ( rParsedInfo.GetGlblSwitchesObject().GetHelpFlag() )
|
|
{
|
|
if ( ioInOrOut == INP )
|
|
_ltot(lVar, szNumber, 10);
|
|
else
|
|
_ltot(lVar + 500, szNumber, 10);
|
|
|
|
chsMsg.Format(L"%-5s", szNumber);
|
|
bstrNumberedPropName = _bstr_t(chsMsg) +
|
|
_bstr_t(bstrPropName);
|
|
}
|
|
else
|
|
bstrNumberedPropName = _bstr_t(bstrPropName);
|
|
|
|
mdMethDet.Params.insert(PROPDETMAP::value_type(
|
|
bstrNumberedPropName,pdIPropDet));
|
|
}
|
|
|
|
// Free the memory allocated using SysAllocString for
|
|
// bstrPropName
|
|
SAFEBSTRFREE(bstrPropName);
|
|
}
|
|
// Destroy array descriptor and all of the data in the array
|
|
SAFEADESTROY(psaNames);
|
|
}
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
SAFEBSTRFREE(bstrPropName);
|
|
SAFEADESTROY(psaNames);
|
|
hr = e.Error();
|
|
}
|
|
catch(CHeap_Exception)
|
|
{
|
|
SAFEBSTRFREE(bstrPropName);
|
|
SAFEADESTROY(psaNames);
|
|
_com_issue_error(WBEM_E_OUT_OF_MEMORY);
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :GetMethodStatusAndDesc
|
|
Synopsis :This function obtains the implementation status and
|
|
description of the verbs available
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
pIObj - pointer to IWbemClassObject object
|
|
bstrMethod - method name
|
|
bTrace - trace flag
|
|
Output Parameter(s):
|
|
bstrStatus - implementation status
|
|
bstrDesc - Method description
|
|
Return Type :HRESULT
|
|
Global Variables :None
|
|
Calling Syntax : GetMethodStatusAndDesc(pIObj, bstrMethod,
|
|
bstrStatus, bstrDesc, bTrace)
|
|
Notes :none
|
|
----------------------------------------------------------------------------*/
|
|
HRESULT CParserEngine::GetMethodStatusAndDesc(IWbemClassObject* pIObj,
|
|
BSTR bstrMethod,
|
|
_bstr_t& bstrStatus,
|
|
_bstr_t& bstrDesc,
|
|
BOOL bTrace)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
IWbemQualifierSet* pIQualSet = NULL;
|
|
VARIANT vtStatus, vtDesc;
|
|
VariantInit(&vtStatus);
|
|
VariantInit(&vtDesc);
|
|
|
|
try
|
|
{
|
|
if ( pIObj != NULL )
|
|
{
|
|
// Obtain the method qualifier set.
|
|
hr = pIObj->GetMethodQualifierSet(bstrMethod, &pIQualSet);
|
|
if ( pIQualSet != NULL )
|
|
{
|
|
// Retrieve the 'Implemented' qualifier status value
|
|
hr = pIQualSet->Get(_bstr_t(L"Implemented"),
|
|
0L, &vtStatus, NULL);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if (vtStatus.vt != VT_EMPTY && vtStatus.vt != VT_NULL )
|
|
{
|
|
if ( vtStatus.boolVal )
|
|
bstrStatus = L"Implemented";
|
|
else
|
|
bstrStatus = L"Not Implemented";
|
|
}
|
|
else
|
|
bstrStatus = L"Not Found";
|
|
}
|
|
else
|
|
bstrStatus = L"Not Found";
|
|
VARIANTCLEAR(vtStatus);
|
|
// Should not break here, hence the HRESULT should be set to S_OK
|
|
hr = S_OK;
|
|
|
|
// Retrieve the 'Description' qualifier text
|
|
hr = pIQualSet->Get(_bstr_t(L"Description"), 0L ,
|
|
&vtDesc, NULL);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if (vtDesc.vt == VT_BSTR)
|
|
bstrDesc = _bstr_t(vtDesc.bstrVal);
|
|
else
|
|
bstrDesc = L"Not available";
|
|
}
|
|
else
|
|
bstrDesc = L"Not available";
|
|
VARIANTCLEAR(vtDesc);
|
|
// Should not break here, hence the HRESULT should be set to S_OK
|
|
hr = S_OK;
|
|
SAFEIRELEASE(pIQualSet);
|
|
}
|
|
else
|
|
hr = S_OK;
|
|
}
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
VARIANTCLEAR(vtStatus);
|
|
VARIANTCLEAR(vtDesc);
|
|
SAFEIRELEASE(pIQualSet);
|
|
hr = e.Error();
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :CheckforHelp
|
|
Synopsis :This function looks ahead one token to see if the next
|
|
token is '?'
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
rParsedInfo - reference to CParsedInfo class object.
|
|
uErrataCode - error string ID
|
|
Output Parameter(s):
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
|
|
Return Type :RETCODE - enumerated data type.
|
|
Global Variables :None
|
|
Calling Syntax :CheckforHelp(cvtokens,theIterator,rParsedInfo,uErrataCode)
|
|
Notes :none
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::CheckForHelp(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo,
|
|
UINT uErrataCode)
|
|
{
|
|
RETCODE retCode = PARSER_DISPHELP;
|
|
// Set the retCode as PARSER_ERROR if no more tokens
|
|
// are present.
|
|
if(!GetNextToken(cvTokens, theIterator))
|
|
{
|
|
retCode = PARSER_ERROR;
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(uErrataCode);
|
|
}
|
|
else if(!CompareTokens(*theIterator, CLI_TOKEN_HELP))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
uErrataCode);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
else
|
|
{
|
|
retCode = ParseHelp(cvTokens, theIterator, rParsedInfo, FALSE);
|
|
}
|
|
return retCode;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ValidateGlobalSwitchValue
|
|
Synopsis :This function checks whether global switches are
|
|
specified in the expected format or not.
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
uErrataCode - error string
|
|
rParsedInfo - reference to CParsedInfo class object.
|
|
uErrataCode2 - error string2 ID
|
|
htHelp - help type
|
|
Output Parameter(s):
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE - enumerated data type.
|
|
Global Variables :None
|
|
Calling Syntax :ValidateGlobalSwitchValue(cvTokens, theIterator,
|
|
uErrataCode, rParsedInfo,
|
|
uErrataCode2, htHelp)
|
|
Notes :none
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ValidateGlobalSwitchValue(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
UINT uErrataCode,
|
|
CParsedInfo& rParsedInfo,
|
|
UINT uErrataCode2,
|
|
HELPTYPE htHelp)
|
|
{
|
|
RETCODE retCode = PARSER_CONTINUE;
|
|
retCode = GetNextToken(cvTokens, theIterator, rParsedInfo,
|
|
htHelp, uErrataCode2);
|
|
|
|
if (retCode == PARSER_CONTINUE)
|
|
{
|
|
// Check for the presence of the ':'
|
|
if (CompareTokens(*theIterator, CLI_TOKEN_COLON))
|
|
{
|
|
// Move to next token
|
|
if (GetNextToken(cvTokens, theIterator, rParsedInfo,
|
|
uErrataCode))
|
|
{
|
|
if (IsOption(*theIterator))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
uErrataCode);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
else
|
|
retCode = PARSER_CONTINUE;
|
|
}
|
|
else
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
else if (IsOption(*theIterator))
|
|
{
|
|
retCode = CheckForHelp(cvTokens, theIterator,
|
|
rParsedInfo, uErrataCode2);
|
|
if (retCode == PARSER_DISPHELP)
|
|
{
|
|
rParsedInfo.GetGlblSwitchesObject().SetHelpFlag(TRUE);
|
|
rParsedInfo.GetHelpInfoObject().SetHelp(htHelp, TRUE);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(uErrataCode2);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
}
|
|
return retCode;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ParseEVERYSwitch
|
|
Synopsis :This function checks whether the value specified for the
|
|
/EVERY swith is valid or not.
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
rParsedInfo - reference to CParsedInfo class object.
|
|
Output Parameter(s):
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE - enumerated data type.
|
|
Global Variables :None
|
|
Calling Syntax :ParseEVERYSwitch(cvTokens, theIterator, rParsedInfo)
|
|
Notes :none
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ParseEVERYSwitch(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo)
|
|
{
|
|
RETCODE retCode = PARSER_EXECCOMMAND;
|
|
|
|
retCode = ParseNumberedSwitch(cvTokens, theIterator, rParsedInfo,
|
|
EVERY, IDS_E_INVALID_EVERY_SWITCH,
|
|
IDS_E_INVALID_INTERVAL);
|
|
|
|
if ( retCode == PARSER_EXECCOMMAND )
|
|
{
|
|
if (GetNextToken(cvTokens, theIterator) == TRUE )
|
|
{
|
|
if ( CompareTokens(*theIterator, CLI_TOKEN_FSLASH) == TRUE )
|
|
{
|
|
if ( GetNextToken(cvTokens, theIterator) == TRUE )
|
|
{
|
|
if (CompareTokens(*theIterator, CLI_TOKEN_REPEAT) == TRUE)
|
|
{
|
|
retCode = ParseNumberedSwitch(cvTokens,
|
|
theIterator,
|
|
rParsedInfo,
|
|
REPEAT,
|
|
IDS_E_INVALID_REPEAT_SWITCH,
|
|
IDS_E_INVALID_REPEATCOUNT);
|
|
}
|
|
else
|
|
theIterator = theIterator - 2;
|
|
}
|
|
else
|
|
theIterator = theIterator - 2;
|
|
}
|
|
else
|
|
theIterator = theIterator - 1;
|
|
}
|
|
}
|
|
|
|
return retCode;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ParseFORMATSwitch
|
|
Synopsis :This function checks whether the value specified for the
|
|
/FORMAT swith is valid or not.
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
rParsedInfo - reference to CParsedInfo class object.
|
|
Output Parameter(s):
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE - enumerated data type.
|
|
Global Variables :None
|
|
Calling Syntax :ParseFORMATSwitch(cvTokens, theIterator, rParsedInfo)
|
|
Notes :none
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ParseFORMATSwitch(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo)
|
|
{
|
|
RETCODE retCode = PARSER_EXECCOMMAND;
|
|
// Reset the XSL file path.
|
|
rParsedInfo.GetCmdSwitchesObject().ClearXSLTDetailsVector();
|
|
|
|
// Move to next token
|
|
if (!GetNextToken(cvTokens, theIterator))
|
|
{
|
|
retCode = PARSER_EXECCOMMAND;
|
|
|
|
// If Translate table name is given then set the flag
|
|
if( rParsedInfo.GetCmdSwitchesObject().
|
|
GetTranslateTableName() != NULL )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetTranslateFirstFlag(TRUE);
|
|
}
|
|
else
|
|
rParsedInfo.GetCmdSwitchesObject().SetTranslateFirstFlag(FALSE);
|
|
}
|
|
else if ( IsOption(*theIterator) &&
|
|
(theIterator + 1) < cvTokens.end() &&
|
|
CompareTokens(*(theIterator+1), CLI_TOKEN_HELP) )
|
|
{
|
|
theIterator++;
|
|
retCode = ParseHelp(cvTokens, theIterator, FORMAT, rParsedInfo);
|
|
}
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_COLON))
|
|
{
|
|
while ( retCode == PARSER_EXECCOMMAND &&
|
|
theIterator < cvTokens.end() )
|
|
{
|
|
XSLTDET xdXSLTDet;
|
|
BOOL bFrameXSLFile = TRUE;
|
|
// Move to next token
|
|
if (!GetNextToken(cvTokens, theIterator))
|
|
{
|
|
// PARSER_ERROR if <format specifier> is missing
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_FORMAT);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
else if ( IsOption(*theIterator) )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_FORMAT);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
else
|
|
{
|
|
xdXSLTDet.FileName = *theIterator;
|
|
if(!g_wmiCmd.GetFileFromKey(*theIterator, xdXSLTDet.FileName))
|
|
bFrameXSLFile = FALSE;
|
|
}
|
|
|
|
if ( retCode == PARSER_EXECCOMMAND )
|
|
{
|
|
if ( !GetNextToken(cvTokens, theIterator) )
|
|
{
|
|
if ( bFrameXSLFile == TRUE )
|
|
{
|
|
if (!FrameFileAndAddToXSLTDetVector(xdXSLTDet,
|
|
rParsedInfo))
|
|
retCode = PARSER_ERRMSG;
|
|
}
|
|
else
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
AddToXSLTDetailsVector(xdXSLTDet);
|
|
break;
|
|
}
|
|
else if ( IsOption(*theIterator) )
|
|
{
|
|
theIterator--;
|
|
if ( bFrameXSLFile == TRUE )
|
|
{
|
|
if (!FrameFileAndAddToXSLTDetVector(xdXSLTDet,
|
|
rParsedInfo))
|
|
retCode = PARSER_ERRMSG;
|
|
}
|
|
else
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
AddToXSLTDetailsVector(xdXSLTDet);
|
|
break;
|
|
}
|
|
else if ( CompareTokens(*theIterator, CLI_TOKEN_COLON ) )
|
|
{
|
|
_TCHAR* pszXSLFile = NULL;
|
|
retCode = ParseParamsString(cvTokens, theIterator,
|
|
rParsedInfo, xdXSLTDet,
|
|
pszXSLFile);
|
|
if ( retCode == PARSER_EXECCOMMAND &&
|
|
(theIterator != cvTokens.end()) && IsOption(*theIterator) )
|
|
{
|
|
theIterator--;
|
|
|
|
if ( bFrameXSLFile == TRUE )
|
|
{
|
|
if (!FrameFileAndAddToXSLTDetVector(xdXSLTDet,
|
|
rParsedInfo))
|
|
retCode = PARSER_ERRMSG;
|
|
}
|
|
else
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
AddToXSLTDetailsVector(xdXSLTDet);
|
|
|
|
if ( pszXSLFile != NULL &&
|
|
retCode == PARSER_EXECCOMMAND )
|
|
{
|
|
XSLTDET xdXSLDetOnlyFile;
|
|
BOOL bInnerFrameXSLFile = TRUE;
|
|
|
|
xdXSLDetOnlyFile.FileName = pszXSLFile;
|
|
if(!g_wmiCmd.GetFileFromKey(pszXSLFile,
|
|
xdXSLTDet.FileName))
|
|
bInnerFrameXSLFile = FALSE;
|
|
|
|
if ( bInnerFrameXSLFile == TRUE )
|
|
{
|
|
if (!FrameFileAndAddToXSLTDetVector(xdXSLDetOnlyFile,
|
|
rParsedInfo))
|
|
retCode = PARSER_ERRMSG;
|
|
}
|
|
else
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
AddToXSLTDetailsVector(xdXSLDetOnlyFile);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
else if ( !CompareTokens(*theIterator, CLI_TOKEN_COMMA ) )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_FORMAT);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
}
|
|
|
|
if ( retCode == PARSER_EXECCOMMAND )
|
|
{
|
|
if ( bFrameXSLFile == TRUE )
|
|
{
|
|
if (!FrameFileAndAddToXSLTDetVector(xdXSLTDet, rParsedInfo))
|
|
retCode = PARSER_ERRMSG;
|
|
}
|
|
else
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
AddToXSLTDetailsVector(xdXSLTDet);
|
|
}
|
|
}
|
|
|
|
// If Translate table name is given then set the flag
|
|
if( rParsedInfo.GetCmdSwitchesObject().
|
|
GetTranslateTableName() != NULL )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetTranslateFirstFlag(TRUE);
|
|
}
|
|
else
|
|
rParsedInfo.GetCmdSwitchesObject().SetTranslateFirstFlag(FALSE);
|
|
}
|
|
else
|
|
{
|
|
theIterator--;
|
|
}
|
|
|
|
return retCode;
|
|
}
|
|
/*----------------------------------------------------------------------------
|
|
Name :IsStdVerbOrUserDefVerb
|
|
Synopsis :This function checks whether the verb is standard verb
|
|
or user defined verb for alias.
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
pszToken - the verb name string
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
|
|
Output Parameter(s): None
|
|
|
|
Return Type :BOOL
|
|
Global Variables :None
|
|
Calling Syntax :IsStdVerbOrUserDefVerb( pszToken,rParsedInfo)
|
|
Notes :none
|
|
----------------------------------------------------------------------------*/
|
|
BOOL CParserEngine::IsStdVerbOrUserDefVerb(_bstr_t bstrToken,
|
|
CParsedInfo& rParsedInfo)
|
|
{
|
|
BOOL bStdVerbOrUserDefVerb = FALSE;
|
|
|
|
try
|
|
{
|
|
if ( CompareTokens(bstrToken, CLI_TOKEN_GET) ||
|
|
CompareTokens(bstrToken, CLI_TOKEN_LIST) ||
|
|
CompareTokens(bstrToken, CLI_TOKEN_SET) ||
|
|
CompareTokens(bstrToken, CLI_TOKEN_CREATE) ||
|
|
CompareTokens(bstrToken, CLI_TOKEN_CALL) ||
|
|
CompareTokens(bstrToken, CLI_TOKEN_ASSOC) ||
|
|
CompareTokens(bstrToken, CLI_TOKEN_DELETE) )
|
|
bStdVerbOrUserDefVerb = TRUE;
|
|
else
|
|
{
|
|
if ( m_bAliasName )
|
|
{
|
|
METHDETMAP mdmMethDetMap = rParsedInfo.GetCmdSwitchesObject()
|
|
.GetMethDetMap();
|
|
if ( mdmMethDetMap.empty() )
|
|
{
|
|
m_CmdAlias.ObtainAliasVerbDetails(rParsedInfo);
|
|
mdmMethDetMap = rParsedInfo.GetCmdSwitchesObject()
|
|
.GetMethDetMap();
|
|
}
|
|
|
|
METHDETMAP::iterator theMethIterator = NULL;
|
|
for ( theMethIterator = mdmMethDetMap.begin();
|
|
theMethIterator != mdmMethDetMap.end(); theMethIterator++ )
|
|
{
|
|
if ( CompareTokens((*theMethIterator).first,bstrToken) )
|
|
{
|
|
bStdVerbOrUserDefVerb = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
bStdVerbOrUserDefVerb = FALSE;
|
|
_com_issue_error(e.Error());
|
|
}
|
|
return bStdVerbOrUserDefVerb;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ParseTRANSLATESwitch
|
|
Synopsis :This function parses for translate switch in the command.
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
rParsedInfo - reference to CParsedInfo class object.
|
|
Output Parameter(s) :
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
|
|
Return Type :RETCODE-enumerated type
|
|
Global Variables :None
|
|
Calling Syntax :ParseTRANSLATESwitch(cvTokens,theIterator,rParsedInfo)
|
|
Notes :none
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ParseTRANSLATESwitch(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo)
|
|
{
|
|
RETCODE retCode = PARSER_EXECCOMMAND;
|
|
|
|
if ( GetNextToken(cvTokens, theIterator, rParsedInfo, TRANSLATE,
|
|
IDS_E_INVALID_TRANSLATE_SWITCH) == PARSER_CONTINUE )
|
|
{
|
|
if ( IsOption(*theIterator) &&
|
|
(theIterator + 1) < cvTokens.end() &&
|
|
CompareTokens(*(theIterator+1), CLI_TOKEN_HELP) )
|
|
{
|
|
theIterator++;
|
|
retCode = ParseHelp(cvTokens, theIterator, TRANSLATE,
|
|
rParsedInfo);
|
|
if ( retCode == PARSER_DISPHELP )
|
|
{
|
|
if( FAILED(m_CmdAlias.ConnectToAlias(rParsedInfo,
|
|
m_pIWbemLocator)))
|
|
retCode = PARSER_ERRMSG;
|
|
if ( FAILED(m_CmdAlias.ObtainTranslateTables(rParsedInfo)))
|
|
retCode = PARSER_ERRMSG;
|
|
}
|
|
}
|
|
else if ( CompareTokens( *theIterator, CLI_TOKEN_COLON ) &&
|
|
GetNextToken(cvTokens, theIterator, rParsedInfo, TRANSLATE,
|
|
IDS_E_INVALID_TRANSLATE_SWITCH) == PARSER_CONTINUE )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetTranslateTableName(*theIterator);
|
|
|
|
if ( IsOption(*theIterator) )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_TRANSLATE_SWITCH);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
else if(FAILED(m_CmdAlias.ConnectToAlias(rParsedInfo,
|
|
m_pIWbemLocator)))
|
|
retCode = PARSER_ERRMSG;
|
|
else if ( m_CmdAlias.ObtainTranslateTableEntries(rParsedInfo) == TRUE )
|
|
retCode = PARSER_EXECCOMMAND;
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_TRANSLATE_TABLE_NOT_EXIST);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
|
|
// If Format switch is specified after translate switch then
|
|
// set the flag else reset it
|
|
if(rParsedInfo.GetCmdSwitchesObject().GetXSLTDetailsVector().
|
|
empty())
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetTranslateFirstFlag(TRUE);
|
|
}
|
|
else
|
|
rParsedInfo.GetCmdSwitchesObject().SetTranslateFirstFlag(FALSE);
|
|
}
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_TRANSLATE_SWITCH);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
|
|
}
|
|
else
|
|
retCode = PARSER_ERROR;
|
|
return retCode;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ParseContextInfo
|
|
Synopsis :This function does the parsing of the help on context
|
|
information
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Output parameter(s):
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE - enumerated data type
|
|
Global Variables :None
|
|
Calling Syntax :ParseContextInfo(cvTokens, theIterator, rParsedInfo)
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ParseContextInfo(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo)
|
|
{
|
|
//BNF: CONTEXT /?[:<FULL|BRIEF>]
|
|
BOOL bContinue = TRUE;
|
|
RETCODE retCode = PARSER_MESSAGE;
|
|
|
|
// If option
|
|
if (IsOption(*theIterator))
|
|
{
|
|
// Check for help
|
|
retCode = IsHelp(cvTokens, theIterator, rParsedInfo, CONTEXTHELP,
|
|
IDS_E_INVALID_CONTEXT_SYNTAX, LEVEL_ONE);
|
|
|
|
// If more tokens are present.
|
|
if (retCode == PARSER_CONTINUE)
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_CONTEXT_SYNTAX);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_CONTEXT_SYNTAX);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
return retCode;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ValidateNodeOrNS
|
|
Synopsis :This function validates the node or namespace
|
|
Type :Member Function
|
|
Input Parameter(s):
|
|
pszInput - node/namesapce to be validated
|
|
bNode - TRUE - pszInput refers to NODE
|
|
FALSE - pszInput refers to NAMESPACE
|
|
Output parameter(s):None
|
|
Return Type :BOOL
|
|
Global Variables :None
|
|
Calling Syntax :ValidateNodeOrNS(pszInput, bNode)
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
BOOL CParserEngine::ValidateNodeOrNS(_TCHAR* pszInput, BOOL bNode)
|
|
{
|
|
IWbemServices* pISvc = NULL;
|
|
BOOL bRet = TRUE;
|
|
HRESULT hr = S_OK;
|
|
|
|
try
|
|
{
|
|
if(pszInput == NULL)
|
|
bRet = FALSE;
|
|
|
|
if(bRet)
|
|
{
|
|
|
|
if (m_pIWbemLocator != NULL)
|
|
{
|
|
// Check for the presence of the following invalid
|
|
// characters for NODE.
|
|
if (bNode)
|
|
{
|
|
CHString str(pszInput);
|
|
if (str.FindOneOf(L"\"\\,/[]:<>+=;?$#{}~`^@!'()*") != -1)
|
|
{
|
|
bRet = FALSE;
|
|
};
|
|
}
|
|
|
|
if (bRet)
|
|
{
|
|
|
|
// Try to connect to root namespace
|
|
_bstr_t bstrNS;
|
|
if (bNode)
|
|
bstrNS = _bstr_t(L"\\\\") + _bstr_t(pszInput) + _bstr_t(L"\\root");
|
|
else
|
|
bstrNS = _bstr_t(L"\\\\.\\") + _bstr_t(pszInput);
|
|
|
|
// Call the ConnectServer method of the IWbemLocator
|
|
hr = m_pIWbemLocator->ConnectServer(bstrNS, NULL, NULL, NULL, 0L,
|
|
NULL, NULL, &pISvc);
|
|
if (FAILED(hr))
|
|
{
|
|
// If invalid machine name
|
|
// 0x800706ba - RPC_SERVER_UNAVAILABLE
|
|
if (bNode && (hr == 0x800706ba))
|
|
{
|
|
bRet = FALSE;
|
|
}
|
|
|
|
// If invalid namespace
|
|
// 0x8004100E - WBEM_E_INVALID_NAMESPACE
|
|
if (!bNode
|
|
&& ((hr == WBEM_E_INVALID_NAMESPACE) ||
|
|
(hr == WBEM_E_INVALID_PARAMETER)))
|
|
{
|
|
bRet = FALSE;
|
|
}
|
|
}
|
|
SAFEIRELEASE(pISvc);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
bRet = FALSE;
|
|
SAFEIRELEASE(pISvc);
|
|
_com_issue_error(e.Error());
|
|
}
|
|
catch(CHeap_Exception)
|
|
{
|
|
bRet = FALSE;
|
|
SAFEIRELEASE(pISvc);
|
|
_com_issue_error(WBEM_E_OUT_OF_MEMORY);
|
|
}
|
|
return bRet;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ParseAssocSwitches
|
|
Synopsis :This function does the parsing and interprets if command
|
|
has ASSOC as the verb. It parses the remaining tokens
|
|
following and updates the same in CParsedInfo.
|
|
Type :Member Function
|
|
Input Parameter(s) :cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Output Parameter(s) :rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE - enumerated data type
|
|
Global Variables :None
|
|
Calling Syntax :ParseAssocSwitch(cvTokens,theIterator,rParsedInfo)
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ParseAssocSwitches(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo)
|
|
{
|
|
RETCODE retCode = PARSER_EXECCOMMAND;
|
|
|
|
while ( retCode == PARSER_EXECCOMMAND )
|
|
{
|
|
// Check for the presence of RESULT CLASS switch
|
|
if (CompareTokens(*theIterator, CLI_TOKEN_RESULTCLASS))
|
|
{
|
|
retCode = ParseAssocSwitchEx(cvTokens, theIterator, rParsedInfo ,RESULTCLASS );
|
|
}
|
|
// Check for the presence of RESULT ROLE switch
|
|
else if (CompareTokens(*theIterator,CLI_TOKEN_RESULTROLE ))
|
|
{
|
|
retCode = ParseAssocSwitchEx(cvTokens, theIterator, rParsedInfo ,RESULTROLE );
|
|
}
|
|
// Check for the presence of ASSOC CLASS switch
|
|
else if (CompareTokens(*theIterator,CLI_TOKEN_ASSOCCLASS ))
|
|
{
|
|
retCode = ParseAssocSwitchEx(cvTokens, theIterator, rParsedInfo , ASSOCCLASS);
|
|
}
|
|
// Check for the presence of help
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_HELP))
|
|
{
|
|
rParsedInfo.GetHelpInfoObject().SetHelp(ASSOCSwitchesOnly, TRUE);
|
|
retCode = ParseHelp(cvTokens, theIterator, ASSOCVerb, rParsedInfo);
|
|
}
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_ASSOC_SWITCH);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
|
|
//Checking the next tokens
|
|
if ( retCode == PARSER_EXECCOMMAND )
|
|
{
|
|
if ( !GetNextToken(cvTokens, theIterator) )
|
|
break;
|
|
|
|
if ( !IsOption(*theIterator) )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_COMMAND);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
|
|
if ( !GetNextToken(cvTokens, theIterator) )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_ASSOC_SWITCH);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return retCode;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ParseAssocSwitchEx
|
|
Synopsis :This function does the parsing of tokens for the assoc
|
|
switches It parses the remaining tokens following and
|
|
updates the same in CParsedInfo.
|
|
Type :Member Function
|
|
Input Parameter(s) :cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
assocSwitch - the type of assoc switch
|
|
Output Parameter(s) :rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE - enumerated data type
|
|
Global Variables :None
|
|
Calling Syntax :ParseAssocSwitchEx(cvTokens,theIterator,
|
|
rParsedInfo,assocSwitch)
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ParseAssocSwitchEx(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo ,
|
|
ASSOCSwitch assocSwitch)
|
|
{
|
|
RETCODE retCode = PARSER_EXECCOMMAND;
|
|
|
|
//Checking the next token to continue parsing
|
|
if ( GetNextToken(cvTokens, theIterator, rParsedInfo, ASSOCVerb,
|
|
IDS_E_INVALID_ASSOC_SWITCH) == PARSER_CONTINUE )
|
|
{
|
|
//Checking for help option
|
|
if ( IsOption(*theIterator) &&
|
|
(theIterator + 1) < cvTokens.end() &&
|
|
CompareTokens(*(theIterator+1), CLI_TOKEN_HELP) )
|
|
{
|
|
theIterator++;
|
|
//Help on RESULTCLASS
|
|
if (assocSwitch == RESULTCLASS)
|
|
{
|
|
retCode = ParseHelp(cvTokens, theIterator, RESULTCLASShelp,
|
|
rParsedInfo);
|
|
|
|
}
|
|
//Help on RESULTROLE
|
|
if (assocSwitch == RESULTROLE)
|
|
{
|
|
retCode = ParseHelp(cvTokens, theIterator, RESULTROLEhelp,
|
|
rParsedInfo);
|
|
}
|
|
//Help on ASSOCCLASS
|
|
if (assocSwitch == ASSOCCLASS)
|
|
{
|
|
retCode = ParseHelp(cvTokens, theIterator, ASSOCCLASShelp,
|
|
rParsedInfo);
|
|
}
|
|
}
|
|
|
|
//If the command has ":" , then the corresponding data
|
|
//has to be set in Command object
|
|
else if ( CompareTokens( *theIterator, CLI_TOKEN_COLON ) &&
|
|
GetNextToken(cvTokens, theIterator, rParsedInfo, ASSOCVerb,
|
|
IDS_E_INVALID_ASSOC_SWITCH) == PARSER_CONTINUE )
|
|
{
|
|
if ( IsOption(*theIterator) )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_ASSOC_SWITCH);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
|
|
else
|
|
{
|
|
//Setting the ResultClassName
|
|
if (assocSwitch == RESULTCLASS)
|
|
{
|
|
if(rParsedInfo.GetCmdSwitchesObject().
|
|
SetResultClassName(*theIterator))
|
|
{
|
|
retCode = PARSER_EXECCOMMAND;
|
|
}
|
|
else
|
|
{
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
}
|
|
//Setting the Result Role Name
|
|
if (assocSwitch == RESULTROLE)
|
|
{
|
|
if(rParsedInfo.GetCmdSwitchesObject().
|
|
SetResultRoleName(*theIterator))
|
|
{
|
|
retCode = PARSER_EXECCOMMAND;
|
|
}
|
|
else
|
|
{
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
}
|
|
//Setting the Assoc Class Name
|
|
if (assocSwitch == ASSOCCLASS)
|
|
{
|
|
if(rParsedInfo.GetCmdSwitchesObject().
|
|
SetAssocClassName(*theIterator))
|
|
{
|
|
retCode = PARSER_EXECCOMMAND;
|
|
}
|
|
else
|
|
{
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_ASSOC_SWITCH);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
}
|
|
else
|
|
retCode = PARSER_ERROR;
|
|
return retCode;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ParseNumberedSwitch
|
|
Synopsis :This function does the parsing of tokens for the every
|
|
and repeat switches. It parses the remaining tokens
|
|
following and updates the same in CParsedInfo.
|
|
Type :Member Function
|
|
Input Parameter(s) :cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
htHelp - enumerated help type
|
|
uSwitchErrCode - error string ID.
|
|
uNumberErrCode - error string ID.
|
|
|
|
Output Parameter(s) :rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE - enumerated data type
|
|
Global Variables :None
|
|
Calling Syntax :ParseNumberedSwitch(cvTokens, theIterator, rParsedInfo,
|
|
EVERYorREPEAT, uSwitchErrCode,
|
|
uNumberErrCode);
|
|
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ParseNumberedSwitch(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo,
|
|
HELPTYPE htHelp,
|
|
UINT uSwitchErrCode,
|
|
UINT uNumberErrCode)
|
|
{
|
|
RETCODE retCode = PARSER_EXECCOMMAND;
|
|
BOOL bInvalidSwitch = FALSE;
|
|
|
|
// Move to next token
|
|
if (!GetNextToken(cvTokens, theIterator, rParsedInfo, htHelp,
|
|
uSwitchErrCode))
|
|
bInvalidSwitch = TRUE;
|
|
else if ( IsOption(*theIterator) &&
|
|
(theIterator + 1) < cvTokens.end() &&
|
|
CompareTokens(*(theIterator+1), CLI_TOKEN_HELP) )
|
|
{
|
|
theIterator++;
|
|
retCode = ParseHelp(cvTokens, theIterator, htHelp, rParsedInfo);
|
|
}
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_COLON))
|
|
{
|
|
BOOL bSuccess = FALSE;
|
|
// Move to next token
|
|
if (GetNextToken(cvTokens, theIterator))
|
|
{
|
|
if ( IsOption(*theIterator) )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(uSwitchErrCode);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
else
|
|
{
|
|
_TCHAR* pszEndPtr = NULL;
|
|
ULONG ulNumber = _tcstoul(*theIterator, &pszEndPtr, 10);
|
|
if (!lstrlen(pszEndPtr))
|
|
{
|
|
BOOL bSetValue = TRUE;
|
|
if ( htHelp == EVERY )
|
|
{
|
|
bSetValue = rParsedInfo.GetCmdSwitchesObject().
|
|
SetRetrievalInterval(ulNumber);
|
|
}
|
|
else if ( htHelp == REPEAT )
|
|
{
|
|
if ( ulNumber == 0)
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(
|
|
IDS_E_INVALID_REPEATCOUNT);
|
|
retCode = PARSER_ERROR;
|
|
bSetValue = FALSE;
|
|
}
|
|
else
|
|
{
|
|
bSetValue = rParsedInfo.GetCmdSwitchesObject().
|
|
SetRepeatCount(ulNumber);
|
|
}
|
|
}
|
|
|
|
if ( bSetValue == TRUE)
|
|
{
|
|
bSuccess = TRUE;
|
|
rParsedInfo.GetCmdSwitchesObject().SetEverySwitchFlag(TRUE);
|
|
retCode = PARSER_EXECCOMMAND;
|
|
}
|
|
else
|
|
{
|
|
bSuccess = FALSE;
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if ( bSuccess == FALSE )
|
|
{
|
|
// PARSER_ERROR if no more tokens are present. i.e <interval>
|
|
// is not specified.
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(uNumberErrCode);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
}
|
|
else
|
|
bInvalidSwitch = TRUE;
|
|
|
|
if ( bInvalidSwitch == TRUE )
|
|
{
|
|
// PARSER_ERROR if no more tokens are present. i.e <interval>
|
|
// is not specified.
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(uSwitchErrCode);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
return retCode;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :IsValidClass
|
|
Synopsis :This function validates the class specified and
|
|
returns True or False accordingly as the validity of
|
|
the class
|
|
Type :Member Function
|
|
Input Parameter(s) :rParsedInfo - reference to CParsedInfo class object
|
|
Output Parameter(s) :rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :BOOL
|
|
Global Variables :None
|
|
Calling Syntax :IsValidClass(rParsedInfo)
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
BOOL CParserEngine::IsValidClass(CParsedInfo& rParsedInfo)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
IWbemClassObject* pIObject = NULL;
|
|
CHString chsMsg;
|
|
DWORD dwThreadId = GetCurrentThreadId();
|
|
BOOL bTrace = FALSE;
|
|
ERRLOGOPT eloErrLogOpt = NO_LOGGING;
|
|
|
|
// Obtain the trace flag status
|
|
bTrace = rParsedInfo.GetGlblSwitchesObject().GetTraceStatus();
|
|
|
|
eloErrLogOpt = rParsedInfo.GetErrorLogObject().GetErrLogOption();
|
|
|
|
try
|
|
{
|
|
hr = ConnectToNamespace(rParsedInfo);
|
|
ONFAILTHROWERROR(hr);
|
|
|
|
hr = m_pITargetNS->GetObject(_bstr_t(rParsedInfo.
|
|
GetCmdSwitchesObject().GetClassPath()),
|
|
WBEM_FLAG_USE_AMENDED_QUALIFIERS,
|
|
NULL, &pIObject, NULL);
|
|
if (bTrace || eloErrLogOpt)
|
|
{
|
|
chsMsg.Format(L"IWbemServices::GetObject(L\"%s\", "
|
|
L"WBEM_FLAG_USE_AMENDED_QUALIFIERS, 0, NULL, -, -)",
|
|
rParsedInfo.GetCmdSwitchesObject().GetClassPath());
|
|
WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId,
|
|
rParsedInfo, bTrace);
|
|
}
|
|
// do not add ONFAILTHROWERROR() here.
|
|
SAFEIRELEASE(pIObject);
|
|
}
|
|
catch(_com_error &e)
|
|
{
|
|
hr = e.Error();
|
|
SAFEIRELEASE(pIObject);
|
|
_com_issue_error(e.Error());
|
|
}
|
|
catch(CHeap_Exception)
|
|
{
|
|
SAFEIRELEASE(pIObject);
|
|
_com_issue_error(WBEM_E_OUT_OF_MEMORY);
|
|
}
|
|
return (SUCCEEDED(hr))? TRUE : FALSE;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ObtainMethodsAvailableFlag
|
|
Synopsis :This function Checks whether methods are available with
|
|
alias in case of alias specified.and with class in case
|
|
of class speicified.
|
|
Type :Member Function
|
|
Input Parameter(s) :
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Output Parameter(s) :None
|
|
Return Type :void
|
|
Global Variables :None
|
|
Calling Syntax :ObtainMethodsAvailableFlag(rParsedInfo)
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
void CParserEngine::ObtainMethodsAvailableFlag(CParsedInfo& rParsedInfo)
|
|
{
|
|
BOOL bMethAvail = TRUE;
|
|
|
|
if ( m_bAliasName == TRUE )
|
|
bMethAvail = m_CmdAlias.AreMethodsAvailable(rParsedInfo);
|
|
else
|
|
bMethAvail = ObtainClassMethods(rParsedInfo, TRUE);
|
|
|
|
rParsedInfo.GetCmdSwitchesObject().SetMethodsAvailable(bMethAvail);
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ObtainWriteablePropsAvailailableFlag
|
|
Synopsis :Checks whether writable props are available with alias in
|
|
case of alias specified. and with class in case of class
|
|
speicified.
|
|
Type :Member Function
|
|
Input Parameter(s) :
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Output Parameter(s) :None
|
|
Return Type :void
|
|
Global Variables :None
|
|
Calling Syntax :ObtainWriteablePropsAvailailableFlag(rParsedInfo)
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
void CParserEngine::ObtainWriteablePropsAvailailableFlag(
|
|
CParsedInfo& rParsedInfo)
|
|
{
|
|
BOOL bWritePropsAvail = TRUE;
|
|
HRESULT hr = S_OK;
|
|
|
|
try
|
|
{
|
|
|
|
if ( m_bAliasName == TRUE )
|
|
{
|
|
hr = m_CmdAlias.ObtainAliasPropDetails(rParsedInfo, &bWritePropsAvail);
|
|
ONFAILTHROWERROR(hr);
|
|
}
|
|
|
|
else
|
|
bWritePropsAvail = ObtainClassProperties(rParsedInfo, TRUE);
|
|
|
|
rParsedInfo.GetCmdSwitchesObject().SetWriteablePropsAvailable(
|
|
bWritePropsAvail);
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
_com_issue_error(e.Error());
|
|
}
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ParseVerbInteractive
|
|
Synopsis :This function parses the verb interactive option
|
|
Type :Member Function
|
|
Input Parameter(s) :
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Output Parameter(s) :
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
bInvalidOption - Invalid syntax for interactive
|
|
Return Type :RETCODE
|
|
Global Variables :None
|
|
Calling Syntax :ParseVerbInteractive(rParsedInfo)
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ParseVerbInteractive(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo, BOOL& bInvalidOption)
|
|
{
|
|
RETCODE retCode = PARSER_EXECCOMMAND;
|
|
|
|
if (GetNextToken(cvTokens, theIterator))
|
|
{
|
|
// check for the presence of ':'
|
|
if (CompareTokens(*theIterator, CLI_TOKEN_COLON))
|
|
{
|
|
if (GetNextToken(cvTokens, theIterator))
|
|
{
|
|
if (IsOption(*theIterator))
|
|
{
|
|
if (GetNextToken(cvTokens, theIterator))
|
|
{
|
|
if (CompareTokens(*theIterator, CLI_TOKEN_HELP))
|
|
{
|
|
retCode = ParseHelp(cvTokens, theIterator, VERBSWITCHES,
|
|
rParsedInfo);
|
|
}
|
|
else
|
|
{
|
|
bInvalidOption = TRUE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
bInvalidOption = TRUE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
while (TRUE)
|
|
{
|
|
if(!rParsedInfo.GetCmdSwitchesObject().
|
|
AddToInteractivePropertyList(*theIterator))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_ADD_TO_PROP_LIST_FAILURE);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
if (GetNextToken(cvTokens, theIterator))
|
|
{
|
|
// check for the presence of ','
|
|
if (CompareTokens(*theIterator, CLI_TOKEN_COMMA))
|
|
{
|
|
if (!GetNextToken(cvTokens, theIterator))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_PARAMLIST);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_PARAMLIST);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
retCode = PARSER_EXECCOMMAND;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_PARAMLIST);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
}
|
|
else if (IsOption(*theIterator))
|
|
{
|
|
if (GetNextToken(cvTokens, theIterator))
|
|
{
|
|
if (CompareTokens(*theIterator, CLI_TOKEN_HELP))
|
|
{
|
|
retCode = ParseHelp(cvTokens, theIterator, VERBSWITCHES,
|
|
rParsedInfo);
|
|
}
|
|
else
|
|
{
|
|
bInvalidOption = TRUE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
bInvalidOption = TRUE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_PARAMLIST);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
}
|
|
|
|
return retCode;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ProcessOutputAndAppendFiles
|
|
Synopsis :Prepares the output and append files for output
|
|
redirection.
|
|
Type :Member Function
|
|
Input Parameter(s) :
|
|
rParsedInfo - reference to CParsedInfo class object.
|
|
retOCode - RETCODE type, specifies the initial RETCODE before
|
|
calling the function.
|
|
bOpenOutInWriteMode - boolean type, to specify flag of OpenOutInWriteMode.
|
|
Output Parameter(s) :
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE
|
|
Global Variables :None
|
|
Calling Syntax :ProcessOutputAndAppendFiles(rParsedInfo, retCode, FALSE)
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ProcessOutputAndAppendFiles(CParsedInfo& rParsedInfo,
|
|
RETCODE retOCode,
|
|
BOOL bOpenOutInWriteMode)
|
|
{
|
|
RETCODE retCode = retOCode;
|
|
|
|
// TRUE for getting output file name.
|
|
_TCHAR* pszOutputFileName =
|
|
rParsedInfo.GetGlblSwitchesObject().GetOutputOrAppendFileName(
|
|
TRUE);
|
|
if ( pszOutputFileName != NULL )
|
|
{
|
|
// redirect the output to file.
|
|
if ( CloseOutputFile() == TRUE )
|
|
{
|
|
FILE *fpOutFile;
|
|
if ( bOpenOutInWriteMode == TRUE )
|
|
fpOutFile = _tfopen(pszOutputFileName, _T("w"));
|
|
else
|
|
fpOutFile = _tfopen(pszOutputFileName, _T("a"));
|
|
|
|
if ( fpOutFile == NULL )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_OPEN_OUTPUT_FILE_FAILURE);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
else // TRUE for setting output file pointer.
|
|
rParsedInfo.GetGlblSwitchesObject().
|
|
SetOutputOrAppendFilePointer(fpOutFile, TRUE);
|
|
}
|
|
}
|
|
|
|
// Processing for append file.
|
|
|
|
if ( retCode == retOCode && bOpenOutInWriteMode == FALSE)
|
|
{
|
|
// FALSE for getting append file name.
|
|
_TCHAR* pszAppendFileName =
|
|
rParsedInfo.GetGlblSwitchesObject().GetOutputOrAppendFileName(
|
|
FALSE);
|
|
if ( pszAppendFileName != NULL )
|
|
{
|
|
if ( CloseAppendFile() == TRUE )
|
|
{
|
|
FILE* fpOpenAppendFile = _tfopen(pszAppendFileName, _T("a"));
|
|
if ( fpOpenAppendFile == NULL )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_OPEN_APPEND_FILE_FAILURE);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
else
|
|
{
|
|
// FALSE for setting append file pointer.
|
|
rParsedInfo.GetGlblSwitchesObject().
|
|
SetOutputOrAppendFilePointer(fpOpenAppendFile,
|
|
FALSE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return retCode;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ParseUnnamedParamList
|
|
Synopsis :Parses Unnamed Parameter list.
|
|
Type :Member Function
|
|
Input Parameter(s) :
|
|
rParsedInfo - reference to CParsedInfo class object.
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
Output Parameter(s) :
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE
|
|
Global Variables :None
|
|
Calling Syntax :ParseUnnamedParamList(cvTokens, theIterator,rParsedInfo);
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ParseUnnamedParamList(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo)
|
|
{
|
|
RETCODE retCode = PARSER_EXECCOMMAND;
|
|
|
|
while (TRUE)
|
|
{
|
|
if(!rParsedInfo.GetCmdSwitchesObject().
|
|
AddToPropertyList(*theIterator))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_ADD_TO_PROP_LIST_FAILURE);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
if (GetNextToken(cvTokens, theIterator))
|
|
{
|
|
if (IsOption(*theIterator))
|
|
{
|
|
// To facilitate ParseVerbSwitches to continue
|
|
theIterator--;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
// check for the presence of ','
|
|
if (CompareTokens(*theIterator, CLI_TOKEN_COMMA))
|
|
{
|
|
if (!GetNextToken(cvTokens, theIterator))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_PARAMLIST);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_INVALID_PARAMLIST);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
|
|
return retCode;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ValidateVerbOrMethodParams
|
|
Synopsis :Validates the named params with verb or method parameters.
|
|
Type :Member Function
|
|
Input Parameter(s) :
|
|
rParsedInfo - reference to CParsedInfo class object.
|
|
Output Parameter(s) :
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE
|
|
Global Variables :None
|
|
Calling Syntax :ValidateVerbOrMethodParams(rParsedInfo);
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ValidateVerbOrMethodParams(CParsedInfo& rParsedInfo)
|
|
{
|
|
RETCODE retCode = PARSER_EXECCOMMAND;
|
|
BSTRMAP::iterator theIterator;
|
|
PROPDETMAP::iterator propIterator;
|
|
// Info about verb or method params.
|
|
PROPDETMAP pdmVerbOrMethParams = (*(rParsedInfo.GetCmdSwitchesObject().
|
|
GetMethDetMap().begin())).second.Params;
|
|
|
|
BSTRMAP bmNamedParams = rParsedInfo.GetCmdSwitchesObject().
|
|
GetParameterMap();
|
|
|
|
for ( theIterator = bmNamedParams.begin();
|
|
theIterator != bmNamedParams.end(); theIterator++ )
|
|
{
|
|
BOOL bFind;
|
|
if ( rParsedInfo.GetCmdSwitchesObject().GetVerbType() == CMDLINE )
|
|
bFind = Find(pdmVerbOrMethParams,(*theIterator).first,
|
|
propIterator, TRUE);
|
|
else
|
|
bFind = Find(pdmVerbOrMethParams,(*theIterator).first,
|
|
propIterator);
|
|
|
|
if ( bFind == FALSE )
|
|
{
|
|
DisplayMessage((*theIterator).first, CP_OEMCP, TRUE, TRUE);
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_NOT_A_VERBORMETH_PARAM);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
else if ( (*propIterator).second.InOrOut != INP )
|
|
{
|
|
DisplayMessage((*theIterator).first, CP_OEMCP, TRUE, TRUE);
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_NOT_A_INPUT_PARAM);
|
|
retCode = PARSER_ERROR;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return retCode;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ParseParamsString
|
|
Synopsis :Parses the parameter string
|
|
Type :Member Function
|
|
Input Parameter(s) :
|
|
rParsedInfo - reference to CParsedInfo class object.
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
xdXSLTDet - reference to the XSLdetails vector
|
|
pszXSLFile - string type, XSL file name.
|
|
Output Parameter(s) :
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE
|
|
Global Variables :None
|
|
Calling Syntax :ParseParamsString(cvTokens, theIterator, rParsedInfo,
|
|
xdXSLTDet, pszXSLFile);
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ParseParamsString(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo,
|
|
XSLTDET& xdXSLTDet,
|
|
_TCHAR* pszXSLFile)
|
|
{
|
|
pszXSLFile = NULL;
|
|
RETCODE retCode = PARSER_EXECCOMMAND ;
|
|
|
|
try
|
|
{
|
|
if ( !GetNextToken(cvTokens, theIterator) )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_FORMAT);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
else if ( IsOption(*theIterator) )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_FORMAT);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
else
|
|
{
|
|
while ( retCode == PARSER_EXECCOMMAND )
|
|
{
|
|
|
|
_TCHAR* pszParam = NULL;
|
|
_TCHAR* pszParamValue = NULL;
|
|
|
|
pszParam = _tcstok(*theIterator,CLI_TOKEN_EQUALTO);
|
|
|
|
if(pszParam != NULL)
|
|
{
|
|
pszParamValue = _tcstok(NULL,CLI_TOKEN_EQUALTO);
|
|
if(pszParamValue != NULL)
|
|
{
|
|
_bstr_t bstrParam = pszParam;
|
|
_bstr_t bstrParamValue = pszParamValue;
|
|
if(IsOption(pszParamValue))
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_FORMAT);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
else
|
|
xdXSLTDet.ParamMap.insert(BSTRMAP::value_type(
|
|
bstrParam, bstrParamValue));
|
|
|
|
}
|
|
else
|
|
pszXSLFile = pszParam;
|
|
}
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().
|
|
SetErrataCode(IDS_E_INVALID_FORMAT);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
|
|
if ( retCode == PARSER_EXECCOMMAND )
|
|
{
|
|
if ( !GetNextToken(cvTokens, theIterator) )
|
|
break;
|
|
else if ( IsOption(*theIterator) )
|
|
break;
|
|
else if (CompareTokens(*theIterator, CLI_TOKEN_COMMA))
|
|
{
|
|
if ( theIterator + 1 == cvTokens.end() )
|
|
break;
|
|
else if ( theIterator + 2 == cvTokens.end() )
|
|
break;
|
|
else if ( pszParamValue == NULL )
|
|
break;
|
|
else
|
|
theIterator++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
retCode = PARSER_ERROR;
|
|
_com_issue_error(e.Error());
|
|
}
|
|
return retCode;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :ParseNodeListFile
|
|
Synopsis :Parses the node list file.
|
|
Type :Member Function
|
|
Input Parameter(s) :
|
|
rParsedInfo - reference to CParsedInfo class object.
|
|
cvTokens - the tokens vector
|
|
theIterator - the Iterator to the cvTokens vector.
|
|
Output Parameter(s) :
|
|
rParsedInfo - reference to CParsedInfo class object
|
|
Return Type :RETCODE
|
|
Global Variables :None
|
|
Calling Syntax :ParseNodeListFile(cvTokens, theIterator,rParsedInfo);
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
RETCODE CParserEngine::ParseNodeListFile(CHARVECTOR& cvTokens,
|
|
CHARVECTOR::iterator& theIterator,
|
|
CParsedInfo& rParsedInfo)
|
|
{
|
|
RETCODE retCode = PARSER_CONTINUE;
|
|
_TCHAR *pszTempFileName = (*theIterator+1);
|
|
_TCHAR *szNodeListFileName = new _TCHAR [BUFFER512];
|
|
if (szNodeListFileName == NULL)
|
|
_com_issue_error(WBEM_E_OUT_OF_MEMORY);
|
|
|
|
lstrcpy(szNodeListFileName, pszTempFileName);
|
|
UnQuoteString(szNodeListFileName);
|
|
FILE *fpNodeListFile =
|
|
_tfopen(szNodeListFileName, _T("rb"));
|
|
LONG lNumberOfInserts = 0;
|
|
CHARVECTOR::iterator itrVectorInCmdTkzr = NULL;
|
|
_TCHAR *pszComma = NULL;
|
|
_TCHAR *pszNode = NULL;
|
|
FILETYPE eftNodeFileType = ANSI_FILE;
|
|
char *pszFirstTwoBytes = NULL;
|
|
|
|
try
|
|
{
|
|
if ( fpNodeListFile != NULL )
|
|
{
|
|
Find(m_CmdTknzr.GetTokenVector(), *theIterator, itrVectorInCmdTkzr);
|
|
SAFEDELETE(*itrVectorInCmdTkzr);
|
|
itrVectorInCmdTkzr = m_CmdTknzr.GetTokenVector().erase(itrVectorInCmdTkzr);
|
|
|
|
// Remove @nodelistfile token from token vector.
|
|
theIterator = cvTokens.erase(theIterator);
|
|
|
|
// Indentifing the file type whether Unicode or ANSI.
|
|
pszFirstTwoBytes = new char[2];
|
|
fread(pszFirstTwoBytes, 2, 1, fpNodeListFile);
|
|
|
|
if ( memcmp(pszFirstTwoBytes, UNICODE_SIGNATURE, 2) == 0 )
|
|
{
|
|
eftNodeFileType = UNICODE_FILE;
|
|
}
|
|
else if (memcmp(pszFirstTwoBytes, UNICODE_BIGEND_SIGNATURE, 2) == 0 )
|
|
{
|
|
eftNodeFileType = UNICODE_BIGENDIAN_FILE;
|
|
}
|
|
else if( memcmp(pszFirstTwoBytes, UTF8_SIGNATURE, 2) == 0 )
|
|
{
|
|
eftNodeFileType = UTF8_FILE;
|
|
}
|
|
else
|
|
{
|
|
eftNodeFileType = ANSI_FILE;
|
|
fseek(fpNodeListFile, 0, SEEK_SET);
|
|
}
|
|
SAFEDELETE(pszFirstTwoBytes);
|
|
|
|
_TCHAR szNodeName[BUFFER512] = NULL_STRING;
|
|
|
|
if ( GetNodeFromNodeFile(fpNodeListFile, eftNodeFileType,
|
|
szNodeName) == FALSE )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_NODELISTFILE_EMPTY);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
else
|
|
{
|
|
BOOL bFirstTime = TRUE;
|
|
do
|
|
{
|
|
LONG lNodeStrLen = lstrlen(szNodeName);
|
|
if ( szNodeName[lNodeStrLen-1] == _T('\n') )
|
|
szNodeName[lNodeStrLen-1] = _T('\0');
|
|
|
|
CHString strRawNodeName(szNodeName);
|
|
strRawNodeName.TrimLeft();
|
|
strRawNodeName.TrimRight();
|
|
|
|
lstrcpy(szNodeName, strRawNodeName.GetBuffer(BUFFER512));
|
|
|
|
if ( szNodeName[0] != _T('#') &&
|
|
strRawNodeName.IsEmpty() == FALSE )
|
|
{
|
|
if ( bFirstTime == FALSE )
|
|
{
|
|
pszComma = new _TCHAR[lstrlen(
|
|
CLI_TOKEN_COMMA) + 1];
|
|
if (pszComma == NULL)
|
|
_com_issue_error(WBEM_E_OUT_OF_MEMORY);
|
|
|
|
lstrcpy(pszComma, CLI_TOKEN_COMMA);
|
|
theIterator = cvTokens.insert(theIterator, pszComma);
|
|
theIterator++;
|
|
itrVectorInCmdTkzr = m_CmdTknzr.GetTokenVector().
|
|
insert(itrVectorInCmdTkzr,
|
|
pszComma);
|
|
itrVectorInCmdTkzr++;
|
|
lNumberOfInserts++;
|
|
}
|
|
else
|
|
bFirstTime = FALSE;
|
|
|
|
lNodeStrLen = lstrlen(szNodeName);
|
|
|
|
pszNode = new _TCHAR[lNodeStrLen + 1];
|
|
if (pszNode == NULL)
|
|
_com_issue_error(WBEM_E_OUT_OF_MEMORY);
|
|
|
|
lstrcpy(pszNode, szNodeName);
|
|
|
|
theIterator = cvTokens.insert(theIterator, pszNode);
|
|
theIterator++;
|
|
itrVectorInCmdTkzr = m_CmdTknzr.GetTokenVector().insert(
|
|
itrVectorInCmdTkzr, pszNode);
|
|
itrVectorInCmdTkzr++;
|
|
lNumberOfInserts++;
|
|
}
|
|
}
|
|
while ( GetNodeFromNodeFile(fpNodeListFile, eftNodeFileType,
|
|
szNodeName) == TRUE );
|
|
|
|
if ( lNumberOfInserts == 0 )
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_NO_NODES_FOR_INSERTION);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
|
|
theIterator = theIterator - lNumberOfInserts;
|
|
}
|
|
|
|
fclose(fpNodeListFile);
|
|
}
|
|
else
|
|
{
|
|
rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
|
|
IDS_E_NODELISTFILE_OPEN_FAILURE);
|
|
retCode = PARSER_ERROR;
|
|
}
|
|
SAFEDELETE(szNodeListFileName);
|
|
}
|
|
catch(CHeap_Exception)
|
|
{
|
|
retCode = PARSER_ERROR;
|
|
SAFEDELETE(szNodeListFileName);
|
|
SAFEDELETE(pszFirstTwoBytes);
|
|
retCode = PARSER_ERROR;
|
|
_com_issue_error(WBEM_E_OUT_OF_MEMORY);
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
retCode = PARSER_ERROR;
|
|
SAFEDELETE(szNodeListFileName);
|
|
SAFEDELETE(pszComma);
|
|
SAFEDELETE(pszNode);
|
|
SAFEDELETE(pszFirstTwoBytes);
|
|
_com_issue_error(e.Error());
|
|
}
|
|
return retCode;
|
|
}
|
|
|
|
|
|
/*----------------------------------------------------------------------------
|
|
Name :GetNodeFromNodeFile
|
|
Synopsis :Retrieves the node list file.
|
|
Type :Member Function
|
|
Input Parameter(s) :
|
|
fpNodeListFile - pointer to File containing node list.
|
|
eftNodeFileType - Enum value specifing unicode or ANSI ....
|
|
Output Parameter(s) :
|
|
szNodeName - pointer to string specifing node to be returned.
|
|
Return Type :BOOL
|
|
Global Variables :None
|
|
Calling Syntax :GetNodeFromNodeFile(fpNodeListFile, eftNodeFileType,
|
|
szNodeName);
|
|
Notes :None
|
|
----------------------------------------------------------------------------*/
|
|
BOOL CParserEngine::GetNodeFromNodeFile(FILE* fpNodeListFile,
|
|
FILETYPE eftNodeFileType,
|
|
_TCHAR* szNodeName)
|
|
{
|
|
WCHAR wszNodeName[2] = L"";
|
|
char cszNodeName[2] = "";
|
|
_TCHAR szTemp[2] = NULL_STRING;
|
|
|
|
try
|
|
{
|
|
lstrcpy(szNodeName, NULL_STRING);
|
|
|
|
while( TRUE )
|
|
{
|
|
lstrcpy(szTemp, NULL_STRING);
|
|
|
|
if ( eftNodeFileType == UNICODE_FILE )
|
|
{
|
|
if ( fgetws(wszNodeName, 2, fpNodeListFile) != NULL )
|
|
{
|
|
lstrcpy(szTemp, (_TCHAR*)_bstr_t(wszNodeName));
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
else if ( eftNodeFileType == UNICODE_BIGENDIAN_FILE )
|
|
{
|
|
if ( fgetws(wszNodeName, 2, fpNodeListFile) != NULL )
|
|
{
|
|
BYTE HiByte = HIBYTE(wszNodeName[0]);
|
|
BYTE LowByte = LOBYTE(wszNodeName[0]);
|
|
wszNodeName[0] = MAKEWORD(HiByte, LowByte);
|
|
lstrcpy(szTemp, (_TCHAR*)_bstr_t(wszNodeName));
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
else if ( eftNodeFileType == UTF8_FILE )
|
|
{
|
|
if ( fgets(cszNodeName, 2, fpNodeListFile) != NULL )
|
|
{
|
|
MultiByteToWideChar(
|
|
CP_UTF8, // code page
|
|
0, // character-type options
|
|
cszNodeName, // string to map
|
|
2, // number of bytes in string
|
|
wszNodeName, // wide-character buffer
|
|
2 // size of buffer
|
|
);
|
|
lstrcpy(szTemp, (_TCHAR*)_bstr_t(wszNodeName));
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
if ( fgets(cszNodeName, 2, fpNodeListFile) != NULL )
|
|
{
|
|
lstrcpy(szTemp, (_TCHAR*)_bstr_t(cszNodeName));
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
|
|
if ( _tcscmp(szTemp, CLI_TOKEN_SPACE) == 0 ||
|
|
_tcscmp(szTemp, CLI_TOKEN_TAB) == 0 ||
|
|
_tcscmp(szTemp, CLI_TOKEN_SEMICOLON) == 0 ||
|
|
_tcscmp(szTemp, CLI_TOKEN_COMMA) == 0 ||
|
|
_tcscmp(szTemp, CLI_TOKEN_DOUBLE_QUOTE)== 0 ||
|
|
_tcscmp(szTemp, CLI_TOKEN_NEWLINE) == 0 )
|
|
{
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
lstrcat(szNodeName, szTemp);
|
|
}
|
|
}
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
_com_issue_error(e.Error());
|
|
}
|
|
|
|
return (!feof(fpNodeListFile) || _tcscmp(szNodeName, NULL_STRING));
|
|
}
|