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

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * asner.h
  3.  *
  4.  * Abstract Syntax Notation Encoding Rules classes
  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: asner.h,v $
  30.  * Revision 1.13  2000/07/11 18:23:03  robertj
  31.  * Added ability to set/get BMP string data as PWORDArray.
  32.  *
  33.  * Revision 1.12  2000/04/10 17:30:42  robertj
  34.  * Added [] operator for char access on ASN string classes.
  35.  *
  36.  * Revision 1.11  2000/02/29 06:32:12  robertj
  37.  * Added ability to remove optional field in sequence, thanks Dave Harvey.
  38.  *
  39.  * Revision 1.10  1999/08/09 13:02:45  robertj
  40.  * dded ASN compiler #defines for backward support of pre GCC 2.9 compilers.
  41.  * Added ASN compiler #defines to reduce its memory footprint.
  42.  *
  43.  * Revision 1.9  1999/07/22 06:48:51  robertj
  44.  * Added comparison operation to base ASN classes and compiled ASN code.
  45.  * Added support for ANY type in ASN parser.
  46.  *
  47.  * Revision 1.8  1999/03/09 09:34:05  robertj
  48.  * Fixed typo's.
  49.  *
  50.  * Revision 1.7  1999/03/09 08:01:46  robertj
  51.  * Changed comments for doc++ support (more to come).
  52.  *
  53.  * Revision 1.6  1998/09/23 06:19:21  robertj
  54.  * Added open source copyright license.
  55.  *
  56.  * Revision 1.5  1998/05/21 04:26:53  robertj
  57.  * Fixed numerous PER problems.
  58.  *
  59.  * Revision 1.4  1998/05/07 05:19:28  robertj
  60.  * Fixed problems with using copy constructor/assignment oeprator on PASN_Objects.
  61.  *
  62.  * Revision 1.3  1997/12/18 05:08:13  robertj
  63.  * Added function to get choice discriminator name.
  64.  *
  65.  * Revision 1.2  1997/12/11 10:35:42  robertj
  66.  * Support for new ASN file parser.
  67.  *
  68.  */
  69. #ifndef _ASNER_H
  70. #define _ASNER_H
  71. #ifdef __GNUC__
  72. #pragma interface
  73. #endif
  74. class PASN_Stream;
  75. class PBER_Stream;
  76. class PPER_Stream;
  77. /////////////////////////////////////////////////////////////////////////////
  78. /** Base class for ASN encoding/decoding.
  79. */
  80. class PASN_Object : public PObject
  81. {
  82.     PCLASSINFO(PASN_Object, PObject);
  83.   public:
  84.     /** Return a string giving the type of the object */
  85.     virtual PString GetTypeAsString() const = 0;
  86.     PINDEX GetObjectLength() const;
  87.     virtual PINDEX GetDataLength() const = 0;
  88.     virtual BOOL IsPrimitive() const { return TRUE; }
  89.     virtual BOOL Decode(PASN_Stream &) = 0;
  90.     virtual void Encode(PASN_Stream &) const = 0;
  91.     BOOL IsExtendable() const { return extendable; }
  92.     void SetExtendable(BOOL ext = TRUE) { extendable = ext; }
  93.     enum TagClass {
  94.       UniversalTagClass,
  95.       ApplicationTagClass,
  96.       ContextSpecificTagClass,
  97.       PrivateTagClass,
  98.       DefaultTagClass
  99.     };
  100.     TagClass GetTagClass() const { return tagClass; }
  101.     enum UniversalTags {
  102.       InvalidUniversalTag,
  103.       UniversalBoolean,
  104.       UniversalInteger,
  105.       UniversalBitString,
  106.       UniversalOctetString,
  107.       UniversalNull,
  108.       UniversalObjectId,
  109.       UniversalObjectDescriptor,
  110.       UniversalExternalType,
  111.       UniversalReal,
  112.       UniversalEnumeration,
  113.       UniversalEmbeddedPDV,
  114.       UniversalSequence = 16,
  115.       UniversalSet,
  116.       UniversalNumericString,
  117.       UniversalPrintableString,
  118.       UniversalTeletexString,
  119.       UniversalVideotexString,
  120.       UniversalIA5String,
  121.       UniversalUTCTime,
  122.       UniversalGeneralisedTime,
  123.       UniversalGraphicString,
  124.       UniversalVisibleString,
  125.       UniversalGeneralString,
  126.       UniversalUniversalString,
  127.       UniversalBMPString = 30
  128.     };
  129.     unsigned GetTag() const  { return tag; }
  130.     virtual void SetTag(unsigned newTag, TagClass tagClass = DefaultTagClass);
  131.     enum ConstraintType {
  132.       Unconstrained,
  133.       PartiallyConstrained,
  134.       FixedConstraint,
  135.       ExtendableConstraint
  136.     };
  137.     enum MinimumValueTag { MinimumValue = INT_MIN };
  138.     enum MaximumValueTag { MaximumValue = INT_MAX };
  139.     void SetConstraints(ConstraintType type, int lower, MaximumValueTag upper);
  140.     void SetConstraints(ConstraintType type, MinimumValueTag lower, unsigned upper);
  141.     void SetConstraints(ConstraintType type, MinimumValueTag lower, MaximumValueTag upper);
  142.     virtual void SetConstraints(ConstraintType type, int lower = 0, unsigned upper = UINT_MAX);
  143.     virtual void SetCharacterSet(ConstraintType ctype, const char * charSet);
  144.     virtual void SetCharacterSet(ConstraintType ctype, unsigned firstChar, unsigned lastChar);
  145.   protected:
  146.     PASN_Object(unsigned tag, TagClass tagClass, BOOL extend = FALSE);
  147.     /// PER extension capability
  148.     BOOL extendable;
  149.     /// BER tag class
  150.     TagClass tagClass;
  151.     /// ASN object tag
  152.     unsigned tag;
  153. };
  154. /** Base class for constrained ASN encoding/decoding.
  155. */
  156. class PASN_ConstrainedObject : public PASN_Object
  157. {
  158.     PCLASSINFO(PASN_ConstrainedObject, PASN_Object);
  159.   public:
  160.     virtual void SetConstraints(ConstraintType type, int lower = 0, unsigned upper = UINT_MAX);
  161.     BOOL IsConstrained() const { return constraint != Unconstrained; }
  162.     int GetLowerLimit() const { return lowerLimit; }
  163.     unsigned GetUpperLimit() const { return upperLimit; }
  164.     int ConstrainedLengthDecode(PPER_Stream & strm, unsigned & length);
  165.     void ConstrainedLengthEncode(PPER_Stream & strm, unsigned length) const;
  166.     BOOL ConstraintEncode(PPER_Stream & strm, unsigned value) const;
  167.   protected:
  168.     PASN_ConstrainedObject(unsigned tag, TagClass tagClass);
  169.     ConstraintType constraint;
  170.     int lowerLimit;
  171.     unsigned upperLimit;
  172. };
  173. /** Class for ASN Null type.
  174. */
  175. class PASN_Null : public PASN_Object
  176. {
  177.     PCLASSINFO(PASN_Null, PASN_Object);
  178.   public:
  179.     PASN_Null(unsigned tag = UniversalNull,
  180.               TagClass tagClass = UniversalTagClass);
  181.     virtual Comparison Compare(const PObject & obj) const;
  182.     virtual PObject * Clone() const;
  183.     virtual void PrintOn(ostream & strm) const;
  184.     virtual PString GetTypeAsString() const;
  185.     virtual PINDEX GetDataLength() const;
  186.     virtual BOOL Decode(PASN_Stream &);
  187.     virtual void Encode(PASN_Stream &) const;
  188. };
  189. /** Class for ASN Boolean type.
  190. */
  191. class PASN_Boolean : public PASN_Object
  192. {
  193.     PCLASSINFO(PASN_Boolean, PASN_Object);
  194.   public:
  195.     PASN_Boolean(BOOL val = FALSE,
  196.                  unsigned tag = UniversalBoolean,
  197.                  TagClass tagClass = UniversalTagClass);
  198.     PASN_Boolean & operator=(BOOL v) { value = v; return *this; }
  199.     operator BOOL() const { return value; }
  200.     BOOL GetValue() const { return value; }
  201.     void SetValue(BOOL v) { value = v; }
  202.     virtual Comparison Compare(const PObject & obj) const;
  203.     virtual PObject * Clone() const;
  204.     virtual void PrintOn(ostream & strm) const;
  205.     virtual PString GetTypeAsString() const;
  206.     virtual PINDEX GetDataLength() const;
  207.     virtual BOOL Decode(PASN_Stream &);
  208.     virtual void Encode(PASN_Stream &) const;
  209.   protected:
  210.     BOOL value;
  211. };
  212. /** Class for ASN Integer type.
  213. */
  214. class PASN_Integer : public PASN_ConstrainedObject
  215. {
  216.     PCLASSINFO(PASN_Integer, PASN_ConstrainedObject);
  217.   public:
  218.     PASN_Integer(unsigned tag = UniversalInteger,
  219.                  TagClass tagClass = UniversalTagClass,
  220.                  unsigned val = 0);
  221.     PASN_Integer & operator=(unsigned value);
  222.     operator unsigned() const { return value; }
  223.     unsigned GetValue() const { return value; }
  224.     void SetValue(unsigned v) { operator=(v); }
  225.     virtual Comparison Compare(const PObject & obj) const;
  226.     virtual PObject * Clone() const;
  227.     virtual void PrintOn(ostream & strm) const;
  228.     virtual PString GetTypeAsString() const;
  229.     virtual PINDEX GetDataLength() const;
  230.     virtual BOOL Decode(PASN_Stream &);
  231.     virtual void Encode(PASN_Stream &) const;
  232.     BOOL DecodePER(PPER_Stream & strm);
  233.     void EncodePER(PPER_Stream & strm) const;
  234.   protected:
  235.     unsigned value;
  236. };
  237. /** Class for ASN Enumerated type.
  238. */
  239. class PASN_Enumeration : public PASN_Object
  240. {
  241.     PCLASSINFO(PASN_Enumeration, PASN_Object);
  242.   public:
  243.     PASN_Enumeration(unsigned tag = UniversalEnumeration,
  244.                      TagClass tagClass = UniversalTagClass,
  245.                      unsigned nEnums = P_MAX_INDEX,
  246.                      BOOL extendable = FALSE,
  247.                      unsigned val = 0);
  248.     PASN_Enumeration(unsigned tag,
  249.                      TagClass tagClass,
  250.                      unsigned nEnums,
  251.                      BOOL extendable,
  252.                      const PString & nameSpec,
  253.                      unsigned val = 0);
  254.     PASN_Enumeration & operator=(unsigned v) { value = v; return *this; }
  255.     operator unsigned() const { return value; }
  256.     unsigned GetValue() const { return value; }
  257.     void SetValue(unsigned v) { value = v; }
  258.     unsigned GetMaximum() const { return maxEnumValue; }
  259.     virtual Comparison Compare(const PObject & obj) const;
  260.     virtual PObject * Clone() const;
  261.     virtual void PrintOn(ostream & strm) const;
  262.     virtual PString GetTypeAsString() const;
  263.     virtual PINDEX GetDataLength() const;
  264.     virtual BOOL Decode(PASN_Stream &);
  265.     virtual void Encode(PASN_Stream &) const;
  266.     BOOL DecodePER(PPER_Stream & strm);
  267.     void EncodePER(PPER_Stream & strm) const;
  268.   protected:
  269.     unsigned maxEnumValue;
  270.     unsigned value;
  271.     POrdinalToString names;
  272. };
  273. /** Class for ASN floating point type.
  274. */
  275. class PASN_Real : public PASN_Object
  276. {
  277.     PCLASSINFO(PASN_Real, PASN_Object);
  278.   public:
  279.     PASN_Real(unsigned tag = UniversalEnumeration,
  280.               TagClass tagClass = UniversalTagClass,
  281.               double val = 0);
  282.     PASN_Real & operator=(double val) { value = val; return *this; }
  283.     operator double() const { return value; }
  284.     double GetValue() const { return value; }
  285.     void SetValue(double v) { value = v; }
  286.     virtual Comparison Compare(const PObject & obj) const;
  287.     virtual PObject * Clone() const;
  288.     virtual void PrintOn(ostream & strm) const;
  289.     virtual PString GetTypeAsString() const;
  290.     virtual PINDEX GetDataLength() const;
  291.     virtual BOOL Decode(PASN_Stream &);
  292.     virtual void Encode(PASN_Stream &) const;
  293.   protected:
  294.     double value;
  295. };
  296. /** Class for ASN Object Identifier type.
  297. */
  298. class PASN_ObjectId : public PASN_Object
  299. {
  300.     PCLASSINFO(PASN_ObjectId, PASN_Object);
  301.   public:
  302.     PASN_ObjectId(unsigned tag = UniversalObjectId,
  303.                   TagClass tagClass = UniversalTagClass);
  304.     PASN_ObjectId(const PASN_ObjectId & other);
  305.     PASN_ObjectId & operator=(const PASN_ObjectId & other);
  306.     PASN_ObjectId & operator=(const char * dotstr);
  307.     PASN_ObjectId & operator=(const PString & dotstr);
  308.     void SetValue(const PString & dotstr);
  309.     BOOL operator==(const char * dotstr) const;
  310.     BOOL operator!=(const char * dotstr) const { return !operator==(dotstr); }
  311.     BOOL operator==(const PASN_ObjectId & id) const { return value == id.value; }
  312.     PINDEX GetSize() const { return value.GetSize(); }
  313.     const PUnsignedArray & GetValue() const { return value; }
  314.     unsigned operator[](PINDEX idx) const { return value[idx]; }
  315.     virtual Comparison Compare(const PObject & obj) const;
  316.     virtual PObject * Clone() const;
  317.     virtual void PrintOn(ostream & strm) const;
  318.     virtual PString GetTypeAsString() const;
  319.     virtual PINDEX GetDataLength() const;
  320.     virtual BOOL Decode(PASN_Stream &);
  321.     virtual void Encode(PASN_Stream &) const;
  322.     BOOL CommonDecode(PASN_Stream & strm, unsigned dataLen);
  323.     void CommonEncode(PBYTEArray & eObjId) const;
  324.   protected:
  325.     PUnsignedArray value;
  326. };
  327. /** Class for ASN Bit String type.
  328. */
  329. class PASN_BitString : public PASN_ConstrainedObject
  330. {
  331.     PCLASSINFO(PASN_BitString, PASN_ConstrainedObject);
  332.   public:
  333.     PASN_BitString(unsigned tag = UniversalBitString,
  334.                    TagClass tagClass = UniversalTagClass,
  335.                    unsigned nBits = 0);
  336.     PASN_BitString(const PASN_BitString & other);
  337.     PASN_BitString & operator=(const PASN_BitString & other);
  338.     void SetData(unsigned nBits, const PBYTEArray & bytes);
  339.     void SetData(unsigned nBits, const BYTE * buf, PINDEX size);
  340.     unsigned GetSize() const { return totalBits; }
  341.     BOOL SetSize(unsigned nBits);
  342.     BOOL operator[](PINDEX bit) const;
  343.     void Set(unsigned bit);
  344.     void Clear(unsigned bit);
  345.     void Invert(unsigned bit);
  346.     virtual void SetConstraints(ConstraintType type, int lower = 0, unsigned upper = UINT_MAX);
  347.     virtual Comparison Compare(const PObject & obj) const;
  348.     virtual PObject * Clone() const;
  349.     virtual void PrintOn(ostream & strm) const;
  350.     virtual PString GetTypeAsString() const;
  351.     virtual PINDEX GetDataLength() const;
  352.     virtual BOOL Decode(PASN_Stream &);
  353.     virtual void Encode(PASN_Stream &) const;
  354.     BOOL DecodeBER(PBER_Stream & strm, unsigned len);
  355.     void EncodeBER(PBER_Stream & strm) const;
  356.     BOOL DecodePER(PPER_Stream & strm);
  357.     void EncodePER(PPER_Stream & strm) const;
  358.   protected:
  359.     unsigned totalBits;
  360.     PBYTEArray bitData;
  361. };
  362. /** Class for ASN Octet String type.
  363. */
  364. class PASN_OctetString : public PASN_ConstrainedObject
  365. {
  366.     PCLASSINFO(PASN_OctetString, PASN_ConstrainedObject);
  367.   public:
  368.     PASN_OctetString(unsigned tag = UniversalOctetString,
  369.                      TagClass tagClass = UniversalTagClass);
  370.     PASN_OctetString(const PASN_OctetString & other);
  371.     PASN_OctetString & operator=(const PASN_OctetString & other);
  372.     PASN_OctetString & operator=(const char * str);
  373.     PASN_OctetString & operator=(const PString & str);
  374.     PASN_OctetString & operator=(const PBYTEArray & arr);
  375.     void SetValue(const char * str) { operator=(str); }
  376.     void SetValue(const PString & str) { operator=(str); }
  377.     void SetValue(const PBYTEArray & arr) { operator=(arr); }
  378.     void SetValue(const BYTE * data, PINDEX len);
  379.     const PBYTEArray & GetValue() const { return value; }
  380.     operator const PBYTEArray &() const { return value; }
  381.     operator const BYTE *() const { return value; }
  382.     PString AsString() const;
  383.     BYTE operator[](PINDEX i) const { return value[i]; }
  384.     BYTE & operator[](PINDEX i) { return value[i]; }
  385.     BYTE * GetPointer(PINDEX sz = 0) { return value.GetPointer(sz); }
  386.     PINDEX GetSize() const { return value.GetSize(); }
  387.     BOOL SetSize(PINDEX newSize) { return value.SetSize(newSize); }
  388.     virtual void SetConstraints(ConstraintType type, int lower = 0, unsigned upper = UINT_MAX);
  389.     virtual Comparison Compare(const PObject & obj) const;
  390.     virtual PObject * Clone() const;
  391.     virtual void PrintOn(ostream & strm) const;
  392.     virtual PString GetTypeAsString() const;
  393.     virtual PINDEX GetDataLength() const;
  394.     virtual BOOL Decode(PASN_Stream &);
  395.     virtual void Encode(PASN_Stream &) const;
  396.     BOOL DecodePER(PPER_Stream & strm);
  397.     void EncodePER(PPER_Stream & strm) const;
  398.   protected:
  399.     PBYTEArray value;
  400. };
  401. /** Base class for ASN String types.
  402. */
  403. class PASN_ConstrainedString : public PASN_ConstrainedObject
  404. {
  405.     PCLASSINFO(PASN_ConstrainedString, PASN_ConstrainedObject);
  406.   public:
  407.     PASN_ConstrainedString & operator=(const char * str);
  408.     PASN_ConstrainedString & operator=(const PString & str) { return operator=((const char *)str); }
  409.     operator const PString &() const { return value; }
  410.     const PString & GetValue() const { return value; }
  411.     void SetValue(const PString & v) { operator=(v); }
  412.     char operator[](PINDEX idx) const { return value[idx]; }
  413.     void SetCharacterSet(ConstraintType ctype, const char * charSet);
  414.     void SetCharacterSet(ConstraintType ctype, unsigned firstChar = 0, unsigned lastChar = 255);
  415.     void SetCharacterSet(const char * charSet, PINDEX size, ConstraintType ctype);
  416.     virtual Comparison Compare(const PObject & obj) const;
  417.     virtual void PrintOn(ostream & strm) const;
  418.     virtual PINDEX GetDataLength() const;
  419.     virtual BOOL Decode(PASN_Stream &);
  420.     virtual void Encode(PASN_Stream &) const;
  421.     BOOL DecodeBER(PBER_Stream & strm, unsigned len);
  422.     void EncodeBER(PBER_Stream & strm) const;
  423.     BOOL DecodePER(PPER_Stream & strm);
  424.     void EncodePER(PPER_Stream & strm) const;
  425.   protected:
  426.     PASN_ConstrainedString(const char * canonicalSet, PINDEX setSize,
  427.                            unsigned tag, TagClass tagClass);
  428.     PString value;
  429.     PCharArray characterSet;
  430.     const char * canonicalSet;
  431.     PINDEX canonicalSetSize;
  432.     unsigned canonicalSetBits;
  433.     unsigned charSetUnalignedBits;
  434.     unsigned charSetAlignedBits;
  435. };
  436. #define DECLARE_STRING_CLASS(name) 
  437.   class PASN_##name##String : public PASN_ConstrainedString { 
  438.     PCLASSINFO(PASN_##name##String, PASN_ConstrainedString); 
  439.     public: 
  440.       PASN_##name##String(unsigned tag = UniversalNumericString, 
  441.                           TagClass tagClass = UniversalTagClass); 
  442.       PASN_##name##String & operator=(const char * str); 
  443.       PASN_##name##String & operator=(const PString & str); 
  444.       virtual PObject * Clone() const; 
  445.       virtual PString GetTypeAsString() const; 
  446.   }
  447. DECLARE_STRING_CLASS(Numeric);
  448. DECLARE_STRING_CLASS(Printable);
  449. DECLARE_STRING_CLASS(Visible);
  450. DECLARE_STRING_CLASS(IA5);
  451. DECLARE_STRING_CLASS(General);
  452. /** Class for ASN BMP (16 bit) String type.
  453. */
  454. class PASN_BMPString : public PASN_ConstrainedObject
  455. {
  456.     PCLASSINFO(PASN_BMPString, PASN_ConstrainedObject);
  457.   public:
  458.     PASN_BMPString(unsigned tag = UniversalBMPString,
  459.                    TagClass tagClass = UniversalTagClass);
  460.     PASN_BMPString(const PASN_BMPString & other);
  461.     PASN_BMPString & operator=(const PASN_BMPString & other);
  462.     PASN_BMPString & operator=(const PString & v);
  463.     PASN_BMPString & operator=(const PWORDArray & v);
  464.     operator PString() const { return GetValue(); }
  465.     operator PWORDArray() const { return value; }
  466.     PString GetValue() const;
  467.     void GetValue(PWORDArray & v) const { v = value; }
  468.     void SetValue(const PString & v) { operator=(v); }
  469.     void SetValue(const PWORDArray & v) { operator=(v); }
  470.     void SetCharacterSet(ConstraintType ctype, const char * charSet);
  471.     void SetCharacterSet(ConstraintType ctype, const PWORDArray & charSet);
  472.     void SetCharacterSet(ConstraintType ctype, unsigned firstChar, unsigned lastChar);
  473.     virtual Comparison Compare(const PObject & obj) const;
  474.     virtual PObject * Clone() const;
  475.     virtual void PrintOn(ostream & strm) const;
  476.     virtual PString GetTypeAsString() const;
  477.     virtual PINDEX GetDataLength() const;
  478.     virtual BOOL Decode(PASN_Stream &);
  479.     virtual void Encode(PASN_Stream &) const;
  480.     BOOL DecodeBER(PBER_Stream & strm, unsigned len);
  481.     void EncodeBER(PBER_Stream & strm) const;
  482.     BOOL DecodePER(PPER_Stream & strm);
  483.     void EncodePER(PPER_Stream & strm) const;
  484.   protected:
  485.     BOOL IsLegalCharacter(WORD ch);
  486.     PWORDArray value;
  487.     PWORDArray characterSet;
  488.     WORD firstChar, lastChar;
  489.     unsigned charSetUnalignedBits;
  490.     unsigned charSetAlignedBits;
  491. };
  492. class PASN_Sequence;
  493. /** Class for ASN Choice type.
  494. */
  495. class PASN_Choice : public PASN_Object
  496. {
  497.     PCLASSINFO(PASN_Choice, PASN_Object);
  498.   public:
  499.     ~PASN_Choice();
  500.     virtual void SetTag(unsigned newTag, TagClass tagClass = DefaultTagClass);
  501.     PString GetTagName() const;
  502.     PASN_Object & GetObject() const;
  503.     BOOL IsValid() const { return choice != NULL; }
  504. #if defined(__GNUC__) && __GNUC__ <= 2 && __GNUC_MINOR__ < 9
  505.     operator PASN_Null &() const;
  506.     operator PASN_Boolean &() const;
  507.     operator PASN_Integer &() const;
  508.     operator PASN_Enumeration &() const;
  509.     operator PASN_Real &() const;
  510.     operator PASN_ObjectId &() const;
  511.     operator PASN_BitString &() const;
  512.     operator PASN_OctetString &() const;
  513.     operator PASN_NumericString &() const;
  514.     operator PASN_PrintableString &() const;
  515.     operator PASN_VisibleString &() const;
  516.     operator PASN_IA5String &() const;
  517.     operator PASN_GeneralString &() const;
  518.     operator PASN_BMPString &() const;
  519.     operator PASN_Sequence &() const;
  520. #else
  521.     operator PASN_Null &();
  522.     operator PASN_Boolean &();
  523.     operator PASN_Integer &();
  524.     operator PASN_Enumeration &();
  525.     operator PASN_Real &();
  526.     operator PASN_ObjectId &();
  527.     operator PASN_BitString &();
  528.     operator PASN_OctetString &();
  529.     operator PASN_NumericString &();
  530.     operator PASN_PrintableString &();
  531.     operator PASN_VisibleString &();
  532.     operator PASN_IA5String &();
  533.     operator PASN_GeneralString &();
  534.     operator PASN_BMPString &();
  535.     operator PASN_Sequence &();
  536.     operator const PASN_Null &() const;
  537.     operator const PASN_Boolean &() const;
  538.     operator const PASN_Integer &() const;
  539.     operator const PASN_Enumeration &() const;
  540.     operator const PASN_Real &() const;
  541.     operator const PASN_ObjectId &() const;
  542.     operator const PASN_BitString &() const;
  543.     operator const PASN_OctetString &() const;
  544.     operator const PASN_NumericString &() const;
  545.     operator const PASN_PrintableString &() const;
  546.     operator const PASN_VisibleString &() const;
  547.     operator const PASN_IA5String &() const;
  548.     operator const PASN_GeneralString &() const;
  549.     operator const PASN_BMPString &() const;
  550.     operator const PASN_Sequence &() const;
  551. #endif
  552.     virtual BOOL CreateObject() = 0;
  553.     virtual Comparison Compare(const PObject & obj) const;
  554.     virtual void PrintOn(ostream & strm) const;
  555.     virtual PString GetTypeAsString() const;
  556.     virtual PINDEX GetDataLength() const;
  557.     virtual BOOL IsPrimitive() const;
  558.     virtual BOOL Decode(PASN_Stream &);
  559.     virtual void Encode(PASN_Stream &) const;
  560.     virtual BOOL DecodePER(PPER_Stream &);
  561.     virtual void EncodePER(PPER_Stream &) const;
  562.   protected:
  563.     PASN_Choice(unsigned nChoices = UINT_MAX, BOOL extend = FALSE);
  564.     PASN_Choice(unsigned tag, TagClass tagClass, unsigned nChoices, BOOL extend);
  565.     PASN_Choice(unsigned tag, TagClass tagClass, unsigned nChoices, BOOL extend, const PString & nameSpec);
  566.     PASN_Choice(const PASN_Choice & other);
  567.     PASN_Choice & operator=(const PASN_Choice & other);
  568.     unsigned numChoices;
  569.     PASN_Object * choice;
  570.     POrdinalToString names;
  571. };
  572. PARRAY(PASN_ObjectArray, PASN_Object);
  573. /** Class for ASN Sequence type.
  574. */
  575. class PASN_Sequence : public PASN_Object
  576. {
  577.     PCLASSINFO(PASN_Sequence, PASN_Object);
  578.   public:
  579.     PASN_Sequence(unsigned tag = UniversalSequence,
  580.                   TagClass tagClass = UniversalTagClass,
  581.                   unsigned nOpts = 0, BOOL extend = FALSE, unsigned nExtend = 0);
  582.     PASN_Sequence(const PASN_Sequence & other);
  583.     PASN_Sequence & operator=(const PASN_Sequence & other);
  584.     PINDEX GetSize() const { return fields.GetSize(); }
  585.     void SetSize(PINDEX newSize);
  586.     PASN_Object & operator[](PINDEX i) const { return fields[i]; }
  587.     BOOL HasOptionalField(PINDEX opt) const;
  588.     void IncludeOptionalField(PINDEX opt);
  589.     void RemoveOptionalField(PINDEX opt);
  590.     virtual Comparison Compare(const PObject & obj) const;
  591.     virtual PObject * Clone() const;
  592.     virtual void PrintOn(ostream & strm) const;
  593.     virtual PString GetTypeAsString() const;
  594.     virtual PINDEX GetDataLength() const;
  595.     virtual BOOL IsPrimitive() const;
  596.     virtual BOOL Decode(PASN_Stream &);
  597.     virtual void Encode(PASN_Stream &) const;
  598.     BOOL PreambleDecode(PASN_Stream & strm);
  599.     void PreambleEncode(PASN_Stream & strm) const;
  600.     BOOL KnownExtensionDecode(PASN_Stream & strm, PINDEX fld, PASN_Object & field);
  601.     void KnownExtensionEncode(PASN_Stream & strm, PINDEX fld, const PASN_Object & field) const;
  602.     BOOL UnknownExtensionsDecode(PASN_Stream & strm);
  603.     void UnknownExtensionsEncode(PASN_Stream & strm) const;
  604.     BOOL PreambleDecodeBER(PBER_Stream & strm);
  605.     void PreambleEncodeBER(PBER_Stream & strm) const;
  606.     BOOL KnownExtensionDecodeBER(PBER_Stream & strm, PINDEX fld, PASN_Object & field);
  607.     void KnownExtensionEncodeBER(PBER_Stream & strm, PINDEX fld, const PASN_Object & field) const;
  608.     BOOL UnknownExtensionsDecodeBER(PBER_Stream & strm);
  609.     void UnknownExtensionsEncodeBER(PBER_Stream & strm) const;
  610.     BOOL PreambleDecodePER(PPER_Stream & strm);
  611.     void PreambleEncodePER(PPER_Stream & strm) const;
  612.     BOOL KnownExtensionDecodePER(PPER_Stream & strm, PINDEX fld, PASN_Object & field);
  613.     void KnownExtensionEncodePER(PPER_Stream & strm, PINDEX fld, const PASN_Object & field) const;
  614.     BOOL UnknownExtensionsDecodePER(PPER_Stream & strm);
  615.     void UnknownExtensionsEncodePER(PPER_Stream & strm) const;
  616.   protected:
  617.     BOOL NoExtensionsToDecode(PPER_Stream & strm);
  618.     BOOL NoExtensionsToEncode(PPER_Stream & strm);
  619.     PASN_ObjectArray fields;
  620.     PASN_BitString optionMap;
  621.     int knownExtensions;
  622.     int totalExtensions;
  623.     PASN_BitString extensionMap;
  624.     PINDEX endBasicEncoding;
  625. };
  626. /** Class for ASN Set type.
  627. */
  628. class PASN_Set : public PASN_Sequence
  629. {
  630.     PCLASSINFO(PASN_Set, PASN_Sequence);
  631.   public:
  632.     PASN_Set(unsigned tag = UniversalSet,
  633.              TagClass tagClass = UniversalTagClass,
  634.              unsigned nOpts = 0, BOOL extend = FALSE, unsigned nExtend = 0);
  635.     virtual PObject * Clone() const;
  636.     virtual PString GetTypeAsString() const;
  637. };
  638. /** Class for ASN Array type.
  639. */
  640. class PASN_Array : public PASN_ConstrainedObject
  641. {
  642.     PCLASSINFO(PASN_Array, PASN_ConstrainedObject);
  643.   public:
  644.     PINDEX GetSize() const { return array.GetSize(); }
  645.     void SetSize(PINDEX newSize);
  646.     PASN_Object & operator[](PINDEX i) const { return array[i]; }
  647.     void RemoveAt(PINDEX i) { array.RemoveAt(i); }
  648.     void RemoveAll() { array.RemoveAll(); }
  649.     virtual Comparison Compare(const PObject & obj) const;
  650.     virtual void PrintOn(ostream & strm) const;
  651.     virtual PString GetTypeAsString() const;
  652.     virtual PINDEX GetDataLength() const;
  653.     virtual BOOL IsPrimitive() const;
  654.     virtual BOOL Decode(PASN_Stream &);
  655.     virtual void Encode(PASN_Stream &) const;
  656.     virtual PASN_Object * CreateObject() const = 0;
  657.   protected:
  658.     PASN_Array(unsigned tag = UniversalSequence,
  659.                TagClass tagClass = UniversalTagClass);
  660.     PASN_Array(const PASN_Array & other);
  661.     PASN_Array & operator=(const PASN_Array & other);
  662.     PASN_ObjectArray array;
  663. };
  664. /////////////////////////////////////////////////////////////////////////////
  665. /** Base class for ASN decoder/encoder stream.
  666. */
  667. class PASN_Stream : public PBYTEArray
  668. {
  669.     PCLASSINFO(PASN_Stream, PBYTEArray);
  670.   public:
  671.     PASN_Stream();
  672.     PASN_Stream(const PBYTEArray & bytes);
  673.     PASN_Stream(const BYTE * buf, PINDEX size);
  674.     void PrintOn(ostream & strm) const;
  675.     PINDEX GetPosition() const { return byteOffset; }
  676.     void SetPosition(PINDEX newPos);
  677.     BOOL IsAtEnd() { return byteOffset >= GetSize(); }
  678.     void ResetDecoder();
  679.     void BeginEncoding();
  680.     void CompleteEncoding();
  681.     virtual BOOL Read(PChannel & chan) = 0;
  682.     virtual BOOL Write(PChannel & chan) = 0;
  683.     virtual BOOL NullDecode(PASN_Null &) = 0;
  684.     virtual void NullEncode(const PASN_Null &) = 0;
  685.     virtual BOOL BooleanDecode(PASN_Boolean &) = 0;
  686.     virtual void BooleanEncode(const PASN_Boolean &) = 0;
  687.     virtual BOOL IntegerDecode(PASN_Integer &) = 0;
  688.     virtual void IntegerEncode(const PASN_Integer &) = 0;
  689.     virtual BOOL EnumerationDecode(PASN_Enumeration &) = 0;
  690.     virtual void EnumerationEncode(const PASN_Enumeration &) = 0;
  691.     virtual BOOL RealDecode(PASN_Real &) = 0;
  692.     virtual void RealEncode(const PASN_Real &) = 0;
  693.     virtual BOOL ObjectIdDecode(PASN_ObjectId &) = 0;
  694.     virtual void ObjectIdEncode(const PASN_ObjectId &) = 0;
  695.     virtual BOOL BitStringDecode(PASN_BitString &) = 0;
  696.     virtual void BitStringEncode(const PASN_BitString &) = 0;
  697.     virtual BOOL OctetStringDecode(PASN_OctetString &) = 0;
  698.     virtual void OctetStringEncode(const PASN_OctetString &) = 0;
  699.     virtual BOOL ConstrainedStringDecode(PASN_ConstrainedString &) = 0;
  700.     virtual void ConstrainedStringEncode(const PASN_ConstrainedString &) = 0;
  701.     virtual BOOL BMPStringDecode(PASN_BMPString &) = 0;
  702.     virtual void BMPStringEncode(const PASN_BMPString &) = 0;
  703.     virtual BOOL ChoiceDecode(PASN_Choice &) = 0;
  704.     virtual void ChoiceEncode(const PASN_Choice &) = 0;
  705.     virtual BOOL ArrayDecode(PASN_Array &) = 0;
  706.     virtual void ArrayEncode(const PASN_Array &) = 0;
  707.     virtual BOOL SequencePreambleDecode(PASN_Sequence &) = 0;
  708.     virtual void SequencePreambleEncode(const PASN_Sequence &) = 0;
  709.     virtual BOOL SequenceKnownDecode(PASN_Sequence &, PINDEX, PASN_Object &) = 0;
  710.     virtual void SequenceKnownEncode(const PASN_Sequence &, PINDEX, const PASN_Object &) = 0;
  711.     virtual BOOL SequenceUnknownDecode(PASN_Sequence &) = 0;
  712.     virtual void SequenceUnknownEncode(const PASN_Sequence &) = 0;
  713.     BYTE ByteDecode();
  714.     void ByteEncode(unsigned value);
  715.     unsigned BlockDecode(BYTE * bufptr, unsigned nBytes);
  716.     void BlockEncode(const BYTE * bufptr, PINDEX nBytes);
  717.     void ByteAlign();
  718.   protected:
  719.     PINDEX byteOffset;
  720.     unsigned bitOffset;
  721.   private:
  722.     void Construct();
  723. };
  724. /** Class for ASN basic Encoding Rules stream.
  725. */
  726. class PBER_Stream : public PASN_Stream
  727. {
  728.     PCLASSINFO(PBER_Stream, PASN_Stream);
  729.   public:
  730.     PBER_Stream();
  731.     PBER_Stream(const PBYTEArray & bytes);
  732.     PBER_Stream(const BYTE * buf, PINDEX size);
  733.     PBER_Stream & operator=(const PBYTEArray & bytes);
  734.     virtual BOOL Read(PChannel & chan);
  735.     virtual BOOL Write(PChannel & chan);
  736.     virtual BOOL NullDecode(PASN_Null &);
  737.     virtual void NullEncode(const PASN_Null &);
  738.     virtual BOOL BooleanDecode(PASN_Boolean &);
  739.     virtual void BooleanEncode(const PASN_Boolean &);
  740.     virtual BOOL IntegerDecode(PASN_Integer &);
  741.     virtual void IntegerEncode(const PASN_Integer &);
  742.     virtual BOOL EnumerationDecode(PASN_Enumeration &);
  743.     virtual void EnumerationEncode(const PASN_Enumeration &);
  744.     virtual BOOL RealDecode(PASN_Real &);
  745.     virtual void RealEncode(const PASN_Real &);
  746.     virtual BOOL ObjectIdDecode(PASN_ObjectId &);
  747.     virtual void ObjectIdEncode(const PASN_ObjectId &);
  748.     virtual BOOL BitStringDecode(PASN_BitString &);
  749.     virtual void BitStringEncode(const PASN_BitString &);
  750.     virtual BOOL OctetStringDecode(PASN_OctetString &);
  751.     virtual void OctetStringEncode(const PASN_OctetString &);
  752.     virtual BOOL ConstrainedStringDecode(PASN_ConstrainedString &);
  753.     virtual void ConstrainedStringEncode(const PASN_ConstrainedString &);
  754.     virtual BOOL BMPStringDecode(PASN_BMPString &);
  755.     virtual void BMPStringEncode(const PASN_BMPString &);
  756.     virtual BOOL ChoiceDecode(PASN_Choice &);
  757.     virtual void ChoiceEncode(const PASN_Choice &);
  758.     virtual BOOL ArrayDecode(PASN_Array &);
  759.     virtual void ArrayEncode(const PASN_Array &);
  760.     virtual BOOL SequencePreambleDecode(PASN_Sequence &);
  761.     virtual void SequencePreambleEncode(const PASN_Sequence &);
  762.     virtual BOOL SequenceKnownDecode(PASN_Sequence &, PINDEX, PASN_Object &);
  763.     virtual void SequenceKnownEncode(const PASN_Sequence &, PINDEX, const PASN_Object &);
  764.     virtual BOOL SequenceUnknownDecode(PASN_Sequence &);
  765.     virtual void SequenceUnknownEncode(const PASN_Sequence &);
  766.     virtual PASN_Object * CreateObject(unsigned tag,
  767.                                        PASN_Object::TagClass tagClass,
  768.                                        BOOL primitive) const;
  769.     BOOL HeaderDecode(unsigned & tagVal,
  770.                       PASN_Object::TagClass & tagClass,
  771.                       BOOL & primitive,
  772.                       unsigned & len);
  773.     BOOL HeaderDecode(PASN_Object & obj, unsigned & len);
  774.     void HeaderEncode(const PASN_Object & obj);
  775. };
  776. /** Class for ASN Packed Encoding Rules stream.
  777. */
  778. class PPER_Stream : public PASN_Stream
  779. {
  780.     PCLASSINFO(PPER_Stream, PASN_Stream);
  781.   public:
  782.     PPER_Stream(BOOL aligned = TRUE);
  783.     PPER_Stream(const PBYTEArray & bytes, BOOL aligned = TRUE);
  784.     PPER_Stream(const BYTE * buf, PINDEX size, BOOL aligned = TRUE);
  785.     PPER_Stream & operator=(const PBYTEArray & bytes);
  786.     unsigned GetBitsLeft() const;
  787.     virtual BOOL Read(PChannel & chan);
  788.     virtual BOOL Write(PChannel & chan);
  789.     virtual BOOL NullDecode(PASN_Null &);
  790.     virtual void NullEncode(const PASN_Null &);
  791.     virtual BOOL BooleanDecode(PASN_Boolean &);
  792.     virtual void BooleanEncode(const PASN_Boolean &);
  793.     virtual BOOL IntegerDecode(PASN_Integer &);
  794.     virtual void IntegerEncode(const PASN_Integer &);
  795.     virtual BOOL EnumerationDecode(PASN_Enumeration &);
  796.     virtual void EnumerationEncode(const PASN_Enumeration &);
  797.     virtual BOOL RealDecode(PASN_Real &);
  798.     virtual void RealEncode(const PASN_Real &);
  799.     virtual BOOL ObjectIdDecode(PASN_ObjectId &);
  800.     virtual void ObjectIdEncode(const PASN_ObjectId &);
  801.     virtual BOOL BitStringDecode(PASN_BitString &);
  802.     virtual void BitStringEncode(const PASN_BitString &);
  803.     virtual BOOL OctetStringDecode(PASN_OctetString &);
  804.     virtual void OctetStringEncode(const PASN_OctetString &);
  805.     virtual BOOL ConstrainedStringDecode(PASN_ConstrainedString &);
  806.     virtual void ConstrainedStringEncode(const PASN_ConstrainedString &);
  807.     virtual BOOL BMPStringDecode(PASN_BMPString &);
  808.     virtual void BMPStringEncode(const PASN_BMPString &);
  809.     virtual BOOL ChoiceDecode(PASN_Choice &);
  810.     virtual void ChoiceEncode(const PASN_Choice &);
  811.     virtual BOOL ArrayDecode(PASN_Array &);
  812.     virtual void ArrayEncode(const PASN_Array &);
  813.     virtual BOOL SequencePreambleDecode(PASN_Sequence &);
  814.     virtual void SequencePreambleEncode(const PASN_Sequence &);
  815.     virtual BOOL SequenceKnownDecode(PASN_Sequence &, PINDEX, PASN_Object &);
  816.     virtual void SequenceKnownEncode(const PASN_Sequence &, PINDEX, const PASN_Object &);
  817.     virtual BOOL SequenceUnknownDecode(PASN_Sequence &);
  818.     virtual void SequenceUnknownEncode(const PASN_Sequence &);
  819.     BOOL IsAligned() const { return aligned; }
  820.     BOOL SingleBitDecode();
  821.     void SingleBitEncode(BOOL value);
  822.     int MultiBitDecode(unsigned nBits);
  823.     void MultiBitEncode(int value, unsigned nBits);
  824.     unsigned SmallUnsignedDecode();
  825.     void SmallUnsignedEncode(unsigned val);
  826.     int LengthDecode(unsigned lower, unsigned upper, unsigned & len);
  827.     void LengthEncode(unsigned len, unsigned lower, unsigned upper);
  828.     int UnsignedDecode(unsigned lower, unsigned upper, unsigned & value);
  829.     void UnsignedEncode(int value, unsigned lower, unsigned upper);
  830.     void AnyTypeEncode(const PASN_Object * value);
  831.   protected:
  832.     BOOL aligned;
  833. };
  834. #endif // _ASNER_H