pasn.h
上传用户:hzhsqp
上传日期:2007-01-06
资源大小:1600k
文件大小:17k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * pasn.h
  3.  *
  4.  * Abstract Syntax Notation 1 classes for support of SNMP only.
  5.  *
  6.  * Portable Windows Library
  7.  *
  8.  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
  9.  *
  10.  * The contents of this file are subject to the Mozilla Public License
  11.  * Version 1.0 (the "License"); you may not use this file except in
  12.  * compliance with the License. You may obtain a copy of the License at
  13.  * http://www.mozilla.org/MPL/
  14.  *
  15.  * Software distributed under the License is distributed on an "AS IS"
  16.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17.  * the License for the specific language governing rights and limitations
  18.  * under the License.
  19.  *
  20.  * The Original Code is Portable Windows Library.
  21.  *
  22.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  23.  *
  24.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  25.  * All Rights Reserved.
  26.  *
  27.  * Contributor(s): ______________________________________.
  28.  *
  29.  * $Log: pasn.h,v $
  30.  * Revision 1.11  1999/05/01 03:52:20  robertj
  31.  * Fixed various egcs warnings.
  32.  *
  33.  * Revision 1.10  1999/03/09 08:01:46  robertj
  34.  * Changed comments for doc++ support (more to come).
  35.  *
  36.  * Revision 1.9  1999/02/16 08:07:10  robertj
  37.  * MSVC 6.0 compatibility changes.
  38.  *
  39.  * Revision 1.8  1998/11/30 02:50:54  robertj
  40.  * New directory structure
  41.  *
  42.  * Revision 1.7  1998/09/23 06:19:44  robertj
  43.  * Added open source copyright license.
  44.  *
  45.  * Revision 1.6  1997/08/20 08:48:56  craigs
  46.  * Added GetString() to PASNNull
  47.  *
  48.  * Revision 1.5  1997/07/20 08:34:14  craigs
  49.  * Added ASN NULL type
  50.  *
  51.  * Revision 1.4  1997/07/16 05:51:08  craigs
  52.  * Added PASNString constructor with ptr and length
  53.  *
  54.  * Revision 1.3  1996/11/04 09:45:08  robertj
  55.  * Fixed bug in IP number ASN type, should be binary not dot format string.
  56.  *
  57.  * Revision 1.2  1996/11/04 03:56:00  robertj
  58.  * Added ASN types to class.
  59.  *
  60.  * Revision 1.1  1996/09/14 12:58:57  robertj
  61.  * Initial revision
  62.  *
  63.  */
  64. #ifndef _PASN_H
  65. #define _PASN_H
  66. #ifdef __GNUC__
  67. #pragma interface
  68. #endif
  69. #include <ptlib/sockets.h>
  70. //
  71. // define some types used by the ASN classes
  72. //
  73. typedef PInt32 PASNInt;
  74. typedef DWORD PASNUnsigned;
  75. typedef DWORD           PASNOid;
  76. class PASNObject;
  77. class PASNSequence;
  78. PLIST(PASNObjectList, PASNObject);
  79. //////////////////////////////////////////////////////////////////////////
  80. /** This class defines the common behviour of all ASN objects. It also contains
  81.    several functions which are used for encoding common ASN primitives.
  82.    This class will never be instantiated directly. See the <A>PASNInteger</A>,
  83.    <A>PASNSequence</A>, <A>PASNString</A> and <A>PASNObjectID</A> classes for examples
  84.    of ASN objects that can be created.
  85.    Only descendants of this class can be put into the <A>ASNSequence</A> class.
  86. */
  87. class PASNObject : public PObject
  88. {
  89.   PCLASSINFO(PASNObject, PObject)
  90.   public:
  91.     /** Value returned by the <A>GetType()</A> function to indicate the type of
  92.        an ASN object
  93.      */
  94.     enum ASNType {
  95.       Integer, // ASN Integer object
  96.       String,       // ASN Octet String object
  97.       ObjectID, // ASN Object ID object
  98.       Sequence, // ASN Sequence object
  99.       Choice, // ASN Sequence with discriminator
  100.       IPAddress,    // ASN IPAddress object
  101.       Counter,      // ASN Counter object
  102.       Gauge,        // ASN Gauge object
  103.       TimeTicks,    // ASN TimeTicks object
  104.       Opaque,       // ASN Opaque object
  105.       NsapAddress,  // ASN NsapAddress
  106.       Counter64,    // ASN Counter64
  107.       UInteger32,   // ASN Unsigned integer 32
  108.   Null,         // ASN Null
  109.       Unknown, // unknown ASN object type
  110.       ASNTypeMax // maximum of number of ASN object types
  111.     };
  112.     /** Return a value of type <A>enum ASNType</A> which indicates the type
  113.        of the object
  114.      */
  115.     virtual ASNType GetType() const;
  116.     /** Return the descriminator for Choice sequences
  117.     */
  118.     int GetChoice() const;
  119.     /** Return a string giving the type of the object */
  120.     virtual PString GetTypeAsString() const;
  121.     /** Return the value of the ASN object as a PASNInt.
  122.        This function will assert if the object is not a descendant of
  123.        <A>PASNInteger</A>.
  124.      */
  125.     virtual PASNInt GetInteger () const;
  126.     /** Return the value of the object as a PASNUnsigned
  127.        This function will assert if the object is not a descendant of
  128.        <A>PASNTimeTicks</A> or <P>PASNCounter</A>.
  129.      */
  130.     virtual PASNUnsigned GetUnsigned () const;
  131.     /** Return the value of the object as a PString. This function can
  132.        be use for all ASN object types
  133.      */
  134.     virtual PString GetString () const;
  135.     /** Return the value of the object as a PString
  136.        This function will assert if the object is not a descendant of
  137.        <A>PASNSequence</A>.
  138.      */
  139.     virtual const PASNSequence & GetSequence() const;
  140.     /** Return the value of the object as an IPAddress
  141.        This function will assert if the object is not a descendant of
  142.        <A>PASNIPAddress</A>.
  143.      */
  144.     virtual PIPSocket::Address GetIPAddress () const;
  145.     /** Virtual functions used by the <A>PObject::operator<<</A> function to
  146.        print the value of the object.
  147.     */
  148.     virtual void PrintOn(
  149.       ostream & strm // stream to print on
  150.     ) const;
  151.     /** Virtual function used to encode the object into ASN format */
  152.     virtual void Encode(
  153.       PBYTEArray & buffer // buffer to encode into
  154.     );
  155.     /** Virtual function used to get the length of object when encoded into
  156.        ASN format 
  157.     */
  158.     virtual WORD GetEncodedLength();
  159.     /** Virtual function used to duplicate objects */
  160.     virtual PObject * Clone() const;
  161.     /** Encode an ASN length value */
  162.     static void EncodeASNLength (
  163.       PBYTEArray & buffer, // buffer to encode into
  164.       WORD length // ASN length to encode
  165.     );
  166.     /** Return the length of an encoded ASN length value */
  167.     static WORD GetASNLengthLength (
  168.       WORD length // length to find length of
  169.     );
  170.     /** Decode an ASN length in the buffer at the given ptr. The ptr is moved
  171.        to the byte after the end of the encoded length.
  172.      */
  173.     static BOOL DecodeASNLength (
  174.       const PBYTEArray & buffer, // buffer to decode data from
  175.       PINDEX & ptr, // ptr to decode from
  176.       WORD & len // returned length
  177.     );
  178.     /** Encode a sequence header into the buffer at the specified offset. */
  179.     static void EncodeASNSequenceStart (
  180.       PBYTEArray & buffer, // buffer to encode data into
  181.       BYTE type, // sequence type
  182.       WORD length // length of sequence data
  183.     );
  184.     /** Return the encoded length of a sequence if it has the specified length */
  185.     static WORD GetASNSequenceStartLength (
  186.       WORD length // length of sequence data
  187.     );
  188.     /** Encode an ASN object header into the buffer */
  189.     static void EncodeASNHeader(
  190.       PBYTEArray & buffer, // buffer to encode into
  191.       PASNObject::ASNType type, // ASN type of the object
  192.       WORD length // length of the object
  193.     );
  194.     /** Return the length of an ASN object header if the object is the specified length */
  195.     static WORD GetASNHeaderLength (
  196.       WORD length // length of object
  197.     );
  198.     static void EncodeASNInteger    (
  199.       PBYTEArray & buffer, // buffer to encode into
  200.       PASNInt data, // value to encode
  201.       PASNObject::ASNType type // actual integer type
  202.     );
  203.     // Encode an ASN integer value into the specified buffer */
  204.     static void EncodeASNUnsigned (
  205.       PBYTEArray & buffer, // buffer to encode into
  206.       PASNUnsigned data, // value to encode
  207.       PASNObject::ASNType type // actual integer type
  208.     );
  209.     // Encode an ASN integer value into the specified buffer */
  210.     static WORD GetASNIntegerLength (
  211.       PASNInt data // value to get length of
  212.     );
  213.     // Return the length of an encoded ASN integer with the specified value 
  214.     static WORD GetASNUnsignedLength (
  215.       PASNUnsigned data // value to get length of
  216.     );
  217.     // Return the length of an encoded ASN integer with the specified value 
  218.     static BOOL DecodeASNInteger (
  219.       const PBYTEArray & buffer, // buffer to decode from
  220.       PINDEX & ptr, // ptr to data in buffer
  221.       PASNInt & value, // returned value
  222.       ASNType type = Integer         // actual integer type
  223.     );
  224.     // Decode an ASN integer value in the specified buffer 
  225.     static BOOL DecodeASNUnsigned (
  226.       const PBYTEArray & buffer, // buffer to decode from
  227.       PINDEX & ptr, // ptr to data in buffer
  228.       PASNUnsigned & value, // returned value
  229.       ASNType type = TimeTicks         // actual integer type
  230.     );
  231.     // Decode an ASN integer value in the specified buffer 
  232.   protected:
  233.     /** Create an empty ASN object. Used only by descendant constructors */
  234.     PASNObject();
  235.     /** Table to map <A>enum ASNType</A> values to ASN identifiers */
  236.     static BYTE ASNTypeToType[ASNTypeMax];
  237. };
  238. //////////////////////////////////////////////////////////////////////////
  239. /** A descendant of PASNObject which is a simple ASN integer type.
  240.  */
  241. class PASNInteger : public PASNObject
  242. {
  243.   PCLASSINFO(PASNInteger, PASNObject)
  244.   public:
  245.     PASNInteger(PASNInt val);
  246.     PASNInteger(const PBYTEArray & buffer, PINDEX & ptr);
  247.     void PrintOn(ostream & strm) const;
  248.     void Encode(PBYTEArray & buffer);
  249.     WORD GetEncodedLength();
  250.     PObject * Clone() const;
  251.     PASNInt GetInteger() const;
  252.     PString GetString () const;
  253.     ASNType GetType() const;
  254.     PString GetTypeAsString() const;
  255.   private:
  256.     PASNInt value;
  257. };
  258. //////////////////////////////////////////////////////////////////////////
  259. /** A descendant of PASNObject which is a simple ASN OctetStr type
  260.  */
  261. class PASNString : public PASNObject
  262. {
  263.   PCLASSINFO(PASNString, PASNObject)
  264.   public:
  265.     PASNString(const PString & str);
  266.     PASNString(const BYTE * ptr, int len);
  267.     PASNString(const PBYTEArray & buffer,               PASNObject::ASNType = String);
  268.     PASNString(const PBYTEArray & buffer, PINDEX & ptr, PASNObject::ASNType = String);
  269.     void PrintOn(ostream & strm) const;
  270.     void Encode(PBYTEArray & buffer)
  271.       { Encode(buffer, String); }
  272.     WORD GetEncodedLength();
  273.     PObject * Clone() const;
  274.     PString GetString() const;
  275.     ASNType GetType() const;
  276.     PString GetTypeAsString() const;
  277.   protected:
  278.     BOOL Decode(const PBYTEArray & buffer, PINDEX & i, PASNObject::ASNType type);
  279.     void Encode(PBYTEArray & buffer,             PASNObject::ASNType type);
  280.     PString value;
  281.     WORD    valueLen;
  282. };
  283. //////////////////////////////////////////////////////////////////////////
  284. /** A descendant of PASNObject which is an IP address type
  285.  */
  286. class PASNIPAddress : public PASNString
  287. {
  288.   PCLASSINFO(PASNIPAddress, PASNString)
  289.   public:
  290.     PASNIPAddress(const PIPSocket::Address & addr)
  291.       : PASNString(PString((const char *)&addr, 4)) { }
  292.     PASNIPAddress(const PString & str);
  293.     PASNIPAddress(const PBYTEArray & buffer)
  294.       : PASNString(buffer, IPAddress) { }
  295.     PASNIPAddress(const PBYTEArray & buffer, PINDEX & ptr)
  296.       : PASNString(buffer, ptr, IPAddress) { }
  297.     PASNObject::ASNType GetType() const
  298.       { return IPAddress; }
  299.     void Encode(PBYTEArray & buffer)
  300.       { PASNString::Encode(buffer, IPAddress); }
  301.     PString GetString() const;
  302.     PString GetTypeAsString() const;
  303.     PObject * Clone() const
  304.       { return PNEW PASNIPAddress(*this); }
  305.     PIPSocket::Address GetIPAddress () const;
  306. };
  307. //////////////////////////////////////////////////////////////////////////
  308. /** A descendant of PASNObject which is an unsigned ASN integer type.
  309.  */
  310. class PASNUnsignedInteger : public PASNObject
  311. {
  312.   PCLASSINFO(PASNUnsignedInteger, PASNObject)
  313.   public:
  314.     PASNUnsignedInteger(PASNUnsigned val)
  315.       { value = val; }
  316.     PASNUnsignedInteger(const PBYTEArray & buffer, PINDEX & ptr);
  317.     void PrintOn(ostream & strm) const;
  318.     WORD GetEncodedLength();
  319.     PString GetString () const;
  320.     PASNUnsigned GetUnsigned() const;
  321.   protected:
  322.     PASNUnsignedInteger()
  323.       { value = 0; }
  324.     BOOL Decode(const PBYTEArray & buffer, PINDEX & i, PASNObject::ASNType theType);
  325.     void Encode(PBYTEArray & buffer, PASNObject::ASNType theType);
  326.   private:
  327.     PASNUnsigned value;
  328. };
  329. //////////////////////////////////////////////////////////////////////////
  330. /** A descendant of PASNObject which is an unsigned ASN time tick type.
  331.  */
  332. class PASNTimeTicks : public PASNUnsignedInteger
  333. {
  334.   PCLASSINFO(PASNTimeTicks, PASNUnsignedInteger)
  335.   public:
  336.     PASNTimeTicks(PASNUnsigned val) 
  337.       : PASNUnsignedInteger(val) { }
  338.     PASNTimeTicks(const PBYTEArray & buffer, PINDEX & ptr)
  339.       { PASNUnsignedInteger::Decode(buffer, ptr, TimeTicks); }
  340.     void Encode(PBYTEArray & buffer)
  341.       { PASNUnsignedInteger::Encode(buffer, TimeTicks); }
  342.     PObject * Clone() const
  343.       { return PNEW PASNTimeTicks(*this); }
  344.     PASNObject::ASNType GetType() const
  345.       { return TimeTicks; }
  346.     PString GetTypeAsString() const;
  347. };
  348. //////////////////////////////////////////////////////////////////////////
  349. /** A descendant of PASNObject which is an unsigned ASN counter type.
  350.  */
  351. class PASNCounter : public PASNUnsignedInteger
  352. {
  353.   PCLASSINFO(PASNCounter, PASNUnsignedInteger)
  354.   public:
  355.     PASNCounter(PASNUnsigned val) 
  356.       : PASNUnsignedInteger(val) { }
  357.     PASNCounter(const PBYTEArray & buffer, PINDEX & ptr)
  358.       {  PASNUnsignedInteger::Decode(buffer, ptr, Counter); }
  359.     void Encode(PBYTEArray & buffer)
  360.       { PASNUnsignedInteger::Encode(buffer, Counter); }
  361.     PObject * Clone() const
  362.       { return PNEW PASNCounter(*this); }
  363.     PASNObject::ASNType GetType() const
  364.       { return Counter; }
  365.     PString GetTypeAsString() const;
  366. };
  367. //////////////////////////////////////////////////////////////////////////
  368. /** A descendant of PASNObject which is an unsigned ASN guage type.
  369.  */
  370. class PASNGauge : public PASNUnsignedInteger
  371. {
  372.   PCLASSINFO(PASNGauge, PASNUnsignedInteger)
  373.   public:
  374.     PASNGauge(PASNUnsigned val) 
  375.       : PASNUnsignedInteger(val) { }
  376.     PASNGauge(const PBYTEArray & buffer, PINDEX & ptr)
  377.       { Decode(buffer, ptr); }
  378.     BOOL Decode(const PBYTEArray & buffer, PINDEX & i)
  379.       { return PASNUnsignedInteger::Decode(buffer, i, Gauge); }
  380.     void Encode(PBYTEArray & buffer)
  381.       { PASNUnsignedInteger::Encode(buffer, Gauge); }
  382.     PObject * Clone() const
  383.       { return PNEW PASNGauge(*this); }
  384.     PASNObject::ASNType GetType() const
  385.       { return Gauge; }
  386.     PString GetTypeAsString() const;
  387. };
  388. //////////////////////////////////////////////////////////////////////////
  389. /** A descendant of PASNObject which is an unsigned ASN ObjID type.
  390.  */
  391. class PASNObjectID : public PASNObject
  392. {
  393.   PCLASSINFO(PASNObjectID, PASNObject)
  394.   public:
  395.     PASNObjectID(const PString & str);
  396.     PASNObjectID(PASNOid * val, BYTE theLen);
  397.     PASNObjectID(const PBYTEArray & buffer);
  398.     PASNObjectID(const PBYTEArray & buffer, PINDEX & ptr);
  399.     void PrintOn(ostream & strm) const;
  400.     void Encode(PBYTEArray & buffer);
  401.     WORD GetEncodedLength();
  402.     PObject * Clone() const;
  403.     ASNType GetType() const;
  404.     PString GetString () const;
  405.     PString GetTypeAsString() const;
  406.   protected:
  407.     BOOL Decode(const PBYTEArray & buffer, PINDEX & i);
  408.   private:
  409.     PDWORDArray value;
  410. };
  411. //////////////////////////////////////////////////////////////////////////
  412. /** A descendant of PASNObject which is the NULL type
  413.  */
  414. class PASNNull : public PASNObject
  415. {
  416.   PCLASSINFO(PASNNull, PASNObject)
  417.   public:
  418.     PASNNull();
  419.     PASNNull(const PBYTEArray & buffer, PINDEX & ptr);
  420.     void PrintOn(ostream & strm) const;
  421.     void Encode(PBYTEArray & buffer);
  422.     WORD GetEncodedLength();
  423.     PObject * Clone() const;
  424.     ASNType GetType() const;
  425.     PString GetString () const;
  426.     PString GetTypeAsString() const;
  427. };
  428. //////////////////////////////////////////////////////////////////////////
  429. /** A descendant of PASNObject which is the complex sequence type
  430.  */
  431. class PASNSequence : public PASNObject
  432. {
  433.   PCLASSINFO(PASNSequence, PASNObject)
  434.   public:
  435.     PASNSequence();
  436.     PASNSequence(BYTE selector);
  437.     PASNSequence(const PBYTEArray & buffer);
  438.     PASNSequence(const PBYTEArray & buffer, PINDEX & i);
  439.     void Append(PASNObject * obj);
  440.     PINDEX GetSize() const;
  441.     PASNObject & operator [] (PINDEX idx) const;
  442.     const PASNSequence & GetSequence() const;
  443.     void AppendInteger (PASNInt value);
  444.     void AppendString  (const PString & str);
  445.     void AppendObjectID(const PString & str);
  446.     void AppendObjectID(PASNOid * val, BYTE len);
  447.     int GetChoice() const;
  448. //    PASNInt GetInteger (PINDEX idx) const;
  449. //    PString GetString  (PINDEX idx) const;
  450.     void PrintOn(ostream & strm) const;
  451.     void Encode(PBYTEArray & buffer);
  452.     BOOL Decode(const PBYTEArray & buffer, PINDEX & i);
  453.     WORD GetEncodedLength();
  454.     ASNType GetType() const;
  455.     PString GetTypeAsString() const;
  456.     BOOL Encode(PBYTEArray & buffer, PINDEX maxLen) ;
  457.   private:
  458.     PASNObjectList sequence;
  459.     BYTE     type;
  460.     ASNType  asnType;
  461.     WORD     encodedLen;
  462.     WORD     seqLen;
  463. };
  464. #endif
  465. // End of File.