windows-nt/Source/XPSP1/NT/admin/wmi/wbem/winmgmt/wbemcomn/ql.h
2020-09-26 16:20:57 +08:00

311 lines
8.3 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:
a-raymcc, a-tomasp 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>
class POLARITY CPropertyName : public WBEM_PROPERTY_NAME
{
protected:
long m_lAllocated;
void* m_pvHandle;
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();
//
// for convienience, a prop handle can be stored with this struct. example
// of such a handle is the one used for fast access to properties on wbem
// class objects. The handle is not used in any way by this implementation
// but will be treated as a regular member var in that it will be nulled,
// copied, etc..
//
void* GetHandle() { return m_pvHandle; }
void SetHandle( void* pvHandle ) { m_pvHandle = pvHandle; }
};
class POLARITY 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 SetCountQuery() = 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 POLARITY 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,
OUT_OF_MEMORY
};
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 POLARITY 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,
OP_UNLIKE = QL1_OPERATOR_UNLIKE
};
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 POLARITY 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;
BOOL bCount;
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 SetCountQuery();
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 POLARITY QL1_Parser : public CAbstractQl1Parser
{
QL_LEVEL_1_RPN_EXPRESSION* m_pExpression;
BOOL m_bPartiallyParsed;
public:
QL1_Parser(CGenLexSource *pSrc);
~QL1_Parser();
int GetQueryClass(LPWSTR pBuf, int nBufSize);
int Parse(QL_LEVEL_1_RPN_EXPRESSION **pOutput);
static LPWSTR ReplaceClassName(QL_LEVEL_1_RPN_EXPRESSION* pExpr,
LPCWSTR wszClassName);
};
#endif