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

290 lines
7.9 KiB
C++

/*++
Copyright (C) 1996-1999 Microsoft Corporation
Module Name:
TWOPROPNODE.H
Abstract:
Two Prop Node
History:
--*/
// classes to support a two-property node for the eval tree
// this will be much like the CPropertyNode defined in EvalTree.h
// but it will compare a property against another property
// rather than a property to a constant
#ifndef _WBEM_TWOPROPNODE_H_
#define _WBEM_TWOPROPNODE_H_
#include "EvalTree.h"
// virtual base class, good stuff derives from this
class CTwoPropNode : public CPropertyNode
{
public:
// various methods to create a new thingie.
CTwoPropNode() : m_lRightPropHandle(-1), m_pRightInfo(NULL)
{}
CTwoPropNode(const CTwoPropNode& Other, BOOL bChildren = TRUE)
: CPropertyNode(Other, bChildren), m_lRightPropHandle(Other.m_lRightPropHandle)
{
if (Other.m_pRightInfo)
m_pRightInfo = new CEmbeddingInfo(*(Other.m_pRightInfo));
else
m_pRightInfo = NULL;
}
virtual CTwoPropNode* CloneSelfWithoutChildren() const =0;
// evaluate
virtual int SubCompare(CEvalNode* pNode);
// integrating and combining into tree structure
void SetRightPropertyInfo(LPCWSTR wszRightPropName, long lRightPropHandle);
virtual int ComparePrecedence(CBranchingNode* pOther);
HRESULT OptimizeSelf(void);
HRESULT SetTest(VARIANT& v);
// Right-side embedding info access
void SetRightEmbeddingInfo(const CEmbeddingInfo* pInfo);
HRESULT GetRightContainerObject(CObjectInfo& ObjInfo,
INTERNAL _IWmiObject** ppInst);
HRESULT CompileRightEmbeddingPortion(CContextMetaData* pNamespace,
CImplicationList& Implications,
_IWmiObject** ppResultClass);
void SetRightEmbeddedObjPropName(CPropertyName& Name);
void MixInJumpsRightObj(const CEmbeddingInfo* pParent);
CPropertyName* GetRightEmbeddedObjPropName();
// any or all embedding info
HRESULT AdjustCompile(CContextMetaData* pNamespace,
CImplicationList& Implications);
// debugging
virtual void Dump(FILE* f, int nOffset);
// property access
CVar* GetPropVariant(_IWmiObject* pObj, long lHandle, CIMTYPE* pct);
protected:
// order is important: must match the way the branches array is constructed
enum Operations {LT, EQ, GT, NOperations};
// the right hand property we hold onto,
// we inherit the left hand prop from CPropertyNode
// we will assume that we always can write something akin to:
// Prop < RightProp
// at merge time, must take a RightProp < Prop
// and turn it into: Prop >= RightProp
long m_lRightPropHandle;
CEmbeddingInfo* m_pRightInfo;
virtual HRESULT CombineBranchesWith(CBranchingNode* pArg2, int nOp,
CContextMetaData* pNamespace,
CImplicationList& Implications,
bool bDeleteThis, bool bDeleteArg2,
CEvalNode** ppRes);
private:
};
template<class TPropType>
class TTwoScalarPropNode : public CTwoPropNode
{
public:
TTwoScalarPropNode() {}
TTwoScalarPropNode(const CTwoPropNode& Other, BOOL bChildren = TRUE) :
CTwoPropNode(Other, bChildren)
{}
virtual CEvalNode* Clone() const;
virtual CTwoPropNode* CloneSelfWithoutChildren() const;
virtual HRESULT Evaluate(CObjectInfo& ObjInfo,
INTERNAL CEvalNode** ppNext);
// type identification
virtual long GetSubType();
};
class CTwoStringPropNode : public CTwoPropNode
{
public:
CTwoStringPropNode() {}
CTwoStringPropNode(const CTwoPropNode& Other, BOOL bChildren = TRUE) :
CTwoPropNode(Other, bChildren)
{}
virtual CEvalNode* Clone() const;
virtual CTwoPropNode* CloneSelfWithoutChildren() const;
// type identification
virtual long GetSubType();
virtual HRESULT Evaluate(CObjectInfo& ObjInfo,
INTERNAL CEvalNode** ppNext);
};
class CTwoMismatchedPropNode : public CTwoPropNode
{
public:
CTwoMismatchedPropNode() {}
CTwoMismatchedPropNode(const CTwoPropNode& Other, BOOL bChildren = TRUE) :
CTwoPropNode(Other, bChildren)
{}
virtual HRESULT Evaluate(CObjectInfo& ObjInfo, INTERNAL CEvalNode** ppNext);
protected:
virtual HRESULT Evaluate(CVar *pLeftVar, CVar *pRightVar, INTERNAL CEvalNode** ppNext) = 0;
};
class CTwoMismatchedIntNode : public CTwoMismatchedPropNode
{
public:
CTwoMismatchedIntNode() {}
CTwoMismatchedIntNode(const CTwoPropNode& Other, BOOL bChildren = TRUE) :
CTwoMismatchedPropNode(Other, bChildren)
{}
virtual CEvalNode* Clone() const;
virtual CTwoPropNode* CloneSelfWithoutChildren() const;
// type identification
virtual long GetSubType();
protected:
virtual HRESULT Evaluate(CVar *pLeftVar, CVar *pRightVar, INTERNAL CEvalNode** ppNext);
};
// TODO: when COM catches up with us, support INT64's as numeric types
// right now, we store & m anipulate them as strings
class CTwoMismatchedInt64Node : public CTwoMismatchedPropNode
{
public:
CTwoMismatchedInt64Node() {}
CTwoMismatchedInt64Node(const CTwoPropNode& Other, BOOL bChildren = TRUE) :
CTwoMismatchedPropNode(Other, bChildren)
{}
virtual CEvalNode* Clone() const;
virtual CTwoPropNode* CloneSelfWithoutChildren() const;
// type identification
virtual long GetSubType();
protected:
virtual HRESULT Evaluate(CVar *pLeftVar, CVar *pRightVar, INTERNAL CEvalNode** ppNext);
};
class CTwoMismatchedFloatNode : public CTwoMismatchedPropNode
{
public:
CTwoMismatchedFloatNode() {}
CTwoMismatchedFloatNode(const CTwoPropNode& Other, BOOL bChildren = TRUE) :
CTwoMismatchedPropNode(Other, bChildren)
{}
virtual CEvalNode* Clone() const;
virtual CTwoPropNode* CloneSelfWithoutChildren() const;
// type identification
virtual long GetSubType();
protected:
virtual HRESULT Evaluate(CVar *pLeftVar, CVar *pRightVar, INTERNAL CEvalNode** ppNext);
};
class CTwoMismatchedUIntNode : public CTwoMismatchedPropNode
{
public:
CTwoMismatchedUIntNode() {}
CTwoMismatchedUIntNode(const CTwoPropNode& Other, BOOL bChildren = TRUE) :
CTwoMismatchedPropNode(Other, bChildren)
{}
virtual CEvalNode* Clone() const;
virtual CTwoPropNode* CloneSelfWithoutChildren() const;
// type identification
virtual long GetSubType();
protected:
virtual HRESULT Evaluate(CVar *pLeftVar, CVar *pRightVar, INTERNAL CEvalNode** ppNext);
};
// TODO: when COM catches up with us, support INT64's as numeric types
// right now, we store & manipulate them as strings
class CTwoMismatchedUInt64Node : public CTwoMismatchedPropNode
{
public:
CTwoMismatchedUInt64Node() {}
CTwoMismatchedUInt64Node(const CTwoPropNode& Other, BOOL bChildren = TRUE) :
CTwoMismatchedPropNode(Other, bChildren)
{}
virtual CEvalNode* Clone() const;
virtual CTwoPropNode* CloneSelfWithoutChildren() const;
// type identification
virtual long GetSubType();
protected:
virtual HRESULT Evaluate(CVar *pLeftVar, CVar *pRightVar, INTERNAL CEvalNode** ppNext);
};
class CTwoMismatchedStringNode : public CTwoMismatchedPropNode
{
public:
CTwoMismatchedStringNode() {}
CTwoMismatchedStringNode(const CTwoPropNode& Other, BOOL bChildren = TRUE) :
CTwoMismatchedPropNode(Other, bChildren)
{}
virtual CEvalNode* Clone() const;
virtual CTwoPropNode* CloneSelfWithoutChildren() const;
// type identification
virtual long GetSubType();
protected:
virtual HRESULT Evaluate(CVar *pLeftVar, CVar *pRightVar, INTERNAL CEvalNode** ppNext);
};
#include "TwoPropNode.inl"
#endif _WBEM_TWOPROPNODE_H_