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

📄 objostrxml.cpp

📁 ncbi源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
    }}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 + -