oid.cpp
上传用户:czjinwang
上传日期:2007-01-12
资源大小:2484k
文件大小:25k
源码类别:

SNMP编程

开发平台:

Visual C++

  1. /*===================================================================
  2.   Copyright (c) 1999
  3.   Hewlett-Packard Company
  4.   ATTENTION: USE OF THIS SOFTWARE IS SUBJECT TO THE FOLLOWING TERMS.
  5.   Permission to use, copy, modify, distribute and/or sell this software 
  6.   and/or its documentation is hereby granted without fee. User agrees 
  7.   to display the above copyright notice and this license notice in all 
  8.   copies of the software and any documentation of the software. User 
  9.   agrees to assume all liability for the use of the software; Hewlett-Packard 
  10.   makes no representations about the suitability of this software for any 
  11.   purpose. It is provided "AS-IS" without warranty of any kind,either express 
  12.   or implied. User hereby grants a royalty-free license to any and all 
  13.   derivatives based upon this software code base. 
  14.   O I D. C P P
  15.   
  16.   OID CLASS IMPLEMENTATION
  17.   DESIGN:
  18.   Peter E. Mellquist
  19.   AUTHOR:
  20.   Peter E Mellquist
  21.   DATE:
  22.   June 15, 1999
  23.   DESCRIPTION:
  24.   This module contains the implementation of the oid class. This
  25.   includes all protected and public member functions. The oid class
  26.   may be compiled stand alone without the use of any other library.
  27.   LANGUAGE:
  28.   ANSI C++
  29.   OPERATING SYSTEM(S):
  30.   MS-Windows Win32
  31.   BSD UNIX
  32. =====================================================================*/
  33. char oid_cpp_version[]="#(@)SNMP++ 2.8 $Header: oid.cpp,v 1.33 96/09/11 14:02:00 hmgr Exp $";
  34. //---------[ external C libaries used ]--------------------------------
  35. extern "C"
  36. {
  37. #include <stdio.h>                // standard io
  38. #include <memory.h>               // memcpy's
  39. #include <string.h>               // strlen, etc..
  40. #include <stdlib.h>               // standard library
  41. #include <ctype.h>                // isdigit
  42. #include <malloc.h>               // malloc, free
  43. }
  44. #include "oid.h"                  // include def for oid class
  45. #define  SNMPBUFFSIZE 10          // size of scratch buffer
  46. #define  SNMPCHARSIZE 10          // an individual oid instance as a string
  47. //=============[Oid::get_syntax(void)]====================================
  48. SmiUINT32 Oid::get_syntax()
  49. { return sNMP_SYNTAX_OID; };
  50. //=============[Oid::Oid(void)]============================================
  51. // constructor using no arguments
  52. // initialize octet ptr and string
  53. // ptr to null
  54. Oid::Oid( void)
  55. {
  56.   smival.syntax = sNMP_SYNTAX_OID;
  57.   smival.value.oid.len = 0;
  58.   smival.value.oid.ptr = NULL;
  59.   iv_str=0;
  60. };
  61. //=============[Oid::Oid( const char *dotted_string ]=====================
  62. // constructor using a dotted string
  63. //
  64. // do a string to oid using the string passed in
  65. Oid::Oid( const char * dotted_oid_string)
  66. {
  67.   smival.syntax = sNMP_SYNTAX_OID;
  68.   smival.value.oid.len = 0;
  69.   smival.value.oid.ptr = NULL;
  70.   StrToOid( (char *) dotted_oid_string, &smival.value.oid);
  71.   iv_str = 0;
  72. };
  73. //=============[Oid::Oid( const Oid &oid) ]================================
  74. // constructor using another oid object
  75. //
  76. // do an oid copy using the oid object passed in
  77. Oid::Oid ( const Oid &oid)
  78. {
  79.   smival.syntax = sNMP_SYNTAX_OID;
  80.   smival.value.oid.len = 0;
  81.   smival.value.oid.ptr = NULL;
  82.   iv_str = 0;
  83.   
  84.   // allocate some memory for the oid
  85.   // in this case the size to allocate is the same
  86.   // size as the source oid
  87.   if (oid.smival.value.oid.len) {
  88.     smival.value.oid.ptr = (SmiLPUINT32) new unsigned long [ oid.smival.value.oid.len];
  89.     if ( smival.value.oid.ptr !=0)
  90.       OidCopy( (SmiLPOID) &(oid.smival.value.oid),(SmiLPOID) &smival.value.oid);
  91.   }
  92. };
  93. //=============[Oid::Oid( const unsigned long *raw_oid, int oid_len) ]====
  94. // constructor using raw numeric form
  95. //
  96. // copy the integer values into the private member
  97. Oid::Oid(const unsigned long *raw_oid, int oid_len)
  98. {
  99.   smival.syntax = sNMP_SYNTAX_OID;
  100.   smival.value.oid.len = 0;
  101.   smival.value.oid.ptr = NULL;
  102.   iv_str = 0;
  103.     
  104.   if (raw_oid && oid_len > 0) {
  105.     smival.value.oid.ptr = (SmiLPUINT32) new unsigned long [ oid_len];
  106.     if ( smival.value.oid.ptr) {
  107.       smival.value.oid.len = oid_len;
  108.       for (int i=0; i < oid_len; i++)
  109. smival.value.oid.ptr[i] = raw_oid[i];
  110.     }
  111.   }
  112. };
  113. //=============[Oid::~Oid]==============================================
  114. // destructor
  115. //
  116. // free up the descriptor space
  117. Oid::~Oid()
  118. {
  119.    // free up the octet deep memory
  120.    if ( smival.value.oid.ptr ) {
  121.      delete [] smival.value.oid.ptr;
  122.      smival.value.oid.ptr = NULL;
  123.    }
  124.    // free up the output string
  125.    if ( iv_str !=0)
  126.      delete [] iv_str;
  127. };
  128. //=============[Oid::operator = const char * dotted_string ]==============
  129. // assignment to a string operator overloaded
  130. //
  131. // free the existing oid
  132. // create the new oid from the string
  133. // return this object
  134. Oid& Oid::operator=( const char *dotted_oid_string)
  135. {
  136.   // delete the old value
  137.   if ( smival.value.oid.ptr ) {
  138.     delete [] smival.value.oid.ptr;
  139.     smival.value.oid.ptr = NULL;
  140.   }
  141.   smival.value.oid.len = 0;
  142.   // assign the new value
  143.   StrToOid( (char *) dotted_oid_string, &smival.value.oid);
  144.   return *this;
  145. };
  146. //=============[Oid:: operator = const Oid &oid ]==========================
  147. // assignment to another oid object overloaded
  148. //
  149. // free the existing oid
  150. // create a new one from the object passed in
  151. Oid& Oid::operator=( const Oid &oid)
  152. {
  153.   // protect against assignment from self
  154.   if ( this == &oid )
  155.       return *this;
  156.   // delete the old value
  157.   if ( smival.value.oid.ptr ) {
  158.     delete [] smival.value.oid.ptr;
  159.     smival.value.oid.ptr = NULL;
  160.   }
  161.   smival.value.oid.len = 0;
  162.   // check for zero len on source
  163.   if ( oid.smival.value.oid.len == 0) {
  164.      smival.value.oid.len = 0;
  165.      smival.value.oid.ptr = NULL;
  166.      return *this;
  167.   }
  168.   // allocate some memory for the oid
  169.   smival.value.oid.ptr = (SmiLPUINT32) new unsigned long [ oid.smival.value.oid.len];
  170.   if ( smival.value.oid.ptr !=0)
  171.     OidCopy( (SmiLPOID) &(oid.smival.value.oid),(SmiLPOID) &smival.value.oid);
  172.   return *this;
  173. };
  174. //==============[Oid:: operator += const char *a ]=========================
  175. // append operator, appends a string
  176. //
  177. // allocate some space for a max oid string
  178. // extract current string into space
  179. // concat new string
  180. // free up existing oid
  181. // make a new oid from string
  182. // delete allocated space
  183. Oid& Oid::operator+=( const char *a)
  184. {
  185.    unsigned long n;
  186.    if (!a)
  187.      return *this;
  188.    if ( *a=='.')
  189.   a++;
  190.    n =  (smival.value.oid.len *SNMPCHARSIZE) + ( smival.value.oid.len) + 1 + STRLEN(a);
  191.    char *ptr = (char *) new char[ n];
  192.    if ( ptr !=0)
  193.    {
  194.      OidToStr(&smival.value.oid, n,ptr);
  195.      if (STRLEN(ptr))
  196.        STRCAT(ptr,".");
  197.      STRCAT(ptr,a);
  198.      if ( smival.value.oid.len !=0) {
  199.        delete [] smival.value.oid.ptr;
  200.        smival.value.oid.len = 0;
  201.      }
  202.      StrToOid( (char *) ptr, &smival.value.oid);
  203.      delete [] ptr;
  204.    }
  205.    return *this;
  206. };
  207. //=============[ int operator == oid,oid ]=================================
  208. // equivlence operator overloaded
  209. int operator==( const Oid &lhs, const Oid &rhs)
  210. {   
  211.    // ensure same len, then use nCompare
  212.    if (rhs.len() != lhs.len()) return 0;
  213.    if( lhs.nCompare( rhs.len(), rhs)==0) return 1; else return 0;
  214. };      
  215.  
  216. //==============[ operator!=( Oid &x,Oid &y) ]============================= 
  217. //not equivlence operator overloaded
  218. int operator!=( const Oid &lhs,const Oid &rhs)
  219. {   
  220.    // just invert ==
  221.    return (!(lhs==rhs));
  222. };  
  223. //==============[ operator<( Oid &x,Oid &y) ]=============================  
  224. // less than < overloaded
  225. int operator<( const Oid &lhs,const Oid &rhs)
  226. {   
  227.   int result;
  228.    // call nCompare with the current
  229.    // Oidx, Oidy and len of Oidx
  230.    if((result = lhs.nCompare( rhs.len(), rhs))<0) return 1; 
  231.    else if (result > 0) return 0;
  232.    else{
  233.      // if here, equivalent substrings, call the shorter one <
  234.      if (lhs.len() < rhs.len()) return 1;
  235.      else return 0;
  236.    }
  237. }; 
  238. //==============[ operator<=( Oid &x,Oid &y) ]=============================  
  239. // less than <= overloaded
  240. int operator<=( const Oid &x,const Oid &y)
  241. {   
  242.    if((x<y) || (x==y)) return 1;
  243.    else return 0;
  244. };    
  245. //==============[ operator>( Oid &x,Oid &y) ]=============================     
  246. // greater than > overloaded
  247. int operator>( const Oid &x,const Oid &y)
  248. {   
  249.   // just invert existing <=
  250.   if (!(x<=y)) return 1;
  251.   else return 0;
  252. }; 
  253. //==============[ operator>=( Oid &x,Oid &y) ]=============================  
  254. // greater than >= overloaded
  255. int operator>=( const Oid &x,const Oid &y)
  256. {   
  257.   // just invert existing <
  258.   if(!(x<y)) return 1;
  259.   else return 0;
  260. };          
  261.   
  262. //==============[ operator==( Oid &x,char *) ]=============================         
  263. // equivlence operator overloaded
  264. int operator==( const Oid &x,const char *dotted_oid_string)
  265. {    
  266.    // create a temp oid object
  267.    Oid to( dotted_oid_string);
  268.    // compare using existing operator
  269.    if(x == to) return 1; else return 0;
  270. };         
  271. //==============[ operator!=( Oid &x,char*) ]=============================    
  272. // not equivlence operator overloaded
  273. int operator!=( const Oid &x,const char *dotted_oid_string)
  274. {    
  275.    // create a temp oid object
  276.    Oid to( dotted_oid_string);
  277.    // compare using existing operator
  278.    if(x != to) return 1; else return 0;
  279. };             
  280. //==============[ operator<( Oid &x,char*) ]=============================     
  281. // less than < operator overloaded
  282. int operator<( const Oid &x,const char *dotted_oid_string)
  283. {    
  284.    // create a temp oid object
  285.    Oid to( dotted_oid_string);
  286.    // compare using existing operator
  287.    if(x < to) return 1; else return 0;
  288. }; 
  289. //==============[ operator<=( Oid &x,char *) ]=============================  
  290. // less than <= operator overloaded
  291. int operator<=( const Oid &x,char *dotted_oid_string)
  292. {    
  293.    // create a temp oid object
  294.    Oid to( dotted_oid_string);
  295.    // compare using existing operator
  296.    if(x <= to) return 1; else return 0;
  297. };             
  298. //==============[ operator>( Oid &x,char* ]=============================  
  299. // greater than > operator overloaded
  300. int operator>( const Oid &x,const char *dotted_oid_string)
  301. {    
  302.    // create a temp oid object
  303.    Oid to( dotted_oid_string);
  304.    // compare using existing operator
  305.    if(x > to) return 1; else return 0;
  306. }; 
  307. //==============[ operator>=( Oid &x,char*) ]=============================  
  308. // greater than >= operator overloaded
  309. int operator>=( const Oid &x,const char *dotted_oid_string)
  310. {    
  311.    // create a temp oid object
  312.    Oid to( dotted_oid_string);
  313.    // compare using existing operator
  314.    if(x >= to) return 1; else return 0;
  315. };            
  316. //===============[Oid::oidval ]=============================================
  317. // return the WinSnmp oid part
  318. SmiLPOID Oid::oidval()
  319. {
  320.   return (SmiLPOID) &smival.value.oid;
  321. };
  322. //===============[Oid::set_data ]==---=====================================
  323. // copy data from raw form...
  324. void Oid::set_data( const unsigned long *raw_oid,
  325.                     const unsigned int oid_len)
  326. {
  327.   if (smival.value.oid.len < oid_len){
  328.     if ( smival.value.oid.ptr) {
  329.       delete [] smival.value.oid.ptr;
  330.       smival.value.oid.ptr = NULL;
  331.       smival.value.oid.len = 0;
  332.     }
  333.     smival.value.oid.ptr = (SmiLPUINT32) new unsigned long [ oid_len];
  334.     if ( smival.value.oid.ptr ==0){
  335.       return;
  336.     }
  337.   }
  338.   MEMCPY((SmiLPBYTE) smival.value.oid.ptr,
  339.          (SmiLPBYTE) raw_oid,
  340.          (size_t) (oid_len*sizeof(SmiUINT32)));
  341.   smival.value.oid.len = oid_len;
  342. };
  343. //===============[Oid::len ]================================================
  344. // return the len of the oid
  345. unsigned long Oid::len() const
  346. {
  347.    return smival.value.oid.len;
  348. };
  349. //===============[Oid::trim( unsigned int) ]============================
  350. // trim off the n leftmost values of an oid
  351. // Note!, does not adjust actual space for
  352. // speed
  353. void Oid::trim( const unsigned long n)
  354. {
  355.   // verify that n is legal
  356.   if ((n<=smival.value.oid.len)&&(n>0)) {
  357.     smival.value.oid.len -= n;
  358.     if (smival.value.oid.len == 0) {
  359.       delete [] smival.value.oid.ptr;
  360.       smival.value.oid.ptr = NULL;
  361.     }
  362.   }
  363. };
  364. //===============[Oid::operator += const unsigned int) ]====================
  365. // append operator, appends an int
  366. //
  367. // allocate some space for a max oid string
  368. // extract current string into space
  369. // concat new string
  370. // free up existing oid
  371. // make a new oid from string
  372. // delete allocated space
  373. Oid& Oid::operator+=( const unsigned long i)
  374. {
  375.    unsigned long n;
  376.    n = (smival.value.oid.len *SNMPCHARSIZE) + ( smival.value.oid.len -1) + 1 + 6;  // extra for
  377.    char buffer[SNMPBUFFSIZE];
  378.    // allocate some temporary space
  379.    char *ptr = (char *) new char[ n];
  380.    if ( ptr != 0)
  381.    {
  382.      OidToStr(&smival.value.oid,n,ptr);
  383.      if (STRLEN(ptr))
  384.        STRCAT(ptr,".");
  385.      sprintf( buffer,"%ld",i);
  386.      STRCAT(ptr,buffer);
  387.      if ( smival.value.oid.ptr ) {
  388.        delete [] smival.value.oid.ptr;
  389.        smival.value.oid.ptr = NULL;
  390.        smival.value.oid.len = 0;
  391.      }
  392.      StrToOid( (char *) ptr, &smival.value.oid);
  393.      delete [] ptr;
  394.    }
  395.    return *this;
  396. }
  397. //===============[Oid::operator += const Oid) ]========================
  398. // append operator, appends an Oid
  399. //
  400. // allocate some space for a max oid string
  401. // extract current string into space
  402. // concat new string
  403. // free up existing oid
  404. // make a new oid from string
  405. // delete allocated space
  406. Oid& Oid::operator+=( const Oid &o)
  407. {
  408.   SmiLPUINT32 new_oid;
  409.   if (o.smival.value.oid.len == 0)
  410.     return *this;
  411.   new_oid = (SmiLPUINT32) new unsigned long [ smival.value.oid.len + o.smival.value.oid.len];
  412.   if ( new_oid == 0 ){
  413.     if ( smival.value.oid.ptr ) {
  414.         delete [] smival.value.oid.ptr;
  415.         smival.value.oid.ptr = NULL;
  416.         smival.value.oid.len = 0;
  417.     }
  418.     return *this;
  419.   }
  420.   
  421.   if (smival.value.oid.ptr){
  422.     MEMCPY((SmiLPBYTE) new_oid,
  423.    (SmiLPBYTE) smival.value.oid.ptr,
  424.    (size_t) (smival.value.oid.len*sizeof(SmiUINT32)));
  425.     delete [] smival.value.oid.ptr;
  426.   }
  427.     // out with the old, in with the new...
  428.   smival.value.oid.ptr = new_oid;
  429.   MEMCPY((SmiLPBYTE) &new_oid[smival.value.oid.len],
  430.          (SmiLPBYTE) o.smival.value.oid.ptr,
  431.          (size_t) (o.smival.value.oid.len*sizeof(SmiUINT32)));
  432.   smival.value.oid.len += o.smival.value.oid.len;
  433.   return *this;
  434. }
  435. //=============[Oid::get_printable ]====================================
  436. // return string value
  437. //
  438. // return string portion of the oid
  439. //
  440. char * Oid::get_printable()
  441. {
  442.    unsigned long n;
  443.    // the worst case char len of an oid can be..
  444.    // oid.len*3 + dots in between if each oid is XXXX
  445.    // so.. size = (len*4) + (len-1) + 1 , extra for a null
  446.    n = (smival.value.oid.len *SNMPCHARSIZE) + ( smival.value.oid.len -1) + 1 ;
  447.    if (n==0) n=1; // need at least 1 byte for a null string
  448.    // adjust the len of output array in case size was adjusted
  449.    if ( iv_str!=0)
  450.      delete [] iv_str;
  451.    // allocate some space for the output string
  452.    iv_str = (char *) new char[ n];
  453.    // convert to an output string
  454.    if ( iv_str !=0)
  455.      OidToStr(&smival.value.oid,n,iv_str);
  456.    return iv_str;
  457. };
  458. //==========[Oid::get_printable( unsigned int n) ]=========================
  459. // overloaded get_printable to get the n left most values
  460. // as a dotted string
  461. char * Oid::get_printable( const unsigned long n)
  462. {
  463.   unsigned long index = 0;
  464.   unsigned long start;
  465.   unsigned totLen = 0;
  466.   char szNumber[SNMPBUFFSIZE];
  467.   unsigned long nz;
  468.   nz = (smival.value.oid.len *SNMPCHARSIZE) + ( smival.value.oid.len -1) + 1 ;
  469.   if (nz==0) nz=1; // need at least one byte for a null string
  470.   // delete the previous output string
  471.   if ( iv_str !=0)
  472.     delete [] iv_str;
  473.     // allocate some space for the output string
  474.   iv_str = (char *) new char[ nz];
  475.   if ( iv_str == 0)
  476.     return iv_str;
  477.     // init the string
  478.   iv_str[totLen] = 0;
  479.   // cannot ask for more then there is..
  480.   if (n>smival.value.oid.len)
  481.     return iv_str;
  482.   start = smival.value.oid.len - n;
  483.   // loop through and build up a string
  484.   for (index=start; index<smival.value.oid.len; index++)
  485.   {
  486.     // convert data element to a string
  487.     sprintf( szNumber,"%ld",smival.value.oid.ptr[index]);
  488.     // verify len is not over
  489.     if (totLen+STRLEN(szNumber)+1>=nz)
  490.       return iv_str;
  491.     // if not at end, pad with a dot
  492.     if (totLen!=0)
  493.       iv_str[totLen++] = '.';
  494.     // copy the string token into the main string
  495.     STRCPY(iv_str+totLen, szNumber);
  496.     // adjust the total len
  497.     totLen += STRLEN(szNumber);
  498.   }
  499.   return iv_str;
  500. };
  501. //==============[Oid::get_printable( unsigned int start, n) ]=============
  502. // return a dotted string starting at start,
  503. // going n positions to the left
  504. // NOTE, start is 1 based ( the first id is at position #1)
  505. char * Oid::get_printable( const unsigned long start,
  506.                            const unsigned long n)
  507. {
  508.   unsigned long index = 0;
  509.   unsigned long totLen = 0;
  510.   char szNumber[SNMPBUFFSIZE];
  511.   unsigned long nz;
  512.   unsigned long my_start;
  513.   my_start = start;
  514.   nz = (smival.value.oid.len *SNMPCHARSIZE) + ( smival.value.oid.len -1) + 1 ;
  515.   if (nz==0) nz=1; // need at least one byte for a null string
  516.   // clean up the previous output string
  517.   if ( iv_str !=0)
  518.     delete [] iv_str;
  519.     // allocate some space for the output string
  520.   iv_str = (char *) new char[ nz];
  521.   if ( iv_str == 0)
  522.     return iv_str;
  523.     // init the string
  524.   iv_str[totLen] = 0;
  525.   my_start -=1;
  526.         // cannot ask for more then there is..
  527.   if ((my_start+n-1)>smival.value.oid.len)
  528.     return iv_str;
  529.         // loop through and build up a string
  530.   for (index=my_start; index<(my_start+n); index++)
  531.   {
  532.     // convert data element to a string
  533.     sprintf( szNumber,"%ld",smival.value.oid.ptr[index]);
  534.     // verify len is not over
  535.     if (totLen+STRLEN(szNumber)+1>=nz)
  536.       return iv_str;
  537.     // if not at end, pad with a dot
  538.     if (totLen!=0)
  539.       iv_str[totLen++] = '.';
  540.     // copy the string token into the main string
  541.     STRCPY(iv_str+totLen, szNumber);
  542.     // adjust the total len
  543.     totLen += STRLEN(szNumber);
  544.   }
  545.   return iv_str;
  546. };
  547. //=============[Oid::StrToOid( char *string, SmiLPOID dst) ]==============
  548. // convert a string to an oid
  549. int Oid::StrToOid( const char *string,
  550.                    SmiLPOID dstOid)
  551. {
  552.   unsigned long index = 0;
  553.   unsigned long number = 0;
  554.   // make a temp buffer to copy the data into first
  555.   SmiLPUINT32 temp;
  556.   unsigned long nz;
  557.   if (string && *string) 
  558.   {
  559.      nz = STRLEN( string);
  560.   }
  561.   else {
  562.      dstOid->len = 0;
  563.      dstOid->ptr = NULL;
  564.      return -1;
  565.   }
  566.   temp = (SmiLPUINT32) new unsigned long [ nz];
  567.   // return if can't get the mem
  568.   if ( temp == 0) return -1;
  569.   while (*string!=0 && index<nz)
  570.   {
  571.     // init the number for each token
  572.     number = 0;
  573.     // skip over the dot
  574.     if (*string=='.') string++;
  575.             // grab a digit token and convert it to a long int
  576.     while (isdigit(*string))
  577.       number=number*10 + *(string++)-'0';
  578.                 // check for invalid chars
  579.     if (*string!=0 && *string!='.')
  580.       // Error: Invalid character in string
  581.     {
  582.       delete [] temp;
  583.       return -1;
  584.     }
  585.     // stuff the value into the array
  586.     temp[index] = number;
  587.     index++;  // bump the counter
  588.   }
  589.   // get some space for the real oid
  590.   dstOid->ptr = (SmiLPUINT32) new unsigned long [ index];
  591.   // return if can't get the mem needed
  592.   if( dstOid->ptr == 0)
  593.   {
  594.     delete [] temp;
  595.     return -1;
  596.   }
  597.   // copy in the temp data
  598.   MEMCPY((SmiLPBYTE) dstOid->ptr,
  599.          (SmiLPBYTE) temp,
  600.          (size_t) (index*sizeof(SmiUINT32)));
  601.   // set the len of the oid
  602.   dstOid->len = index;
  603.   // free up temp data
  604.   delete [] temp;
  605.   return (int) index;
  606. };
  607. //===============[Oid::OidCopy( source, destination) ]====================
  608. // Copy an oid
  609. int Oid::OidCopy( SmiLPOID srcOid,     // source oid
  610.                   SmiLPOID dstOid)     // destination oid
  611. {
  612.   // check source len ! zero
  613.   if (srcOid->len==0)
  614.     return -1;
  615.   // copy source to destination
  616.   MEMCPY((SmiLPBYTE) dstOid->ptr,
  617.          (SmiLPBYTE) srcOid->ptr,
  618.          (size_t) (srcOid->len*sizeof(SmiUINT32)));
  619.   //set the new len
  620.   dstOid->len = srcOid->len;
  621.   return (int) srcOid->len;
  622. };
  623. //===============[Oid::nCompare( n, Oid) ]=================================
  624. // compare the n leftmost values of two oids ( left-to_right )
  625. // 
  626. // self == Oid then return 0, they are equal
  627. // self < Oid then return -1, <
  628. // self > Oid then return 1,  >
  629. int Oid::nCompare( const unsigned long n, 
  630.                    const Oid &o) const
  631. {             
  632.    unsigned long z;
  633.    unsigned long len = n;
  634.    int reduced_len = 0;
  635.    
  636.    // 1st case they both are null
  637.    if (( len==0)&&( this->smival.value.oid.len==0)) return 0;  // equal
  638.    
  639.    // verify that n is valid, must be >= 0
  640.    if ( len <=0) return 1;                         // ! equal
  641.    // only compare for the minimal length
  642.    if (len > this->smival.value.oid.len){
  643.      len = this->smival.value.oid.len;
  644.      reduced_len = 1;
  645.    }
  646.    if (len > o.smival.value.oid.len){
  647.      len = o.smival.value.oid.len;
  648.      reduced_len = 1;
  649.    }
  650.    
  651.    z=0;
  652.    while(z<len)
  653.    {
  654.       if ( this->smival.value.oid.ptr[z] < o.smival.value.oid.ptr[z])
  655.         return -1;                              // less than
  656.       if ( this->smival.value.oid.ptr[z] > o.smival.value.oid.ptr[z])
  657.         return 1;                               // greater than
  658.       z++;    
  659.    }      
  660.    
  661.      // if we truncated the len then these may not be equal
  662.    if (reduced_len){
  663.      if (this->smival.value.oid.len < o.smival.value.oid.len)
  664.        return -1;
  665.      if (this->smival.value.oid.len > o.smival.value.oid.len)
  666.        return 1;
  667.    }
  668.    return 0;                                 // equal
  669.       
  670. };
  671. //===============[Oid::nCompare( n, Oid) ]=================================
  672. // compare the n rightmost bytes (right-to-left)
  673. // returns 0, equal
  674. // returns -1, <
  675. // returns 1 , >
  676. int Oid::RnCompare( const unsigned long n, const Oid &o) const
  677. {
  678.    // oid to compare must have at least the same number
  679.    // of sub-ids to comparison else the argument Oid is 
  680.    // less than THIS
  681.    if ( o.len() < n)
  682.       return -1;
  683.    // also can't compare argument oid for sub-ids which
  684.    // THIS does not have
  685.    if ( this->len() < n)
  686.       return -1;
  687.    int start = (int) this->len();
  688.    int end = (int) start - (int) n;
  689.    for ( int z=start;z< end;z--)
  690.    {
  691.        if ( o.smival.value.oid.ptr[z] < this->smival.value.oid.ptr[z])
  692.           return -1;
  693.        if ( o.smival.value.oid.ptr[z] > this->smival.value.oid.ptr[z])
  694.           return 1;
  695.    }
  696.    return 0;   // they are equal
  697. }; 
  698. //================[ Oid::valid() ]========================================
  699. // is the Oid object valid
  700. // returns validity
  701. int Oid::valid() const
  702. {
  703.    return ( smival.value.oid.ptr ? TRUE : FALSE ) ;
  704. };
  705. //================[Oid::OidToStr ]=========================================
  706. // convert an oid to a string
  707. int Oid::OidToStr( SmiLPOID srcOid,            // source oid
  708.                    unsigned long size,         // size of string
  709.                    char *string)               // pointer to string
  710. {
  711.   unsigned long index = 0;
  712.   unsigned totLen = 0;
  713.   char szNumber[SNMPBUFFSIZE];
  714.   // init the string
  715.   string[totLen] = 0;
  716.   // verify there is something to copy
  717.   if (srcOid->len==0)
  718.     return -1;
  719.   // loop through and build up a string
  720.   for (index=0; index<srcOid->len; index++)
  721.   {
  722.     // convert data element to a string
  723.     sprintf( szNumber,"%ld", srcOid->ptr[index]);
  724.     // verify len is not over
  725.     if (totLen+STRLEN(szNumber)+1>=size)
  726.       return -2;
  727.     // if not at end, pad with a dot
  728.     if (totLen!=0)
  729.       string[totLen++] = '.';
  730.     // copy the string token into the main string
  731.     STRCPY(string+totLen, szNumber);
  732.     // adjust the total len
  733.     totLen += STRLEN(szNumber);
  734.   }
  735.   return totLen+1;
  736. };
  737. //================[ general Value = operator ]========================
  738. SnmpSyntax& Oid::operator=( SnmpSyntax &val)
  739. {
  740.   // protect against assignment from self
  741.   if ( this == &val )
  742.       return *this;
  743.   // blow away old value
  744.   smival.value.oid.len = 0;
  745.   if (smival.value.oid.ptr) {
  746.       delete [] smival.value.oid.ptr;
  747.       smival.value.oid.ptr = NULL;
  748.   }
  749.   // assign new value
  750.   if (val.valid()){
  751.     switch (val.get_syntax()){
  752.       case sNMP_SYNTAX_OID:
  753.         set_data( ((Oid &)val).smival.value.oid.ptr, 
  754.   (unsigned int)((Oid &)val).smival.value.oid.len);
  755.         break;
  756.     }
  757.   }
  758.   return *this;
  759. };
  760. //================[ [] operator ]=====================================
  761. unsigned long& Oid::operator[](int position)
  762. {
  763.   return smival.value.oid.ptr[position];
  764. }
  765. //================[ clone ]===========================================
  766. SnmpSyntax *Oid::clone() const
  767.     return (SnmpSyntax *) new Oid(*this); 
  768. };