oid.h
上传用户:uncom666
上传日期:2020-03-30
资源大小:1426k
文件大小:13k
源码类别:

SNMP编程

开发平台:

Visual C++

  1. /*_############################################################################
  2.   _## 
  3.   _##  oid.h  
  4.   _##
  5.   _##  SNMP++v3.2.24
  6.   _##  -----------------------------------------------
  7.   _##  Copyright (c) 2001-2009 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, Fri May 29 22:35:14 CEST 2009 
  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.   SNMP++ O I D. H
  43.   OID CLASS DEFINITION
  44.   DESIGN + AUTHOR:   Peter E Mellquist
  45.   DESCRIPTION:
  46.   This class is fully contained and does not rely on or any other
  47.   SNMP libraries. This class is portable across any platform
  48.   which supports C++.
  49. =====================================================================*/
  50. // $Id: oid.h 1541 2009-05-29 11:29:22Z katz $
  51. #ifndef _OID_H_
  52. #define _OID_H_
  53. //------------------------------------------------------------------------
  54. #include "snmp_pp/smival.h"                // derived class for all values
  55. #include "snmp_pp/collect.h"
  56. #ifdef SNMP_PP_NAMESPACE
  57. namespace Snmp_pp {
  58. #endif
  59. /**
  60.  * The Object Identifier Class.
  61.  *
  62.  * The Object Identification (Oid) class is the encapsulation of an
  63.  * SMI object identifier. The SMI object is a data identifier for a
  64.  * data element found in a Management Information Base (MIB), as
  65.  * defined by a MIB definition. The SMI Oid, its related structures
  66.  * and functions, are a natural fit for object orientation. In fact,
  67.  * the Oid class shares many common features to the C++ String
  68.  * class. For those of you familiar with the C++ String class or
  69.  * Microsoft's Foundation Classes (MFC) CString class, the Oid class
  70.  * will be familiar and easy to use. The Oid class is designed to be
  71.  * efficient and fast. The Oid class allows definition and
  72.  * manipulation of object identifiers. 
  73.  *
  74.  * @note Oid holds two internal buffers for get_printable() functions.
  75.  *       The buffer returned by get_printable() is valid until the
  76.  *       Oid object is modified. The functions get_printable(len) and
  77.  *       get_printable(start, len) share the same buffer which is
  78.  *       freed and newly allocated for each call.
  79.  */
  80. class DLLOPT Oid : public SnmpSyntax
  81. {
  82.  public:
  83.   /**
  84.    * Construct an invalid Oid.
  85.    */
  86.   Oid();
  87.   /**
  88.    * Construct an Oid from a string.
  89.    *
  90.    * Depending on the second param, the oid_string can either be
  91.    * - a dotted oid string (like "1.3.6.1.6"). An arbitrary part
  92.    *   of the oid can be given as a string value enclosed in
  93.    *   '$' characters. For example the oid string
  94.    *   "1.3.6.1.6.1.12.1.3.$public0$" will result to the oid
  95.    *   1.3.6.1.6.1.12.1.3.112.117.98.108.105.99.95.48
  96.    * - a normal string (like "public"). The Oid will have the
  97.    *   ASCII values of the string characters. So "public" will
  98.    *   result to the oid 112.117.98.108.105.99
  99.    * 
  100.    * @param oid_string - for example "1.3.1.6.1.10"
  101.    * @param is_dotted_oid_string - Select format within oid_string
  102.    */
  103.   Oid(const char *oid_string, const bool is_dotted_oid_string = true);
  104.   /**
  105.    * Constructor using another oid object (copy constructor).
  106.    *
  107.    * @param oid - Source Oid
  108.    */
  109.   Oid(const Oid &oid);
  110.   /**
  111.    * Constructor from array.
  112.    *
  113.    * @param raw_oid - array of oid values
  114.    * @param oid_len - length of array
  115.    */
  116.   Oid(const unsigned long *raw_oid, int oid_len);
  117. #if 0 // can be done through Oid o; o.set_data("public", 6); 
  118.   /**
  119.    * Constructor from standard C string array.
  120.    *
  121.    * @note This constructor does not take a dotted oid string as argument.
  122.    *
  123.    * @param str     - Array of new values (a string)
  124.    * @param str_len - Length of the array raw_oid
  125.    */
  126.   Oid(const char *str, const unsigned int str_len);
  127. #endif
  128.   /**
  129.    * Destructor.
  130.    */
  131.   virtual ~Oid();
  132.   /**
  133.    * Return the current syntax.
  134.    *
  135.    * @return always sNMP_SYNTAX_OID
  136.    */
  137.   SmiUINT32 get_syntax() const { return sNMP_SYNTAX_OID; };
  138.   /**
  139.    * Assignment from a string.
  140.    *
  141.    * @param dotted_oid_string - New value (for example "1.3.6.1.6.0");
  142.    */
  143.   virtual Oid& operator=(const char *dotted_oid_string);
  144.   /**
  145.    * Assign one Oid to another.
  146.    */
  147.   virtual Oid& operator=(const Oid &oid);
  148.   /**
  149.    * Return the space needed for serialization.
  150.    */
  151.   int get_asn1_length() const;
  152.   /**
  153.    * Overloaded equal operator.
  154.    */
  155.   DLLOPT friend int operator==(const Oid &lhs, const Oid &rhs);
  156.   /**
  157.    * Overloaded not equal operator.
  158.    */
  159.   DLLOPT friend int operator!=(const Oid &lhs, const Oid &rhs)
  160.       { return (!(lhs == rhs)); };  // just invert ==
  161.   /**
  162.    * Overloaded less than < operator.
  163.    */
  164.   DLLOPT friend int operator<(const Oid &lhs, const Oid &rhs);
  165.   /**
  166.    * Overloaded less than <= operator.
  167.    */
  168.   DLLOPT friend int operator<=(const Oid &lhs, const Oid &rhs)
  169.       { return ((lhs < rhs) || (lhs == rhs)); };
  170.   /**
  171.    * Overloaded greater than > operator.
  172.    */
  173.   DLLOPT friend int operator>(const Oid &lhs, const Oid &rhs)
  174.       { return (!(lhs <= rhs)); };  // just invert existing <=
  175.   /**
  176.    * Overloaded greater than >= operator.
  177.    */
  178.   DLLOPT friend int operator>=(const Oid &lhs, const Oid &rhs)
  179.       { return (!(lhs < rhs)); };  // just invert existing <
  180.   /**
  181.    * Overloaded equal operator operator.
  182.    */
  183.   DLLOPT friend int operator==(const Oid &lhs, const char *rhs);
  184.   /**
  185.    * Overloaded not equal operator.
  186.    */
  187.   DLLOPT friend int operator!=(const Oid &lhs, const char *rhs);
  188.   /**
  189.    * Overloaded less than < operator.
  190.    */
  191.   DLLOPT friend int operator<(const Oid &lhs, const char *rhs);
  192.   /**
  193.    * Overloaded less than <= operator.
  194.    */
  195.   DLLOPT friend int operator<=(const Oid &lhs, char *rhs);
  196.   /**
  197.    * Overloaded greater than > operator.
  198.    */
  199.   DLLOPT friend int operator>(const Oid &lhs, const char *rhs);
  200.   /**
  201.    * Overloaded greater than >= operator.
  202.    */
  203.   DLLOPT friend int operator>=(const Oid &lhs, const char *rhs);
  204.   /**
  205.    * Overloaded operator +, Concatenate two Oids.
  206.    */
  207.   DLLOPT friend Oid operator +(const Oid &lhs, const Oid &rhs)
  208.     { Oid tmp(lhs); tmp += rhs; return tmp;};
  209.   /**
  210.    * Append operator, appends the dotted oid string.
  211.    *
  212.    * @param a - dotted oid string, for example "5.192.14.6"
  213.    */
  214.   Oid& operator+=(const char *a);
  215.   /**
  216.    * Appends an int.
  217.    *
  218.    * @param i - Value to add at the end of the Oid
  219.    */
  220.   Oid& operator+=(const unsigned long i);
  221.   /**
  222.    * Appends an Oid.
  223.    *
  224.    * @param o - Oid to add at the end
  225.    */
  226.   Oid& operator+=(const Oid &o);
  227.   /**
  228.    * Allows element access as an array.
  229.    * This method behaves like real array: if your index
  230.    * is out of bounds, you're lost!
  231.    *
  232.    * @param index - valid index -- 0 to (len() - 1)
  233.    *
  234.    * @return Value on the given index
  235.    */
  236.   unsigned long &operator[](const unsigned int index)
  237.     { m_changed = true; return smival.value.oid.ptr[index]; };
  238.   /**
  239.    * Allows element access as an array for const objects.
  240.    * This method behaves like real array: if your index
  241.    * is out of bounds, you're lost!
  242.    *
  243.    * @param index - valid index -- 0 to (len() - 1)
  244.    *
  245.    * @return Value on the given position
  246.    */
  247.   unsigned long operator[](const unsigned int index) const
  248.     { return (index >= len()) ? 0 : smival.value.oid.ptr[index]; };
  249.   /**
  250.    * Get the WinSnmp oid part.
  251.    * @note This method returns a pointer to internal data.
  252.    *       If it is modified, the Oid changes too.
  253.    *
  254.    * @return pointer to the internal oid structure.
  255.    */
  256.   SmiLPOID oidval() { return (SmiLPOID) &smival.value.oid; };
  257.   /**
  258.    * Set the data from raw form.
  259.    *
  260.    * @param raw_oid - Array of new values
  261.    * @param oid_len - Length of the array raw_oid
  262.    */
  263.   void set_data(const unsigned long *raw_oid, const unsigned int oid_len);
  264.   /**
  265.    * Set the data from raw form.
  266.    *
  267.    * @param str     - Array of new values (a string)
  268.    * @param str_len - Length of the array raw_oid
  269.    */
  270.   void set_data(const char *str, const unsigned int str_len);
  271.   /**
  272.    * Get the length of the oid.
  273.    */
  274.   unsigned long len() const { return smival.value.oid.len; };
  275.   /**
  276.    * Trim off the rightmost values of an oid.
  277.    *
  278.    * @param n - Trim off n values from the right (default is one)
  279.    */
  280.   void trim(const unsigned long n = 1);
  281.   /**
  282.    * Compare two Oids from the left in direction left-to-right.
  283.    *
  284.    * @param n - Subvalues to compare
  285.    * @param o - The Oid to compare with
  286.    *
  287.    * @return 0 if equal / -1 if less / 1 if greater
  288.    */
  289.   int nCompare(const unsigned long n, const Oid &o) const;
  290.   /**
  291.    * Return validity of the object.
  292.    */
  293.   bool valid() const { return (smival.value.oid.ptr ? true : false); };
  294.   /**
  295.    * Get a printable ASCII string of the whole value.
  296.    *
  297.    * @return Dotted oid string (for example "1.3.6.1.6.0")
  298.    */
  299.   const char *get_printable() const
  300.     { return get_printable(1, smival.value.oid.len, (char*&)iv_str); };
  301.   /**
  302.    * Get a printable ASCII string of the right part of the value.
  303.    *
  304.    * @param n - positions to print, counted from right.
  305.    *
  306.    * @return Dotted oid string (for example "6.0")
  307.    */
  308.   const char *get_printable(const unsigned long n) const
  309.     { return get_printable(smival.value.oid.len - n + 1, n, (char*&)iv_part_str); };
  310.   /**
  311.    * Get a printable ASCII string of a part of the value.
  312.    *
  313.    * @param start - First position to print, starting with 1 (not zero!)
  314.    * @param n - positions to print.
  315.    * @param buffer - pointer to the returned buffer
  316.    *
  317.    * @note If buffer is not NULL, this function calls "delete [] buffer",
  318.    *       a new buffer is allocated using "new" and the caller has
  319.    *       to delete it.
  320.    *
  321.    * @return Dotted oid string (for example "3.6.1.6")
  322.    */
  323.   const char *get_printable(const unsigned long start,
  324.     const unsigned long n,
  325.     char *&buffer) const;
  326.   /**
  327.    * Get a printable ASCII string of a part of the value.
  328.    *
  329.    * @param start - First position to print, starting with 1 (not zero!)
  330.    * @param n - positions to print.
  331.    *
  332.    * @return Dotted oid string (for example "3.6.1.6")
  333.    */
  334.   const char *get_printable(const unsigned long start,
  335.     const unsigned long n) const
  336.     { return get_printable(start, n, (char*&)iv_part_str); };
  337.   /**
  338.    * Clone this object.
  339.    *
  340.    * @return Pointer to the newly created object (allocated through new).
  341.    */
  342.   SnmpSyntax *clone() const { return (SnmpSyntax *) new Oid(*this); };
  343.   /**
  344.    * Map other SnmpSyntax objects to Oid.
  345.    */
  346.   SnmpSyntax& operator=(const SnmpSyntax &val);
  347.   /**
  348.    * Clear the Oid.
  349.    */
  350.   void clear() { delete_oid_ptr(); };
  351.  protected:
  352.   /**
  353.    * Convert a string to an smi oid.
  354.    *
  355.    * @param string - input string
  356.    * @param dstOid - destination oid
  357.    */
  358.   virtual int StrToOid(const char *string, SmiLPOID dstOid) const;
  359.   /**
  360.    * Clone an smi oid.
  361.    *
  362.    * @param srcOid - source oid
  363.    * @param dstOid - destination oid
  364.    */
  365.   virtual int OidCopy(SmiLPOID srcOid, SmiLPOID dstOid) const;
  366.   /**
  367.    * Convert an smi oid to its string representation.
  368.    *
  369.    * @param srcOid - source oid
  370.    * @param size   - size of string
  371.    * @param string - pointer to string
  372.    */
  373.   virtual int OidToStr(const SmiOID *srcOid,
  374.        SmiUINT32 size,
  375.        char *string) const;
  376.   /**
  377.    * Free the internal oid pointer and set the pointer and the length to zero.
  378.    */
  379.   inline void delete_oid_ptr();
  380.   //----[ instance variables ]
  381.   SNMP_PP_MUTABLE char *iv_str;      // used for returning complete oid string
  382.   SNMP_PP_MUTABLE char *iv_part_str; // used for returning part oid string
  383.   SNMP_PP_MUTABLE bool m_changed;
  384. };
  385. //-----------[ End Oid Class ]-------------------------------------
  386. // create OidCollection type
  387. typedef SnmpCollection <Oid> OidCollection;
  388. inline void Oid::delete_oid_ptr()
  389. {
  390.   // delete the old value
  391.   if (smival.value.oid.ptr)
  392.   {
  393.     delete [] smival.value.oid.ptr;
  394.     smival.value.oid.ptr = 0;
  395.   }
  396.   smival.value.oid.len = 0;
  397.   m_changed = true;
  398. }
  399. #ifdef SNMP_PP_NAMESPACE
  400. } // end of namespace Snmp_pp
  401. #endif 
  402. #endif //_OID_H_