oid.cpp
来自「HP公司的SNMP++的Win32版本源码」· C++ 代码 · 共 917 行 · 第 1/2 页
CPP
917 行
// allocate some space for a max oid string
// extract current string into space
// concat new string
// free up existing oid
// make a new oid from string
// delete allocated space
Oid& Oid::operator+=( const Oid &o)
{
SmiLPUINT32 new_oid;
if (o.smival.value.oid.len == 0)
return *this;
new_oid = (SmiLPUINT32) new unsigned long [ smival.value.oid.len + o.smival.value.oid.len];
if ( new_oid == 0 ){
if ( smival.value.oid.ptr ) {
delete [] smival.value.oid.ptr;
smival.value.oid.ptr = NULL;
smival.value.oid.len = 0;
}
return *this;
}
if (smival.value.oid.ptr){
MEMCPY((SmiLPBYTE) new_oid,
(SmiLPBYTE) smival.value.oid.ptr,
(size_t) (smival.value.oid.len*sizeof(SmiUINT32)));
delete [] smival.value.oid.ptr;
}
// out with the old, in with the new...
smival.value.oid.ptr = new_oid;
MEMCPY((SmiLPBYTE) &new_oid[smival.value.oid.len],
(SmiLPBYTE) o.smival.value.oid.ptr,
(size_t) (o.smival.value.oid.len*sizeof(SmiUINT32)));
smival.value.oid.len += o.smival.value.oid.len;
return *this;
}
//=============[Oid::get_printable ]====================================
// return string value
//
// return string portion of the oid
//
char * Oid::get_printable()
{
unsigned long n;
// the worst case char len of an oid can be..
// oid.len*3 + dots in between if each oid is XXXX
// so.. size = (len*4) + (len-1) + 1 , extra for a null
n = (smival.value.oid.len *SNMPCHARSIZE) + ( smival.value.oid.len -1) + 1 ;
if (n==0) n=1; // need at least 1 byte for a null string
// adjust the len of output array in case size was adjusted
if ( iv_str!=0)
delete [] iv_str;
// allocate some space for the output string
iv_str = (char *) new char[ n];
// convert to an output string
if ( iv_str !=0)
OidToStr(&smival.value.oid,n,iv_str);
return iv_str;
};
//==========[Oid::get_printable( unsigned int n) ]=========================
// overloaded get_printable to get the n left most values
// as a dotted string
char * Oid::get_printable( const unsigned long n)
{
unsigned long index = 0;
unsigned long start;
unsigned totLen = 0;
char szNumber[SNMPBUFFSIZE];
unsigned long nz;
nz = (smival.value.oid.len *SNMPCHARSIZE) + ( smival.value.oid.len -1) + 1 ;
if (nz==0) nz=1; // need at least one byte for a null string
// delete the previous output string
if ( iv_str !=0)
delete [] iv_str;
// allocate some space for the output string
iv_str = (char *) new char[ nz];
if ( iv_str == 0)
return iv_str;
// init the string
iv_str[totLen] = 0;
// cannot ask for more then there is..
if (n>smival.value.oid.len)
return iv_str;
start = smival.value.oid.len - n;
// loop through and build up a string
for (index=start; index<smival.value.oid.len; index++)
{
// convert data element to a string
sprintf( szNumber,"%ld",smival.value.oid.ptr[index]);
// verify len is not over
if (totLen+STRLEN(szNumber)+1>=nz)
return iv_str;
// if not at end, pad with a dot
if (totLen!=0)
iv_str[totLen++] = '.';
// copy the string token into the main string
STRCPY(iv_str+totLen, szNumber);
// adjust the total len
totLen += STRLEN(szNumber);
}
return iv_str;
};
//==============[Oid::get_printable( unsigned int start, n) ]=============
// return a dotted string starting at start,
// going n positions to the left
// NOTE, start is 1 based ( the first id is at position #1)
char * Oid::get_printable( const unsigned long start,
const unsigned long n)
{
unsigned long index = 0;
unsigned long totLen = 0;
char szNumber[SNMPBUFFSIZE];
unsigned long nz;
unsigned long my_start;
my_start = start;
nz = (smival.value.oid.len *SNMPCHARSIZE) + ( smival.value.oid.len -1) + 1 ;
if (nz==0) nz=1; // need at least one byte for a null string
// clean up the previous output string
if ( iv_str !=0)
delete [] iv_str;
// allocate some space for the output string
iv_str = (char *) new char[ nz];
if ( iv_str == 0)
return iv_str;
// init the string
iv_str[totLen] = 0;
my_start -=1;
// cannot ask for more then there is..
if ((my_start+n-1)>smival.value.oid.len)
return iv_str;
// loop through and build up a string
for (index=my_start; index<(my_start+n); index++)
{
// convert data element to a string
sprintf( szNumber,"%ld",smival.value.oid.ptr[index]);
// verify len is not over
if (totLen+STRLEN(szNumber)+1>=nz)
return iv_str;
// if not at end, pad with a dot
if (totLen!=0)
iv_str[totLen++] = '.';
// copy the string token into the main string
STRCPY(iv_str+totLen, szNumber);
// adjust the total len
totLen += STRLEN(szNumber);
}
return iv_str;
};
//=============[Oid::StrToOid( char *string, SmiLPOID dst) ]==============
// convert a string to an oid
int Oid::StrToOid( const char *string,
SmiLPOID dstOid)
{
unsigned long index = 0;
unsigned long number = 0;
// make a temp buffer to copy the data into first
SmiLPUINT32 temp;
unsigned long nz;
if (string && *string)
{
nz = STRLEN( string);
}
else {
dstOid->len = 0;
dstOid->ptr = NULL;
return -1;
}
temp = (SmiLPUINT32) new unsigned long [ nz];
// return if can't get the mem
if ( temp == 0) return -1;
while (*string!=0 && index<nz)
{
// init the number for each token
number = 0;
// skip over the dot
if (*string=='.') string++;
// grab a digit token and convert it to a long int
while (isdigit(*string))
number=number*10 + *(string++)-'0';
// check for invalid chars
if (*string!=0 && *string!='.')
// Error: Invalid character in string
{
delete [] temp;
return -1;
}
// stuff the value into the array
temp[index] = number;
index++; // bump the counter
}
// get some space for the real oid
dstOid->ptr = (SmiLPUINT32) new unsigned long [ index];
// return if can't get the mem needed
if( dstOid->ptr == 0)
{
delete [] temp;
return -1;
}
// copy in the temp data
MEMCPY((SmiLPBYTE) dstOid->ptr,
(SmiLPBYTE) temp,
(size_t) (index*sizeof(SmiUINT32)));
// set the len of the oid
dstOid->len = index;
// free up temp data
delete [] temp;
return (int) index;
};
//===============[Oid::OidCopy( source, destination) ]====================
// Copy an oid
int Oid::OidCopy( SmiLPOID srcOid, // source oid
SmiLPOID dstOid) // destination oid
{
// check source len ! zero
if (srcOid->len==0)
return -1;
// copy source to destination
MEMCPY((SmiLPBYTE) dstOid->ptr,
(SmiLPBYTE) srcOid->ptr,
(size_t) (srcOid->len*sizeof(SmiUINT32)));
//set the new len
dstOid->len = srcOid->len;
return (int) srcOid->len;
};
//===============[Oid::nCompare( n, Oid) ]=================================
// compare the n leftmost values of two oids ( left-to_right )
//
// self == Oid then return 0, they are equal
// self < Oid then return -1, <
// self > Oid then return 1, >
int Oid::nCompare( const unsigned long n,
const Oid &o) const
{
unsigned long z;
unsigned long len = n;
int reduced_len = 0;
// 1st case they both are null
if (( len==0)&&( this->smival.value.oid.len==0)) return 0; // equal
// verify that n is valid, must be >= 0
if ( len <=0) return 1; // ! equal
// only compare for the minimal length
if (len > this->smival.value.oid.len){
len = this->smival.value.oid.len;
reduced_len = 1;
}
if (len > o.smival.value.oid.len){
len = o.smival.value.oid.len;
reduced_len = 1;
}
z=0;
while(z<len)
{
if ( this->smival.value.oid.ptr[z] < o.smival.value.oid.ptr[z])
return -1; // less than
if ( this->smival.value.oid.ptr[z] > o.smival.value.oid.ptr[z])
return 1; // greater than
z++;
}
// if we truncated the len then these may not be equal
if (reduced_len){
if (this->smival.value.oid.len < o.smival.value.oid.len)
return -1;
if (this->smival.value.oid.len > o.smival.value.oid.len)
return 1;
}
return 0; // equal
};
//===============[Oid::nCompare( n, Oid) ]=================================
// compare the n rightmost bytes (right-to-left)
// returns 0, equal
// returns -1, <
// returns 1 , >
int Oid::RnCompare( const unsigned long n, const Oid &o) const
{
// oid to compare must have at least the same number
// of sub-ids to comparison else the argument Oid is
// less than THIS
if ( o.len() < n)
return -1;
// also can't compare argument oid for sub-ids which
// THIS does not have
if ( this->len() < n)
return -1;
int start = (int) this->len();
int end = (int) start - (int) n;
for ( int z=start;z< end;z--)
{
if ( o.smival.value.oid.ptr[z] < this->smival.value.oid.ptr[z])
return -1;
if ( o.smival.value.oid.ptr[z] > this->smival.value.oid.ptr[z])
return 1;
}
return 0; // they are equal
};
//================[ Oid::valid() ]========================================
// is the Oid object valid
// returns validity
int Oid::valid() const
{
return ( smival.value.oid.ptr ? TRUE : FALSE ) ;
};
//================[Oid::OidToStr ]=========================================
// convert an oid to a string
int Oid::OidToStr( SmiLPOID srcOid, // source oid
unsigned long size, // size of string
char *string) // pointer to string
{
unsigned long index = 0;
unsigned totLen = 0;
char szNumber[SNMPBUFFSIZE];
// init the string
string[totLen] = 0;
// verify there is something to copy
if (srcOid->len==0)
return -1;
// loop through and build up a string
for (index=0; index<srcOid->len; index++)
{
// convert data element to a string
sprintf( szNumber,"%ld", srcOid->ptr[index]);
// verify len is not over
if (totLen+STRLEN(szNumber)+1>=size)
return -2;
// if not at end, pad with a dot
if (totLen!=0)
string[totLen++] = '.';
// copy the string token into the main string
STRCPY(string+totLen, szNumber);
// adjust the total len
totLen += STRLEN(szNumber);
}
return totLen+1;
};
//================[ general Value = operator ]========================
SnmpSyntax& Oid::operator=( SnmpSyntax &val)
{
// protect against assignment from self
if ( this == &val )
return *this;
// blow away old value
smival.value.oid.len = 0;
if (smival.value.oid.ptr) {
delete [] smival.value.oid.ptr;
smival.value.oid.ptr = NULL;
}
// assign new value
if (val.valid()){
switch (val.get_syntax()){
case sNMP_SYNTAX_OID:
set_data( ((Oid &)val).smival.value.oid.ptr,
(unsigned int)((Oid &)val).smival.value.oid.len);
break;
}
}
return *this;
};
//================[ [] operator ]=====================================
unsigned long& Oid::operator[](int position)
{
return smival.value.oid.ptr[position];
}
//================[ clone ]===========================================
SnmpSyntax *Oid::clone() const
{
return (SnmpSyntax *) new Oid(*this);
};
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?