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

SNMP编程

开发平台:

Visual C++

  1. /*_############################################################################
  2.   _## 
  3.   _##  integer.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.   I N T E G E R . C P P
  43.   SMI INTEGER CLASS IMPLEMTATION
  44.   DESIGN + AUTHOR: Jeff Meyer
  45.   LANGUAGE:
  46.   ANSI C++
  47.   OPERATING SYSTEMS:
  48.   MS-Windows Win32
  49.   BSD UNIX
  50.   DESCRIPTION:
  51.   Class implemtation for SMI Integer classes.
  52. =====================================================================*/
  53. char integer_cpp_version[]="#(@) SNMP++ $Id: integer.cpp 128 2005-01-19 22:22:17Z katz $";
  54. #include <stdio.h>             // for sprintf()
  55. #include "snmp_pp/integer.h"   // header file for gauge class
  56. #ifdef SNMP_PP_NAMESPACE
  57. namespace Snmp_pp {
  58. #endif
  59. // constructor no value
  60. SnmpUInt32::SnmpUInt32() : valid_flag(true), m_changed(true)
  61. {
  62.   smival.value.uNumber = 0;
  63.   smival.syntax = sNMP_SYNTAX_UINT32;
  64. }
  65. // constructor with value
  66. SnmpUInt32::SnmpUInt32 (const unsigned long i)
  67.   : valid_flag(true), m_changed(true)
  68. {
  69.   smival.value.uNumber = i;
  70.   smival.syntax = sNMP_SYNTAX_UINT32;
  71. }
  72. // copy constructor
  73. SnmpUInt32::SnmpUInt32(const SnmpUInt32 &c) : valid_flag(true), m_changed(true)
  74. {
  75.   smival.value.uNumber=c.smival.value.uNumber;
  76.   smival.syntax = sNMP_SYNTAX_UINT32;
  77. }
  78. // overloaded assignment
  79. SnmpUInt32& SnmpUInt32::operator=(const unsigned long i)
  80. {
  81.   smival.value.uNumber = i;
  82.   valid_flag = true;
  83.   m_changed = true;
  84.   return *this;
  85. }
  86. // general assignment from any Value
  87. SnmpSyntax& SnmpUInt32::operator=(const SnmpSyntax &in_val)
  88. {
  89.   if (this == &in_val) return *this; // handle assignement from itself
  90.   valid_flag = false; // will get set true if really valid
  91.   if (in_val.valid())
  92.   {
  93.     switch (in_val.get_syntax())
  94.     {
  95.       case sNMP_SYNTAX_UINT32:
  96.    // case sNMP_SYNTAX_GAUGE32:   .. indistinquishable from UINT32
  97.       case sNMP_SYNTAX_CNTR32:
  98.       case sNMP_SYNTAX_TIMETICKS:
  99.       case sNMP_SYNTAX_INT32: // implied cast int -> uint
  100.   smival.value.uNumber =
  101.       ((SnmpUInt32 &)in_val).smival.value.uNumber;
  102.      valid_flag = true;
  103.   break;
  104.     }
  105.   }
  106.   m_changed = true;
  107.   return *this;
  108. }
  109. // overloaded assignment
  110. SnmpUInt32& SnmpUInt32::operator=(const SnmpUInt32 &uli)
  111. {
  112.   if (this == &uli) return *this;  // check for self assignment
  113.   smival.value.uNumber = uli.smival.value.uNumber;
  114.   valid_flag = uli.valid_flag;
  115.   m_changed = true;
  116.   return *this;
  117. }
  118. // ASCII format return
  119. const char *SnmpUInt32::get_printable() const
  120. {
  121.   if (m_changed == false) return output_buffer;
  122.   SnmpUInt32 *nc_this = PP_CONST_CAST(SnmpUInt32*, this);
  123.   sprintf(nc_this->output_buffer, "%lu", smival.value.uNumber);
  124.   nc_this->m_changed = false;
  125.   return output_buffer;
  126. }
  127. // Return the space needed for serialization
  128. int SnmpUInt32::get_asn1_length() const
  129. {
  130.   if (smival.value.uNumber < 0x80)
  131.     return 3;
  132.   else if (smival.value.uNumber < 0x8000)
  133.     return 4;
  134.   else if (smival.value.uNumber < 0x800000)
  135.     return 5;
  136.   else if (smival.value.uNumber < 0x80000000)
  137.     return 6;
  138.   return 7;
  139. }
  140. //====================================================================
  141. //  INT 32 Implementation
  142. //====================================================================
  143. // constructor no value
  144. SnmpInt32::SnmpInt32() : valid_flag(true), m_changed(true)
  145. {
  146.   smival.value.sNumber = 0;
  147.   smival.syntax = sNMP_SYNTAX_INT32;
  148. }
  149. // constructor with value
  150. SnmpInt32::SnmpInt32(const long i) : valid_flag(true), m_changed(true)
  151. {
  152.   smival.value.sNumber = i;
  153.   smival.syntax = sNMP_SYNTAX_INT32;
  154. }
  155. // constructor with value
  156. SnmpInt32::SnmpInt32(const SnmpInt32 &c) : valid_flag(true), m_changed(true)
  157. {
  158.   smival.value.sNumber = c.smival.value.sNumber;
  159.   smival.syntax = sNMP_SYNTAX_INT32;
  160. }
  161. // overloaded assignment
  162. SnmpInt32& SnmpInt32::operator=(const long i)
  163. {
  164.   smival.value.sNumber = (unsigned long) i;
  165.   valid_flag = true;
  166.   m_changed = true;
  167.   return *this;
  168. }
  169. // overloaded assignment
  170. SnmpInt32& SnmpInt32::operator=(const SnmpInt32 &uli)
  171. {
  172.   if (this == &uli) return *this;  // check for self assignment
  173.   smival.value.sNumber = uli.smival.value.sNumber;
  174.   valid_flag = uli.valid_flag;
  175.   m_changed = true;
  176.   return *this;
  177. }
  178. // general assignment from any Value
  179. SnmpSyntax& SnmpInt32::operator=(const SnmpSyntax &in_val)
  180. {
  181.   if (this == &in_val) return *this; // handle assignement from itself
  182.   valid_flag = false; // will get set true if really valid
  183.   if (in_val.valid())
  184.   {
  185.     switch (in_val.get_syntax())
  186.     {
  187.       case sNMP_SYNTAX_INT32:
  188.       case sNMP_SYNTAX_UINT32: // implied cast uint -> int
  189.    // case sNMP_SYNTAX_GAUGE32:   .. indistinquishable from UINT32
  190.       case sNMP_SYNTAX_CNTR32: // implied cast uint -> int
  191.       case sNMP_SYNTAX_TIMETICKS: // implied cast uint -> int
  192.   smival.value.sNumber =
  193. ((SnmpInt32 &)in_val).smival.value.sNumber;
  194.      valid_flag = true;
  195.   break;
  196.     }
  197.   }
  198.   m_changed = true;
  199.   return *this;
  200. }
  201. // ASCII format return
  202. const char *SnmpInt32::get_printable() const
  203. {
  204.   if (m_changed == false) return output_buffer;
  205.   SnmpInt32 *nc_this = PP_CONST_CAST(SnmpInt32*, this);
  206.   sprintf(nc_this->output_buffer, "%ld", (long)smival.value.sNumber);
  207.   nc_this->m_changed = false;
  208.   return output_buffer;
  209. }
  210. // Return the space needed for serialization
  211. int SnmpInt32::get_asn1_length() const
  212. {
  213.   if ((smival.value.sNumber <   0x80) &&
  214.       (smival.value.sNumber >= -0x80))
  215.     return 3;
  216.   else if ((smival.value.sNumber <   0x8000) &&
  217.    (smival.value.sNumber >= -0x8000))
  218.     return 4;
  219.   else if ((smival.value.sNumber <   0x800000) &&
  220.    (smival.value.sNumber >= -0x800000))
  221.     return 5;
  222.   return 6;
  223. }
  224. #ifdef SNMP_PP_NAMESPACE
  225. }; // end of namespace Snmp_pp
  226. #endif