vb.cpp
上传用户:ets1996
上传日期:2014-09-30
资源大小:353k
文件大小:10k
源码类别:

SNMP编程

开发平台:

Visual C++

  1. /*_############################################################################
  2.   _## 
  3.   _##  vb.cpp  
  4.   _##
  5.   _##  SNMP++v3.2.22
  6.   _##  -----------------------------------------------
  7.   _##  Copyright (c) 2001-2007 Jochen Katz, Frank Fock
  8.   _##
  9.   _##  This software is based on SNMP++2.6 from Hewlett Packard:
  10.   _##  
  11.   _##    Copyright (c) 1996
  12.   _##    Hewlett-Packard Company
  13.   _##  
  14.   _##  ATTENTION: USE OF THIS SOFTWARE IS SUBJECT TO THE FOLLOWING TERMS.
  15.   _##  Permission to use, copy, modify, distribute and/or sell this software 
  16.   _##  and/or its documentation is hereby granted without fee. User agrees 
  17.   _##  to display the above copyright notice and this license notice in all 
  18.   _##  copies of the software and any documentation of the software. User 
  19.   _##  agrees to assume all liability for the use of the software; 
  20.   _##  Hewlett-Packard and Jochen Katz make no representations about the 
  21.   _##  suitability of this software for any purpose. It is provided 
  22.   _##  "AS-IS" without warranty of any kind, either express or implied. User 
  23.   _##  hereby grants a royalty-free license to any and all derivatives based
  24.   _##  upon this software code base. 
  25.   _##  
  26.   _##  Stuttgart, Germany, Wed May  2 23:22:30 CEST 2007 
  27.   _##  
  28.   _##########################################################################*/
  29. /*===================================================================
  30.   Copyright (c) 1999
  31.   Hewlett-Packard Company
  32.   ATTENTION: USE OF THIS SOFTWARE IS SUBJECT TO THE FOLLOWING TERMS.
  33.   Permission to use, copy, modify, distribute and/or sell this software
  34.   and/or its documentation is hereby granted without fee. User agrees
  35.   to display the above copyright notice and this license notice in all
  36.   copies of the software and any documentation of the software. User
  37.   agrees to assume all liability for the use of the software; Hewlett-Packard
  38.   makes no representations about the suitability of this software for any
  39.   purpose. It is provided "AS-IS" without warranty of any kind,either express
  40.   or implied. User hereby grants a royalty-free license to any and all
  41.   derivatives based upon this software code base.
  42.   V B . C P P
  43.   VARIABLE BINDING CLASS IMPLEMENTATION
  44.   DESCRIPTION:
  45.   This module contains the class implementation of the VB class.
  46.   The Vb class is an encapsulation of the snmp variable binding.
  47.   DESIGN + AUTHOR:
  48.   Peter E Mellquist
  49.   LANGAUGE:
  50.   ANSI C++
  51.   OPERATING SYSTEMS:
  52.   MS-Windows Win32
  53.   BSD UNIX
  54. =====================================================================*/
  55. char vb_cpp_version[]="#(@) SNMP++ $Id: vb.cpp 212 2006-01-08 15:28:32Z katz $";
  56. #include "snmp_pp/vb.h"            // include vb class defs
  57. #ifdef SNMP_PP_NAMESPACE
  58. namespace Snmp_pp {
  59. #endif
  60. #define IP_ADDR_SIZE  4
  61. #define IPX_ADDR_SIZE 10
  62. #define MAC_ADDR_SIZE 6
  63. //--------------[ Vb::valid() ]-----------------------------------------
  64. // returns validity of a Vb object
  65. // must have a valid oid and value
  66. bool Vb::valid() const
  67. {
  68.   if (iv_vb_oid.valid() &&
  69. #ifdef WHEN_WE_HAVE_SNMPNULL_CLASS
  70.       iv_vb_value && iv_vb_value->valid()
  71. #else
  72.       ((iv_vb_value == NULL) || (iv_vb_value && iv_vb_value->valid()))
  73. #endif
  74.     )
  75.     return true;
  76.   return false;
  77. }
  78. //---------------[ Vb& Vb::operator=(const Vb &vb) ]--------------------
  79. // overloaded assignment allows assigning one Vb to another
  80. // this involves deep memory thus target vb needs to be freed
  81. // before assigning source
  82. Vb& Vb::operator=(const Vb &vb)
  83. {
  84.   if (this == &vb) return *this;  // check for self assignment
  85.   free_vb(); // free up target to begin with
  86.   //-----[ reassign the Oid portion 1st ]
  87.   vb.get_oid(iv_vb_oid);
  88.   //-----[ next set the vb value portion ]
  89.   if (vb.iv_vb_value)
  90.     iv_vb_value = vb.iv_vb_value->clone();
  91.   exception_status = vb.exception_status;
  92.   return *this; // return self reference
  93. }
  94. //----------------[ void Vb::free_vb() ]--------------------------------
  95. // protected method to free memory
  96. // this method is used to free memory when assigning new vbs
  97. // or destructing
  98. // in the case of oids and octets, we need to do a deep free
  99. void Vb::free_vb()
  100. {
  101.   if (iv_vb_value)
  102.   {
  103.     delete iv_vb_value;
  104.     iv_vb_value = NULL;
  105.   }
  106.   exception_status = SNMP_CLASS_SUCCESS;
  107. }
  108. //---------------------[ Vb::get_value(int &i) ]----------------------
  109. // get value int
  110. // returns 0 on success and value
  111. int Vb::get_value(int &i) const
  112. {
  113.    if (iv_vb_value &&
  114.        iv_vb_value->valid() &&
  115.        (iv_vb_value->get_syntax() == sNMP_SYNTAX_INT32 ))
  116.    {
  117.      long lval;
  118.      lval = *((SnmpInt32 *)iv_vb_value);// SnmpInt32 includes cast to long,
  119.      i = (int) lval;                    // but not to int.
  120.      return SNMP_CLASS_SUCCESS;
  121.    }
  122.    return SNMP_CLASS_INVALID;
  123. }
  124. //--------------[ Vb::get_value(long int &i) ]-------------------------
  125. // get the signed long int
  126. // returns 0 on success and a value
  127. int Vb::get_value(long &i) const
  128. {
  129.    if (iv_vb_value &&
  130.        iv_vb_value->valid() &&
  131.        (iv_vb_value->get_syntax() == sNMP_SYNTAX_INT32 ))
  132.    {
  133.      i = *((SnmpInt32 *)iv_vb_value); // SnmpInt32 includes cast to long
  134.      return SNMP_CLASS_SUCCESS;
  135.    }
  136.    return SNMP_CLASS_INVALID;
  137. }
  138. //-----------------[  Vb::get_value(unsigned long int &i) ]--------------
  139. // get the unsigned long int
  140. // returns 0 on success and a value
  141. int Vb::get_value(unsigned long &i) const
  142. {
  143.   if (iv_vb_value &&
  144.       iv_vb_value->valid() &&
  145.       ((iv_vb_value->get_syntax() == sNMP_SYNTAX_UINT32 ) ||
  146.        (iv_vb_value->get_syntax() == sNMP_SYNTAX_CNTR32 ) ||
  147.        (iv_vb_value->get_syntax() == sNMP_SYNTAX_GAUGE32 ) ||
  148.        (iv_vb_value->get_syntax() == sNMP_SYNTAX_TIMETICKS )))
  149.   {
  150.     i = *((SnmpUInt32 *)iv_vb_value); // SnmpUint32 has includes to ulong
  151.     return SNMP_CLASS_SUCCESS;
  152.   }
  153.   return SNMP_CLASS_INVALID;
  154. }
  155. //--------------[ Vb::get_value(unsigned char WINFAR * ptr, unsigned long &len)
  156. // get a unsigned char string value
  157. // destructive, copies into given ptr
  158. // also returned is the length
  159. //
  160. // Note!! The user must provide a target string
  161. // which is big enough to hold the string
  162. int Vb::get_value(unsigned char *ptr, unsigned long &len) const
  163. {
  164.   if (iv_vb_value &&
  165.       iv_vb_value->valid() &&
  166.       (iv_vb_value->get_syntax() == sNMP_SYNTAX_OCTETS))
  167.   {
  168.     OctetStr *p_os = (OctetStr *)iv_vb_value;
  169.     len = p_os->len();
  170.     memcpy(ptr, p_os->data(), len);
  171.     ptr[len] = 0;
  172.     return SNMP_CLASS_SUCCESS;
  173.   }
  174.   if (ptr) ptr[0] = 0;
  175.   len = 0;
  176.   return SNMP_CLASS_INVALID;
  177. }
  178. //---------------[ Vb::get_value ]-------------------------------------
  179. // get an unsigned char array
  180. // caller specifies max len of target space
  181. int Vb::get_value(unsigned char *ptr, unsigned long &len,
  182.   const unsigned long maxlen,
  183.   const bool add_null_byte) const
  184. {
  185.   if (iv_vb_value &&
  186.       iv_vb_value->valid() &&
  187.       (iv_vb_value->get_syntax() == sNMP_SYNTAX_OCTETS) &&
  188.       (maxlen > 0))
  189.   {
  190.     OctetStr *p_os = (OctetStr *)iv_vb_value;
  191.     len = p_os->len();
  192.     if (len > maxlen) len = maxlen;
  193.     memcpy(ptr, p_os->data(), len);
  194.     if (add_null_byte)
  195.     {
  196.       if (len == maxlen)
  197. ptr[len-1] = 0;
  198.       else
  199. ptr[len] = 0;
  200.     }
  201.     return SNMP_CLASS_SUCCESS;
  202.   }
  203.   if (ptr) ptr[0] = 0;
  204.   len = 0;
  205.   return SNMP_CLASS_INVALID;
  206. }
  207. //---------------[ Vb::get_value(Value &val) ]--------
  208. int Vb::get_value(SnmpSyntax &val) const
  209. {
  210.   if (iv_vb_value)
  211.   {
  212.     val = *iv_vb_value;
  213.     if (val.valid())
  214.       return SNMP_CLASS_SUCCESS;
  215.     return SNMP_CLASS_INVALID;
  216.   }
  217.   // TM: should set val to be invalid
  218.   return SNMP_CLASS_INVALID;
  219. }
  220. //--------------[ Vb::get_value(char WINFAR *ptr) ]-------------------
  221. // get a char * from an octet string
  222. // the user must provide space or
  223. // memory will be stepped on
  224. int Vb::get_value(char *ptr) const
  225. {
  226.   if (iv_vb_value &&
  227.       iv_vb_value->valid() &&
  228.       (iv_vb_value->get_syntax() == sNMP_SYNTAX_OCTETS))
  229.   {
  230.     OctetStr *p_os = (OctetStr *)iv_vb_value;
  231.     unsigned long len = p_os->len();
  232.     memcpy(ptr, p_os->data(), len);
  233.     ptr[len] = 0;
  234.     return SNMP_CLASS_SUCCESS;
  235.   }
  236.   if (ptr) ptr[0] = 0;
  237.   return SNMP_CLASS_INVALID;
  238. }
  239. //-----[ misc]--------------------------------------------------------
  240. // return the current syntax
  241. // This method violates Object Orientation but may be useful if
  242. // the caller has a vb object and does not know what it is.
  243. // This would be useful in the implementation of a browser.
  244. SmiUINT32 Vb::get_syntax() const
  245. {
  246.   if (exception_status != SNMP_CLASS_SUCCESS)
  247.     return exception_status;
  248.   else
  249.     return (iv_vb_value ? iv_vb_value->get_syntax() : sNMP_SYNTAX_NULL);
  250. }
  251. void Vb::set_syntax(const SmiUINT32 syntax)
  252. {
  253. free_vb(); // setting to SNMP_SYNTAX_NULL
  254. exception_status = SNMP_CLASS_SUCCESS;
  255. switch (syntax) {
  256. case sNMP_SYNTAX_INT32:
  257.    iv_vb_value = new SnmpInt32();
  258. break;
  259. case sNMP_SYNTAX_TIMETICKS:
  260. iv_vb_value = new TimeTicks();
  261. break;
  262. case sNMP_SYNTAX_CNTR32:
  263. iv_vb_value = new Counter32();
  264. break;
  265. case sNMP_SYNTAX_GAUGE32:
  266. iv_vb_value = new Gauge32();
  267. break;
  268. /* Not distinguishable from Gauge32
  269. case sNMP_SYNTAX_UINT32:
  270.    iv_vb_value = new SnmpUInt32();
  271. break;
  272. */
  273. case sNMP_SYNTAX_CNTR64:
  274.    iv_vb_value = new Counter64();
  275. break;
  276. case sNMP_SYNTAX_BITS:
  277. case sNMP_SYNTAX_OCTETS:
  278.    iv_vb_value = new OctetStr();
  279. break;
  280. case sNMP_SYNTAX_OPAQUE:
  281.    iv_vb_value = new OpaqueStr();
  282. break;
  283. case sNMP_SYNTAX_IPADDR:
  284.    iv_vb_value = new IpAddress();
  285. break;
  286. case sNMP_SYNTAX_OID:
  287.    iv_vb_value = new Oid();
  288. break;
  289. case sNMP_SYNTAX_NULL:
  290. break;
  291. case sNMP_SYNTAX_NOSUCHINSTANCE:
  292. exception_status = sNMP_SYNTAX_NOSUCHINSTANCE;
  293. break;
  294. case sNMP_SYNTAX_NOSUCHOBJECT:
  295. exception_status = sNMP_SYNTAX_NOSUCHOBJECT;
  296. break;
  297. case sNMP_SYNTAX_ENDOFMIBVIEW:
  298. exception_status = sNMP_SYNTAX_ENDOFMIBVIEW;
  299. break;
  300. case sNMP_SYNTAX_SEQUENCE:
  301. break;
  302. }
  303. }
  304. static char blank_string[] = "";
  305. // return the printabel value
  306. const char WINFAR *Vb::get_printable_value() const
  307. {
  308.   if (iv_vb_value)
  309.     return iv_vb_value->get_printable();
  310.   return blank_string;
  311. }
  312. int Vb::get_asn1_length() const
  313. {
  314.   // Header for vbs is always 4 Bytes! FIXME
  315.   if (iv_vb_value)
  316.     return iv_vb_oid.get_asn1_length() + iv_vb_value->get_asn1_length() + 4;
  317.   return iv_vb_oid.get_asn1_length() + 2 + 4;
  318. }
  319. #ifdef SNMP_PP_NAMESPACE
  320. }; // end of namespace Snmp_pp
  321. #endif