309 lines
7.8 KiB
C
309 lines
7.8 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (C) 1996-2001 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
QL.H
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
Level 1 Syntax QL Parser
|
|||
|
|
|||
|
Implements the syntax described in QL.BNF. This translates the input
|
|||
|
into an RPN stream of tokens.
|
|||
|
|
|||
|
History:
|
|||
|
|
|||
|
raymcc 21-Jun-96 Created.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#ifndef _QL__H_
|
|||
|
#define _QL__H_
|
|||
|
|
|||
|
#include <wbemidl.h>
|
|||
|
#include <wbemint.h>
|
|||
|
#include <qllex.h>
|
|||
|
#include <corepol.h>
|
|||
|
#include <parmdefs.h>
|
|||
|
#include <stdio.h>
|
|||
|
#include <wmiutils.h>
|
|||
|
|
|||
|
class CPropertyName : public WBEM_PROPERTY_NAME
|
|||
|
{
|
|||
|
protected:
|
|||
|
long m_lAllocated;
|
|||
|
|
|||
|
void EnsureAllocated(long lElements);
|
|||
|
public:
|
|||
|
void Init();
|
|||
|
CPropertyName() {Init();}
|
|||
|
CPropertyName(const CPropertyName& Other);
|
|||
|
void operator=(const CPropertyName& Other);
|
|||
|
void operator=(const WBEM_PROPERTY_NAME& Other);
|
|||
|
BOOL operator==(const WBEM_PROPERTY_NAME& Other);
|
|||
|
|
|||
|
void Empty();
|
|||
|
~CPropertyName() {Empty();}
|
|||
|
|
|||
|
long GetNumElements() const {return m_lNumElements;}
|
|||
|
LPCWSTR GetStringAt(long lIndex) const;
|
|||
|
void AddElement(LPCWSTR wszElement);
|
|||
|
DELETE_ME LPWSTR GetText();
|
|||
|
};
|
|||
|
|
|||
|
class CQl1ParseSink
|
|||
|
{
|
|||
|
public:
|
|||
|
virtual void SetClassName(LPCWSTR wszClass) = 0;
|
|||
|
virtual void SetTolerance(const WBEM_QL1_TOLERANCE& Tolerance) = 0;
|
|||
|
virtual void AddToken(const WBEM_QL1_TOKEN& Token) = 0;
|
|||
|
virtual void AddProperty(const CPropertyName& Property) = 0;
|
|||
|
virtual void AddAllProperties() = 0;
|
|||
|
|
|||
|
virtual void SetAggregated() = 0;
|
|||
|
virtual void SetAggregationTolerance(const WBEM_QL1_TOLERANCE& Tolerance)= 0;
|
|||
|
virtual void AddAggregationProperty(const CPropertyName& Property) = 0;
|
|||
|
virtual void AddAllAggregationProperties() = 0;
|
|||
|
virtual void AddHavingToken(const WBEM_QL1_TOKEN& Token) = 0;
|
|||
|
|
|||
|
virtual void InOrder(long lOp){}
|
|||
|
};
|
|||
|
|
|||
|
class CAbstractQl1Parser
|
|||
|
{
|
|||
|
protected:
|
|||
|
// Controls keyword parsing in Next().
|
|||
|
// ===================================
|
|||
|
enum {
|
|||
|
NO_KEYWORDS = 0,
|
|||
|
ALL_KEYWORDS,
|
|||
|
EXCLUDE_GROUP_KEYWORD,
|
|||
|
EXCLUDE_EXPRESSION_KEYWORDS
|
|||
|
};
|
|||
|
|
|||
|
CQl1ParseSink* m_pSink;
|
|||
|
CGenLexer *m_pLexer;
|
|||
|
int m_nLine;
|
|||
|
wchar_t* m_pTokenText;
|
|||
|
int m_nCurrentToken;
|
|||
|
|
|||
|
// Semantic transfer variables.
|
|||
|
// ============================
|
|||
|
VARIANT m_vTypedConst;
|
|||
|
BOOL m_bQuoted;
|
|||
|
int m_nRelOp;
|
|||
|
DWORD m_dwConstFunction;
|
|||
|
DWORD m_dwPropFunction;
|
|||
|
CPropertyName m_PropertyName;
|
|||
|
BOOL m_bInAggregation;
|
|||
|
CPropertyName m_PropertyName2;
|
|||
|
BOOL m_bPropComp;
|
|||
|
|
|||
|
// Parsing functions.
|
|||
|
// ==================
|
|||
|
virtual BOOL Next(int nFlags = ALL_KEYWORDS);
|
|||
|
LPCWSTR GetSinglePropertyName();
|
|||
|
void DeletePropertyName();
|
|||
|
int FlipOperator(int nOp);
|
|||
|
void AddAppropriateToken(const WBEM_QL1_TOKEN& Token);
|
|||
|
|
|||
|
int parse_property_name(CPropertyName& Prop);
|
|||
|
|
|||
|
int parse(int nFlags);
|
|||
|
|
|||
|
int prop_list();
|
|||
|
int class_name();
|
|||
|
int tolerance();
|
|||
|
int opt_where();
|
|||
|
int expr();
|
|||
|
int property_name();
|
|||
|
int prop_list_2();
|
|||
|
int term();
|
|||
|
int expr2();
|
|||
|
int simple_expr();
|
|||
|
int term2();
|
|||
|
int leading_ident_expr();
|
|||
|
int finalize();
|
|||
|
int rel_operator();
|
|||
|
int equiv_operator();
|
|||
|
int comp_operator();
|
|||
|
int is_operator();
|
|||
|
int trailing_prop_expr();
|
|||
|
int trailing_prop_expr2();
|
|||
|
int trailing_or_null();
|
|||
|
int trailing_const_expr();
|
|||
|
int trailing_ident_expr();
|
|||
|
int unknown_func_expr();
|
|||
|
int typed_constant();
|
|||
|
int opt_aggregation();
|
|||
|
int aggregation_params();
|
|||
|
int aggregate_by();
|
|||
|
int aggregate_within();
|
|||
|
int opt_having();
|
|||
|
|
|||
|
static DWORD TranslateIntrinsic(LPCWSTR pFuncName);
|
|||
|
static void InitToken(WBEM_QL1_TOKEN* pToken);
|
|||
|
public:
|
|||
|
enum {
|
|||
|
SUCCESS = 0,
|
|||
|
SYNTAX_ERROR,
|
|||
|
LEXICAL_ERROR,
|
|||
|
FAILED,
|
|||
|
BUFFER_TOO_SMALL
|
|||
|
};
|
|||
|
|
|||
|
enum {
|
|||
|
FULL_PARSE = 0,
|
|||
|
NO_WHERE,
|
|||
|
JUST_WHERE
|
|||
|
};
|
|||
|
|
|||
|
CAbstractQl1Parser(CGenLexSource *pSrc);
|
|||
|
virtual ~CAbstractQl1Parser();
|
|||
|
|
|||
|
int Parse(CQl1ParseSink* pSink, int nFlags);
|
|||
|
|
|||
|
int CurrentLine() { return m_nLine; }
|
|||
|
LPWSTR CurrentToken() { return m_pTokenText; }
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
|
|||
|
struct QL_LEVEL_1_TOKEN
|
|||
|
{
|
|||
|
enum
|
|||
|
{
|
|||
|
OP_EXPRESSION = QL1_OP_EXPRESSION,
|
|||
|
TOKEN_AND = QL1_AND,
|
|||
|
TOKEN_OR = QL1_OR,
|
|||
|
TOKEN_NOT = QL1_NOT
|
|||
|
};
|
|||
|
enum
|
|||
|
{
|
|||
|
IFUNC_NONE = QL1_FUNCTION_NONE,
|
|||
|
IFUNC_UPPER = QL1_FUNCTION_UPPER,
|
|||
|
IFUNC_LOWER = QL1_FUNCTION_LOWER
|
|||
|
};
|
|||
|
|
|||
|
// If the field is a OP_EXPRESSION, then the following are used.
|
|||
|
enum
|
|||
|
{
|
|||
|
OP_EQUAL = QL1_OPERATOR_EQUALS,
|
|||
|
OP_NOT_EQUAL = QL1_OPERATOR_NOTEQUALS,
|
|||
|
OP_EQUALorGREATERTHAN = QL1_OPERATOR_GREATEROREQUALS,
|
|||
|
OP_EQUALorLESSTHAN = QL1_OPERATOR_LESSOREQUALS,
|
|||
|
OP_LESSTHAN = QL1_OPERATOR_LESS,
|
|||
|
OP_GREATERTHAN = QL1_OPERATOR_GREATER,
|
|||
|
OP_LIKE = QL1_OPERATOR_LIKE
|
|||
|
};
|
|||
|
|
|||
|
int nTokenType; // OP_EXPRESSION,TOKEN_AND, TOKEN_OR, TOKEN_NOT
|
|||
|
CPropertyName PropertyName;
|
|||
|
// Name of the property on which the operator is applied
|
|||
|
int nOperator; // Operator that is applied on property
|
|||
|
VARIANT vConstValue; // Value applied by operator
|
|||
|
BOOL bQuoted; // FALSE if the string should not have quotes around it.
|
|||
|
|
|||
|
CPropertyName PropertyName2; // Property to compare, if applicable.
|
|||
|
BOOL m_bPropComp; // TRUE if this is a property-to-property compare.
|
|||
|
|
|||
|
DWORD dwPropertyFunction; // 0=no instrinsic function applied
|
|||
|
DWORD dwConstFunction; // "
|
|||
|
|
|||
|
QL_LEVEL_1_TOKEN();
|
|||
|
QL_LEVEL_1_TOKEN(const QL_LEVEL_1_TOKEN&);
|
|||
|
~QL_LEVEL_1_TOKEN();
|
|||
|
QL_LEVEL_1_TOKEN& operator=(const QL_LEVEL_1_TOKEN &Src);
|
|||
|
QL_LEVEL_1_TOKEN& operator=(const WBEM_QL1_TOKEN &Src);
|
|||
|
|
|||
|
void Dump(FILE *);
|
|||
|
DELETE_ME LPWSTR GetText();
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
// Contains RPN version of expression.
|
|||
|
// ===================================
|
|||
|
|
|||
|
struct QL_LEVEL_1_RPN_EXPRESSION : public CQl1ParseSink
|
|||
|
{
|
|||
|
int nNumTokens;
|
|||
|
int nCurSize;
|
|||
|
QL_LEVEL_1_TOKEN *pArrayOfTokens;
|
|||
|
BSTR bsClassName;
|
|||
|
WBEM_QL1_TOLERANCE Tolerance;
|
|||
|
|
|||
|
int nNumberOfProperties; // Zero means all properties selected
|
|||
|
int nCurPropSize;
|
|||
|
BOOL bStar;
|
|||
|
CPropertyName *pRequestedPropertyNames;
|
|||
|
// Array of property names which values are to be returned if
|
|||
|
|
|||
|
BOOL bAggregated;
|
|||
|
WBEM_QL1_TOLERANCE AggregationTolerance;
|
|||
|
BOOL bAggregateAll;
|
|||
|
int nNumAggregatedProperties;
|
|||
|
int nCurAggPropSize;
|
|||
|
CPropertyName *pAggregatedPropertyNames;
|
|||
|
|
|||
|
int nNumHavingTokens;
|
|||
|
int nCurHavingSize;
|
|||
|
QL_LEVEL_1_TOKEN *pArrayOfHavingTokens;
|
|||
|
|
|||
|
long lRefCount;
|
|||
|
|
|||
|
QL_LEVEL_1_RPN_EXPRESSION();
|
|||
|
QL_LEVEL_1_RPN_EXPRESSION(const QL_LEVEL_1_RPN_EXPRESSION& Other);
|
|||
|
~QL_LEVEL_1_RPN_EXPRESSION();
|
|||
|
void AddRef();
|
|||
|
void Release();
|
|||
|
|
|||
|
void SetClassName(LPCWSTR wszName);
|
|||
|
void SetTolerance(const WBEM_QL1_TOLERANCE& Tolerance);
|
|||
|
void AddToken(const WBEM_QL1_TOKEN& Tok);
|
|||
|
void AddToken(const QL_LEVEL_1_TOKEN& Tok);
|
|||
|
void AddProperty(const CPropertyName& Prop);
|
|||
|
void AddAllProperties();
|
|||
|
|
|||
|
void SetAggregated();
|
|||
|
void SetAggregationTolerance(const WBEM_QL1_TOLERANCE& Tolerance);
|
|||
|
void AddAggregationProperty(const CPropertyName& Property);
|
|||
|
void AddAllAggregationProperties();
|
|||
|
void AddHavingToken(const WBEM_QL1_TOKEN& Tok);
|
|||
|
|
|||
|
void Dump(const char *pszTextFile);
|
|||
|
DELETE_ME LPWSTR GetText();
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
class QL1_Parser : public CAbstractQl1Parser
|
|||
|
{
|
|||
|
QL_LEVEL_1_RPN_EXPRESSION* m_pExpression;
|
|||
|
BOOL m_bPartiallyParsed;
|
|||
|
|
|||
|
public:
|
|||
|
QL1_Parser(CGenLexSource *pSrc);
|
|||
|
#undef ExportClass
|
|||
|
#define ExportClass SMSEXPORT
|
|||
|
~QL1_Parser();
|
|||
|
#undef ExportClass
|
|||
|
#define ExportClass SMSIMPORT
|
|||
|
|
|||
|
|
|||
|
int GetQueryClass(LPWSTR pBuf, int nBufSize);
|
|||
|
|
|||
|
int Parse(QL_LEVEL_1_RPN_EXPRESSION **pOutput);
|
|||
|
|
|||
|
HRESULT Parse(
|
|||
|
SWbemRpnEncodedQuery **pOutput
|
|||
|
);
|
|||
|
|
|||
|
static LPWSTR ReplaceClassName(QL_LEVEL_1_RPN_EXPRESSION* pExpr,
|
|||
|
LPCWSTR wszClassName);
|
|||
|
};
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
|