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

SNMP编程

开发平台:

Visual C++

  1. /*_############################################################################
  2.   _## 
  3.   _##  address.h  
  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.   SNMP++ A D D R E S S . H
  43.   ADDRESS CLASS DEFINITION
  44.   DESIGN + AUTHOR:   Peter E Mellquist
  45.   DESCRIPTION:
  46.   Address class definition. Encapsulates various network
  47.   addresses into easy to use, safe and portable classes.
  48. =====================================================================*/
  49. // $Id: address.h 287 2007-03-22 22:37:09Z katz $
  50. #ifndef _ADDRESS
  51. #define _ADDRESS
  52. //----[ includes ]-----------------------------------------------------
  53. #include <string.h>
  54. #if defined (CPU) && CPU == PPC603
  55. #undef HASH1
  56. #undef HASH2
  57. #else
  58. #include <memory.h>
  59. #endif
  60. #include "snmp_pp/config_snmp_pp.h" // for _IPX_ADDRESS and _MAC_ADDRESS
  61. #include "snmp_pp/smival.h"
  62. #include "snmp_pp/collect.h"
  63. #include "snmp_pp/reentrant.h"
  64. // include sockets header files
  65. // for Windows16 and Windows32 include Winsock
  66. // otherwise assume UNIX
  67. #if defined (CPU) && CPU == PPC603
  68. #include <inetLib.h>
  69. #include <hostLib.h>
  70. #endif
  71. #ifdef __unix
  72. #if !defined(_AIX) && !defined(__QNX_NEUTRINO)
  73. #include <unistd.h>
  74. #endif
  75. #include <sys/socket.h>
  76. #include <netinet/in.h>
  77. #include <netdb.h>
  78. #include <arpa/inet.h>
  79. #if defined _AIX
  80. #include <strings.h> // This is needed for FD_SET, bzero
  81. #endif
  82. #if !defined __CYGWIN32__ && !defined __hpux && !defined linux && !defined _AIX
  83. extern int h_errno;  // defined in WinSock header, but not for UX?!
  84. #endif
  85. #endif // __unix
  86. #ifdef WIN32
  87. #ifndef __unix         // __unix overrides WIN32 if both options are present
  88. #include <winsock.h>
  89. #endif
  90. #endif
  91. #ifdef SNMP_PP_NAMESPACE
  92. namespace Snmp_pp {
  93. #endif
  94. //----[ macros ]-------------------------------------------------------
  95. #define ADDRBUF 40     // worst case of address lens
  96. #define OUTBUFF 80     // worst case of output lens
  97. #define IPLEN      4
  98. #define IP6LEN     16
  99. #define UDPIPLEN   6
  100. #define UDPIP6LEN  18
  101. #define IPXLEN     10
  102. #define IPXSOCKLEN 12
  103. #define MACLEN     6
  104. #define MAX_FRIENDLY_NAME 80
  105. #define HASH0 19
  106. #define HASH1 13
  107. #define HASH2 7
  108. //---[ forward declarations ]-----------------------------------------
  109. class GenAddress;
  110. //----[ Address class ]-----------------------------------------------
  111. /**
  112.  * Base class of all Address classes.
  113.  */
  114. class DLLOPT Address : public SnmpSyntax
  115. {
  116.   friend class GenAddress;
  117.  public:
  118.   //----[ enumerated types for address types ]---------------------------
  119.   /**
  120.    * Type returned by Address::get_type().
  121.    */
  122.   enum addr_type
  123.   {
  124.     type_ip,      ///< IpAddress (IPv4 or IPv6)
  125.     type_ipx,     ///< IpxAddress
  126.     type_udp,     ///< UdpAddress (IPv4 or IPv6)
  127.     type_ipxsock, ///< IpxSockAddress
  128.     type_mac,     ///< MacAddress
  129.     type_invalid  ///< Used by GenAddress::get_type() if address is not valid
  130.   };
  131.   /**
  132.    * Type returned by IpAddress::get_ip_version() and
  133.    * UdpAddress::get_ip_version().
  134.    */
  135.   enum version_type
  136.   {
  137.     version_ipv4, ///< IPv4
  138.     version_ipv6  ///< IPv6
  139.   };
  140.   /**
  141.    * Default constructor, clears the buffer and sets valid flag to false.
  142.    */
  143.   Address();
  144.   /**
  145.    * Allow destruction of derived classes.
  146.    */
  147.   virtual ~Address() {};
  148.   /// overloaded equivlence operator, are two addresses equal?
  149.   DLLOPT friend int operator==(const Address &lhs,const Address &rhs);
  150.   /// overloaded not equivlence operator, are two addresses not equal?
  151.   DLLOPT friend int operator!=(const Address &lhs, const Address &rhs)
  152.     { return !(lhs == rhs); };
  153.   /// overloaded > operator, is a1 > a2
  154.   DLLOPT friend int operator>(const Address &lhs,const Address &rhs);
  155.   /// overloaded >= operator, is a1 >= a2
  156.   DLLOPT friend int operator>=(const Address &lhs,const Address &rhs)
  157.     { if ((lhs > rhs) || (lhs == rhs)) return true;  return false; };
  158.   /// overloaded < operator, is a1 < a2
  159.   DLLOPT friend int operator<(const Address &lhs,const Address &rhs);
  160.   /// overloaded <= operator, is a1 <= a2
  161.   DLLOPT friend int operator<=(const Address &lhs, const Address &rhs)
  162.     { if ((lhs < rhs) || (lhs == rhs)) return true; return false; };
  163.   /// equivlence operator overloaded, are an address and a string equal?
  164.   DLLOPT friend int operator==(const Address &lhs,const char *rhs);
  165.   /// overloaded not equivlence operator, are an address and string not equal?
  166.   DLLOPT friend int operator!=(const Address &lhs,const char *rhs)
  167.     { return !(lhs == rhs); };
  168.   /// overloaded < , is an address greater than a string?
  169.   DLLOPT friend int operator>(const Address &lhs,const char *rhs);
  170.   /// overloaded >=, is an address greater than or equal to a string?
  171.   DLLOPT friend int operator>=(const Address &lhs,const char *rhs);
  172.   /// overloaded < , is an address less than a string?
  173.   DLLOPT friend int operator<(const Address &lhs,const char *rhs);
  174.   /// overloaded <=, is an address less than or equal to a string?
  175.   DLLOPT friend int operator<=(const Address &lhs,const char *rhs);
  176.   /**
  177.    * Overloaded operator for streaming output.
  178.    *
  179.    * @return String containing the numerical address
  180.    */
  181.   virtual operator const char *() const = 0;
  182.   /**
  183.    * Return if the object contains a valid address.
  184.    *
  185.    * @return true if the object is valid
  186.    */
  187.   virtual bool valid() const { return valid_flag; };
  188.   /**
  189.    * Return the space needed for serialization.
  190.    */
  191.   virtual int get_asn1_length() const = 0;
  192.   /**
  193.    * Access as an array (read and write).
  194.    * @note Only pass in values between 0 and get_length().
  195.    *
  196.    * @param position - pos to return
  197.    * @return reference to the byte at the given position
  198.    */
  199.   unsigned char& operator[](const int position)
  200.     { addr_changed = true; valid_flag = true;
  201.       return (position < ADDRBUF) ? address_buffer[position]
  202.                                   : address_buffer[0]; };
  203.   /**
  204.    * Access as an array (read only).
  205.    * @note Only pass in values between 0 and get_length().
  206.    *
  207.    * @param position - pos to return
  208.    * @return the byte at the given position
  209.    */
  210.   unsigned char operator[](const int position) const
  211.     { return (position < ADDRBUF) ? address_buffer[ position] : 0; }
  212.   /**
  213.    * Get the length of the binary address (accessible through operator[]).
  214.    */
  215.   virtual int get_length() const = 0;
  216.   /**
  217.    * Get the type of the address.
  218.    * @see Address::addr_type
  219.    */
  220.   virtual addr_type get_type() const = 0;
  221.   /**
  222.    * Overloaded assignment operator.
  223.    */
  224.   virtual SnmpSyntax& operator=(const SnmpSyntax &val) = 0;
  225.   // return a hash key
  226.   virtual unsigned int hashFunction() const { return 0;};
  227.  protected:
  228.   SNMP_PP_MUTABLE bool addr_changed;
  229.   bool valid_flag;
  230.   unsigned char address_buffer[ADDRBUF]; // internal representation
  231.   // parse the address string
  232.   // redefined for each specific address subclass
  233.   virtual bool parse_address(const char * inaddr) = 0;
  234.   // format the output
  235.   // redefined for each specific address subclass
  236.   virtual void format_output() const = 0;
  237.   /**
  238.    * Trim of whitespaces at the start and the end of the string.
  239.    *
  240.    * @param ptr - string to trim
  241.    */
  242.   void trim_white_space(char * ptr);
  243.   /**
  244.    * Is this a GenAddress object.
  245.    */
  246.   virtual bool is_gen_address() const { return false; };
  247.   /**
  248.    * Reset the object.
  249.    */
  250.   void clear();
  251. #if !defined HAVE_GETHOSTBYNAME_R || !defined HAVE_GETHOSTBYADDR_R || !defined HAVE_REENTRANT_GETHOSTBYNAME || !defined HAVE_REENTRANT_GETHOSTBYADDR
  252. #ifdef _THREADS
  253.   static SnmpSynchronized syscall_mutex;
  254. #endif
  255. #endif
  256. };
  257. //-----------------------------------------------------------------------
  258. //---------[ IP Address Class ]------------------------------------------
  259. //-----------------------------------------------------------------------
  260. class DLLOPT IpAddress : public Address
  261. {
  262.  public:
  263.   /**
  264.    * Construct an empty invalid IP address.
  265.    */
  266.   IpAddress();
  267.   /**
  268.    * Construct an IP address from a string.
  269.    *
  270.    * The following formats can be used:
  271.    * - hostname with or without domain ("www.agentpp.com", "printsrv")
  272.    * - Numerical IPv4 address ("192.168.17.1")
  273.    * - Numerical IPv6 address ("abcd:1234::a:b:1", "::abcd:1")
  274.    *
  275.    * @param inaddr - Hostname or IP address
  276.    */
  277.   IpAddress(const char *inaddr);
  278.   /**
  279.    * Construct an IP address from another IP address.
  280.    *
  281.    * @param ipaddr - address to copy
  282.    */
  283.   IpAddress(const IpAddress &ipaddr);
  284.   /**
  285.    * Construct an IP address from a GenAddress.
  286.    *
  287.    * @param genaddr - address to copy
  288.    */
  289.   IpAddress(const GenAddress &genaddr);
  290.   /**
  291.    * Destructor (ensure that SnmpSyntax::~SnmpSyntax() is overridden).
  292.    */
  293.   ~IpAddress() {};
  294.   /**
  295.    * Map other SnmpSyntax objects to IpAddress.
  296.    */
  297.   SnmpSyntax& operator=(const SnmpSyntax &val);
  298.   /**
  299.    * Overloaded assignment operator for other IP addresses.
  300.    */
  301.   IpAddress& operator=(const IpAddress &ipaddress);
  302.   /**
  303.    * Overloaded assignment operator for strings.
  304.    */
  305.   IpAddress& operator=(const char *inaddr);
  306.   /**
  307.    * Clone this object.
  308.    *
  309.    * @return Pointer to the newly created object (allocated through new).
  310.    */
  311.   SnmpSyntax *clone() const { return (SnmpSyntax *) new IpAddress(*this); };
  312.   /**
  313.    * Return the friendly name. Does a reverse DNS lookup for the IP address.
  314.    *
  315.    * @param status - The errno value for the lookup
  316.    *
  317.    * @return the friendly name or a zero length string (no null pointer)
  318.    */
  319.   char *friendly_name(int &status);
  320.   /**
  321.    * Get a printable ASCII value of the address.
  322.    *
  323.    * @return String containing the numerical address
  324.    */
  325.   virtual const char *get_printable() const
  326.     { if (addr_changed) format_output(); return output_buffer; };
  327.   /**
  328.    * Overloaded operator for streaming output.
  329.    *
  330.    * @return String containing the numerical address
  331.    */
  332.   virtual operator const char *() const
  333.     { if (addr_changed) format_output(); return output_buffer; };
  334.   /**
  335.    * Logically AND the address with the param.
  336.    *
  337.    * @param ipaddr - address to use as mask
  338.    */
  339.   void mask(const IpAddress &ipaddr);
  340.   /**
  341.    * Get the count of matching bits from the left.
  342.    *
  343.    * @param match_ip - address to match with
  344.    */
  345.   int get_match_bits(const IpAddress match_ip) const;
  346.   /**
  347.    * Get the length of the binary address (accessible through operator[]).
  348.    */
  349.   virtual int get_length() const
  350.     { return (ip_version == version_ipv4) ? IPLEN : IP6LEN; };
  351.   /**
  352.    * Return the type of the address.
  353.    * @see Address::addr_type
  354.    * @return Always Address:type_ip
  355.    */
  356.   virtual addr_type get_type() const { return type_ip; };
  357.   /**
  358.    * Return the syntax.
  359.    *
  360.    * @return This method always returns sNMP_SYNTAX_IPADDR.
  361.    */
  362.   virtual SmiUINT32 get_syntax() const { return sNMP_SYNTAX_IPADDR; };
  363.   /**
  364.    * Return the space needed for serialization.
  365.    */
  366.   virtual int get_asn1_length() const
  367.     { return (ip_version == version_ipv4) ? (IPLEN + 2) : (IP6LEN + 2); };
  368.   /**
  369.    * Return the IP version of the address.
  370.    *
  371.    * @return one of Address::version_type
  372.    */
  373.   virtual version_type get_ip_version() const { return ip_version; };
  374.   /**
  375.    * Map a IPv4 address to a IPv6 address.
  376.    *
  377.    * @return - TRUE if no error occured.
  378.    */
  379.   virtual int map_to_ipv6();
  380.   /**
  381.    * Reset the object.
  382.    */
  383.   void clear();
  384.  protected:
  385.   SNMP_PP_MUTABLE char output_buffer[OUTBUFF];           // output buffer
  386.   // friendly name storage
  387.   char iv_friendly_name[MAX_FRIENDLY_NAME];
  388.   int  iv_friendly_name_status;
  389.   // redefined parse address
  390.   // specific to IP addresses
  391.   virtual bool parse_address(const char *inaddr);
  392.   // redefined format output
  393.   // specific to IP addresses
  394.   virtual void format_output() const;
  395.   // parse a dotted string
  396.   int parse_dotted_ipstring(const char *inaddr);
  397.   // parse a coloned string
  398.   int parse_coloned_ipstring(const char *inaddr);
  399.   // using the currently defined address, do a DNS
  400.   // and try to fill up the name
  401.   int addr_to_friendly();
  402.   // support both ipv4 and ipv6 addresses
  403.   version_type ip_version;
  404. };
  405. //------------------------------------------------------------------------
  406. //---------[ UDP Address Class ]------------------------------------------
  407. //------------------------------------------------------------------------
  408. class DLLOPT UdpAddress : public IpAddress
  409. {
  410.  public:
  411.   /**
  412.    * Construct an empty invalid UDP address.
  413.    */
  414.   UdpAddress();
  415.   /**
  416.    * Construct an UDP address from a string.
  417.    *
  418.    * The following formats can be used additional to those recognized by
  419.    * IpAdress:
  420.    * - Port added to IPv4 address with '/' or ':'
  421.    *   ("192.168.17.1:161", "192.168.17.1/161", "printsrv/161")
  422.    * - Port added to IPv6 address with '/' or using '[...]:'
  423.    *   ("::1/162", "[::1]/162", "[::1]:162")
  424.    *
  425.    * @param inaddr - Hostname or IP address
  426.    */
  427.   UdpAddress(const char *inaddr);
  428.   /**
  429.    * Construct an UDP address from another UDP address.
  430.    *
  431.    * @param udpaddr - address to copy
  432.    */
  433.   UdpAddress(const UdpAddress &udpaddr);
  434.   /**
  435.    * Construct an UDP address from a GenAddress.
  436.    *
  437.    * @param genaddr - address to copy
  438.    */
  439.   UdpAddress(const GenAddress &genaddr);
  440.   /**
  441.    * Construct an UDP address from a IP address.
  442.    * The port will be set to 0.
  443.    *
  444.    * @param ipaddr - address to copy
  445.    */
  446.   UdpAddress(const IpAddress &ipaddr);
  447.   /**
  448.    * Destructor (ensure that SnmpSyntax::~SnmpSyntax() is overridden).
  449.    */
  450.   ~UdpAddress() {};
  451.   /**
  452.    * Map other SnmpSyntax objects to UdpAddress.
  453.    */
  454.   SnmpSyntax& operator=(const SnmpSyntax &val);
  455.   /**
  456.    * Overloaded assignment operator for UdpAddress.
  457.    */
  458.   UdpAddress& operator=(const UdpAddress &udpaddr);
  459.   /**
  460.    * Overloaded assignment operator for IpAddress.
  461.    */
  462.   UdpAddress& operator=(const IpAddress &ipaddr);
  463.   /**
  464.    * Overloaded assignment operator for strings.
  465.    */
  466.   UdpAddress& operator=(const char *inaddr);
  467.   /**
  468.    * Return the syntax.
  469.    *
  470.    * @return This method always returns sNMP_SYNTAX_OCTETS.
  471.    */
  472.   SmiUINT32 get_syntax() const { return sNMP_SYNTAX_OCTETS; };
  473.   /**
  474.    * Return the space needed for serialization.
  475.    */
  476.   virtual int get_asn1_length() const
  477.     { return (ip_version == version_ipv4) ? (UDPIPLEN + 2) : (UDPIP6LEN + 2);};
  478.   /**
  479.    * Clone this object.
  480.    *
  481.    * @return Pointer to the newly created object (allocated through new).
  482.    */
  483.   SnmpSyntax *clone() const { return (SnmpSyntax *) new UdpAddress(*this); };
  484.   /**
  485.    * Get a printable ASCII value of the address.
  486.    *
  487.    * @return String containing the numerical address
  488.    */
  489.   virtual const char *get_printable() const
  490.     { if (addr_changed) format_output(); return output_buffer; };
  491.   /**
  492.    * Overloaded operator for streaming output.
  493.    *
  494.    * @return String containing the numerical address
  495.    */
  496.   virtual operator const char *() const
  497.     { if (addr_changed) format_output(); return output_buffer; };
  498.   /**
  499.    * Set the port number.
  500.    *
  501.    * @note If the object is not valid(), the port may not be set.
  502.    */
  503.   void set_port(const unsigned short p);
  504.   /**
  505.    * Get the port number.
  506.    *
  507.    * @return The port number, or 0 is the object is not valid.
  508.    */
  509.   unsigned short get_port() const;
  510.   /**
  511.    * Get the length of the binary address (accessible through operator[]).
  512.    */
  513.   virtual int get_length() const
  514.     { return (ip_version == version_ipv4) ? UDPIPLEN : UDPIP6LEN; };
  515.   /**
  516.    * Return the type of the address.
  517.    * @see Address::addr_type
  518.    * @return Always Address:type_udp
  519.    */
  520.   virtual addr_type get_type() const { return type_udp; };
  521.   /**
  522.    * Map a IPv4 UDP address to a IPv6 UDP address.
  523.    *
  524.    * @return - TRUE if no error occured.
  525.    */
  526.   virtual int map_to_ipv6();
  527.   /**
  528.    * Reset the object.
  529.    */
  530.   void clear()
  531.     { Address::clear(); memset(output_buffer, 0, sizeof(output_buffer)); };
  532.  protected:
  533.   SNMP_PP_MUTABLE char output_buffer[OUTBUFF];           // output buffer
  534.   char sep;                              // separator
  535.   // redefined parse address
  536.   // specific to IP addresses
  537.   virtual bool parse_address(const char *inaddr);
  538.   // redefined format output
  539.   // specific to IP addresses
  540.   virtual void format_output() const;
  541. };
  542. #ifdef _MAC_ADDRESS
  543. //-------------------------------------------------------------------------
  544. //---------[ 802.3 MAC Address Class ]-------------------------------------
  545. //-------------------------------------------------------------------------
  546. class DLLOPT MacAddress : public Address {
  547. public:
  548.   // constructor, no arguments
  549.   MacAddress();
  550.   // constructor with a string argument
  551.   MacAddress(const char  *inaddr);
  552.   // constructor with another MAC object
  553.   MacAddress(const MacAddress  &macaddr);
  554.   // construct a MacAddress with a GenAddress
  555.   MacAddress(const GenAddress &genaddr);
  556.   // destructor
  557.   ~MacAddress() {};
  558.   /**
  559.    * Return the syntax.
  560.    *
  561.    * @return This method always returns sNMP_SYNTAX_OCTETS.
  562.    */
  563.   SmiUINT32 get_syntax() const { return sNMP_SYNTAX_OCTETS; };
  564.   /**
  565.    * Return the space needed for serialization.
  566.    */
  567.   virtual int get_asn1_length() const { return MACLEN + 2; };
  568.   /**
  569.    * Map other SnmpSyntax objects to MacAddress.
  570.    */
  571.   SnmpSyntax& operator=(const SnmpSyntax &val);
  572.   // assignment to another IpAddress object overloaded
  573.   MacAddress& operator=(const MacAddress &macaddress);
  574.   /**
  575.    * Clone this object.
  576.    *
  577.    * @return Pointer to the newly created object (allocated through new).
  578.    */
  579.   SnmpSyntax *clone() const { return (SnmpSyntax *) new MacAddress(*this); };
  580.   /**
  581.    * Get a printable ASCII value of the address.
  582.    *
  583.    * @return String containing the numerical address
  584.    */
  585.   virtual const char *get_printable() const
  586.     { if (addr_changed) format_output(); return output_buffer; };
  587.   /**
  588.    * Overloaded operator for streaming output.
  589.    *
  590.    * @return String containing the numerical address
  591.    */
  592.   virtual operator const char *() const
  593.     { if (addr_changed) format_output(); return output_buffer; };
  594.   /**
  595.    * Get the length of the binary address (accessible through operator[]).
  596.    */
  597.   virtual int get_length() const { return MACLEN; };
  598.   /**
  599.    * Return the type of the address.
  600.    * @see Address::addr_type
  601.    * @return Always Address:type_mac
  602.    */
  603.   virtual addr_type get_type() const { return type_mac; };
  604.   // return a hash key
  605.   unsigned int hashFunction() const;
  606.   /**
  607.    * Reset the object.
  608.    */
  609.   void clear()
  610.     { Address::clear(); memset(output_buffer, 0, sizeof(output_buffer)); };
  611.  protected:
  612.   SNMP_PP_MUTABLE char output_buffer[OUTBUFF];           // output buffer
  613.   // redefined parse address for macs
  614.   virtual bool parse_address(const char *inaddr);
  615.   // redefined format output for MACs
  616.   virtual void format_output() const;
  617. };
  618. #endif // _MAC_ADDRESS
  619. #ifdef _IPX_ADDRESS
  620. //------------------------------------------------------------------------
  621. //---------[ IPX Address Class ]------------------------------------------
  622. //------------------------------------------------------------------------
  623. class DLLOPT IpxAddress : public Address {
  624. public:
  625.   // constructor no args
  626.   IpxAddress();
  627.   // constructor with a string arg
  628.   IpxAddress(const char  *inaddr);
  629.   // constructor with another ipx object
  630.   IpxAddress(const IpxAddress  &ipxaddr);
  631.   // construct with a GenAddress
  632.   IpxAddress(const GenAddress &genaddr);
  633.   // destructor
  634.   ~IpxAddress() {};
  635.   /**
  636.    * Return the syntax.
  637.    *
  638.    * @return This method always returns sNMP_SYNTAX_OCTETS.
  639.    */
  640.   virtual SmiUINT32 get_syntax() const { return sNMP_SYNTAX_OCTETS; };
  641.   /**
  642.    * Return the space needed for serialization.
  643.    */
  644.   virtual int get_asn1_length() const  { return IPXLEN + 2; };
  645.   /**
  646.    * Map other SnmpSyntax objects to IpxAddress.
  647.    */
  648.   SnmpSyntax& operator=(const SnmpSyntax &val);
  649.   // assignment to another IpAddress object overloaded
  650.   IpxAddress& operator=(const IpxAddress &ipxaddress);
  651. #ifdef _MAC_ADDRESS
  652.   // get the host id portion of an ipx address
  653.   int get_hostid(MacAddress& mac) const;
  654. #endif
  655.   /**
  656.    * Clone this object.
  657.    *
  658.    * @return Pointer to the newly created object (allocated through new).
  659.    */
  660.   SnmpSyntax *clone() const { return (SnmpSyntax *) new IpxAddress(*this); };
  661.   /**
  662.    * Get a printable ASCII value of the address.
  663.    *
  664.    * @return String containing the numerical address
  665.    */
  666.   virtual const char *get_printable() const
  667.     { if (addr_changed) format_output(); return output_buffer; };
  668.   /**
  669.    * Overloaded operator for streaming output.
  670.    *
  671.    * @return String containing the numerical address
  672.    */
  673.   virtual operator const char *() const
  674.     { if (addr_changed) format_output(); return output_buffer; };
  675.   /**
  676.    * Get the length of the binary address (accessible through operator[]).
  677.    */
  678.   virtual int get_length() const { return IPXLEN; };
  679.   /**
  680.    * Return the type of the address.
  681.    * @see Address::addr_type
  682.    * @return Always Address:type_ipx
  683.    */
  684.   virtual addr_type get_type() const { return type_ipx; };
  685.   /**
  686.    * Reset the object.
  687.    */
  688.   void clear()
  689.     { Address::clear(); memset(output_buffer, 0, sizeof(output_buffer)); };
  690.  protected:
  691.   // ipx format separator
  692.   char separator;
  693.   SNMP_PP_MUTABLE char output_buffer[OUTBUFF];           // output buffer
  694.   // redefined parse address for ipx strings
  695.   virtual bool parse_address(const char  *inaddr);
  696.   // redefined format output for ipx strings
  697.   // uses same separator as when constructed
  698.   virtual void format_output() const;
  699. };
  700. //------------------------------------------------------------------------
  701. //---------[ IpxSock Address Class ]--------------------------------------
  702. //------------------------------------------------------------------------
  703. class DLLOPT IpxSockAddress : public IpxAddress {
  704. public:
  705.   // constructor, no args
  706.   IpxSockAddress();
  707.   // constructor with a dotted string
  708.   IpxSockAddress(const char *inaddr);
  709.   // construct an Udp address with another Udp address
  710.   IpxSockAddress(const IpxSockAddress &ipxaddr);
  711.   //constructor with a GenAddress
  712.   IpxSockAddress(const GenAddress &genaddr);
  713.   //constructor with a IpxAddress
  714.   // default socket # is 0
  715.   IpxSockAddress(const IpxAddress &ipxaddr);
  716.   // destructor
  717.   ~IpxSockAddress() {};
  718.   // syntax type
  719.   //virtual SmiUINT32 get_syntax() const { return sNMP_SYNTAX_OCTETS; };
  720.   /**
  721.    * Return the space needed for serialization.
  722.    */
  723.   virtual int get_asn1_length() const { return IPXSOCKLEN + 2; };
  724.   /**
  725.    * Map other SnmpSyntax objects to IpxSockAddress.
  726.    */
  727.   SnmpSyntax& operator=(const SnmpSyntax &val);
  728.   // assignment to another IpAddress object overloaded
  729.   IpxSockAddress& operator=(const IpxSockAddress &ipxaddr);
  730.   /**
  731.    * Clone this object.
  732.    *
  733.    * @return Pointer to the newly created object (allocated through new).
  734.    */
  735.   SnmpSyntax *clone() const { return (SnmpSyntax *)new IpxSockAddress(*this); };
  736.   // set the socket number
  737.   void set_socket(const unsigned short s);
  738.   // get the socket number
  739.   unsigned short get_socket() const;
  740.   /**
  741.    * Get a printable ASCII value of the address.
  742.    *
  743.    * @return String containing the numerical address
  744.    */
  745.   virtual const char *get_printable() const
  746.     { if (addr_changed) format_output(); return output_buffer; };
  747.   /**
  748.    * Overloaded operator for streaming output.
  749.    *
  750.    * @return String containing the numerical address
  751.    */
  752.   virtual operator const char *() const
  753.     { if (addr_changed) format_output(); return output_buffer; };
  754.   /**
  755.    * Get the length of the binary address (accessible through operator[]).
  756.    */
  757.   virtual int get_length() const { return IPXSOCKLEN; };
  758.   /**
  759.    * Return the type of the address.
  760.    * @see Address::addr_type
  761.    * @return Always Address:type_ipxsock
  762.    */
  763.   virtual addr_type get_type() const { return type_ipxsock; };
  764.   /**
  765.    * Reset the object.
  766.    */
  767.   void clear()
  768.     { Address::clear(); memset(output_buffer, 0, sizeof(output_buffer)); };
  769.  protected:
  770.   SNMP_PP_MUTABLE char output_buffer[OUTBUFF];           // output buffer
  771.   // redefined parse address for ipx strings
  772.   virtual bool parse_address(const char  *inaddr);
  773.   // redefined format output
  774.   // specific to IP addresses
  775.   virtual void format_output() const;
  776. };
  777. #endif // _IPX_ADDRESS
  778. //-------------------------------------------------------------------------
  779. //--------[ Generic Address ]----------------------------------------------
  780. //-------------------------------------------------------------------------
  781. class DLLOPT GenAddress : public Address
  782. {
  783.  public:
  784.   /**
  785.    * Construct an empty invalid generic address object.
  786.    */
  787.   GenAddress();
  788.   /**
  789.    * Construct a generic address from a string.
  790.    *
  791.    * To optimize the speed of the parsing method, use_type can be used
  792.    * to indicate that the address string is of the specified type.
  793.    *
  794.    * @param addr     - address string
  795.    * @param use_type - if this value is set, the input string is only
  796.    *                   parsed for the given type 
  797.    */
  798.   GenAddress(const char *addr,
  799.      const Address::addr_type use_type = Address::type_invalid);
  800.   /**
  801.    * Construct a generic address from an Address object.
  802.    *
  803.    * @param addr - Any address object
  804.    */
  805.   GenAddress(const Address &addr);
  806.   /**
  807.    * Construct a generic address from another generic address object.
  808.    *
  809.    * @param addr - Generic address object to copy
  810.    */
  811.   GenAddress(const GenAddress &addr);
  812.   /**
  813.    * Destructor, free memory.
  814.    */
  815.   ~GenAddress() { if (address) delete address; };
  816.   /**
  817.    * Return the syntax.
  818.    *
  819.    * @return This method returns sNMP_SYNTAX_IPADDR, sNMP_SYNTAX_OCTETS
  820.    *         or sNMP_SYNTAX_NULL if the generic address does not have
  821.    *         an address object.
  822.    */
  823.   SmiUINT32 get_syntax() const
  824.     { return address ? address->get_syntax() : sNMP_SYNTAX_NULL; };
  825.   /**
  826.    * Return the space needed for serialization.
  827.    */
  828.   virtual int get_asn1_length() const
  829.     { return address ? address->get_asn1_length() : 2; };
  830.   /**
  831.    * Clone this object.
  832.    *
  833.    * @return Pointer to the newly created object (allocated through new).
  834.    */
  835.   SnmpSyntax *clone() const { return (SnmpSyntax *)new GenAddress(*this); };
  836.   /**
  837.    * Overloaded assignment operator for a GenAddress.
  838.    */
  839.   GenAddress& operator=(const GenAddress &addr);
  840.   /**
  841.    * Overloaded assignment operator for a Address.
  842.    */
  843.   GenAddress& operator=(const Address &addr);
  844.   /**
  845.    * Map other SnmpSyntax objects to GenAddress.
  846.    */
  847.   SnmpSyntax& operator=(const SnmpSyntax &val);
  848.   /**
  849.    * Get a printable ASCII value of the address.
  850.    *
  851.    * @return String containing the numerical address
  852.    */
  853.   virtual const char *get_printable() const
  854.     { return (address) ? address->get_printable() : output_buffer; };
  855.   /**
  856.    * Overloaded operator for streaming output.
  857.    *
  858.    * @return String containing the numerical address
  859.    */
  860.   virtual operator const char *() const
  861.     { return address ? (const char *)*address : output_buffer; };
  862.   /**
  863.    * Get the length of the binary address (accessible through operator[]).
  864.    */
  865.   virtual int get_length() const
  866.     { return (address) ? address->get_length() : 0; };
  867.   /**
  868.    * Reset the object.
  869.    */
  870.   void clear() { if (address) address->clear(); };
  871.   /**
  872.    * Return the type of the address.
  873.    * @see Address::addr_type
  874.    * @return Type of the contained address object or Address::type_invalid
  875.    *         if it is not valid().
  876.    */
  877.   virtual addr_type get_type() const
  878.     { return (valid()) ? address->get_type() : type_invalid; };
  879.   /**
  880.    * Access the protected address.
  881.    * The caller must make sure that this GenAddress object ist valid()
  882.    * and is of the right type (get_type()).
  883.    */
  884.   const IpAddress  &cast_ipaddress()  const { return (IpAddress& )*address; };
  885.   /**
  886.    * Access the protected address.
  887.    * The caller must make sure that this GenAddress object ist valid()
  888.    * and is of the right type (get_type()).
  889.    */
  890.   const UdpAddress &cast_udpaddress() const { return (UdpAddress&)*address; };
  891. #ifdef _MAC_ADDRESS
  892.   /**
  893.    * Access the protected address.
  894.    * The caller must make sure that this GenAddress object ist valid()
  895.    * and is of the right type (get_type()).
  896.    */
  897.   const MacAddress &cast_macaddress() const { return (MacAddress&)*address; };
  898. #endif
  899. #ifdef _IPX_ADDRESS
  900.   /**
  901.    * Access the protected address.
  902.    * The caller must make sure that this GenAddress object ist valid()
  903.    * and is of the right type (get_type()).
  904.    */
  905.   const IpxAddress &cast_ipxaddress() const { return (IpxAddress&)*address; };
  906.   /**
  907.    * Access the protected address.
  908.    * The caller must make sure that this GenAddress object ist valid()
  909.    * and is of the right type (get_type()).
  910.    */
  911.   const IpxSockAddress &cast_ipxsockaddress() const
  912.     { return (IpxSockAddress&)*address; };
  913. #endif
  914. protected:
  915.   // pointer to a concrete address
  916.   Address *address;
  917.   char output_buffer[1];           // output buffer
  918.   // redefined parse address for generic address
  919.   virtual bool parse_address(const char *addr)
  920.     { return parse_address(addr, Address::type_invalid); };
  921.   virtual bool parse_address(const char *addr,
  922.      const Address::addr_type use_type);
  923.   // format output for a generic address
  924.   virtual void format_output() const {};
  925.   /**
  926.    * Is this a GenAddress object.
  927.    */
  928.   virtual bool is_gen_address() const { return true; };
  929. };
  930. #if !defined (DLLOPT_TEMPL_ADDRESSCOLLECTION)
  931. #define DLLOPT_TEMPL_ADDRESSCOLLECTION
  932. // DLLOPT_TEMPL template class DLLOPT SnmpCollection<GenAddress>;
  933. // DLLOPT_TEMPL template class DLLOPT SnmpCollection<UdpAddress>;
  934. #endif
  935. // create AddressCollection type
  936. typedef SnmpCollection <GenAddress> AddressCollection;
  937. typedef SnmpCollection <UdpAddress> UdpAddressCollection;
  938. #ifdef SNMP_PP_NAMESPACE
  939. } // end of namespace Snmp_pp
  940. #endif 
  941. #endif  //_ADDRESS