📄 objistrasn.cpp
字号:
throw; }}void CObjectIStreamAsn::SkipNull(void){ if ( SkipWhiteSpace() == 'N' && m_Input.PeekCharNoEOF(1) == 'U' && m_Input.PeekCharNoEOF(2) == 'L' && m_Input.PeekCharNoEOF(3) == 'L' && !IdChar(m_Input.PeekCharNoEOF(4)) ) { m_Input.SkipChars(4); return; } ThrowError(fFormatError, "NULL expected");}void CObjectIStreamAsn::SkipByteBlock(void){ Expect('\'', true); for ( ;; ) { char c = GetChar(); if ( c >= '0' && c <= '9' ) { continue; } else if ( c >= 'A' && c <= 'Z' ) { continue; } else if ( c >= 'a' && c <= 'z' ) { continue; } else if ( c == '\'' ) { break; } else if ( c == '\r' || c == '\n' ) { SkipEndOfLine(c); } else { m_Input.UngetChar(c); ThrowError(fFormatError, "bad char in octet string: #" + NStr::IntToString(c)); } } Expect('H', true);}void CObjectIStreamAsn::StartBlock(void){ Expect('{', true); m_BlockStart = true;}bool CObjectIStreamAsn::NextElement(void){ char c = SkipWhiteSpace(); if ( m_BlockStart ) { // first element m_BlockStart = false; return c != '}'; } else { // next element if ( c == ',' ) { m_Input.SkipChar(); return true; } else if ( c != '}' ) ThrowError(fFormatError, "',' or '}' expected"); return false; }}void CObjectIStreamAsn::EndBlock(void){ Expect('}');}void CObjectIStreamAsn::BeginContainer(const CContainerTypeInfo* /*cType*/){ StartBlock();}void CObjectIStreamAsn::EndContainer(void){ EndBlock();}bool CObjectIStreamAsn::BeginContainerElement(TTypeInfo /*elementType*/){ return NextElement();}#ifdef VIRTUAL_MID_LEVEL_IOvoid CObjectIStreamAsn::ReadContainer(const CContainerTypeInfo* contType, TObjectPtr contPtr){ StartBlock(); BEGIN_OBJECT_FRAME(eFrameArrayElement); CContainerTypeInfo::CIterator iter; bool old_element = contType->InitIterator(iter, contPtr); TTypeInfo elementType = contType->GetElementType(); while ( NextElement() ) { if ( old_element ) { elementType->ReadData(*this, contType->GetElementPtr(iter)); old_element = contType->NextElement(iter); } else { contType->AddElement(contPtr, *this); } } if ( old_element ) { contType->EraseAllElements(iter); } END_OBJECT_FRAME(); EndBlock();}void CObjectIStreamAsn::SkipContainer(const CContainerTypeInfo* contType){ StartBlock(); TTypeInfo elementType = contType->GetElementType(); BEGIN_OBJECT_FRAME(eFrameArrayElement); while ( NextElement() ) { SkipObject(elementType); } END_OBJECT_FRAME(); EndBlock();}#endifvoid CObjectIStreamAsn::BeginClass(const CClassTypeInfo* /*classInfo*/){ StartBlock();}void CObjectIStreamAsn::EndClass(void){ EndBlock();}void CObjectIStreamAsn::UnexpectedMember(const CLightString& id, const CItemsInfo& items){ string message = "\""+string(id)+"\": unexpected member, should be one of: "; for ( CItemsInfo::CIterator i(items); i.Valid(); ++i ) { message += '\"' + items.GetItemInfo(i)->GetId().ToString() + "\" "; } ThrowError(fFormatError, message);}TMemberIndexCObjectIStreamAsn::BeginClassMember(const CClassTypeInfo* classType){ if ( !NextElement() ) return kInvalidMember; CLightString id = ReadMemberId(SkipWhiteSpace()); TMemberIndex index = GetMemberIndex(classType, id); if ( index == kInvalidMember ) { if (GetSkipUnknownMembers() == eSerialSkipUnknown_Yes) { string value; ReadAnyContent(value); return BeginClassMember(classType); } else { UnexpectedMember(id, classType->GetMembers()); } } return index;}TMemberIndexCObjectIStreamAsn::BeginClassMember(const CClassTypeInfo* classType, TMemberIndex pos){ if ( !NextElement() ) return kInvalidMember; CLightString id = ReadMemberId(SkipWhiteSpace()); TMemberIndex index = GetMemberIndex(classType, id, pos); if ( index == kInvalidMember ) { if (GetSkipUnknownMembers() == eSerialSkipUnknown_Yes) { string value; ReadAnyContent(value); return BeginClassMember(classType, pos); } else { UnexpectedMember(id, classType->GetMembers()); } } return index;}#ifdef VIRTUAL_MID_LEVEL_IOvoid CObjectIStreamAsn::ReadClassRandom(const CClassTypeInfo* classType, TObjectPtr classPtr){ StartBlock(); ReadClassRandomContentsBegin(classType); TMemberIndex index; while ( (index = BeginClassMember(classType)) != kInvalidMember ) { ReadClassRandomContentsMember(classPtr); } ReadClassRandomContentsEnd(); EndBlock();}void CObjectIStreamAsn::ReadClassSequential(const CClassTypeInfo* classType, TObjectPtr classPtr){ StartBlock(); ReadClassSequentialContentsBegin(classType); TMemberIndex index; while ( (index = BeginClassMember(classType,*pos)) != kInvalidMember ) { ReadClassSequentialContentsMember(classPtr); } ReadClassSequentialContentsEnd(classPtr); EndBlock();}void CObjectIStreamAsn::SkipClassRandom(const CClassTypeInfo* classType){ StartBlock(); SkipClassRandomContentsBegin(classType); TMemberIndex index; while ( (index = BeginClassMember(classType)) != kInvalidMember ) { SkipClassRandomContentsMember(); } SkipClassRandomContentsEnd(); EndBlock();}void CObjectIStreamAsn::SkipClassSequential(const CClassTypeInfo* classType){ StartBlock(); SkipClassSequentialContentsBegin(classType); TMemberIndex index; while ( (index = BeginClassMember(classType,*pos)) != kInvalidMember ) { SkipClassSequentialContentsMember(); } SkipClassSequentialContentsEnd(); EndBlock();}#endifTMemberIndex CObjectIStreamAsn::BeginChoiceVariant(const CChoiceTypeInfo* choiceType){ CLightString id = ReadMemberId(SkipWhiteSpace()); if ( id.Empty() ) ThrowError(fFormatError, "choice variant id expected"); TMemberIndex index = GetChoiceIndex(choiceType, id); if ( index == kInvalidMember ) UnexpectedMember(id, choiceType->GetVariants()); return index;}#ifdef VIRTUAL_MID_LEVEL_IOvoid CObjectIStreamAsn::ReadChoice(const CChoiceTypeInfo* choiceType, TObjectPtr choicePtr){ TMemberIndex index = BeginChoiceVariant(choiceType); const CVariantInfo* variantInfo = choiceType->GetVariantInfo(index); BEGIN_OBJECT_FRAME2(eFrameChoiceVariant, variantInfo->GetId()); variantInfo->ReadVariant(*this, choicePtr); END_OBJECT_FRAME();}void CObjectIStreamAsn::SkipChoice(const CChoiceTypeInfo* choiceType){ TMemberIndex index = BeginChoiceVariant(choiceType); const CVariantInfo* variantInfo = choiceType->GetVariantInfo(index); BEGIN_OBJECT_FRAME2(eFrameChoiceVariant, variantInfo->GetId()); variantInfo->SkipVariant(*this); END_OBJECT_FRAME();}#endifvoid CObjectIStreamAsn::BeginBytes(ByteBlock& ){ Expect('\'', true);}int CObjectIStreamAsn::GetHexChar(void){ for ( ;; ) { char c = GetChar(); if ( c >= '0' && c <= '9' ) { return c - '0'; } else if ( c >= 'A' && c <= 'F' ) { return c - 'A' + 10; } else if ( c >= 'a' && c <= 'f' ) { return c - 'a' + 10; } switch ( c ) { case '\'': return -1; case '\r': case '\n': SkipEndOfLine(c); break; default: m_Input.UngetChar(c); ThrowError(fFormatError, "bad char in octet string: #" + NStr::IntToString(c)); } }}size_t CObjectIStreamAsn::ReadBytes(ByteBlock& block, char* dst, size_t length){ size_t count = 0; while ( length-- > 0 ) { int c1 = GetHexChar(); if ( c1 < 0 ) { block.EndOfBlock(); return count; } int c2 = GetHexChar(); if ( c2 < 0 ) { *dst++ = c1 << 4; count++; block.EndOfBlock(); return count; } else { *dst++ = (c1 << 4) | c2; count++; } } return count;}void CObjectIStreamAsn::EndBytes(const ByteBlock& ){ Expect('H');}void CObjectIStreamAsn::BeginChars(CharBlock& ){ Expect('\"', true);}size_t CObjectIStreamAsn::ReadChars(CharBlock& block, char* dst, size_t length){ size_t count = 0; try { while (length-- > 0) { char c = m_Input.GetChar(); switch ( c ) { case '\r': case '\n': break; case '\"': if ( m_Input.PeekCharNoEOF() == '\"' ) { m_Input.SkipChar(); dst[count++] = c; } else { // end of string // Check the string for non-printable characters EFixNonPrint fix_method = m_FixMethod; if ( fix_method != eFNP_Allow ) { size_t line = m_Input.GetLine(); for (size_t i = 0; i < count; i++) { FixVisibleChar(dst[i], fix_method, line); } } block.EndOfBlock(); return count; } break; default: // ok: append char { dst[count++] = c; } break; } } } catch ( CEofException& ) { UnendedString(m_Input.GetLine()); throw; } return count;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -