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.
 
 
 
 
 
 

174 lines
4.1 KiB

//
// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
//
#ifndef SIMC_OID_VALUE
#define SIMC_OID_VALUE
/*
* This file contains classes for modelling OID values
* OID values are of 2 types, for purposes of the compiler
* A clean oid value, is one in which the values of the individual components
* are known presently. Hence a list of integers is all that is required to model
* it, as is done by the SIMCCleanOidValue typedef. It is referred to, as a
* "clean" oid value, in the documentation.
* However, while compiling a MIB, we might not know the values of
* of all the components of an OID (these may be symbols that refer
* to integer values, or to other oid values. Hence, we need to model this
* too, as is done by the SIMCOidValue class. It is often referred to as
* an "unclean" OID value in the documentation.
*/
// Each component of the SIMCOidValue Object. This is basically a
// pointer to SIMCSymbol*, with other associated information.
class SIMCOidComponent
{
char *_name;
long _nameLine, _nameColumn;
// The symbol that represents this component.
// It should resolve to an integer, or another oid value
SIMCSymbol **_value;
long _valueLine, _valueColumn;
public:
SIMCOidComponent(SIMCSymbol **value, long valueLine, long valueColumn,
char *name, long nameLine, long nameColumn)
: _value(value), _valueLine(valueLine), _valueColumn(valueColumn),
_nameLine(nameLine), _nameColumn(nameColumn)
{
if(name)
_name = NewString(name);
else
_name = NULL;
}
virtual ~SIMCOidComponent()
{
if(_name)
delete []_name;
}
SIMCSymbol ** GetValue() const
{
return _value;
}
long GetNameLine() const
{
return _nameLine;
}
void SetNameLine(long x)
{
_nameLine = x;
}
long GetNameColumn() const
{
return _nameColumn;
}
void SetNameColumn(long x)
{
_nameColumn = x;
}
long GetValueLine() const
{
return _valueLine;
}
void SetValueLine(long x)
{
_valueLine = x;
}
long GetValueColumn() const
{
return _valueColumn;
}
void SetValueColumn(long x)
{
_valueColumn = x;
}
friend ostream& operator << ( ostream& outStream, const SIMCOidComponent& obj);
};
typedef CList<SIMCOidComponent *, SIMCOidComponent*> SIMCOidComponentList;
// An "unclean" oid value
class SIMCOidValue : public SIMCValue
{
SIMCOidComponentList * _listOfComponents;
public:
SIMCOidValue( SIMCOidComponentList* listOfComponents,
long line = 0, long column = 0)
: _listOfComponents(listOfComponents),
SIMCValue(line, column)
{
if(_listOfComponents)
{
SIMCOidComponent *next;
POSITION p = _listOfComponents->GetHeadPosition();
while(p)
{
next = _listOfComponents->GetNext(p);
(*next->GetValue())->IncrementReferenceCount();
}
}
}
~SIMCOidValue()
{
if(_listOfComponents)
{
SIMCOidComponent *next;
BOOL useReferenceCount = UseReferenceCount();
while(!_listOfComponents->IsEmpty())
{
next = _listOfComponents->RemoveHead();
if(useReferenceCount)
(*next->GetValue())->DecrementReferenceCount();
delete next;
}
delete _listOfComponents;
}
}
void SetListOfComponents(SIMCOidComponentList *list)
{
_listOfComponents = list;
}
SIMCOidComponentList *GetListOfComponents() const
{
return _listOfComponents;
}
virtual void WriteValue( ostream& outStream) const;
};
/*
* A "clean" oid value
*/
typedef CList<int, int> SIMCCleanOidValue;
// Functions to operate on a clean OID value
ostream& operator << (ostream& outStream, const SIMCCleanOidValue& obj);
operator == (const SIMCCleanOidValue & lhs, const SIMCCleanOidValue & rhs);
operator < (const SIMCCleanOidValue & lhs, const SIMCCleanOidValue & rhs);
void AppendOid(SIMCCleanOidValue& to, const SIMCCleanOidValue& from);
char * CleanOidValueToString(const SIMCCleanOidValue& value);
SIMCCleanOidValue& CleanOidValueCopy(SIMCCleanOidValue & lhs, const SIMCCleanOidValue & rhs);
#endif