📄 objostrxml.cpp
字号:
}}void CObjectOStreamXml::BeginArrayElement(TTypeInfo elementType){ if (x_IsStdXml() && GetRealTypeFamily(elementType) != eTypeFamilyPrimitive) { TopFrame().SetNotag(); } else { OpenStackTag(0); }}void CObjectOStreamXml::EndArrayElement(void){ if (TopFrame().GetNotag()) { TopFrame().SetNotag(false); } else { CloseStackTag(0); }}void CObjectOStreamXml::WriteContainerContents(const CContainerTypeInfo* cType, TConstObjectPtr containerPtr){ TTypeInfo elementType = cType->GetElementType(); CContainerTypeInfo::CConstIterator i; if ( WillHaveName(elementType) ) { if ( cType->InitIterator(i, containerPtr) ) { do { if (elementType->GetTypeFamily() == eTypeFamilyPointer) { const CPointerTypeInfo* pointerType = CTypeConverter<CPointerTypeInfo>::SafeCast(elementType); _ASSERT(pointerType->GetObjectPointer(cType->GetElementPtr(i))); if ( !pointerType->GetObjectPointer(cType->GetElementPtr(i)) ) { ERR_POST(Warning << " NULL pointer found in container: skipping"); continue; } } WriteObject(cType->GetElementPtr(i), elementType); } while ( cType->NextElement(i) ); } } else { BEGIN_OBJECT_FRAME2(eFrameArrayElement, elementType); if ( cType->InitIterator(i, containerPtr) ) { do { BeginArrayElement(elementType); WriteObject(cType->GetElementPtr(i), elementType); EndArrayElement(); } while ( cType->NextElement(i) ); } else { const TFrame& frame = FetchFrameFromTop(1); if (frame.GetFrameType() == CObjectStackFrame::eFrameNamed) { const CClassTypeInfo* clType = dynamic_cast<const CClassTypeInfo*>(frame.GetTypeInfo()); if (clType && clType->Implicit() && clType->IsImplicitNonEmpty()) { ThrowError(fInvalidData, "container is empty"); } } } END_OBJECT_FRAME(); }}#endifvoid CObjectOStreamXml::BeginNamedType(TTypeInfo namedTypeInfo){ const CClassTypeInfo* classType = dynamic_cast<const CClassTypeInfo*>(namedTypeInfo); if (classType) { CheckStdXml(classType); } OpenTag(namedTypeInfo);}void CObjectOStreamXml::EndNamedType(void){ CloseTag(TopFrame().GetTypeInfo());}#ifdef VIRTUAL_MID_LEVEL_IOvoid CObjectOStreamXml::WriteNamedType(TTypeInfo namedTypeInfo, TTypeInfo typeInfo, TConstObjectPtr object){ BEGIN_OBJECT_FRAME2(eFrameNamed, namedTypeInfo); BeginNamedType(namedTypeInfo); WriteObject(object, typeInfo); EndNamedType(); END_OBJECT_FRAME();}void CObjectOStreamXml::CopyNamedType(TTypeInfo namedTypeInfo, TTypeInfo objectType, CObjectStreamCopier& copier){ BEGIN_OBJECT_2FRAMES_OF2(copier, eFrameNamed, namedTypeInfo); copier.In().BeginNamedType(namedTypeInfo); BeginNamedType(namedTypeInfo); CopyObject(objectType, copier); EndNamedType(); copier.In().EndNamedType(); END_OBJECT_2FRAMES_OF(copier);}#endifvoid CObjectOStreamXml::CheckStdXml(const CClassTypeInfoBase* classType){ if (m_EnforcedStdXml) { m_StdXml = false; return; } TMemberIndex first = classType->GetItems().FirstIndex(); m_StdXml = classType->GetItems().GetItemInfo(first)->GetId().HaveNoPrefix();}ETypeFamily CObjectOStreamXml::GetRealTypeFamily(TTypeInfo typeInfo){ ETypeFamily type = typeInfo->GetTypeFamily(); if (type == eTypeFamilyPointer) { const CPointerTypeInfo* ptr = dynamic_cast<const CPointerTypeInfo*>(typeInfo); if (ptr) { type = ptr->GetPointedType()->GetTypeFamily(); } } return type;}ETypeFamily CObjectOStreamXml::GetContainerElementTypeFamily(TTypeInfo typeInfo){ if (typeInfo->GetTypeFamily() == eTypeFamilyPointer) { const CPointerTypeInfo* ptr = dynamic_cast<const CPointerTypeInfo*>(typeInfo); if (ptr) { typeInfo = ptr->GetPointedType(); } } _ASSERT(typeInfo->GetTypeFamily() == eTypeFamilyContainer); const CContainerTypeInfo* ptr = dynamic_cast<const CContainerTypeInfo*>(typeInfo); return GetRealTypeFamily(ptr->GetElementType());}void CObjectOStreamXml::BeginClass(const CClassTypeInfo* classInfo){ CheckStdXml(classInfo); bool needNs = x_ProcessTypeNamespace(classInfo); OpenTagIfNamed(classInfo); if (needNs) { x_WriteClassNamespace(classInfo); }}void CObjectOStreamXml::EndClass(void){ if (!m_Attlist && m_LastTagAction != eTagSelfClosed) { EolIfEmptyTag(); } CloseTagIfNamed(TopFrame().GetTypeInfo()); x_EndTypeNamespace();}void CObjectOStreamXml::BeginClassMember(const CMemberId& id){ const CClassTypeInfoBase* classType = dynamic_cast<const CClassTypeInfoBase*> (FetchFrameFromTop(1).GetTypeInfo()); _ASSERT(classType); BeginClassMember(classType->GetItemInfo(id.GetName())->GetTypeInfo(),id);}void CObjectOStreamXml::BeginClassMember(TTypeInfo memberType, const CMemberId& id){ if (x_IsStdXml()) { if(id.IsAttlist()) { if(m_LastTagAction == eTagClose) { OpenTagEndBack(); } m_Attlist = true; TopFrame().SetNotag(); } else { ETypeFamily type = GetRealTypeFamily(memberType); bool needTag = true; if (GetEnforcedStdXml()) { if (type == eTypeFamilyContainer) { needTag = (GetContainerElementTypeFamily(memberType) != eTypeFamilyPrimitive); } } else { needTag = (type == eTypeFamilyPrimitive && !id.HasNotag()); } if (needTag) { OpenStackTag(0); } else { TopFrame().SetNotag(); } } } else { OpenStackTag(0); }}void CObjectOStreamXml::EndClassMember(void){ if (TopFrame().GetNotag()) { TopFrame().SetNotag(false); m_Attlist = false; if(m_LastTagAction == eTagOpen) { OpenTagEnd(); } } else { CloseStackTag(0); }}#ifdef VIRTUAL_MID_LEVEL_IOvoid CObjectOStreamXml::WriteClass(const CClassTypeInfo* classType, TConstObjectPtr classPtr){ if ( !classType->GetName().empty() ) { BEGIN_OBJECT_FRAME2(eFrameClass, classType); BeginClass(classType); for ( CClassTypeInfo::CIterator i(classType); i.Valid(); ++i ) { classType->GetMemberInfo(i)->WriteMember(*this, classPtr); } EndClass(); END_OBJECT_FRAME(); } else { for ( CClassTypeInfo::CIterator i(classType); i.Valid(); ++i ) { classType->GetMemberInfo(i)->WriteMember(*this, classPtr); } }}void CObjectOStreamXml::WriteClassMember(const CMemberId& memberId, TTypeInfo memberType, TConstObjectPtr memberPtr){ BEGIN_OBJECT_FRAME2(eFrameClassMember,memberId); BeginClassMember(memberType,memberId); WriteObject(memberPtr, memberType); EndClassMember(); END_OBJECT_FRAME();}bool CObjectOStreamXml::WriteClassMember(const CMemberId& memberId, const CDelayBuffer& buffer){ if ( !buffer.HaveFormat(eSerial_Xml) ) return false; BEGIN_OBJECT_FRAME2(eFrameClassMember, memberId); OpenStackTag(0); Write(buffer.GetSource()); CloseStackTag(0); END_OBJECT_FRAME(); return true;}#endifvoid CObjectOStreamXml::BeginChoice(const CChoiceTypeInfo* choiceType){ CheckStdXml(choiceType); bool needNs = x_ProcessTypeNamespace(choiceType); OpenTagIfNamed(choiceType); if (needNs) { x_WriteClassNamespace(choiceType); }}void CObjectOStreamXml::EndChoice(void){ CloseTagIfNamed(TopFrame().GetTypeInfo()); x_EndTypeNamespace();}void CObjectOStreamXml::BeginChoiceVariant(const CChoiceTypeInfo* choiceType, const CMemberId& id){ if (x_IsStdXml()) { const CVariantInfo* var_info = choiceType->GetVariantInfo(id.GetName()); ETypeFamily type = GetRealTypeFamily(var_info->GetTypeInfo()); bool needTag = true; if (GetEnforcedStdXml()) { if (type == eTypeFamilyContainer) { needTag = (GetContainerElementTypeFamily( var_info->GetTypeInfo()) != eTypeFamilyPrimitive); } } else { needTag = (type == eTypeFamilyPrimitive && !id.HasNotag()); } if (needTag) { OpenStackTag(0); } else { TopFrame().SetNotag(); } } else { OpenStackTag(0); }}void CObjectOStreamXml::EndChoiceVariant(void){ if (TopFrame().GetNotag()) { TopFrame().SetNotag(false); } else { CloseStackTag(0); }}#ifdef VIRTUAL_MID_LEVEL_IOvoid CObjectOStreamXml::WriteChoice(const CChoiceTypeInfo* choiceType, TConstObjectPtr choicePtr){ if ( !choiceType->GetName().empty() ) { BEGIN_OBJECT_FRAME2(eFrameChoice, choiceType); OpenTag(choiceType); WriteChoiceContents(choiceType, choicePtr); CloseTag(choiceType); END_OBJECT_FRAME(); } else { WriteChoiceContents(choiceType, choicePtr); }}void CObjectOStreamXml::WriteChoiceContents(const CChoiceTypeInfo* choiceType, TConstObjectPtr choicePtr){ TMemberIndex index = choiceType->GetIndex(choicePtr); const CVariantInfo* variantInfo = choiceType->GetVariantInfo(index); BEGIN_OBJECT_FRAME2(eFrameChoiceVariant, variantInfo->GetId()); OpenStackTag(0); variantInfo->WriteVariant(*this, choicePtr); CloseStackTag(0); END_OBJECT_FRAME();}#endifstatic const char* const HEX = "0123456789ABCDEF";void CObjectOStreamXml::WriteBytes(const ByteBlock& , const char* bytes, size_t length){ while ( length-- > 0 ) { char c = *bytes++; m_Output.PutChar(HEX[(c >> 4) & 0xf]); m_Output.PutChar(HEX[c & 0xf]); }}void CObjectOStreamXml::WriteChars(const CharBlock& , const char* chars, size_t length){ while ( length-- > 0 ) { char c = *chars++; WriteEscapedChar(c); }}void CObjectOStreamXml::WriteSeparator(void){ m_Output.PutString(GetSeparator());}#if defined(NCBI_SERIAL_IO_TRACE)void CObjectOStreamXml::TraceTag(const string& name){ cout << ", Tag=" << name;}#endifEND_NCBI_SCOPE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -