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
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
|