Leaked source code of windows server 2003
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.
 
 
 
 
 
 

1908 lines
35 KiB

// (C) 1999-2001 Microsoft Corporation
#ifndef __DNF_TREE_H
#define __DNF_TREE_H
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
#include <stdio.h>
#include <wmiutils.h>
#include <strutils.h>
#include "ProvTree.h"
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
enum WmiTriState
{
State_False = 0 ,
State_True = 1 ,
State_Error = 0xFFFFFFFF
} ;
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
#define TypeId_WmiOrNode 1
#define TypeId_WmiAndNode 2
#define TypeId_WmiNotNode 3
#define TypeId_WmiOperatorNode 4
#define TypeId_WmiOperatorEqualNode 5
#define TypeId_WmiOperatorNotEqualNode 6
#define TypeId_WmiOperatorEqualOrGreaterNode 7
#define TypeId_WmiOperatorEqualOrLessNode 8
#define TypeId_WmiOperatorGreaterNode 9
#define TypeId_WmiOperatorLessNode 10
#define TypeId_WmiOperatorLikeNode 11
#define TypeId_WmiOperatorNotLikeNode 12
#define TypeId_WmiOperatorIsANode 13
#define TypeId_WmiOperatorNotIsANode 14
#define TypeId_WmiValueNode 15
#define TypeId_WmiSignedIntegerNode 16
#define TypeId_WmiUnsignedIntegerNode 17
#define TypeId_WmiStringNode 18
#define TypeId_WmiNullNode 19
#define TypeId_WmiRangeNode 20
#define TypeId_WmiUnsignedIntegerRangeNode 21
#define TypeId_WmiSignedIntegerRangeNode 22
#define TypeId_WmiStringRangeNode 23
#define TypeId_WmiNullRangeNode 24
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
class WmiOrNode : public WmiTreeNode
{
private:
protected:
public:
WmiOrNode (
WmiTreeNode *a_Left = NULL ,
WmiTreeNode *a_Right = NULL ,
WmiTreeNode *a_Parent = NULL
) : WmiTreeNode ( TypeId_WmiOrNode , NULL , a_Left , a_Right , a_Parent ) {}
~WmiOrNode () ;
WmiTreeNode *Copy () ;
void Print () ;
} ;
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
class WmiAndNode : public WmiTreeNode
{
private:
protected:
public:
WmiAndNode (
WmiTreeNode *a_Left = NULL ,
WmiTreeNode *a_Right = NULL ,
WmiTreeNode *a_Parent = NULL
) : WmiTreeNode ( TypeId_WmiAndNode , NULL , a_Left , a_Right , a_Parent ) {}
~WmiAndNode () ;
WmiTreeNode *Copy () ;
void Print () ;
} ;
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
class WmiNotNode : public WmiTreeNode
{
private:
protected:
public:
WmiNotNode (
WmiTreeNode *a_Node = NULL ,
WmiTreeNode *a_Parent = NULL
) : WmiTreeNode ( TypeId_WmiNotNode , NULL , a_Node , NULL , a_Parent ) {}
~WmiNotNode () ;
WmiTreeNode *Copy () ;
void Print () ;
} ;
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
class WmiRangeNode ;
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
class WmiOperatorNode : public WmiTreeNode
{
private:
protected:
public:
WmiOperatorNode (
TypeId_TreeNode a_Type ,
WmiTreeNode *a_Node = NULL ,
WmiTreeNode *a_Parent = NULL
) : WmiTreeNode ( a_Type , NULL , a_Node , NULL , a_Parent ) {}
~WmiOperatorNode () {} ;
virtual WmiTriState GetRange (WmiRangeNode *&) = 0 ;
} ;
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
class WmiOperatorEqualNode : public WmiOperatorNode
{
private:
protected:
public:
WmiOperatorEqualNode (
WmiTreeNode *a_Node = NULL ,
WmiTreeNode *a_Parent = NULL
) : WmiOperatorNode ( TypeId_WmiOperatorEqualNode , a_Node , a_Parent ) {}
~WmiOperatorEqualNode () ;
WmiTreeNode *Copy () ;
WmiTriState GetRange (WmiRangeNode *&) ;
void Print () ;
} ;
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
class WmiOperatorNotEqualNode : public WmiOperatorNode
{
private:
protected:
public:
WmiOperatorNotEqualNode (
WmiTreeNode *a_Node = NULL ,
WmiTreeNode *a_Parent = NULL
) : WmiOperatorNode ( TypeId_WmiOperatorNotEqualNode , a_Node , a_Parent ) {}
~WmiOperatorNotEqualNode () ;
WmiTreeNode *Copy () ;
WmiTriState GetRange (WmiRangeNode *& a_Range ) { a_Range = 0; return ::State_True; }
void Print () ;
} ;
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
class WmiOperatorEqualOrGreaterNode : public WmiOperatorNode
{
private:
protected:
public:
WmiOperatorEqualOrGreaterNode (
WmiTreeNode *a_Node = NULL ,
WmiTreeNode *a_Parent = NULL
) : WmiOperatorNode ( TypeId_WmiOperatorEqualOrGreaterNode , a_Node , a_Parent ) {}
~WmiOperatorEqualOrGreaterNode () ;
WmiTreeNode *Copy () ;
WmiTriState GetRange (WmiRangeNode *&) ;
void Print () ;
} ;
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
class WmiOperatorEqualOrLessNode : public WmiOperatorNode
{
private:
protected:
public:
WmiOperatorEqualOrLessNode (
WmiTreeNode *a_Node = NULL ,
WmiTreeNode *a_Parent = NULL
) : WmiOperatorNode ( TypeId_WmiOperatorEqualOrLessNode , a_Node , a_Parent ) {}
~WmiOperatorEqualOrLessNode () ;
WmiTreeNode *Copy () ;
WmiTriState GetRange (WmiRangeNode *&) ;
void Print () ;
} ;
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
class WmiOperatorGreaterNode : public WmiOperatorNode
{
private:
protected:
public:
WmiOperatorGreaterNode (
WmiTreeNode *a_Node = NULL ,
WmiTreeNode *a_Parent = NULL
) : WmiOperatorNode ( TypeId_WmiOperatorGreaterNode , a_Node , a_Parent ) {}
~WmiOperatorGreaterNode () ;
WmiTreeNode *Copy () ;
WmiTriState GetRange (WmiRangeNode *&) ;
void Print () ;
} ;
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
class WmiOperatorLessNode : public WmiOperatorNode
{
private:
protected:
public:
WmiOperatorLessNode (
WmiTreeNode *a_Node = NULL ,
WmiTreeNode *a_Parent = NULL
) : WmiOperatorNode ( TypeId_WmiOperatorLessNode , a_Node , a_Parent ) {}
~WmiOperatorLessNode () ;
WmiTreeNode *Copy () ;
WmiTriState GetRange (WmiRangeNode *&) ;
void Print () ;
} ;
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
class WmiOperatorLikeNode : public WmiOperatorNode
{
private:
protected:
public:
WmiOperatorLikeNode (
WmiTreeNode *a_Node = NULL ,
WmiTreeNode *a_Parent = NULL
) : WmiOperatorNode ( TypeId_WmiOperatorLikeNode , a_Node , a_Parent ) {}
~WmiOperatorLikeNode () ;
WmiTreeNode *Copy () ;
WmiTriState GetRange (WmiRangeNode *&) ;
void Print () ;
} ;
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
class WmiOperatorNotLikeNode : public WmiOperatorNode
{
private:
protected:
public:
WmiOperatorNotLikeNode (
WmiTreeNode *a_Node = NULL ,
WmiTreeNode *a_Parent = NULL
) : WmiOperatorNode ( TypeId_WmiOperatorNotLikeNode , a_Node , a_Parent ) {}
~WmiOperatorNotLikeNode () ;
WmiTreeNode *Copy () ;
WmiTriState GetRange (WmiRangeNode *&) ;
void Print () ;
} ;
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
class WmiOperatorIsANode : public WmiOperatorNode
{
private:
protected:
public:
WmiOperatorIsANode (
WmiTreeNode *a_Node = NULL ,
WmiTreeNode *a_Parent = NULL
) : WmiOperatorNode ( TypeId_WmiOperatorIsANode , a_Node , a_Parent ) {}
~WmiOperatorIsANode () ;
WmiTreeNode *Copy () ;
WmiTriState GetRange (WmiRangeNode *&) ;
void Print () ;
} ;
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
class WmiOperatorNotIsANode : public WmiOperatorNode
{
private:
protected:
public:
WmiOperatorNotIsANode (
WmiTreeNode *a_Node = NULL ,
WmiTreeNode *a_Parent = NULL
) : WmiOperatorNode ( TypeId_WmiOperatorNotIsANode , a_Node , a_Parent ) {}
~WmiOperatorNotIsANode () ;
WmiTreeNode *Copy () ;
WmiTriState GetRange (WmiRangeNode *&) ;
void Print () ;
} ;
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
class WmiValueNode : public WmiTreeNode
{
public:
enum WmiValueFunction
{
Function_None = 0 ,
Function_Upper = 1 ,
Function_Lower = 2
} ;
private:
protected:
BSTR m_PropertyName ;
ULONG m_Index ;
WmiValueFunction m_PropertyFunction ;
WmiValueFunction m_ConstantFunction ;
public:
WmiValueNode (
TypeId_TreeNode a_Type ,
BSTR a_PropertyName ,
WmiValueFunction a_PropertyFunction ,
WmiValueFunction a_ConstantFunction ,
ULONG a_Index ,
WmiTreeNode *a_Parent = NULL
) : WmiTreeNode ( a_Type , NULL , NULL , NULL , a_Parent ) ,
m_PropertyFunction ( a_PropertyFunction ) ,
m_ConstantFunction ( a_ConstantFunction ) ,
m_Index ( a_Index )
{
if ( a_PropertyName )
{
m_PropertyName = SysAllocString ( a_PropertyName ) ;
SetValid(m_PropertyName != NULL);
}
else
{
m_PropertyName = NULL ;
}
}
~WmiValueNode ()
{
SysFreeString ( m_PropertyName ) ;
}
BSTR GetPropertyName ()
{
return m_PropertyName ;
}
ULONG GetIndex () { return m_Index ; }
WmiValueNode :: WmiValueFunction GetPropertyFunction ()
{
return m_PropertyFunction ;
}
WmiValueNode :: WmiValueFunction GetConstantFunction ()
{
return m_ConstantFunction ;
}
LONG ComparePropertyName ( WmiValueNode &a_ValueNode )
{
if ( m_Index < a_ValueNode.m_Index )
{
return -1 ;
}
else if ( m_Index > a_ValueNode.m_Index )
{
return 1 ;
}
else
{
return _wcsicmp ( m_PropertyName , a_ValueNode.m_PropertyName ) ;
}
}
} ;
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
class WmiSignedIntegerNode : public WmiValueNode
{
private:
protected:
LONG m_Integer ;
public:
WmiSignedIntegerNode (
BSTR a_PropertyName ,
LONG a_Integer ,
ULONG a_Index ,
WmiTreeNode *a_Parent = NULL
) : WmiValueNode (
TypeId_WmiSignedIntegerNode ,
a_PropertyName ,
Function_None ,
Function_None ,
a_Index ,
a_Parent
) , m_Integer ( a_Integer )
{
}
WmiTreeNode *Copy () ;
BOOL LexicographicallyBefore ( LONG &a_Integer )
{
if ( m_Integer == 0x80000000 )
{
return FALSE ;
}
else
{
a_Integer = m_Integer - 1 ;
return TRUE ;
}
}
BOOL LexicographicallyAfter ( LONG &a_Integer )
{
if ( m_Integer == 0x7FFFFFFF )
{
return FALSE ;
}
else
{
a_Integer = m_Integer + 1 ;
return TRUE ;
}
}
LONG GetValue ()
{
return m_Integer ;
}
void Print () ;
} ;
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
class WmiUnsignedIntegerNode : public WmiValueNode
{
private:
protected:
ULONG m_Integer ;
public:
WmiUnsignedIntegerNode (
BSTR a_PropertyName ,
ULONG a_Integer ,
ULONG a_Index ,
WmiTreeNode *a_Parent = NULL
) : WmiValueNode (
TypeId_WmiUnsignedIntegerNode ,
a_PropertyName ,
Function_None ,
Function_None ,
a_Index ,
a_Parent
) , m_Integer ( a_Integer )
{
}
WmiTreeNode *Copy () ;
BOOL LexicographicallyBefore ( ULONG &a_Integer )
{
if ( m_Integer == 0 )
{
return FALSE ;
}
else
{
a_Integer = m_Integer - 1 ;
return TRUE ;
}
}
BOOL LexicographicallyAfter ( ULONG &a_Integer )
{
if ( m_Integer == 0xFFFFFFFF )
{
return FALSE ;
}
else
{
a_Integer = m_Integer + 1 ;
return TRUE ;
}
}
ULONG GetValue ()
{
return m_Integer ;
}
void Print () ;
} ;
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
class WmiStringNode : public WmiValueNode
{
private:
protected:
BSTR m_String ;
public:
WmiStringNode (
BSTR a_PropertyName ,
BSTR a_String ,
WmiValueNode :: WmiValueFunction a_PropertyFunction ,
WmiValueNode :: WmiValueFunction a_ConstantFunction ,
ULONG a_Index ,
WmiTreeNode *a_Parent = NULL
) : WmiValueNode (
TypeId_WmiStringNode ,
a_PropertyName ,
a_PropertyFunction ,
Function_None ,
a_Index ,
a_Parent
)
{
if ( a_String )
{
ULONG t_StringLength = wcslen ( a_String ) ;
m_String = SysAllocString ( a_String) ;
if (!m_String)
{
SetValid(false);
return;
}
if ( a_ConstantFunction == Function_Upper || a_ConstantFunction == Function_Upper)
{
for ( ULONG t_Index = 0 ; t_Index < t_StringLength ; t_Index ++ )
{
m_String [ t_Index ] = wbem_towlower ( a_String [ t_Index ] ) ;
}
}
}
else
{
m_String = NULL ;
}
}
~WmiStringNode ()
{
if ( m_String )
{
SysFreeString ( m_String ) ;
}
} ;
WmiTreeNode *Copy () ;
BSTR GetValue ()
{
return m_String ;
}
void Print () ;
} ;
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
class WmiNullNode : public WmiValueNode
{
private:
protected:
public:
WmiNullNode (
BSTR a_PropertyName ,
ULONG a_Index ,
WmiTreeNode *a_Parent = NULL
) : WmiValueNode (
TypeId_WmiNullNode ,
a_PropertyName ,
Function_None ,
Function_None ,
a_Index ,
a_Parent
)
{
}
WmiTreeNode *Copy () ;
void Print () ;
} ;
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
class WmiRangeNode : public WmiTreeNode
{
private:
protected:
BSTR m_PropertyName ;
ULONG m_Index ;
BOOL m_InfiniteLowerBound ;
BOOL m_InfiniteUpperBound ;
BOOL m_LowerBoundClosed;
BOOL m_UpperBoundClosed;
public:
LONG ComparePropertyName ( WmiRangeNode &a_RangeNode )
{
if ( m_Index < a_RangeNode.m_Index )
{
return -1 ;
}
else if ( m_Index > a_RangeNode.m_Index )
{
return 1 ;
}
else
{
return _wcsicmp ( m_PropertyName , a_RangeNode.m_PropertyName ) ;
}
}
public:
WmiRangeNode (
TypeId_TreeNode a_Type ,
BSTR a_PropertyName ,
ULONG a_Index ,
BOOL a_InfiniteLowerBound ,
BOOL a_InfiniteUpperBound ,
BOOL a_LowerBoundClosed ,
BOOL a_UpperBoundClosed ,
WmiTreeNode *a_NextNode = NULL ,
WmiTreeNode *a_Parent = NULL
) : WmiTreeNode ( a_Type , NULL , NULL , a_NextNode , a_Parent ),
m_InfiniteLowerBound ( a_InfiniteLowerBound ) ,
m_InfiniteUpperBound ( a_InfiniteUpperBound ) ,
m_LowerBoundClosed ( a_LowerBoundClosed ) ,
m_UpperBoundClosed ( a_UpperBoundClosed ) ,
m_Index ( a_Index )
{
if ( a_PropertyName )
{
m_PropertyName = SysAllocString ( a_PropertyName ) ;
SetValid(m_PropertyName != NULL);
}
else
{
m_PropertyName = NULL ;
}
} ;
~WmiRangeNode ()
{
if ( m_PropertyName )
{
SysFreeString ( m_PropertyName ) ;
}
} ;
BSTR GetPropertyName ()
{
return m_PropertyName ;
}
ULONG GetIndex () { return m_Index ; }
BOOL InfiniteLowerBound () { return m_InfiniteLowerBound ; }
BOOL InfiniteUpperBound () { return m_InfiniteUpperBound ; }
BOOL ClosedLowerBound () { return m_LowerBoundClosed ; }
BOOL ClosedUpperBound () { return m_UpperBoundClosed ; }
} ;
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
class WmiUnsignedIntegerRangeNode : public WmiRangeNode
{
private:
protected:
ULONG m_LowerBound ;
ULONG m_UpperBound ;
public:
WmiTreeNode *Copy () ;
WmiTriState GetIntersectingRange (
WmiUnsignedIntegerRangeNode &a_Range ,
WmiUnsignedIntegerRangeNode *&a_Intersection
) ;
WmiTriState GetOverlappingRange (
WmiUnsignedIntegerRangeNode &a_Range ,
WmiUnsignedIntegerRangeNode *&a_Intersection
) ;
public:
WmiUnsignedIntegerRangeNode (
BSTR a_PropertyName ,
ULONG a_Index ,
BOOL a_InfiniteLowerBound ,
BOOL a_InfiniteUpperBound ,
BOOL a_LowerBoundClosed ,
BOOL a_UpperBoundClosed ,
ULONG a_LowerBound ,
ULONG a_UpperBound ,
WmiTreeNode *a_NextNode = NULL ,
WmiTreeNode *a_Parent = NULL
) : WmiRangeNode (
TypeId_WmiUnsignedIntegerRangeNode ,
a_PropertyName ,
a_Index ,
a_InfiniteLowerBound ,
a_InfiniteUpperBound ,
a_LowerBoundClosed ,
a_UpperBoundClosed ,
a_NextNode ,
a_Parent
) ,
m_LowerBound ( a_LowerBound ) ,
m_UpperBound ( a_UpperBound )
{
}
ULONG LowerBound () { return m_LowerBound ; }
ULONG UpperBound () { return m_UpperBound ; }
void Print () ;
} ;
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
class WmiSignedIntegerRangeNode : public WmiRangeNode
{
private:
protected:
LONG m_LowerBound ;
LONG m_UpperBound ;
public:
WmiTreeNode *Copy () ;
WmiTriState GetIntersectingRange (
WmiSignedIntegerRangeNode &a_Range ,
WmiSignedIntegerRangeNode *&a_Intersection
) ;
WmiTriState GetOverlappingRange (
WmiSignedIntegerRangeNode &a_Range ,
WmiSignedIntegerRangeNode *&a_Intersection
) ;
public:
WmiSignedIntegerRangeNode (
BSTR a_PropertyName ,
ULONG a_Index ,
BOOL a_InfiniteLowerBound ,
BOOL a_InfiniteUpperBound ,
BOOL a_LowerBoundClosed ,
BOOL a_UpperBoundClosed ,
LONG a_LowerBound ,
LONG a_UpperBound ,
WmiTreeNode *a_NextNode = NULL ,
WmiTreeNode *a_Parent = NULL
) : WmiRangeNode (
TypeId_WmiSignedIntegerRangeNode ,
a_PropertyName ,
a_Index ,
a_InfiniteLowerBound ,
a_InfiniteUpperBound ,
a_LowerBoundClosed ,
a_UpperBoundClosed ,
a_NextNode ,
a_Parent
) ,
m_LowerBound ( a_LowerBound ) ,
m_UpperBound ( a_UpperBound )
{
}
LONG LowerBound () { return m_LowerBound ; }
LONG UpperBound () { return m_UpperBound ; }
void Print () ;
} ;
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
class WmiStringRangeNode : public WmiRangeNode
{
private:
protected:
BSTR m_LowerBound ;
BSTR m_UpperBound ;
public:
WmiTreeNode *Copy () ;
WmiTriState GetIntersectingRange (
WmiStringRangeNode &a_Range ,
WmiStringRangeNode *&a_Intersection
) ;
WmiTriState GetOverlappingRange (
WmiStringRangeNode &a_Range ,
WmiStringRangeNode *&a_Intersection
) ;
public:
WmiStringRangeNode (
BSTR a_PropertyName ,
ULONG a_Index ,
BOOL a_InfiniteLowerBound ,
BOOL a_InfiniteUpperBound ,
BOOL a_LowerBoundClosed ,
BOOL a_UpperBoundClosed ,
BSTR a_LowerBound ,
BSTR a_UpperBound ,
WmiTreeNode *a_NextNode = NULL ,
WmiTreeNode *a_Parent = NULL
) : WmiRangeNode (
TypeId_WmiStringRangeNode ,
a_PropertyName ,
a_Index ,
a_InfiniteLowerBound ,
a_InfiniteUpperBound ,
a_LowerBoundClosed ,
a_UpperBoundClosed ,
a_NextNode ,
a_Parent
)
{
if ( a_LowerBound )
{
m_LowerBound = SysAllocString ( a_LowerBound ) ;
SetValid(m_LowerBound != NULL);
}
else
{
m_LowerBound = NULL ;
}
if ( a_UpperBound )
{
m_UpperBound = SysAllocString ( a_UpperBound ) ;
SetValid(m_UpperBound != NULL);
}
else
{
m_UpperBound = NULL ;
}
}
~WmiStringRangeNode ()
{
if ( m_LowerBound )
{
SysFreeString ( m_LowerBound ) ;
}
if ( m_UpperBound )
{
SysFreeString ( m_UpperBound ) ;
}
} ;
BSTR LowerBound () { return m_LowerBound ; }
BSTR UpperBound () { return m_UpperBound ; }
void Print () ;
} ;
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
class WmiNullRangeNode : public WmiRangeNode
{
private:
protected:
public:
WmiNullRangeNode (
BSTR a_PropertyName ,
ULONG a_Index ,
WmiTreeNode *a_NextNode = NULL ,
WmiTreeNode *a_Parent = NULL
) : WmiRangeNode (
TypeId_WmiNullRangeNode ,
a_PropertyName ,
a_Index ,
TRUE ,
TRUE ,
FALSE ,
FALSE ,
a_NextNode ,
a_Parent
)
{
}
~WmiNullRangeNode ()
{
} ;
WmiTreeNode *Copy () ;
void Print () ;
} ;
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
class Conjunctions
{
private:
protected:
/*
* Range values for the set of properties in a disjunction.
* Array index is ordered in property order.
*/
ULONG m_RangeContainerCount ;
WmiRangeNode **m_RangeContainer ;
public:
Conjunctions (
ULONG a_RangeContainerCount
) : m_RangeContainerCount ( a_RangeContainerCount ) ,
m_RangeContainer ( NULL )
{
}
~Conjunctions ()
{
if ( m_RangeContainer )
{
for ( ULONG t_Index = 0 ; t_Index < m_RangeContainerCount ; t_Index ++ )
{
delete m_RangeContainer [ t_Index ] ;
}
delete [] m_RangeContainer ;
}
} ;
WmiTriState Initialize ()
{
WmiTriState t_Status = State_True ;
m_RangeContainer = new WmiRangeNode * [ m_RangeContainerCount ] ;
if ( m_RangeContainer )
{
for ( ULONG t_Index = 0 ; t_Index < m_RangeContainerCount ; t_Index ++ )
{
m_RangeContainer [ t_Index ] = NULL ;
}
}
else
{
t_Status = State_Error ;
}
return t_Status ;
}
ULONG GetRangeCount ()
{
return m_RangeContainerCount ;
}
WmiRangeNode *GetRange ( ULONG a_Index )
{
if ( m_RangeContainerCount > a_Index )
{
return m_RangeContainer [ a_Index ] ;
}
else
{
return NULL ;
}
}
void SetRange ( ULONG a_Index , WmiRangeNode *a_Range )
{
if ( m_RangeContainerCount > a_Index )
{
if ( m_RangeContainer [ a_Index ] )
{
delete m_RangeContainer [ a_Index ] ;
}
m_RangeContainer [ a_Index ] = a_Range ;
}
}
} ;
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
class Disjunctions
{
private:
protected:
/*
* Range values for the set of properties in a disjunction.
* Array index is ordered in property order.
*/
ULONG m_ConjunctionCount ;
ULONG m_DisjunctionCount ;
Conjunctions **m_Disjunction ;
public:
Disjunctions (
ULONG a_DisjunctionCount ,
ULONG a_ConjunctionCount
) : m_DisjunctionCount ( a_DisjunctionCount ) ,
m_ConjunctionCount ( a_ConjunctionCount ) ,
m_Disjunction ( NULL )
{
}
WmiTriState Initialize ()
{
WmiTriState t_Status = State_True ;
m_Disjunction = new Conjunctions * [ m_DisjunctionCount ] ;
if ( m_Disjunction )
{
for ( ULONG t_Index = 0 ; t_Index < m_DisjunctionCount ; t_Index ++ )
{
m_Disjunction [ t_Index ] = NULL ;
}
for ( t_Index = 0 ; t_Index < m_DisjunctionCount ; t_Index ++ )
{
Conjunctions *t_Disjunction = new Conjunctions ( m_ConjunctionCount ) ;
if ( t_Disjunction )
{
t_Status = t_Disjunction->Initialize () ;
if ( t_Status != State_True )
{
break ;
}
}
else
{
t_Status = State_Error ;
break ;
}
m_Disjunction [ t_Index ] = t_Disjunction ;
}
}
else
{
t_Status = State_Error ;
}
return t_Status ;
}
~Disjunctions ()
{
if ( m_Disjunction )
{
for ( ULONG t_Index = 0 ; t_Index < m_DisjunctionCount ; t_Index ++ )
{
Conjunctions *t_Disjunction = m_Disjunction [ t_Index ] ;
delete t_Disjunction ;
}
delete [] m_Disjunction ;
}
} ;
ULONG GetDisjunctionCount ()
{
return m_DisjunctionCount ;
}
ULONG GetConjunctionCount ()
{
return m_ConjunctionCount ;
}
Conjunctions *GetDisjunction ( ULONG a_Index )
{
if ( m_DisjunctionCount > a_Index )
{
return m_Disjunction [ a_Index ] ;
}
else
{
return NULL ;
}
}
} ;
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
class PartitionSet
{
private:
protected:
/*
* Null for top level
*/
ULONG m_KeyIndex ;
WmiRangeNode *m_Range ;
/*
* Number of non overlapping partitions, zero when all keys have been partitioned
*/
ULONG m_NumberOfNonOverlappingPartitions ;
PartitionSet **m_NonOverlappingPartitions ;
public:
PartitionSet () : m_Range ( NULL ) ,
m_KeyIndex ( 0 ) ,
m_NumberOfNonOverlappingPartitions ( 0 ) ,
m_NonOverlappingPartitions ( NULL )
{
}
virtual ~PartitionSet ()
{
delete m_Range ;
if ( m_NonOverlappingPartitions )
{
for ( ULONG t_Index = 0 ; t_Index < m_NumberOfNonOverlappingPartitions ; t_Index ++ )
{
delete m_NonOverlappingPartitions [ t_Index ] ;
}
delete [] m_NonOverlappingPartitions ;
}
}
public:
WmiTriState Initialize ( ULONG a_Count )
{
WmiTriState t_Status = State_True ;
m_NumberOfNonOverlappingPartitions = a_Count ;
m_NonOverlappingPartitions = new PartitionSet * [ a_Count ] ;
if ( m_NonOverlappingPartitions )
{
for ( ULONG t_Index = 0 ; t_Index < a_Count ; t_Index ++ )
{
m_NonOverlappingPartitions [ t_Index ] = NULL ;
}
}
else
{
t_Status = State_Error ;
}
return t_Status ;
}
void SetPartition ( ULONG a_Index , PartitionSet *a_Partition )
{
if ( a_Index < m_NumberOfNonOverlappingPartitions )
{
m_NonOverlappingPartitions [ a_Index ] = a_Partition ;
}
}
public:
ULONG GetKeyIndex () { return m_KeyIndex ; }
void SetKeyIndex ( ULONG a_KeyIndex ) { m_KeyIndex = a_KeyIndex ; }
BOOL Root () { return m_Range == NULL ; }
BOOL Leaf () { return m_NonOverlappingPartitions == NULL ; }
void SetRange ( WmiRangeNode *a_Range ) { m_Range = a_Range ; }
WmiRangeNode *GetRange () { return m_Range ; }
ULONG GetPartitionCount () { return m_NumberOfNonOverlappingPartitions ; }
PartitionSet *GetPartition ( ULONG a_Index )
{
if ( a_Index < m_NumberOfNonOverlappingPartitions )
{
return m_NonOverlappingPartitions [ a_Index ] ;
}
else
{
return NULL ;
}
}
} ;
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
class QueryPreprocessor
{
public:
enum QuadState {
State_True ,
State_False ,
State_ReEvaluate ,
State_Undefined ,
State_Error
} ;
private:
protected:
BOOL RecursiveEvaluate (
void *a_Context ,
SWbemRpnQueryToken ** a_Expression ,
WmiTreeNode *a_Parent ,
WmiTreeNode **a_Node ,
int &a_Index
) ;
void TransformAndOrExpression (
WmiTreeNode *&a_Node ,
WmiTreeNode *a_AndChild ,
WmiTreeNode *a_OrChild
) ;
void TransformNotNotExpression (
WmiTreeNode *&a_Node ,
WmiTreeNode *a_Child
) ;
void TransformNotAndExpression (
WmiTreeNode *&a_Node ,
WmiTreeNode *a_Child
) ;
void TransformNotOperatorEqualExpression (
WmiTreeNode *&a_Node ,
WmiTreeNode *a_Child
) ;
void TransformNotOperatorNotEqualExpression (
WmiTreeNode *&a_Node ,
WmiTreeNode *a_Child
) ;
void TransformNotOperatorEqualOrGreaterExpression (
WmiTreeNode *&a_Node ,
WmiTreeNode *a_Child
) ;
void TransformNotOperatorEqualOrLessExpression (
WmiTreeNode *&a_Node ,
WmiTreeNode *a_Child
) ;
void TransformNotOperatorGreaterExpression (
WmiTreeNode *&a_Node ,
WmiTreeNode *a_Child
) ;
void TransformNotOperatorLessExpression (
WmiTreeNode *&a_Node ,
WmiTreeNode *a_Child
) ;
void TransformNotOperatorLikeExpression (
WmiTreeNode *&a_Node ,
WmiTreeNode *a_Child
) ;
void TransformNotOperatorNotLikeExpression (
WmiTreeNode *&a_Node ,
WmiTreeNode *a_Child
) ;
void TransformNotOperatorIsAExpression (
WmiTreeNode *&a_Node ,
WmiTreeNode *a_Child
) ;
void TransformNotOperatorNotIsAExpression (
WmiTreeNode *&a_Node ,
WmiTreeNode *a_Child
) ;
void TransformNotOrExpression (
WmiTreeNode *&a_Node ,
WmiTreeNode *a_Child
) ;
void TransformNotEqualExpression (
WmiTreeNode *&a_Node ,
WmiTreeNode *a_Child
) ;
void TransformAndTrueEvaluation (
WmiTreeNode *&a_Node ,
WmiTreeNode *a_Child
) ;
void TransformOrFalseEvaluation (
WmiTreeNode *&a_Node ,
WmiTreeNode *a_Child
) ;
void TransformOperatorToRange (
WmiTreeNode *&a_Node
) ;
void TransformIntersectingRange (
WmiTreeNode *&a_Node ,
WmiTreeNode *a_Compare ,
WmiTreeNode *a_Intersection
) ;
void TransformNonIntersectingRange (
WmiTreeNode *&a_Node ,
WmiTreeNode *a_Compare
) ;
WmiTriState EvaluateNotEqualExpression ( WmiTreeNode *&a_Node ) ;
WmiTriState EvaluateNotExpression ( WmiTreeNode *&a_Node ) ;
WmiTriState EvaluateAndExpression ( WmiTreeNode *&a_Node ) ;
WmiTriState EvaluateOrExpression ( WmiTreeNode *&a_Node ) ;
QuadState RecursiveDisjunctiveNormalForm ( WmiTreeNode *&a_Node ) ;
QuadState RecursiveRemoveInvariants ( void *a_Context , WmiTreeNode *&a_Root ) ;
WmiTriState RecursiveInsertNode ( WmiTreeNode *&a_Root , WmiTreeNode *&a_Node ) ;
WmiTriState InsertNode ( WmiTreeNode *&a_Root , WmiTreeNode *&a_Node ) ;
WmiTriState RecursiveSortConditionals ( WmiTreeNode *&a_Root , WmiTreeNode *&a_NewRoot ) ;
WmiTriState SortConditionals ( WmiTreeNode *&a_Root ) ;
WmiTriState RecursiveSort ( WmiTreeNode *&a_Root ) ;
WmiTriState RecursiveConvertToRanges ( WmiTreeNode *&a_Root ) ;
QuadState RecursiveRemoveNonOverlappingRanges ( WmiTreeNode *&a_Root , WmiTreeNode *&a_Compare ) ;
void CountDisjunctions ( WmiTreeNode *a_Root , ULONG &a_Count ) ;
WmiTriState RecursivePartitionSet (
Disjunctions *a_Disjunctions ,
PartitionSet *&a_Partition ,
ULONG a_DisjunctionSetToTestCount ,
ULONG *a_DisjunctionSetToTest ,
ULONG a_KeyIndex
) ;
protected:
/*
* Given a property name and it's value convert to it's correct type.
* e.g. if the CIMType of a_PropertyName is uint32 then create an WmiUnsignedIntegerNode
* return NULL if error.
*/
virtual WmiTreeNode *AllocTypeNode (
void *a_Context ,
BSTR a_PropertyName ,
VARIANT &a_Variant ,
WmiValueNode :: WmiValueFunction a_PropertyFunction ,
WmiValueNode :: WmiValueFunction a_ConstantFunction ,
WmiTreeNode *a_Parent
) ;
virtual QuadState InvariantEvaluate (
void *a_Context ,
WmiTreeNode *a_Operator ,
WmiTreeNode *a_Operand
) { return State_Undefined ; }
virtual WmiRangeNode *AllocInfiniteRangeNode (
void *a_Context ,
BSTR a_PropertyName
) { return NULL ; }
protected:
BOOL Evaluate (
void *a_Context ,
SWbemRpnQueryToken **a_Expression ,
int a_Count ,
WmiTreeNode **a_Root
) ;
QuadState DisjunctiveNormalForm ( WmiTreeNode *&a_Root ) ;
void RecursiveQuickSort (
WmiRangeNode **a_Array ,
ULONG *a_UnsortedOrder ,
ULONG a_Lower ,
ULONG a_Upper
) ;
void QuickSort (
WmiRangeNode **a_Array ,
ULONG *a_UnsortedOrder ,
ULONG a_Size
) ;
void SortRanges (
ULONG a_DisjunctionCount ,
ULONG *a_OriginToSorted ,
WmiRangeNode **a_RangeTable
) ;
WmiTriState RemoveOverlaps (
ULONG *a_DisjunctionSetToTest ,
ULONG a_DisjunctionCount ,
ULONG *a_OverlappingIndex ,
ULONG *a_OriginToSorted ,
WmiRangeNode **a_RangeTable
) ;
QuadState RemoveInvariants ( void *a_Context , WmiTreeNode *&a_Root ) ;
WmiTriState Sort ( WmiTreeNode *&a_Root ) ;
WmiTriState ConvertToRanges ( WmiTreeNode *&a_Root ) ;
QuadState RemoveNonOverlappingRanges ( WmiTreeNode *&a_Root ) ;
WmiTriState CreatePartitionSet (
Disjunctions *a_Disjunctions ,
PartitionSet *&a_Partition
) ;
void PrintTree ( WmiTreeNode *a_Root ) ;
public:
QueryPreprocessor () ;
virtual ~QueryPreprocessor () ;
QuadState PreProcess (
void *a_Context ,
IWbemQuery *a_QueryAnalysis ,
WmiTreeNode *&a_Root
) ;
QuadState Query (
BSTR a_Query ,
IWbemQuery *a_QueryAnalysis
) ;
} ;
#endif