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.
 
 
 
 
 
 

239 lines
6.5 KiB

//
// Copyright (c) 1997-2002 Microsoft Corporation, All Rights Reserved
//
#ifndef SIMC_OID_TREE_H
#define SIMC_OID_TREE_H
#include <autoptr.h>
/*
* This file contains the SIMCOidTree class, which is a class that
* represents the OID tree of an SNMP MIB module, and the associated classes
*/
// Forward references
class SIMCOidTreeNode;
class SIMCParseTree;
class SIMCOidTree;
// Helpful typedefs
typedef CList<const SIMCSymbol **, const SIMCSymbol **> SIMCSymbolList;
typedef CList<SIMCOidTreeNode *, SIMCOidTreeNode *> SIMCNodeList;
// Each node in the OID tree
class SIMCOidTreeNode
{
// The integer value of this node. Basically a component of the
// OID value
int _val;
// A list of symbols that have an OID value represented by this node
SIMCSymbolList _listOfSymbols;
// A list of child nodes
SIMCNodeList _listOfChildNodes;
public:
// You *have* to supply an integer value for this node
SIMCOidTreeNode(int val)
: _val(val)
{}
~SIMCOidTreeNode();
// Add a symbol to the list of symbols that have this oid value
void AddSymbol(const SIMCSymbol ** s)
{
_listOfSymbols.AddTail(s);
}
int GetValue() const
{
return _val;
}
const SIMCSymbolList *GetSymbolList() const
{
return &_listOfSymbols;
}
// Check whether the specified symbol is in the list of symbols
// of this node
BOOL HasSymbol(SIMCSymbol *symbol)
{
POSITION p = _listOfSymbols.GetHeadPosition();
const SIMCSymbol **next;
const char * const symbolName = symbol->GetSymbolName();
const char * const moduleName = (symbol->GetModule())->GetModuleName();
while(p)
{
next = _listOfSymbols.GetNext(p);
if(strcmp((*next)->GetSymbolName(), symbolName) == 0 &&
strcmp( ((*next)->GetModule())->GetModuleName(), moduleName) == 0)
return TRUE;
}
return FALSE;
}
// Add a child node
BOOL AddChild(int val)
{
POSITION p = _listOfChildNodes.GetHeadPosition();
SIMCOidTreeNode * next;
while(p)
{
next = _listOfChildNodes.GetNext(p);
if( next->GetValue() == val )
return FALSE;
}
SIMCOidTreeNode * pTmp = new SIMCOidTreeNode(val) ;
wmilib::auto_ptr<SIMCOidTreeNode> pTmp_Guard ( pTmp ) ;
_listOfChildNodes.AddTail ( pTmp ) ;
//
// dismiss as we succeeded to add that node
//
pTmp_Guard.release () ;
return TRUE;
}
const SIMCNodeList * GetListOfChildNodes() const
{
return &_listOfChildNodes;
}
// Get a child node that has the specified value
SIMCOidTreeNode *GetChild(int val) const
{
POSITION p = _listOfChildNodes.GetHeadPosition();
SIMCOidTreeNode * next;
while(p)
{
next = _listOfChildNodes.GetNext(p);
if( next->GetValue() == val )
return next;
}
return NULL;
}
// Check whether the specified symbol is an any of the child
// nodes
BOOL HasChild(SIMCSymbol *child)
{
POSITION p = _listOfChildNodes.GetHeadPosition();
SIMCOidTreeNode * next;
while(p)
{
next = _listOfChildNodes.GetNext(p);
if( next->HasSymbol(child))
return TRUE;
}
return FALSE;
}
// These functions make semantic checks on a node
BOOL CheckNode(BOOL local, SIMCParseTree *const parseTree,
SIMCSymbol *parentSequence,
SIMCSymbol *parentSequenceOf,
SIMCSymbol *ancestor);
BOOL CheckSequenceProperty(BOOL local, SIMCParseTree *const parseTree,
SIMCSymbol *objectTypeSymbol,
SIMCObjectTypeType *objectType,
SIMCBuiltInTypeReference *seqTypeRef);
BOOL CheckSequenceOfProperty(BOOL local, SIMCParseTree *const parseTree,
SIMCSymbol *objectTypeSymbol,
SIMCBuiltInTypeReference *seqOfTypeRef);
// These functions are used in the implementation of
// SIMCOidTree functions and should never be called by
// the user. the user should always call the corresponding
// SIMCOidTree functions
BOOL GetOidValue(const char * const symbolName,
const char * const moduleName,
SIMCCleanOidValue& val) const;
SIMCOidTreeNode *GetParentOf(const SIMCOidTreeNode * node);
SIMCOidTreeNode *GetParentOf(SIMCSymbol *symbol);
// Gets all the object groups, from this node, downwards.
// Never called by the user. Use the corresponding SIMCOidTree
// functions
BOOL GetObjectGroups(SIMCOidTree *tree,
SIMCGroupList *groupList);
// These functions deal with fabrication
// Never called by the user. Use the corresponding SIMCOidTree
// functions
BOOL FabricateGroup(SIMCOidTree *tree,
SIMCSymbol *namedNode, SIMCGroupList *groupList);
BOOL FabricateTable(SIMCOidTree *tree, SIMCTable *table);
BOOL FabricateRow(SIMCOidTree *tree, SIMCTable *table);
};
/* And the OID tree */
class SIMCOidTree
{
SIMCOidTreeNode _root;
public:
SIMCOidTree()
: _root(0)
{}
// Gets the root of the OID tree
const SIMCOidTreeNode * GetRoot() const
{
return &_root;
}
// Adds a symbol with the specified OID value to the OID tree
BOOL AddSymbol(const SIMCSymbol ** s, const SIMCCleanOidValue& val);
// Gets a list of symbols that have the specified OID value
const SIMCSymbolList *GetSymbolList(const SIMCCleanOidValue& val);
// Gets the OID value of a symbol, based on its name and its module name
BOOL GetOidValue(const char * const symbolName,
const char * const moduleName,
SIMCCleanOidValue& val) const;
// Gets the parent node of the specified node
SIMCOidTreeNode *GetParentOf(const SIMCOidTreeNode * node);
// Gets the parent node of the specified symbol
SIMCOidTreeNode *GetParentOf(SIMCSymbol *symbol);
// Gets all the OBJECT-GROUPS that can be fabricated from
// this tree.
BOOL GetObjectGroups(SIMCGroupList *groupList);
// Checks the semantics of the OID tree
BOOL CheckOidTree(BOOL local, SIMCParseTree * const parseTree);
// Checks the semantics of single node
BOOL CheckNode(BOOL local, SIMCParseTree * const parseTree);
// Never called by the user
static void SetAugmentedTable(SIMCTable *table,
SIMCSymbol *augmentsSymbol,
SIMCGroupList *groupList);
// debugging functions
friend ostream& operator<< (ostream& outStream, const SIMCOidTree& obj)
{
obj.WriteTree(outStream);
return outStream;
}
void WriteTree(ostream& outStream) const;
static void WriteSubTree(ostream& outStream,
const SIMCOidTreeNode *subNode,
SIMCCleanOidValue& realValue);
};
#endif