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.
 
 
 
 
 
 

771 lines
17 KiB

// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
/*-----------------------------------------------------------------
Filename: value.hpp
Purpose : To specify the classes of various Snmp values and instance
identifiers. These classes represent the different types of
values for variables that may populate a MIB.
Written By: B.Rajeev
-----------------------------------------------------------------*/
#ifndef __VALUE__
#define __VALUE__
/*-----------------------------------------------------------------
General Overview:
A variable instance refers to a MIB object, e.g.
‘1.3.6.1.2.1.1.1.0’ or ‘1.3.6.1.2.1.2.1.2.1’. The instance is
encoded as an SNMP object identifier and is represented by the
class ‘SnmpObjectIdentifier’.
The classes derived from SnmpValue represent the encoding of the
information stored within the MIB object. The ‘value’ is encoded
as an implementation of the abstract class ‘SnmpValue’. The SNMP
class library implements the following derivations of ‘SnmpValue’
which refer to SNMP BER encoded types.
SnmpNull
SnmpInteger
SnmpCounter32
SnmpCounter64
SnmpGauge
SnmpTimeTicks
SnmpIPAddress
SnmpNetworkAddress
SnmpBitString
SnmpOctetString
SnmpOpaque
SnmpObjectIdentifier
All the implemented classes provide (in addition to others) -
1. Constructors to initialize using relevant values or another
instance of the same class.
2. GetValue, SetValue methods for obtaining and setting
relevant values.
3. "=" operator to over-ride the default assignment operator and
an Equivalent method to check for equivalence between two instances
of the same (derived) class
4. Copy methods for obtaining a copy of a specified instance of
the class.
note of caution:
----------------
Some of the GetValue functions return pointers
to dynamically allocated data. Users of the class must make copies
of the returned values and must not rely on the integrity of this
pointer or values obtained through it in future (because of
SetValue methods, or destruction of corresponding SnmpValue class)
-----------------------------------------------------------------*/
#include <provexpt.h>
// Abstract class at the root of all Snmp Values
class DllImportExport SnmpValue
{
// the "=" operator and the copy constructor have been
// made private to prevent copies of the SnmpValue instance
// from being made
SnmpValue &operator=(IN const SnmpValue &)
{
return *this;
}
SnmpValue(IN const SnmpValue &snmp_value) {}
protected:
virtual BOOL Equivalent(IN const SnmpValue &value) const = 0;
SnmpValue() {}
public:
virtual SnmpValue *Copy () const = 0 ;
BOOL operator==(IN const SnmpValue &value) const
{
return Equivalent(value) ;
}
BOOL operator!=(IN const SnmpValue &value) const
{
return !((*this) == value) ;
}
virtual ~SnmpValue() {}
} ;
// Enables null values for required variables. Its a concrete class
// with dummy constructor and destructors to enable specification of
// null values
class DllImportExport SnmpNull : public SnmpValue
{
protected:
virtual BOOL Equivalent(IN const SnmpValue &value) const ;
public:
// dummy constructor and destructor
SnmpNull() {}
~SnmpNull() {}
SnmpValue &operator=(IN const SnmpNull &to_copy)
{
return *this;
}
SnmpValue *Copy() const { return new SnmpNull; }
};
// Allows integer values to be specified
class DllImportExport SnmpInteger : public SnmpValue
{
private:
LONG val;
protected:
virtual BOOL Equivalent(IN const SnmpValue &value) const ;
public:
SnmpInteger ( IN const LONG value ) : val(value) {}
SnmpInteger ( IN const SnmpInteger &value );
~SnmpInteger () {}
LONG GetValue () const;
void SetValue ( IN const LONG value );
SnmpValue &operator=(IN const SnmpInteger &to_copy)
{
SetValue(to_copy.GetValue());
return *this;
}
BOOL Equivalent(IN const SnmpInteger &snmp_integer) const
{
if ( val == snmp_integer.GetValue() )
return TRUE;
else
return FALSE;
}
SnmpValue *Copy () const;
} ;
// Encapsulates gauge value
class DllImportExport SnmpGauge : public SnmpValue
{
private:
ULONG val;
protected:
virtual BOOL Equivalent(IN const SnmpValue &value) const ;
public:
SnmpGauge ( IN const LONG value ) : val(value) {}
SnmpGauge ( IN const SnmpGauge &value );
~SnmpGauge () {}
ULONG GetValue () const;
void SetValue ( IN const ULONG value );
SnmpValue *Copy () const;
SnmpValue &operator=(IN const SnmpGauge &to_copy)
{
SetValue(to_copy.GetValue());
return *this;
}
BOOL Equivalent(IN const SnmpGauge &snmp_gauge) const
{
if ( val == snmp_gauge.GetValue() )
return TRUE;
else
return FALSE;
}
} ;
// Encapsulates Counter values
class DllImportExport SnmpCounter : public SnmpValue
{
private:
ULONG val;
protected:
virtual BOOL Equivalent(IN const SnmpValue &value) const ;
public:
SnmpCounter ( IN const ULONG value ) : val(value) {}
SnmpCounter ( IN const SnmpCounter &value );
~SnmpCounter () {}
ULONG GetValue () const;
void SetValue ( IN const ULONG value );
SnmpValue *Copy () const;
SnmpValue &operator=(IN const SnmpCounter &to_copy)
{
SetValue(to_copy.GetValue());
return *this;
}
BOOL Equivalent(IN const SnmpCounter &snmp_counter) const
{
if ( val == snmp_counter.GetValue() )
return TRUE;
else
return FALSE;
}
} ;
// Encapsulates Time Ticks (since an earlier event)
class DllImportExport SnmpTimeTicks : public SnmpValue
{
private:
ULONG val;
protected:
virtual BOOL Equivalent(IN const SnmpValue &value) const ;
public:
SnmpTimeTicks ( IN const ULONG value ) : val(value) {}
SnmpTimeTicks ( IN const SnmpTimeTicks &value );
~SnmpTimeTicks () {}
ULONG GetValue () const;
void SetValue ( IN const ULONG value );
SnmpValue *Copy () const;
SnmpValue &operator=(IN const SnmpTimeTicks &to_copy)
{
SetValue(to_copy.GetValue());
return *this;
}
BOOL Equivalent(IN const SnmpTimeTicks &snmp_time_ticks) const
{
if ( val == snmp_time_ticks.GetValue() )
return TRUE;
else
return FALSE;
}
} ;
// Encapsulates octet strings that do not have any terminator.
// The octet string is specified by the pair (val,length) where
// 'val' is a pointer to heap data and 'length' provides the number
// of octets in the data string.
class DllImportExport SnmpOctetString : public SnmpValue
{
private:
// in case a new 'value' string has the same length as the stored
// string, the stored string may be overwritten. this avoids
// having to allocate and deallocate heap memory for the purpose.
void OverWrite(IN const UCHAR *value);
protected:
BOOL is_valid;
UCHAR *val;
ULONG length;
virtual BOOL Equivalent(IN const SnmpValue &value) const ;
virtual void Initialize(IN const UCHAR *value, IN const ULONG valueLength);
// The Replicate and UnReplicate methods allocate and deallocate
// heap data. Replicate also copies the contents of the parameter
// 'value' onto the allocated memory. This function may be
// implemented different and, thus, the methods have been declared
// virtual.
virtual UCHAR *Replicate(IN const UCHAR *value, IN const ULONG valueLength);
virtual void UnReplicate(UCHAR *value);
public:
SnmpOctetString ( IN const UCHAR *value , IN const ULONG valueLength );
SnmpOctetString ( IN const SnmpOctetString &value );
~SnmpOctetString ();
void SetValue ( IN const UCHAR *value , IN const ULONG valueLength );
ULONG GetValueLength () const;
UCHAR *GetValue () const;
SnmpValue *Copy () const;
SnmpValue &operator=(IN const SnmpOctetString &to_copy)
{
if ( to_copy() )
SetValue(to_copy.GetValue(), to_copy.GetValueLength());
return *this;
}
void * operator()(void) const
{
return ( is_valid?(void *)this:NULL );
}
BOOL Equivalent(IN const SnmpOctetString &snmp_octet_string) const;
} ;
// OpaqueValue class encapsulates octet strings
class DllImportExport SnmpOpaque : public SnmpValue
{
private:
SnmpOctetString *octet_string;
protected:
virtual BOOL Equivalent(IN const SnmpValue &value) const ;
public:
SnmpOpaque ( IN const UCHAR *value , IN const ULONG valueLength ) : octet_string ( NULL )
{
octet_string = new SnmpOctetString(value, valueLength);
}
SnmpOpaque ( IN const SnmpOpaque &value ) : octet_string ( NULL )
{
octet_string = new SnmpOctetString(value.GetValue(), value.GetValueLength());
}
~SnmpOpaque()
{
delete octet_string;
}
void SetValue ( IN const UCHAR *value , IN const ULONG valueLength )
{
octet_string->SetValue(value, valueLength);
}
ULONG GetValueLength () const
{
return octet_string->GetValueLength();
}
UCHAR *GetValue () const
{
return octet_string->GetValue();
}
SnmpValue &operator=(IN const SnmpOpaque &to_copy)
{
if ( to_copy() )
SetValue(to_copy.GetValue(), to_copy.GetValueLength());
return *this;
}
SnmpValue *Copy () const
{
return new SnmpOpaque(octet_string->GetValue(),
octet_string->GetValueLength());
}
void * operator()(void) const
{
return (*octet_string)();
}
BOOL Equivalent(IN const SnmpOpaque &snmp_opaque) const
{
return octet_string->Equivalent(*(snmp_opaque.octet_string));
}
};
#define DEFAULT_OBJECTIDENTIFIER_LENGTH 32
// Encapsulates the object identifier. An object identifier
// identifies a MIB object instance
class DllImportExport SnmpObjectIdentifier : public SnmpValue
{
// describes the legal values for a comparison
enum Comparison {LESS_THAN, EQUAL_TO, GREATER_THAN};
private:
BOOL is_valid;
ULONG m_value[DEFAULT_OBJECTIDENTIFIER_LENGTH];
ULONG *val;
ULONG length;
// in case a new 'value' string has the same length as the stored
// string, the stored string may be overwritten. this avoids
// having to allocate and deallocate heap memory for the purpose.
void OverWrite(IN const ULONG *value);
protected:
virtual BOOL Equivalent(IN const SnmpValue &value) const ;
virtual void Initialize(IN const ULONG *value, IN const ULONG valueLength);
// The Replicate and UnReplicate methods allocate and deallocate
// heap data. Replicate also copies the contents of the parameter
// 'value' onto the allocated memory. This function may be
// implemented different and, thus, the methods have been declared
// virtual.
virtual ULONG *Replicate(IN const ULONG *value, IN const ULONG valueLength) const;
// Allocates enough memory to copy the first value followed by
// the second value to be copied, thus, appending the two values
virtual ULONG *Replicate(IN const ULONG *first_value, IN const ULONG first_length,
IN const ULONG *second_value, IN const ULONG second_length) const;
virtual void UnReplicate(ULONG *value);
// This single function
Comparison Compare(IN const SnmpObjectIdentifier &first,
IN const SnmpObjectIdentifier &second) const;
BOOL Equivalent(IN const SnmpObjectIdentifier &value) const;
public:
SnmpObjectIdentifier ( IN const ULONG *value , IN const ULONG valueLength );
SnmpObjectIdentifier ( IN const char *value );
SnmpObjectIdentifier ( IN const SnmpObjectIdentifier &value );
~SnmpObjectIdentifier ();
void SetValue ( IN const ULONG *value , IN const ULONG valueLength );
ULONG GetValueLength () const;
ULONG *GetValue () const;
SnmpValue *Copy () const;
BOOL Equivalent(IN const SnmpObjectIdentifier &value,
IN ULONG max_length) const;
BOOL operator<(IN const SnmpObjectIdentifier &value) const
{
return (Compare(*this,value) == LESS_THAN)?TRUE:FALSE;
}
BOOL operator>(IN const SnmpObjectIdentifier &value) const
{
return (Compare(*this,value) == GREATER_THAN)?TRUE:FALSE;
}
BOOL operator<=(IN const SnmpObjectIdentifier &value) const
{
return !(*this > value);
}
BOOL operator>=(IN const SnmpObjectIdentifier &value) const
{
return !(*this < value);
}
BOOL operator==(IN const SnmpObjectIdentifier &value) const
{
if ( this->GetValueLength() == value.GetValueLength() )
return Equivalent(value) ;
else
return FALSE;
}
BOOL operator!=(IN const SnmpObjectIdentifier &value) const
{
return !(*this == value);
}
SnmpObjectIdentifier operator+ ( IN const SnmpObjectIdentifier &value ) const;
BOOL Prefix( IN ULONG index, SnmpObjectIdentifier &prefix ) const
{
if ( index >= length )
return FALSE;
prefix.UnReplicate (val) ;
prefix.Initialize (val, index+1) ;
return TRUE ;
}
BOOL Suffix ( IN ULONG index , SnmpObjectIdentifier &suffix ) const
{
if ( index >= length )
return FALSE;
suffix.UnReplicate (val) ;
suffix.Initialize ( val+index, length-index ) ;
return TRUE ;
}
SnmpObjectIdentifier *Cut (SnmpObjectIdentifier &value) const;
ULONG &operator [] ( IN const ULONG index ) const;
SnmpValue &operator=(IN const SnmpObjectIdentifier &to_copy)
{
if ( to_copy() )
SetValue(to_copy.GetValue(), to_copy.GetValueLength());
return *this;
}
void * operator()(void) const
{
return ( is_valid?(void *)this:NULL );
}
char *GetAllocatedString() const;
} ;
// encapsulates an ip address. represents the 32 bit value in a ULONG
class DllImportExport SnmpIpAddress : public SnmpValue
{
private:
// if the dotted decimal representation passed to the constructor
// is ill-formed, the instance may be invalid
BOOL is_valid;
ULONG val;
protected:
virtual BOOL Equivalent(IN const SnmpValue &value) const ;
public:
SnmpIpAddress ( IN const ULONG value )
:val(value), is_valid(TRUE)
{}
// a dotted decimal representation is parsed to obtain the 32 bit value
SnmpIpAddress ( IN const char *value ) ;
SnmpIpAddress ( IN const SnmpIpAddress &value );
~SnmpIpAddress () {}
ULONG GetValue () const;
void SetValue ( IN const ULONG value );
SnmpValue *Copy () const;
SnmpValue &operator=(IN const SnmpIpAddress &to_copy)
{
if ( to_copy() )
SetValue(to_copy.GetValue());
return *this;
}
void * operator()(void) const
{
return ( is_valid?(void *)this:NULL );
}
BOOL Equivalent(IN const SnmpIpAddress &snmp_ip_address) const
{
if ( is_valid && snmp_ip_address() )
return ( val == snmp_ip_address.GetValue() );
else
return FALSE;
}
} ;
// Encapsulates UInteger32 value
class DllImportExport SnmpUInteger32 : public SnmpValue
{
private:
ULONG val;
protected:
virtual BOOL Equivalent(IN const SnmpValue &value) const ;
public:
SnmpUInteger32 ( IN const LONG value ) : val(value) {}
SnmpUInteger32 ( IN const SnmpUInteger32 &value );
~SnmpUInteger32 () {}
ULONG GetValue () const;
void SetValue ( IN const ULONG value );
SnmpValue *Copy () const;
SnmpValue &operator=(IN const SnmpUInteger32 &to_copy)
{
SetValue(to_copy.GetValue());
return *this;
}
BOOL Equivalent(IN const SnmpUInteger32 &snmp_integer) const
{
if ( val == snmp_integer.GetValue() )
return TRUE;
else
return FALSE;
}
} ;
// Encapsulates Counter64 values
class DllImportExport SnmpCounter64 : public SnmpValue
{
private:
ULONG lval;
ULONG hval;
protected:
virtual BOOL Equivalent(IN const SnmpValue &value) const ;
public:
SnmpCounter64 ( IN const ULONG lvalue , IN const ULONG hvalue ) : lval(lvalue),hval(hvalue) {}
SnmpCounter64 ( IN const SnmpCounter64 &value );
~SnmpCounter64 () {}
ULONG GetLowValue () const;
ULONG GetHighValue () const;
void SetValue ( IN const ULONG lvalue , IN const ULONG hvalue );
SnmpValue *Copy () const;
SnmpValue &operator=(IN const SnmpCounter64 &to_copy)
{
SetValue(to_copy.GetLowValue(),to_copy.GetHighValue());
return *this;
}
BOOL Equivalent(IN const SnmpCounter64 &snmp_counter ) const
{
if ( ( lval == snmp_counter.GetLowValue() ) && ( hval == snmp_counter.GetHighValue() ) )
return TRUE;
else
return FALSE;
}
} ;
// Encapsulates EndOfMibView values
class DllImportExport SnmpEndOfMibView : public SnmpValue
{
private:
protected:
virtual BOOL Equivalent(IN const SnmpValue &value) const ;
public:
SnmpEndOfMibView () {} ;
~SnmpEndOfMibView () {} ;
SnmpValue *Copy () const { return new SnmpEndOfMibView ; }
SnmpValue &operator=(IN const SnmpEndOfMibView &to_copy)
{
return *this;
}
} ;
// Encapsulates NoSuchObject values
class DllImportExport SnmpNoSuchObject: public SnmpValue
{
private:
protected:
virtual BOOL Equivalent(IN const SnmpValue &value) const ;
public:
SnmpNoSuchObject () {} ;
~SnmpNoSuchObject () {} ;
SnmpValue *Copy () const { return new SnmpNoSuchObject ; }
SnmpValue &operator=(IN const SnmpNoSuchObject &to_copy)
{
return *this;
}
} ;
// Encapsulates NoSuchInstance values
class DllImportExport SnmpNoSuchInstance: public SnmpValue
{
private:
protected:
virtual BOOL Equivalent(IN const SnmpValue &value) const ;
public:
SnmpNoSuchInstance () {} ;
~SnmpNoSuchInstance () {} ;
SnmpValue *Copy () const { return new SnmpNoSuchInstance ; }
SnmpValue &operator=(IN const SnmpNoSuchInstance &to_copy)
{
return *this;
}
} ;
#endif // __VALUE__