📄 asner.cxx
字号:
void PBER_Stream::IntegerEncode(const PASN_Integer & value){ HeaderEncode(value); // output the integer bits for (int count = GetIntegerDataLength(value)-1; count >= 0; count--) ByteEncode(value >> (count*8));}BOOL PPER_Stream::IntegerDecode(PASN_Integer & value){ return value.DecodePER(*this);}void PPER_Stream::IntegerEncode(const PASN_Integer & value){ value.EncodePER(*this);}BOOL PASN_Integer::DecodePER(PPER_Stream & strm){ // X.931 Sections 12 if ((extendable && strm.SingleBitDecode()) || constraint != FixedConstraint) { // 12.1 unsigned len; if (strm.LengthDecode(0, INT_MAX, len) != 0) return FALSE; value = strm.MultiBitDecode(len*8); return TRUE; } if ((unsigned)lowerLimit != upperLimit) // 12.2.1 return strm.UnsignedDecode(lowerLimit, upperLimit, value) == 0; // 12.2.2 which devolves to 10.5 value = lowerLimit; return TRUE;}void PASN_Integer::EncodePER(PPER_Stream & strm) const{ // X.931 Sections 12 if (ConstraintEncode(strm, (int)value)) { // 12.1 PINDEX nBytes; unsigned adjusted_value = value - lowerLimit; if (adjusted_value == 0) nBytes = 1; else { PINDEX nBits = CountBits(adjusted_value+1); nBytes = (nBits+7)/8; } strm.LengthEncode(nBytes, 0, INT_MAX); strm.MultiBitEncode(adjusted_value, nBytes*8); return; } if ((unsigned)lowerLimit == upperLimit) // 12.2.1 return; // 12.2.2 which devolves to 10.5 strm.UnsignedEncode(value, lowerLimit, upperLimit);}///////////////////////////////////////////////////////////////////////PASN_Enumeration::PASN_Enumeration(unsigned tag, TagClass tagClass, unsigned maxEnum, BOOL extend, unsigned val) : PASN_Object(tag, tagClass, extend){ value = val; maxEnumValue = maxEnum;}static POrdinalToString BuildNamesDict(const PString & nameSpec){ POrdinalToString names; PStringArray nameList = nameSpec.Tokenise(' ', FALSE); int num = 0; for (PINDEX i = 0; i < nameList.GetSize(); i++) { const PString & thisName = nameList[i]; if (!thisName) { PINDEX equalPos = thisName.Find('='); if (equalPos != P_MAX_INDEX) num = (int)thisName.Mid(equalPos+1).AsInteger(); names.SetAt(POrdinalKey(num), thisName.Left(equalPos)); num++; } } return names;}PASN_Enumeration::PASN_Enumeration(unsigned tag, TagClass tagClass, unsigned maxEnum, BOOL extend, const PString & nameSpec, unsigned val) : PASN_Object(tag, tagClass, extend), names(BuildNamesDict(nameSpec)){ PAssert(maxEnum > 0, PInvalidParameter); maxEnumValue = maxEnum; PAssert(val < maxEnum, PInvalidParameter); value = val;}PObject::Comparison PASN_Enumeration::Compare(const PObject & obj) const{ PAssert(obj.IsDescendant(PASN_Enumeration::Class()), PInvalidCast); const PASN_Enumeration & other = (const PASN_Enumeration &)obj; if (value < other.value) return LessThan; if (value > other.value) return GreaterThan; return EqualTo;}PObject * PASN_Enumeration::Clone() const{ PAssert(IsClass(PASN_Enumeration::Class()), PInvalidCast); return new PASN_Enumeration(*this);}void PASN_Enumeration::PrintOn(ostream & strm) const{ if (names.Contains(value)) strm << names[value]; else strm << '<' << value << '>';}PString PASN_Enumeration::GetTypeAsString() const{ return "Enumeration";}PINDEX PASN_Enumeration::GetDataLength() const{ return GetIntegerDataLength(value);}BOOL PASN_Enumeration::Decode(PASN_Stream & strm){ return strm.EnumerationDecode(*this);}void PASN_Enumeration::Encode(PASN_Stream & strm) const{ strm.EnumerationEncode(*this);}BOOL PBER_Stream::EnumerationDecode(PASN_Enumeration & value){ unsigned len; if (!HeaderDecode(value, len) || len == 0 || IsAtEnd()) return FALSE; unsigned val = 0; while (len-- > 0) { if (IsAtEnd()) return FALSE; val = (val << 8) | ByteDecode(); } value = val; return TRUE;}void PBER_Stream::EnumerationEncode(const PASN_Enumeration & value){ HeaderEncode(value); // output the integer bits for (int count = GetIntegerDataLength(value)-1; count >= 0; count--) ByteEncode(value >> (count*8));}BOOL PPER_Stream::EnumerationDecode(PASN_Enumeration & value){ return value.DecodePER(*this);}void PPER_Stream::EnumerationEncode(const PASN_Enumeration & value){ value.EncodePER(*this);}BOOL PASN_Enumeration::DecodePER(PPER_Stream & strm){ // X.691 Section 13 if (extendable) { // 13.3 if (strm.SingleBitDecode()) return strm.UnsignedDecode(0, strm.SmallUnsignedDecode()-1, value) == 0; } return strm.UnsignedDecode(0, maxEnumValue, value) == 0; // 13.2}void PASN_Enumeration::EncodePER(PPER_Stream & strm) const{ // X.691 Section 13 if (extendable) { // 13.3 BOOL extended = value > maxEnumValue; strm.SingleBitEncode(extended); if (extended) { strm.SmallUnsignedEncode(1+value); strm.UnsignedEncode(value, 0, value); return; } } strm.UnsignedEncode(value, 0, maxEnumValue); // 13.2}///////////////////////////////////////////////////////////////////////PASN_Real::PASN_Real(unsigned tag, TagClass tagClass, double val) : PASN_Object(tag, tagClass){ value = val;}PObject::Comparison PASN_Real::Compare(const PObject & obj) const{ PAssert(obj.IsDescendant(PASN_Real::Class()), PInvalidCast); const PASN_Real & other = (const PASN_Real &)obj; if (value < other.value) return LessThan; if (value > other.value) return GreaterThan; return EqualTo;}PObject * PASN_Real::Clone() const{ PAssert(IsClass(PASN_Real::Class()), PInvalidCast); return new PASN_Real(*this);}void PASN_Real::PrintOn(ostream & strm) const{ strm << value;}PString PASN_Real::GetTypeAsString() const{ return "Real";}PINDEX PASN_Real::GetDataLength() const{ PAssertAlways(PUnimplementedFunction); return 0;}BOOL PASN_Real::Decode(PASN_Stream & strm){ return strm.RealDecode(*this);}void PASN_Real::Encode(PASN_Stream & strm) const{ strm.RealEncode(*this);}BOOL PBER_Stream::RealDecode(PASN_Real & value){ unsigned len; if (!HeaderDecode(value, len) || len == 0 || IsAtEnd()) return FALSE; PAssertAlways(PUnimplementedFunction); byteOffset += len; return TRUE;}void PBER_Stream::RealEncode(const PASN_Real &){ PAssertAlways(PUnimplementedFunction);}BOOL PPER_Stream::RealDecode(PASN_Real &){ // X.691 Section 14 if (IsAtEnd()) return FALSE; PINDEX len = MultiBitDecode(8)+1; PAssertAlways(PUnimplementedFunction); byteOffset += len; return TRUE;}void PPER_Stream::RealEncode(const PASN_Real &){ // X.691 Section 14 MultiBitEncode(0, 8); PAssertAlways(PUnimplementedFunction); MultiBitEncode(0, 8);}///////////////////////////////////////////////////////////////////////PASN_ObjectId::PASN_ObjectId(unsigned tag, TagClass tagClass) : PASN_Object(tag, tagClass){}PASN_ObjectId::PASN_ObjectId(const PASN_ObjectId & other) : PASN_Object(other), value(other.value, other.GetSize()){}PASN_ObjectId & PASN_ObjectId::operator=(const PASN_ObjectId & other){ PASN_Object::operator=(other); value = PUnsignedArray(other.value, other.GetSize()); return *this;}PASN_ObjectId & PASN_ObjectId::operator=(const char * dotstr){ SetValue(dotstr); return *this;}PASN_ObjectId & PASN_ObjectId::operator=(const PString & dotstr){ SetValue(dotstr); return *this;}void PASN_ObjectId::SetValue(const PString & dotstr){ PStringArray parts = dotstr.Tokenise('.'); value.SetSize(parts.GetSize()); for (PINDEX i = 0; i < parts.GetSize(); i++) value[i] = parts[i].AsUnsigned();}BOOL PASN_ObjectId::operator==(const char * dotstr) const{ PASN_ObjectId id; id.SetValue(dotstr); return *this == id;}PObject::Comparison PASN_ObjectId::Compare(const PObject & obj) const{ PAssert(obj.IsDescendant(PASN_ObjectId::Class()), PInvalidCast); const PASN_ObjectId & other = (const PASN_ObjectId &)obj; return value.Compare(other.value);}PObject * PASN_ObjectId::Clone() const{ PAssert(IsClass(PASN_ObjectId::Class()), PInvalidCast); return new PASN_ObjectId(*this);}void PASN_ObjectId::PrintOn(ostream & strm) const{ for (PINDEX i = 0; i < value.GetSize(); i++) { strm << (unsigned)value[i]; if (i < value.GetSize()-1) strm << '.'; }}PString PASN_ObjectId::GetTypeAsString() const{ return "Object ID";}BOOL PASN_ObjectId::CommonDecode(PASN_Stream & strm, unsigned dataLen){ value.SetSize(0); // handle zero length strings correctly if (dataLen == 0) return TRUE; unsigned subId; // start at the second identifier in the buffer, because we will later // expand the first number into the first two IDs PINDEX i = 1; while (dataLen > 0) { unsigned byte; subId = 0; do { /* shift and add in low order 7 bits */ if (strm.IsAtEnd()) return FALSE; byte = strm.ByteDecode(); subId = (subId << 7) + (byte & 0x7f); dataLen--; } while ((byte & 0x80) != 0); value.SetAt(i++, subId); } /* * The first two subidentifiers are encoded into the first component * with the value (X * 40) + Y, where: * X is the value of the first subidentifier. * Y is the value of the second subidentifier. */ subId = value[1]; if (subId < 40) { value[0] = 0; value[1] = subId; } else if (subId < 80) { value[0] = 1; value[1] = subId-40; } else { value[0] = 2; value[1] = subId-80; } return TRUE;}void PASN_ObjectId::CommonEncode(PBYTEArray & encodecObjectId) const{ PINDEX length = value.GetSize(); const unsigned * objId = value; if (length < 2) { // Thise case is really illegal, but we have to do SOMETHING encodecObjectId.SetSize(0); return; } unsigned subId = (objId[0] * 40) + objId[1]; objId += 2; PINDEX outputPosition = 0; while (--length > 0) { if (subId < 128) encodecObjectId[outputPosition++] = (BYTE)subId; else { unsigned mask = 0x7F; /* handle subid == 0 case */ int bits = 0; /* testmask *MUST* !!!! be of an unsigned type */ unsigned testmask = 0x7F; int testbits = 0; while (testmask != 0) { if (subId & testmask) { /* if any bits set */ mask = testmask; bits = testbits; } testmask <<= 7; testbits += 7; } /* mask can't be zero here */ while (mask != 0x7F) { /* fix a mask that got truncated above */ if (mask == 0x1E00000) mask = 0xFE00000; encodecObjectId[outputPosition++] = (BYTE)(((subId & mask) >> bits) | 0x80); mask >>= 7; bits -= 7; } encodecObjectId[outputPosition++] = (BYTE)(subId & mask); } subId = *objId++; }}PINDEX PASN_ObjectId::GetDataLength() const{ PBYTEArray dummy; CommonEncode(dummy); return dummy.GetSize();}BOOL PASN_ObjectId::Decode(PASN_Stream & strm){ return strm.ObjectIdDecode(*this);}void PASN_ObjectId::Encode(PASN_Stream & strm) const{ strm.ObjectIdEncode(*this);}BOOL PBER_Stream::ObjectIdDecode(PASN_ObjectId & value){ unsigned len; if (!HeaderDecode(value, len)) return FALSE; return value.CommonDecode(*this, len);}void PBER_Stream::ObjectIdEncode(const PASN_ObjectId & value){ HeaderEncode(value); PBYTEArray data; value.CommonEncode(data); BlockEncode(data, data.GetSize());}BOOL PPER_Stream::ObjectIdDecode(PASN_ObjectId & value){ // X.691 Section 23 unsigned dataLen; if (LengthDecode(0, 255, dataLen) < 0) return FALSE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -