00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184 #ifndef _ASNER_H
00185 #define _ASNER_H
00186
00187 #ifdef P_USE_PRAGMA
00188 #pragma interface
00189 #endif
00190
00191
00192 #define P_INCLUDE_PER
00193 #define P_INCLUDE_BER
00194 #define P_INCLUDE_XER
00195
00196 class PASN_Stream;
00197 class PBER_Stream;
00198 class PPER_Stream;
00199
00200 #if P_EXPAT
00201 class PXER_Stream;
00202 class PXMLElement;
00203 #else
00204 #undef P_INCLUDE_XER
00205 #endif
00206
00207 #include <ptlib.h>
00208
00210
00213 class PASN_Object : public PObject
00214 {
00215 PCLASSINFO(PASN_Object, PObject);
00216 public:
00218 virtual PString GetTypeAsString() const = 0;
00219
00220 PINDEX GetObjectLength() const;
00221 virtual PINDEX GetDataLength() const = 0;
00222 virtual BOOL IsPrimitive() const { return TRUE; }
00223
00224 virtual BOOL Decode(PASN_Stream &) = 0;
00225 virtual void Encode(PASN_Stream &) const = 0;
00226
00227 BOOL IsExtendable() const { return extendable; }
00228 void SetExtendable(BOOL ext = TRUE) { extendable = ext; }
00229
00230 enum TagClass {
00231 UniversalTagClass,
00232 ApplicationTagClass,
00233 ContextSpecificTagClass,
00234 PrivateTagClass,
00235 DefaultTagClass
00236 };
00237 TagClass GetTagClass() const { return tagClass; }
00238
00239 enum UniversalTags {
00240 InvalidUniversalTag,
00241 UniversalBoolean,
00242 UniversalInteger,
00243 UniversalBitString,
00244 UniversalOctetString,
00245 UniversalNull,
00246 UniversalObjectId,
00247 UniversalObjectDescriptor,
00248 UniversalExternalType,
00249 UniversalReal,
00250 UniversalEnumeration,
00251 UniversalEmbeddedPDV,
00252 UniversalSequence = 16,
00253 UniversalSet,
00254 UniversalNumericString,
00255 UniversalPrintableString,
00256 UniversalTeletexString,
00257 UniversalVideotexString,
00258 UniversalIA5String,
00259 UniversalUTCTime,
00260 UniversalGeneralisedTime,
00261 UniversalGeneralizedTime = UniversalGeneralisedTime,
00262 UniversalGraphicString,
00263 UniversalVisibleString,
00264 UniversalGeneralString,
00265 UniversalUniversalString,
00266 UniversalBMPString = 30
00267 };
00268
00269 unsigned GetTag() const { return tag; }
00270 virtual void SetTag(unsigned newTag, TagClass tagClass = DefaultTagClass);
00271
00272 enum ConstraintType {
00273 Unconstrained,
00274 PartiallyConstrained,
00275 FixedConstraint,
00276 ExtendableConstraint
00277 };
00278
00279 enum MinimumValueTag { MinimumValue = INT_MIN };
00280 enum MaximumValueTag { MaximumValue = INT_MAX };
00281 void SetConstraints(ConstraintType type, int value)
00282 { SetConstraintBounds(type, value, value); }
00283 void SetConstraints(ConstraintType, int lower, MaximumValueTag )
00284 { SetConstraintBounds(PartiallyConstrained, (int)lower, lower < 0 ? INT_MAX : UINT_MAX); }
00285 void SetConstraints(ConstraintType, MinimumValueTag lower, unsigned upper)
00286 { SetConstraintBounds(PartiallyConstrained, (int)lower, (unsigned)upper); }
00287 void SetConstraints(ConstraintType, MinimumValueTag lower, MaximumValueTag upper)
00288 { SetConstraintBounds(PartiallyConstrained, (int)lower, (unsigned)upper); }
00289 void SetConstraints(ConstraintType type, int lower, unsigned upper)
00290 { SetConstraintBounds(type, lower, upper); }
00291
00292 virtual void SetConstraintBounds(ConstraintType type, int lower, unsigned upper);
00293 virtual void SetCharacterSet(ConstraintType ctype, const char * charSet);
00294 virtual void SetCharacterSet(ConstraintType ctype, unsigned firstChar, unsigned lastChar);
00295
00296 static PINDEX GetMaximumArraySize();
00297 static void SetMaximumArraySize(PINDEX sz);
00298 static PINDEX GetMaximumStringSize();
00299 static void SetMaximumStringSize(PINDEX sz);
00300
00301 protected:
00302 PASN_Object(unsigned tag, TagClass tagClass, BOOL extend = FALSE);
00303
00305 BOOL extendable;
00307 TagClass tagClass;
00309 unsigned tag;
00310 };
00311
00312
00315 class PASN_ConstrainedObject : public PASN_Object
00316 {
00317 PCLASSINFO(PASN_ConstrainedObject, PASN_Object);
00318 public:
00319 BOOL IsConstrained() const { return constraint != Unconstrained; }
00320 int GetLowerLimit() const { return lowerLimit; }
00321 unsigned GetUpperLimit() const { return upperLimit; }
00322
00323 BOOL ConstrainedLengthDecode(PPER_Stream & strm, unsigned & length);
00324 void ConstrainedLengthEncode(PPER_Stream & strm, unsigned length) const;
00325
00326 BOOL ConstraintEncode(PPER_Stream & strm, unsigned value) const;
00327
00328 protected:
00329 virtual void SetConstraintBounds(ConstraintType type, int lower, unsigned upper);
00330 PASN_ConstrainedObject(unsigned tag, TagClass tagClass);
00331
00332 ConstraintType constraint;
00333 int lowerLimit;
00334 unsigned upperLimit;
00335 };
00336
00337
00340 class PASN_Null : public PASN_Object
00341 {
00342 PCLASSINFO(PASN_Null, PASN_Object);
00343 public:
00344 PASN_Null(unsigned tag = UniversalNull,
00345 TagClass tagClass = UniversalTagClass);
00346
00347 virtual Comparison Compare(const PObject & obj) const;
00348 virtual PObject * Clone() const;
00349 virtual void PrintOn(ostream & strm) const;
00350
00351 virtual PString GetTypeAsString() const;
00352 virtual PINDEX GetDataLength() const;
00353 virtual BOOL Decode(PASN_Stream &);
00354 virtual void Encode(PASN_Stream &) const;
00355 };
00356
00357
00360 class PASN_Boolean : public PASN_Object
00361 {
00362 PCLASSINFO(PASN_Boolean, PASN_Object);
00363 public:
00364 PASN_Boolean(BOOL val = FALSE);
00365 PASN_Boolean(unsigned tag, TagClass tagClass, BOOL val = FALSE);
00366
00367 PASN_Boolean & operator=(BOOL v) { value = v; return *this; }
00368 operator BOOL() const { return value; }
00369 BOOL GetValue() const { return value; }
00370 void SetValue(BOOL v) { value = v; }
00371
00372 virtual Comparison Compare(const PObject & obj) const;
00373 virtual PObject * Clone() const;
00374 virtual void PrintOn(ostream & strm) const;
00375
00376 virtual PString GetTypeAsString() const;
00377 virtual PINDEX GetDataLength() const;
00378 virtual BOOL Decode(PASN_Stream &);
00379 virtual void Encode(PASN_Stream &) const;
00380
00381 protected:
00382 BOOL value;
00383 };
00384
00385
00388 class PASN_Integer : public PASN_ConstrainedObject
00389 {
00390 PCLASSINFO(PASN_Integer, PASN_ConstrainedObject);
00391 public:
00392 PASN_Integer(unsigned val = 0);
00393 PASN_Integer(unsigned tag, TagClass tagClass, unsigned val = 0);
00394
00395 PASN_Integer & operator=(unsigned value);
00396 operator unsigned() const { return value; }
00397 unsigned GetValue() const { return value; }
00398 void SetValue(unsigned v) { operator=(v); }
00399
00400 virtual Comparison Compare(const PObject & obj) const;
00401 virtual PObject * Clone() const;
00402 virtual void PrintOn(ostream & strm) const;
00403
00404 virtual void SetConstraintBounds(ConstraintType type, int lower, unsigned upper);
00405 virtual PString GetTypeAsString() const;
00406 virtual PINDEX GetDataLength() const;
00407 virtual BOOL Decode(PASN_Stream &);
00408 virtual void Encode(PASN_Stream &) const;
00409
00410 #ifdef P_INCLUDE_PER
00411 BOOL DecodePER(PPER_Stream & strm);
00412 void EncodePER(PPER_Stream & strm) const;
00413 #endif
00414
00415 BOOL IsUnsigned() const;
00416
00417 protected:
00418 unsigned value;
00419 };
00420
00421 struct PASN_Names{
00422 const char * name;
00423 PINDEX value;
00424 };
00425
00428 class PASN_Enumeration : public PASN_Object
00429 {
00430 PCLASSINFO(PASN_Enumeration, PASN_Object);
00431 public:
00432 PASN_Enumeration(unsigned val = 0);
00433 PASN_Enumeration(unsigned tag,
00434 TagClass tagClass,
00435 unsigned nEnums = P_MAX_INDEX,
00436 BOOL extendable = FALSE,
00437 unsigned val = 0);
00438 PASN_Enumeration(unsigned tag,
00439 TagClass tagClass,
00440 unsigned nEnums,
00441 BOOL extendable,
00442 const PASN_Names * nameSpec,
00443 unsigned namesCnt,
00444 unsigned val = 0);
00445
00446 PASN_Enumeration & operator=(unsigned v) { value = v; return *this; }
00447 operator unsigned() const { return value; }
00448 unsigned GetValue() const { return value; }
00449 void SetValue(unsigned v) { value = v; }
00450
00451 unsigned GetMaximum() const { return maxEnumValue; }
00452
00453 virtual Comparison Compare(const PObject & obj) const;
00454 virtual PObject * Clone() const;
00455 virtual void PrintOn(ostream & strm) const;
00456
00457 virtual PString GetTypeAsString() const;
00458 virtual PINDEX GetDataLength() const;
00459 virtual BOOL Decode(PASN_Stream &);
00460 virtual void Encode(PASN_Stream &) const;
00461
00462 #ifdef P_INCLUDE_PER
00463 BOOL DecodePER(PPER_Stream & strm);
00464 void EncodePER(PPER_Stream & strm) const;
00465 #endif
00466
00467 #ifdef P_INCLUDE_XER
00468 virtual BOOL DecodeXER(PXER_Stream & strm);
00469 virtual void EncodeXER(PXER_Stream & strm) const;
00470 #endif
00471
00472 PINDEX GetValueByName(PString name) const;
00473 protected:
00474 unsigned maxEnumValue;
00475 unsigned value;
00476 const PASN_Names *names;
00477 unsigned namesCount;
00478 };
00479
00480
00483 class PASN_Real : public PASN_Object
00484 {
00485 PCLASSINFO(PASN_Real, PASN_Object);
00486 public:
00487 PASN_Real(double val = 0);
00488 PASN_Real(unsigned tag, TagClass tagClass, double val = 0);
00489
00490 PASN_Real & operator=(double val) { value = val; return *this; }
00491 operator double() const { return value; }
00492 double GetValue() const { return value; }
00493 void SetValue(double v) { value = v; }
00494
00495 virtual Comparison Compare(const PObject & obj) const;
00496 virtual PObject * Clone() const;
00497 virtual void PrintOn(ostream & strm) const;
00498
00499 virtual PString GetTypeAsString() const;
00500 virtual PINDEX GetDataLength() const;
00501 virtual BOOL Decode(PASN_Stream &);
00502 virtual void Encode(PASN_Stream &) const;
00503
00504 protected:
00505 double value;
00506 };
00507
00508
00511 class PASN_ObjectId : public PASN_Object
00512 {
00513 PCLASSINFO(PASN_ObjectId, PASN_Object);
00514 public:
00515 PASN_ObjectId(const char * dotstr = NULL);
00516 PASN_ObjectId(unsigned tag, TagClass tagClass);
00517
00518 PASN_ObjectId(const PASN_ObjectId & other);
00519 PASN_ObjectId & operator=(const PASN_ObjectId & other);
00520
00521 PASN_ObjectId & operator=(const char * dotstr);
00522 PASN_ObjectId & operator=(const PString & dotstr);
00523 PASN_ObjectId & operator=(const PUnsignedArray & numbers);
00524 void SetValue(const PString & dotstr);
00525 void SetValue(const PUnsignedArray & numbers) { value = numbers; }
00526 void SetValue(const unsigned * numbers, PINDEX size);
00527
00528 bool operator==(const char * dotstr) const;
00529 bool operator!=(const char * dotstr) const { return !operator==(dotstr); }
00530 bool operator==(const PString & dotstr) const { return operator==((const char *)dotstr); }
00531 bool operator!=(const PString & dotstr) const { return !operator==((const char *)dotstr); }
00532 bool operator==(const PASN_ObjectId & id) const { return value == id.value; }
00533
00534 PINDEX GetSize() const { return value.GetSize(); }
00535 unsigned operator[](PINDEX idx) const { return value[idx]; }
00536 const PUnsignedArray & GetValue() const { return value; }
00537 PString AsString() const;
00538
00539 virtual Comparison Compare(const PObject & obj) const;
00540 virtual PObject * Clone() const;
00541 virtual void PrintOn(ostream & strm) const;
00542
00543 virtual PString GetTypeAsString() const;
00544 virtual PINDEX GetDataLength() const;
00545 virtual BOOL Decode(PASN_Stream &);
00546 virtual void Encode(PASN_Stream &) const;
00547
00548 BOOL CommonDecode(PASN_Stream & strm, unsigned dataLen);
00549 void CommonEncode(PBYTEArray & eObjId) const;
00550
00551 protected:
00552 PUnsignedArray value;
00553 };
00554
00555
00558 class PASN_BitString : public PASN_ConstrainedObject
00559 {
00560 PCLASSINFO(PASN_BitString, PASN_ConstrainedObject);
00561 public:
00562 PASN_BitString(unsigned nBits = 0, const BYTE * buf = NULL);
00563 PASN_BitString(unsigned tag, TagClass tagClass, unsigned nBits = 0);
00564
00565 PASN_BitString(const PASN_BitString & other);
00566 PASN_BitString & operator=(const PASN_BitString & other);
00567
00568 void SetData(unsigned nBits, const PBYTEArray & bytes);
00569 void SetData(unsigned nBits, const BYTE * buf, PINDEX size = 0);
00570
00571 const BYTE * GetDataPointer() const { return bitData; }
00572
00573 unsigned GetSize() const { return totalBits; }
00574 BOOL SetSize(unsigned nBits);
00575
00576 bool operator[](PINDEX bit) const;
00577 void Set(unsigned bit);
00578 void Clear(unsigned bit);
00579 void Invert(unsigned bit);
00580
00581 virtual Comparison Compare(const PObject & obj) const;
00582 virtual PObject * Clone() const;
00583 virtual void PrintOn(ostream & strm) const;
00584
00585 virtual void SetConstraintBounds(ConstraintType type, int lower, unsigned upper);
00586 virtual PString GetTypeAsString() const;
00587 virtual PINDEX GetDataLength() const;
00588 virtual BOOL Decode(PASN_Stream &);
00589 virtual void Encode(PASN_Stream &) const;
00590
00591 #ifdef P_INCLUDE_BER
00592 BOOL DecodeBER(PBER_Stream & strm, unsigned len);
00593 void EncodeBER(PBER_Stream & strm) const;
00594 #endif
00595
00596 #ifdef P_INCLUDE_PER
00597 BOOL DecodePER(PPER_Stream & strm);
00598 void EncodePER(PPER_Stream & strm) const;
00599 #endif
00600
00601 BOOL DecodeSequenceExtensionBitmap(PPER_Stream & strm);
00602 void EncodeSequenceExtensionBitmap(PPER_Stream & strm) const;
00603
00604 protected:
00605 unsigned totalBits;
00606 PBYTEArray bitData;
00607 };
00608
00609
00612 class PASN_OctetString : public PASN_ConstrainedObject
00613 {
00614 PCLASSINFO(PASN_OctetString, PASN_ConstrainedObject);
00615 public:
00616 PASN_OctetString(const char * str = NULL, PINDEX size = 0);
00617 PASN_OctetString(unsigned tag, TagClass tagClass);
00618
00619 PASN_OctetString(const PASN_OctetString & other);
00620 PASN_OctetString & operator=(const PASN_OctetString & other);
00621
00622 PASN_OctetString & operator=(const char * str);
00623 PASN_OctetString & operator=(const PString & str);
00624 PASN_OctetString & operator=(const PBYTEArray & arr);
00625 void SetValue(const char * str) { operator=(str); }
00626 void SetValue(const PString & str) { operator=(str); }
00627 void SetValue(const PBYTEArray & arr) { operator=(arr); }
00628 void SetValue(const BYTE * data, PINDEX len);
00629 const PBYTEArray & GetValue() const { return value; }
00630 operator const PBYTEArray &() const { return value; }
00631 operator const BYTE *() const { return value; }
00632 PString AsString() const;
00633 BYTE operator[](PINDEX i) const { return value[i]; }
00634 BYTE & operator[](PINDEX i) { return value[i]; }
00635 BYTE * GetPointer(PINDEX sz = 0) { return value.GetPointer(sz); }
00636 PINDEX GetSize() const { return value.GetSize(); }
00637 BOOL SetSize(PINDEX newSize);
00638
00639 virtual Comparison Compare(const PObject & obj) const;
00640 virtual PObject * Clone() const;
00641 virtual void PrintOn(ostream & strm) const;
00642
00643 virtual void SetConstraintBounds(ConstraintType type, int lower, unsigned upper);
00644 virtual PString GetTypeAsString() const;
00645 virtual PINDEX GetDataLength() const;
00646 virtual BOOL Decode(PASN_Stream &);
00647 virtual void Encode(PASN_Stream &) const;
00648
00649 #ifdef P_INCLUDE_PER
00650 BOOL DecodePER(PPER_Stream & strm);
00651 void EncodePER(PPER_Stream & strm) const;
00652 #endif
00653
00654 BOOL DecodeSubType(PASN_Object &) const;
00655 void EncodeSubType(const PASN_Object &);
00656
00657 protected:
00658 PBYTEArray value;
00659 };
00660
00661
00664 class PASN_ConstrainedString : public PASN_ConstrainedObject
00665 {
00666 PCLASSINFO(PASN_ConstrainedString, PASN_ConstrainedObject);
00667 public:
00668 PASN_ConstrainedString & operator=(const char * str);
00669 PASN_ConstrainedString & operator=(const PString & str) { return operator=((const char *)str); }
00670 operator const PString &() const { return value; }
00671 const PString & GetValue() const { return value; }
00672 void SetValue(const char * v) { operator=(v); }
00673 void SetValue(const PString & v) { operator=(v); }
00674 char operator[](PINDEX idx) const { return value[idx]; }
00675
00676 void SetCharacterSet(ConstraintType ctype, const char * charSet);
00677 void SetCharacterSet(ConstraintType ctype, unsigned firstChar = 0, unsigned lastChar = 255);
00678 void SetCharacterSet(const char * charSet, PINDEX size, ConstraintType ctype);
00679
00680 virtual Comparison Compare(const PObject & obj) const;
00681 virtual void PrintOn(ostream & strm) const;
00682
00683 virtual void SetConstraintBounds(ConstraintType type, int lower, unsigned upper);
00684 virtual PINDEX GetDataLength() const;
00685 virtual BOOL Decode(PASN_Stream &);
00686 virtual void Encode(PASN_Stream &) const;
00687
00688 #ifdef P_INCLUDE_BER
00689 BOOL DecodeBER(PBER_Stream & strm, unsigned len);
00690 void EncodeBER(PBER_Stream & strm) const;
00691 #endif
00692
00693 #ifdef P_INCLUDE_PER
00694 BOOL DecodePER(PPER_Stream & strm);
00695 void EncodePER(PPER_Stream & strm) const;
00696 #endif
00697
00698 protected:
00699 PASN_ConstrainedString(const char * canonicalSet, PINDEX setSize,
00700 unsigned tag, TagClass tagClass);
00701
00702 PString value;
00703 PCharArray characterSet;
00704 const char * canonicalSet;
00705 PINDEX canonicalSetSize;
00706 unsigned canonicalSetBits;
00707 unsigned charSetUnalignedBits;
00708 unsigned charSetAlignedBits;
00709 };
00710
00711
00712 #define DECLARE_STRING_CLASS(name) \
00713 class PASN_##name##String : public PASN_ConstrainedString { \
00714 PCLASSINFO(PASN_##name##String, PASN_ConstrainedString); \
00715 public: \
00716 PASN_##name##String(const char * str = NULL); \
00717 PASN_##name##String(unsigned tag, TagClass tagClass); \
00718 PASN_##name##String & operator=(const char * str); \
00719 PASN_##name##String & operator=(const PString & str); \
00720 virtual PObject * Clone() const; \
00721 virtual PString GetTypeAsString() const; \
00722 }
00723
00724 DECLARE_STRING_CLASS(Numeric);
00725 DECLARE_STRING_CLASS(Printable);
00726 DECLARE_STRING_CLASS(Visible);
00727 DECLARE_STRING_CLASS(IA5);
00728 DECLARE_STRING_CLASS(General);
00729
00730
00733 class PASN_BMPString : public PASN_ConstrainedObject
00734 {
00735 PCLASSINFO(PASN_BMPString, PASN_ConstrainedObject);
00736 public:
00737 PASN_BMPString(const char * str = NULL);
00738 PASN_BMPString(const PWORDArray & wstr);
00739 PASN_BMPString(unsigned tag, TagClass tagClass);
00740
00741 PASN_BMPString(const PASN_BMPString & other);
00742 PASN_BMPString & operator=(const PASN_BMPString & other);
00743
00744 PASN_BMPString & operator=(const char * v) { return operator=(PString(v).AsUCS2()); }
00745 PASN_BMPString & operator=(const PString & v) { return operator=(v.AsUCS2()); }
00746 PASN_BMPString & operator=(const PWORDArray & v);
00747 operator PString() const { return GetValue(); }
00748 operator PWORDArray() const { return value; }
00749 PString GetValue() const { return value; }
00750 void GetValue(PWORDArray & v) const { v = value; }
00751 void SetValue(const char * v) { operator=(PString(v).AsUCS2()); }
00752 void SetValue(const PString & v) { operator=(v.AsUCS2()); }
00753 void SetValue(const PWORDArray & v) { operator=(v); }
00754 void SetValue(const PASN_BMPString & v) { operator=(v.value); }
00755
00756 void SetCharacterSet(ConstraintType ctype, const char * charSet);
00757 void SetCharacterSet(ConstraintType ctype, const PWORDArray & charSet);
00758 void SetCharacterSet(ConstraintType ctype, unsigned firstChar, unsigned lastChar);
00759
00760 virtual Comparison Compare(const PObject & obj) const;
00761 virtual PObject * Clone() const;
00762 virtual void PrintOn(ostream & strm) const;
00763
00764 virtual PString GetTypeAsString() const;
00765 virtual PINDEX GetDataLength() const;
00766 virtual BOOL Decode(PASN_Stream &);
00767 virtual void Encode(PASN_Stream &) const;
00768
00769 #ifdef P_INCLUDE_BER
00770 BOOL DecodeBER(PBER_Stream & strm, unsigned len);
00771 void EncodeBER(PBER_Stream & strm) const;
00772 #endif
00773
00774 #ifdef P_INCLUDE_PER
00775 BOOL DecodePER(PPER_Stream & strm);
00776 void EncodePER(PPER_Stream & strm) const;
00777 #endif
00778
00779 protected:
00780 void Construct();
00781 BOOL IsLegalCharacter(WORD ch);
00782
00783 PWORDArray value;
00784 PWORDArray characterSet;
00785 WORD firstChar, lastChar;
00786 unsigned charSetUnalignedBits;
00787 unsigned charSetAlignedBits;
00788 };
00789
00790
00791 class PASN_GeneralisedTime : public PASN_VisibleString
00792 {
00793 PCLASSINFO(PASN_GeneralisedTime, PASN_VisibleString);
00794 public:
00795 PASN_GeneralisedTime()
00796 : PASN_VisibleString(UniversalGeneralisedTime, UniversalTagClass) { }
00797 PASN_GeneralisedTime(const PTime & time)
00798 : PASN_VisibleString(UniversalGeneralisedTime, UniversalTagClass) { SetValue(time); }
00799 PASN_GeneralisedTime(unsigned tag, TagClass tagClass)
00800 : PASN_VisibleString(tag, tagClass) { }
00801
00802 PASN_GeneralisedTime & operator=(const PTime & time);
00803 void SetValue(const PTime & time) { operator=(time); }
00804 PTime GetValue() const;
00805 };
00806
00807
00808 class PASN_UniversalTime : public PASN_VisibleString
00809 {
00810 PCLASSINFO(PASN_UniversalTime, PASN_VisibleString);
00811 public:
00812 PASN_UniversalTime()
00813 : PASN_VisibleString(UniversalUTCTime, UniversalTagClass) { }
00814 PASN_UniversalTime(const PTime & time)
00815 : PASN_VisibleString(UniversalUTCTime, UniversalTagClass) { SetValue(time); }
00816 PASN_UniversalTime(unsigned tag, TagClass tagClass)
00817 : PASN_VisibleString(tag, tagClass) { }
00818
00819 PASN_UniversalTime & operator=(const PTime & time);
00820 void SetValue(const PTime & time) { operator=(time); }
00821 PTime GetValue() const;
00822 };
00823
00824
00825 class PASN_Sequence;
00826
00829 class PASN_Choice : public PASN_Object
00830 {
00831 PCLASSINFO(PASN_Choice, PASN_Object);
00832 public:
00833 ~PASN_Choice();
00834
00835 virtual void SetTag(unsigned newTag, TagClass tagClass = DefaultTagClass);
00836 PString GetTagName() const;
00837 PASN_Object & GetObject() const;
00838 BOOL IsValid() const { return choice != NULL; }
00839
00840 #if defined(__GNUC__) && __GNUC__ <= 2 && __GNUC_MINOR__ < 9
00841
00842 operator PASN_Null &() const;
00843 operator PASN_Boolean &() const;
00844 operator PASN_Integer &() const;
00845 operator PASN_Enumeration &() const;
00846 operator PASN_Real &() const;
00847 operator PASN_ObjectId &() const;
00848 operator PASN_BitString &() const;
00849 operator PASN_OctetString &() const;
00850 operator PASN_NumericString &() const;
00851 operator PASN_PrintableString &() const;
00852 operator PASN_VisibleString &() const;
00853 operator PASN_IA5String &() const;
00854 operator PASN_GeneralString &() const;
00855 operator PASN_BMPString &() const;
00856 operator PASN_Sequence &() const;
00857
00858 #else
00859
00860 operator PASN_Null &();
00861 operator PASN_Boolean &();
00862 operator PASN_Integer &();
00863 operator PASN_Enumeration &();
00864 operator PASN_Real &();
00865 operator PASN_ObjectId &();
00866 operator PASN_BitString &();
00867 operator PASN_OctetString &();
00868 operator PASN_NumericString &();
00869 operator PASN_PrintableString &();
00870 operator PASN_VisibleString &();
00871 operator PASN_IA5String &();
00872 operator PASN_GeneralString &();
00873 operator PASN_BMPString &();
00874 operator PASN_Sequence &();
00875
00876 operator const PASN_Null &() const;
00877 operator const PASN_Boolean &() const;
00878 operator const PASN_Integer &() const;
00879 operator const PASN_Enumeration &() const;
00880 operator const PASN_Real &() const;
00881 operator const PASN_ObjectId &() const;
00882 operator const PASN_BitString &() const;
00883 operator const PASN_OctetString &() const;
00884 operator const PASN_NumericString &() const;
00885 operator const PASN_PrintableString &() const;
00886 operator const PASN_VisibleString &() const;
00887 operator const PASN_IA5String &() const;
00888 operator const PASN_GeneralString &() const;
00889 operator const PASN_BMPString &() const;
00890 operator const PASN_Sequence &() const;
00891
00892 #endif
00893
00894 virtual BOOL CreateObject() = 0;
00895
00896 virtual Comparison Compare(const PObject & obj) const;
00897 virtual void PrintOn(ostream & strm) const;
00898
00899 virtual PString GetTypeAsString() const;
00900 virtual PINDEX GetDataLength() const;
00901 virtual BOOL IsPrimitive() const;
00902 virtual BOOL Decode(PASN_Stream &);
00903 virtual void Encode(PASN_Stream &) const;
00904
00905 #ifdef P_INCLUDE_PER
00906 virtual BOOL DecodePER(PPER_Stream &);
00907 virtual void EncodePER(PPER_Stream &) const;
00908 #endif
00909
00910 #ifdef P_INCLUDE_XER
00911 BOOL DecodeXER(PXER_Stream &);
00912 void EncodeXER(PXER_Stream &) const;
00913 #endif
00914
00915 PASN_Choice & operator=(const PASN_Choice & other);
00916
00917 PINDEX GetValueByName(PString name) const;
00918 protected:
00919 PASN_Choice(unsigned nChoices = 0, BOOL extend = FALSE);
00920 PASN_Choice(unsigned tag, TagClass tagClass, unsigned nChoices, BOOL extend);
00921 PASN_Choice(unsigned tag, TagClass tagClass, unsigned nChoices, BOOL extend, const PASN_Names * nameSpec,unsigned namesCnt);
00922
00923 PASN_Choice(const PASN_Choice & other);
00924
00925 BOOL CheckCreate() const;
00926
00927 unsigned numChoices;
00928 PASN_Object * choice;
00929 const PASN_Names *names;
00930 unsigned namesCount;
00931 };
00932
00933
00934 PARRAY(PASN_ObjectArray, PASN_Object);
00935
00936
00939 class PASN_Sequence : public PASN_Object
00940 {
00941 PCLASSINFO(PASN_Sequence, PASN_Object);
00942 public:
00943 PASN_Sequence(unsigned tag = UniversalSequence,
00944 TagClass tagClass = UniversalTagClass,
00945 unsigned nOpts = 0, BOOL extend = FALSE, unsigned nExtend = 0);
00946
00947 PASN_Sequence(const PASN_Sequence & other);
00948 PASN_Sequence & operator=(const PASN_Sequence & other);
00949
00950 PINDEX GetSize() const { return fields.GetSize(); }
00951 BOOL SetSize(PINDEX newSize);
00952 PASN_Object & operator[](PINDEX i) const { return fields[i]; }
00953
00954 BOOL HasOptionalField(PINDEX opt) const;
00955 void IncludeOptionalField(PINDEX opt);
00956 void RemoveOptionalField(PINDEX opt);
00957
00958 virtual Comparison Compare(const PObject & obj) const;
00959 virtual PObject * Clone() const;
00960 virtual void PrintOn(ostream & strm) const;
00961
00962 virtual PString GetTypeAsString() const;
00963 virtual PINDEX GetDataLength() const;
00964 virtual BOOL IsPrimitive() const;
00965 virtual BOOL Decode(PASN_Stream &);
00966 virtual void Encode(PASN_Stream &) const;
00967
00968 BOOL PreambleDecode(PASN_Stream & strm);
00969 void PreambleEncode(PASN_Stream & strm) const;
00970 BOOL KnownExtensionDecode(PASN_Stream & strm, PINDEX fld, PASN_Object & field);
00971 void KnownExtensionEncode(PASN_Stream & strm, PINDEX fld, const PASN_Object & field) const;
00972 BOOL UnknownExtensionsDecode(PASN_Stream & strm);
00973 void UnknownExtensionsEncode(PASN_Stream & strm) const;
00974
00975 #ifdef P_INCLUDE_BER
00976 BOOL PreambleDecodeBER(PBER_Stream & strm);
00977 void PreambleEncodeBER(PBER_Stream & strm) const;
00978 BOOL KnownExtensionDecodeBER(PBER_Stream & strm, PINDEX fld, PASN_Object & field);
00979 void KnownExtensionEncodeBER(PBER_Stream & strm, PINDEX fld, const PASN_Object & field) const;
00980 BOOL UnknownExtensionsDecodeBER(PBER_Stream & strm);
00981 void UnknownExtensionsEncodeBER(PBER_Stream & strm) const;
00982 #endif
00983
00984 #ifdef P_INCLUDE_PER
00985 BOOL PreambleDecodePER(PPER_Stream & strm);
00986 void PreambleEncodePER(PPER_Stream & strm) const;
00987 BOOL KnownExtensionDecodePER(PPER_Stream & strm, PINDEX fld, PASN_Object & field);
00988 void KnownExtensionEncodePER(PPER_Stream & strm, PINDEX fld, const PASN_Object & field) const;
00989 BOOL UnknownExtensionsDecodePER(PPER_Stream & strm);
00990 void UnknownExtensionsEncodePER(PPER_Stream & strm) const;
00991 #endif
00992
00993 #ifdef P_INCLUDE_XER
00994 virtual BOOL PreambleDecodeXER(PXER_Stream & strm);
00995 virtual void PreambleEncodeXER(PXER_Stream & strm) const;
00996 virtual BOOL KnownExtensionDecodeXER(PXER_Stream & strm, PINDEX fld, PASN_Object & field);
00997 virtual void KnownExtensionEncodeXER(PXER_Stream & strm, PINDEX fld, const PASN_Object & field) const;
00998 virtual BOOL UnknownExtensionsDecodeXER(PXER_Stream & strm);
00999 virtual void UnknownExtensionsEncodeXER(PXER_Stream & strm) const;
01000 #endif
01001
01002 protected:
01003 BOOL NoExtensionsToDecode(PPER_Stream & strm);
01004 BOOL NoExtensionsToEncode(PPER_Stream & strm);
01005
01006 PASN_ObjectArray fields;
01007 PASN_BitString optionMap;
01008 int knownExtensions;
01009 int totalExtensions;
01010 PASN_BitString extensionMap;
01011 PINDEX endBasicEncoding;
01012 };
01013
01014
01017 class PASN_Set : public PASN_Sequence
01018 {
01019 PCLASSINFO(PASN_Set, PASN_Sequence);
01020 public:
01021 PASN_Set(unsigned tag = UniversalSet,
01022 TagClass tagClass = UniversalTagClass,
01023 unsigned nOpts = 0, BOOL extend = FALSE, unsigned nExtend = 0);
01024
01025 virtual PObject * Clone() const;
01026 virtual PString GetTypeAsString() const;
01027 };
01028
01029
01032 class PASN_Array : public PASN_ConstrainedObject
01033 {
01034 PCLASSINFO(PASN_Array, PASN_ConstrainedObject);
01035 public:
01036 PINDEX GetSize() const { return array.GetSize(); }
01037 BOOL SetSize(PINDEX newSize);
01038 PASN_Object & operator[](PINDEX i) const { return array[i]; }
01039 void Append(PASN_Object * obj) { array.SetAt(array.GetSize(), obj); }
01040 void RemoveAt(PINDEX i) { array.RemoveAt(i); }
01041 void RemoveAll() { array.RemoveAll(); }
01042
01043 virtual Comparison Compare(const PObject & obj) const;
01044 virtual void PrintOn(ostream & strm) const;
01045
01046 virtual void SetConstraintBounds(ConstraintType type, int lower, unsigned upper);
01047 virtual PString GetTypeAsString() const;
01048 virtual PINDEX GetDataLength() const;
01049 virtual BOOL IsPrimitive() const;
01050 virtual BOOL Decode(PASN_Stream &);
01051 virtual void Encode(PASN_Stream &) const;
01052
01053 virtual PASN_Object * CreateObject() const = 0;
01054
01055 PASN_Array & operator=(const PASN_Array & other);
01056
01057 protected:
01058 PASN_Array(unsigned tag = UniversalSequence,
01059 TagClass tagClass = UniversalTagClass);
01060
01061 PASN_Array(const PASN_Array & other);
01062
01063 PASN_ObjectArray array;
01064 };
01065
01066
01068
01071 class PASN_Stream : public PBYTEArray
01072 {
01073 PCLASSINFO(PASN_Stream, PBYTEArray);
01074 public:
01075 PASN_Stream();
01076 PASN_Stream(const PBYTEArray & bytes);
01077 PASN_Stream(const BYTE * buf, PINDEX size);
01078
01079 void PrintOn(ostream & strm) const;
01080
01081 PINDEX GetPosition() const { return byteOffset; }
01082 void SetPosition(PINDEX newPos);
01083 BOOL IsAtEnd() { return byteOffset >= GetSize(); }
01084 void ResetDecoder();
01085 void BeginEncoding();
01086 void CompleteEncoding();
01087
01088 virtual BOOL Read(PChannel & chan) = 0;
01089 virtual BOOL Write(PChannel & chan) = 0;
01090
01091 virtual BOOL NullDecode(PASN_Null &) = 0;
01092 virtual void NullEncode(const PASN_Null &) = 0;
01093 virtual BOOL BooleanDecode(PASN_Boolean &) = 0;
01094 virtual void BooleanEncode(const PASN_Boolean &) = 0;
01095 virtual BOOL IntegerDecode(PASN_Integer &) = 0;
01096 virtual void IntegerEncode(const PASN_Integer &) = 0;
01097 virtual BOOL EnumerationDecode(PASN_Enumeration &) = 0;
01098 virtual void EnumerationEncode(const PASN_Enumeration &) = 0;
01099 virtual BOOL RealDecode(PASN_Real &) = 0;
01100 virtual void RealEncode(const PASN_Real &) = 0;
01101 virtual BOOL ObjectIdDecode(PASN_ObjectId &) = 0;
01102 virtual void ObjectIdEncode(const PASN_ObjectId &) = 0;
01103 virtual BOOL BitStringDecode(PASN_BitString &) = 0;
01104 virtual void BitStringEncode(const PASN_BitString &) = 0;
01105 virtual BOOL OctetStringDecode(PASN_OctetString &) = 0;
01106 virtual void OctetStringEncode(const PASN_OctetString &) = 0;
01107 virtual BOOL ConstrainedStringDecode(PASN_ConstrainedString &) = 0;
01108 virtual void ConstrainedStringEncode(const PASN_ConstrainedString &) = 0;
01109 virtual BOOL BMPStringDecode(PASN_BMPString &) = 0;
01110 virtual void BMPStringEncode(const PASN_BMPString &) = 0;
01111 virtual BOOL ChoiceDecode(PASN_Choice &) = 0;
01112 virtual void ChoiceEncode(const PASN_Choice &) = 0;
01113 virtual BOOL ArrayDecode(PASN_Array &) = 0;
01114 virtual void ArrayEncode(const PASN_Array &) = 0;
01115 virtual BOOL SequencePreambleDecode(PASN_Sequence &) = 0;
01116 virtual void SequencePreambleEncode(const PASN_Sequence &) = 0;
01117 virtual BOOL SequenceKnownDecode(PASN_Sequence &, PINDEX, PASN_Object &) = 0;
01118 virtual void SequenceKnownEncode(const PASN_Sequence &, PINDEX, const PASN_Object &) = 0;
01119 virtual BOOL SequenceUnknownDecode(PASN_Sequence &) = 0;
01120 virtual void SequenceUnknownEncode(const PASN_Sequence &) = 0;
01121
01122 BYTE ByteDecode();
01123 void ByteEncode(unsigned value);
01124
01125 unsigned BlockDecode(BYTE * bufptr, unsigned nBytes);
01126 void BlockEncode(const BYTE * bufptr, PINDEX nBytes);
01127
01128 void ByteAlign();
01129
01130 protected:
01131 PINDEX byteOffset;
01132 unsigned bitOffset;
01133
01134 private:
01135 void Construct();
01136 };
01137
01138 #ifdef P_INCLUDE_PER
01139 #include "asnper.h"
01140 #endif
01141
01142 #ifdef P_INCLUDE_BER
01143 #include "asnber.h"
01144 #endif
01145
01146 #ifdef P_INCLUDE_XER
01147 #include "asnxer.h"
01148 #endif
01149
01150 #endif // _ASNER_H