mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
161 lines
6.9 KiB
161 lines
6.9 KiB
//******************************************************************************
|
|
//
|
|
// ANALYSER.H
|
|
//
|
|
// Copyright (C) 1996-1999 Microsoft Corporation
|
|
//
|
|
//******************************************************************************
|
|
#ifndef __WBEM_ANALYSER__H_
|
|
#define __WBEM_ANALYSER__H_
|
|
|
|
#include "esscpol.h"
|
|
#include <stdio.h>
|
|
#include "wbemidl.h"
|
|
#include "wbemcomn.h"
|
|
#include "parmdefs.h"
|
|
#include "ql.h"
|
|
#include "eventrep.h"
|
|
#include "evaltree.h"
|
|
|
|
struct ESSCLI_POLARITY CClassInformation
|
|
{
|
|
IWbemClassObject* m_pClass;
|
|
LPWSTR m_wszClassName;
|
|
BOOL m_bIncludeChildren;
|
|
DWORD m_dwEventMask;
|
|
public:
|
|
CClassInformation()
|
|
{
|
|
m_wszClassName = NULL;
|
|
m_pClass = NULL;
|
|
}
|
|
CClassInformation(const CClassInformation& Other)
|
|
{
|
|
m_wszClassName = CloneWstr(Other.m_wszClassName);
|
|
if (!m_wszClassName)
|
|
throw CX_MemoryException();
|
|
m_pClass = Other.m_pClass;
|
|
if(m_pClass) m_pClass->AddRef();
|
|
m_bIncludeChildren = Other.m_bIncludeChildren;
|
|
m_dwEventMask = Other.m_dwEventMask;
|
|
}
|
|
|
|
~CClassInformation()
|
|
{
|
|
delete [] m_wszClassName;
|
|
if(m_pClass) m_pClass->Release();
|
|
}
|
|
};
|
|
|
|
class ESSCLI_POLARITY CClassInfoArray
|
|
{
|
|
protected:
|
|
BOOL m_bLimited;
|
|
CUniquePointerArray<CClassInformation>* m_pClasses;
|
|
|
|
public:
|
|
CClassInfoArray();
|
|
~CClassInfoArray();
|
|
BOOL IsLimited() {return m_bLimited;}
|
|
int GetNumClasses() {return m_pClasses->GetSize();}
|
|
INTERNAL CClassInformation* GetClass(int nIndex)
|
|
{return (*m_pClasses)[nIndex]; }
|
|
|
|
void SetLimited(BOOL bLimited) {m_bLimited = bLimited;}
|
|
bool operator=(CClassInfoArray& Other);
|
|
bool SetOne(LPCWSTR wszClass, BOOL bIncludeChildren);
|
|
void Clear() {m_bLimited = FALSE; m_pClasses->RemoveAll();}
|
|
bool AddClass(ACQUIRE CClassInformation* pInfo)
|
|
{return m_pClasses->Add(pInfo) >= 0;}
|
|
void RemoveClass(int nIndex) {m_pClasses->RemoveAt(nIndex);}
|
|
};
|
|
|
|
class ESSCLI_POLARITY CQueryAnalyser
|
|
{
|
|
public:
|
|
static HRESULT GetPossibleInstanceClasses(QL_LEVEL_1_RPN_EXPRESSION* pExpr,
|
|
CClassInfoArray*& paInfos);
|
|
static HRESULT GetDefiniteInstanceClasses(QL_LEVEL_1_RPN_EXPRESSION* pExpr,
|
|
CClassInfoArray*& paInfos);
|
|
static HRESULT GetLimitingQueryForInstanceClass(
|
|
IN QL_LEVEL_1_RPN_EXPRESSION* pExpr,
|
|
IN CClassInformation& Info,
|
|
OUT LPWSTR& wszQuery);
|
|
static HRESULT GetNecessaryQueryForProperty(
|
|
IN QL_LEVEL_1_RPN_EXPRESSION* pExpr,
|
|
IN CPropertyName& PropName,
|
|
DELETE_ME QL_LEVEL_1_RPN_EXPRESSION*& pNewExpr);
|
|
static HRESULT GetNecessaryQueryForClass(
|
|
IN QL_LEVEL_1_RPN_EXPRESSION* pExpr,
|
|
IWbemClassObject* pClass,
|
|
CWStringArray& awsOverriden,
|
|
DELETE_ME QL_LEVEL_1_RPN_EXPRESSION*& pNewExpr);
|
|
static BOOL CompareRequestedToProvided(
|
|
CClassInfoArray& aRequestedInstanceClasses,
|
|
CClassInfoArray& aProvidedInstanceClasses);
|
|
|
|
static HRESULT SimplifyQueryForChild(
|
|
IN QL_LEVEL_1_RPN_EXPRESSION* pExpr,
|
|
LPCWSTR wszClassName, IWbemClassObject* pClass,
|
|
CContextMetaData* pMeta,
|
|
DELETE_ME QL_LEVEL_1_RPN_EXPRESSION*& pNewExpr);
|
|
static HRESULT CanPointToClass(IWbemClassObject* pRefClass,
|
|
LPCWSTR wszPropName, LPCWSTR wszTargetClassName,
|
|
CContextMetaData* pMeta);
|
|
protected:
|
|
enum
|
|
{
|
|
e_Keep, e_True, e_False, e_Invalid
|
|
};
|
|
static HRESULT GetInstanceClasses(QL_LEVEL_1_TOKEN& Token,
|
|
CClassInfoArray& aInfos);
|
|
static HRESULT AndPossibleClassArrays(IN CClassInfoArray* paFirst,
|
|
IN CClassInfoArray* paSecond,
|
|
OUT CClassInfoArray* paNew);
|
|
static HRESULT OrPossibleClassArrays(IN CClassInfoArray* paFirst,
|
|
IN CClassInfoArray* paSecond,
|
|
OUT CClassInfoArray* paNew);
|
|
static HRESULT NegatePossibleClassArray(IN CClassInfoArray* paOrig,
|
|
OUT CClassInfoArray* paNew);
|
|
static HRESULT AndDefiniteClassArrays(IN CClassInfoArray* paFirst,
|
|
IN CClassInfoArray* paSecond,
|
|
OUT CClassInfoArray* paNew);
|
|
static HRESULT OrDefiniteClassArrays(IN CClassInfoArray* paFirst,
|
|
IN CClassInfoArray* paSecond,
|
|
OUT CClassInfoArray* paNew);
|
|
static HRESULT NegateDefiniteClassArray(IN CClassInfoArray* paOrig,
|
|
OUT CClassInfoArray* paNew);
|
|
static BOOL IsTokenAboutProperty(
|
|
IN QL_LEVEL_1_TOKEN& Token,
|
|
IN CPropertyName& PropName);
|
|
static void AppendQueryExpression(
|
|
IN QL_LEVEL_1_RPN_EXPRESSION* pDest,
|
|
IN QL_LEVEL_1_RPN_EXPRESSION* pSource);
|
|
static HRESULT AndQueryExpressions(
|
|
IN QL_LEVEL_1_RPN_EXPRESSION* pFirst,
|
|
IN QL_LEVEL_1_RPN_EXPRESSION* pSecond,
|
|
OUT QL_LEVEL_1_RPN_EXPRESSION* pNew);
|
|
static HRESULT OrQueryExpressions(
|
|
IN QL_LEVEL_1_RPN_EXPRESSION* pFirst,
|
|
IN QL_LEVEL_1_RPN_EXPRESSION* pSecond,
|
|
OUT QL_LEVEL_1_RPN_EXPRESSION* pNew);
|
|
static HRESULT NegateQueryExpression(
|
|
IN QL_LEVEL_1_RPN_EXPRESSION* pExpr,
|
|
OUT QL_LEVEL_1_RPN_EXPRESSION* pNewExpr);
|
|
static int SimplifyTokenForChild(QL_LEVEL_1_TOKEN& Token,
|
|
LPCWSTR wszClass, IWbemClassObject* pClass,
|
|
CContextMetaData* pMeta);
|
|
static BOOL ValidateSQLDateTime(LPCWSTR wszDateTime);
|
|
static HRESULT GetPropertiesThatMustDiffer(
|
|
IN QL_LEVEL_1_RPN_EXPRESSION* pExpr,
|
|
IN CClassInformation& Info,
|
|
CWStringArray& wsProperties);
|
|
static BOOL IsTokenAboutClass(QL_LEVEL_1_TOKEN& Token,
|
|
IWbemClassObject* pClass,
|
|
CWStringArray& awsOverriden);
|
|
static BOOL IsPropertyInClass(CPropertyName& Prop,
|
|
IWbemClassObject* pClass,
|
|
CWStringArray& awsOverriden);
|
|
};
|
|
|
|
#endif
|