⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asner.cxx

📁 mgcp协议源代码。支持多种编码:g711
💻 CXX
📖 第 1 页 / 共 5 页
字号:
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 + -