📄 asner.cxx
字号:
{ PAssert(IsClass(PASN_Boolean::Class()), PInvalidCast); return new PASN_Boolean(*this);}void PASN_Boolean::PrintOn(ostream & strm) const{ if (value) strm << "TRUE"; else strm << "FALSE";}PString PASN_Boolean::GetTypeAsString() const{ return "Boolean";}PINDEX PASN_Boolean::GetDataLength() const{ return 1;}BOOL PASN_Boolean::Decode(PASN_Stream & strm){ return strm.BooleanDecode(*this);}void PASN_Boolean::Encode(PASN_Stream & strm) const{ strm.BooleanEncode(*this);}///////////////////////////////////////////////////////////////////////PASN_Integer::PASN_Integer(unsigned val) : PASN_ConstrainedObject(UniversalInteger, UniversalTagClass){ value = val;}PASN_Integer::PASN_Integer(unsigned tag, TagClass tagClass, unsigned val) : PASN_ConstrainedObject(tag, tagClass){ value = val;}BOOL PASN_Integer::IsUnsigned() const{ return constraint != Unconstrained && lowerLimit >= 0;}PASN_Integer & PASN_Integer::operator=(unsigned val){ if (constraint == Unconstrained) value = val; else if (lowerLimit >= 0) { // Is unsigned integer if (val < (unsigned)lowerLimit) value = lowerLimit; else if (val > upperLimit) value = upperLimit; else value = val; } else { int ival = (int)val; if (ival < lowerLimit) value = lowerLimit; else if (upperLimit < INT_MAX && ival > (int)upperLimit) value = upperLimit; else value = val; } return *this;}PObject::Comparison PASN_Integer::Compare(const PObject & obj) const{ PAssert(PIsDescendant(&obj, PASN_Integer), PInvalidCast); const PASN_Integer & other = (const PASN_Integer &)obj; if (IsUnsigned()) { if (value < other.value) return LessThan; if (value > other.value) return GreaterThan; } else { if ((int)value < (int)other.value) return LessThan; if ((int)value > (int)other.value) return GreaterThan; } return EqualTo;}PObject * PASN_Integer::Clone() const{ PAssert(IsClass(PASN_Integer::Class()), PInvalidCast); return new PASN_Integer(*this);}void PASN_Integer::PrintOn(ostream & strm) const{ if (constraint == Unconstrained || lowerLimit < 0) strm << (int)value; else strm << value;}void PASN_Integer::SetConstraintBounds(ConstraintType type, int lower, unsigned upper){ PASN_ConstrainedObject::SetConstraintBounds(type, lower, upper); operator=(value);}PString PASN_Integer::GetTypeAsString() const{ return "Integer";}static PINDEX GetIntegerDataLength(int value){ // create a mask which is the top nine bits of a DWORD, or 0xFF800000 // on a big endian machine int shift = (sizeof(value)-1)*8-1; // remove all sequences of nine 0's or 1's at the start of the value while (shift > 0 && ((value >> shift)&0x1ff) == (value < 0 ? 0x1ff : 0)) shift -= 8; return (shift+9)/8;}PINDEX PASN_Integer::GetDataLength() const{ return GetIntegerDataLength(value);}BOOL PASN_Integer::Decode(PASN_Stream & strm){ return strm.IntegerDecode(*this);}void PASN_Integer::Encode(PASN_Stream & strm) const{ strm.IntegerEncode(*this);}///////////////////////////////////////////////////////////////////////PASN_Enumeration::PASN_Enumeration(unsigned val): PASN_Object(UniversalEnumeration, UniversalTagClass, FALSE),names(NULL),namesCount(0){ value = val; maxEnumValue = P_MAX_INDEX;}PASN_Enumeration::PASN_Enumeration(unsigned tag, TagClass tagClass, unsigned maxEnum, BOOL extend, unsigned val) : PASN_Object(tag, tagClass, extend),names(NULL),namesCount(0){ value = val; maxEnumValue = maxEnum;}PASN_Enumeration::PASN_Enumeration(unsigned tag, TagClass tagClass, unsigned maxEnum, BOOL extend, const PASN_Names * nameSpec, unsigned namesCnt, unsigned val) : PASN_Object(tag, tagClass, extend), names(nameSpec),namesCount(namesCnt){ maxEnumValue = maxEnum; PAssert(val <= maxEnum, PInvalidParameter); value = val;}PObject::Comparison PASN_Enumeration::Compare(const PObject & obj) const{ PAssert(PIsDescendant(&obj, PASN_Enumeration), 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{ PINDEX idx = FindNameByValue(names, namesCount, value); if (idx != P_MAX_INDEX) strm << names[idx].name; 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);}///////////////////////////////////////////////////////////////////////PASN_Real::PASN_Real(double val) : PASN_Object(UniversalReal, UniversalTagClass){ value = val;}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(PIsDescendant(&obj, PASN_Real), 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);}///////////////////////////////////////////////////////////////////////PASN_ObjectId::PASN_ObjectId(const char * dotstr) : PASN_Object(UniversalObjectId, UniversalTagClass){ if (dotstr != NULL) SetValue(dotstr);}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){ if (dotstr != NULL) SetValue(dotstr); else value.SetSize(0); return *this;}PASN_ObjectId & PASN_ObjectId::operator=(const PString & dotstr){ SetValue(dotstr); return *this;}PASN_ObjectId & PASN_ObjectId::operator=(const PUnsignedArray & numbers){ SetValue(numbers); 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();}void PASN_ObjectId::SetValue(const unsigned * numbers, PINDEX size){ value = PUnsignedArray(numbers, size);}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(PIsDescendant(&obj, PASN_ObjectId), 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::AsString() const{ PStringStream s; PrintOn(s); return s;}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); } if (length > 1) subId = *objId++; }}PINDEX PASN_ObjectId::GetDataLength() const
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -