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