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

📄 objistr.cpp

📁 ncbi源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
    m_PathReadObjectHooks.SetHook(path,hook);    WatchPathHooks();}void CObjectIStream::SetPathSkipObjectHook(const string& path,                                           CSkipObjectHook* hook){    m_PathSkipObjectHooks.SetHook(path,hook);    WatchPathHooks();}void CObjectIStream::SetPathReadMemberHook(const string& path,                                            CReadClassMemberHook* hook){    m_PathReadMemberHooks.SetHook(path,hook);    WatchPathHooks();}void CObjectIStream::SetPathSkipMemberHook(const string& path,                                            CSkipClassMemberHook* hook){    m_PathSkipMemberHooks.SetHook(path,hook);    WatchPathHooks();}void CObjectIStream::SetPathReadVariantHook(const string& path,                                            CReadChoiceVariantHook* hook){    m_PathReadVariantHooks.SetHook(path,hook);    WatchPathHooks();}void CObjectIStream::SetPathSkipVariantHook(const string& path,                                            CSkipChoiceVariantHook* hook){    m_PathSkipVariantHooks.SetHook(path,hook);    WatchPathHooks();}string CObjectIStream::GetStackTrace(void) const{    return GetStackTraceASN();}size_t CObjectIStream::GetStreamOffset(void) const{    return m_Input.GetStreamOffset();}void CObjectIStream::SetStreamOffset(size_t pos){    m_Input.SetStreamOffset(pos);}string CObjectIStream::GetPosition(void) const{    return "byte "+NStr::UIntToString(GetStreamOffset());}void CObjectIStream::ThrowError1(const char* file, int line,                                  TFailFlags fail, const char* message){    ThrowError1(file,line,fail,string(message));}void CObjectIStream::ThrowError1(const char* file, int line,                                  TFailFlags fail, const string& message){    CSerialException::EErrCode err;    SetFailFlags(fail, message.c_str());    switch(fail)    {    case fNoError:        CNcbiDiag(file, line, eDiag_Trace) << message;        return;    case fEOF:          err = CSerialException::eEOF;          break;    default:    case fReadError:    err = CSerialException::eIoError;      break;    case fFormatError:  err = CSerialException::eFormatError;  break;    case fOverflow:     err = CSerialException::eOverflow;     break;    case fInvalidData:  err = CSerialException::eInvalidData;  break;    case fIllegalCall:  err = CSerialException::eIllegalCall;  break;    case fFail:         err = CSerialException::eFail;         break;    case fNotOpen:      err = CSerialException::eNotOpen;      break;    case fMissingValue: err = CSerialException::eMissingValue; break;    }    throw CSerialException(file,line,0,err,GetPosition()+": "+message);}static inlineTTypeInfo MapType(const string& name){    return CClassTypeInfoBase::GetClassInfoByName(name);}void CObjectIStream::RegisterObject(TTypeInfo typeInfo){    if ( m_Objects )        m_Objects->RegisterObject(typeInfo);}void CObjectIStream::RegisterObject(TObjectPtr objectPtr, TTypeInfo typeInfo){    if ( m_Objects )        m_Objects->RegisterObject(objectPtr, typeInfo);}const CReadObjectInfo&CObjectIStream::GetRegisteredObject(CReadObjectInfo::TObjectIndex index){    if ( !m_Objects ) {        ThrowError(fFormatError,"invalid object index: NO_COLLECT defined");    }    return m_Objects->GetRegisteredObject(index);}// root readervoid CObjectIStream::SkipFileHeader(TTypeInfo typeInfo){    BEGIN_OBJECT_FRAME2(eFrameNamed, typeInfo);        string name = ReadFileHeader();    if ( !name.empty() && name != typeInfo->GetName() ) {        ThrowError(fFormatError,                   "incompatible type "+name+"<>"+typeInfo->GetName());    }    END_OBJECT_FRAME();}void CObjectIStream::EndOfRead(void){    if ( m_Objects )        m_Objects->Clear();}void CObjectIStream::Read(const CObjectInfo& object, ENoFileHeader){    // root object    BEGIN_OBJECT_FRAME2(eFrameNamed, object.GetTypeInfo());        ReadObject(object);    EndOfRead();        END_OBJECT_FRAME();}void CObjectIStream::Read(const CObjectInfo& object){    // root object    SkipFileHeader(object.GetTypeInfo());    Read(object, eNoFileHeader);}void CObjectIStream::Read(TObjectPtr object, TTypeInfo typeInfo, ENoFileHeader){    // root object    BEGIN_OBJECT_FRAME2(eFrameNamed, typeInfo);    ReadObject(object, typeInfo);        EndOfRead();    END_OBJECT_FRAME();}void CObjectIStream::Read(TObjectPtr object, TTypeInfo typeInfo){    // root object    SkipFileHeader(typeInfo);    Read(object, typeInfo, eNoFileHeader);}CObjectInfo CObjectIStream::Read(TTypeInfo typeInfo){    // root object    SkipFileHeader(typeInfo);    CObjectInfo info(typeInfo->Create(), typeInfo);    Read(info, eNoFileHeader);    return info;}CObjectInfo CObjectIStream::Read(const CObjectTypeInfo& type){    return Read(type.GetTypeInfo());}void CObjectIStream::Skip(TTypeInfo typeInfo, ENoFileHeader){    BEGIN_OBJECT_FRAME2(eFrameNamed, typeInfo);    SkipObject(typeInfo);        EndOfRead();    END_OBJECT_FRAME();}void CObjectIStream::Skip(TTypeInfo typeInfo){    SkipFileHeader(typeInfo);    Skip(typeInfo, eNoFileHeader);}void CObjectIStream::Skip(const CObjectTypeInfo& type){    Skip(type.GetTypeInfo());}void CObjectIStream::StartDelayBuffer(void){    m_Input.StartSubSource();}CRef<CByteSource> CObjectIStream::EndDelayBuffer(void){    return m_Input.EndSubSource();}void CObjectIStream::EndDelayBuffer(CDelayBuffer& buffer,                                    const CItemInfo* itemInfo,                                    TObjectPtr objectPtr){    CRef<CByteSource> src = EndDelayBuffer();    buffer.SetData(itemInfo, objectPtr, GetDataFormat(), *src);}void CObjectIStream::ExpectedMember(const CMemberInfo* memberInfo){    if (GetVerifyData() == eSerialVerifyData_Yes) {        ThrowError(fFormatError,                   "member "+memberInfo->GetId().ToString()+" expected");    } else {        ERR_POST("member "+memberInfo->GetId().ToString()+" is missing");    }}void CObjectIStream::DuplicatedMember(const CMemberInfo* memberInfo){    ThrowError(fFormatError,               "duplicated member: "+memberInfo->GetId().ToString());}void CObjectIStream::ReadSeparateObject(const CObjectInfo& object){    if ( m_Objects ) {        size_t firstObject = m_Objects->GetObjectCount();        ReadObject(object);        size_t lastObject = m_Objects->GetObjectCount();        m_Objects->ForgetObjects(firstObject, lastObject);    }    else {        ReadObject(object);    }}void CObjectIStream::ReadExternalObject(TObjectPtr objectPtr,                                        TTypeInfo typeInfo){    _TRACE("CObjectIStream::Read("<<NStr::PtrToString(objectPtr)<<", "<<           typeInfo->GetName()<<")");    RegisterObject(objectPtr, typeInfo);    ReadObject(objectPtr, typeInfo);}CObjectInfo CObjectIStream::ReadObject(void){    TTypeInfo typeInfo = MapType(ReadFileHeader());    TObjectPtr objectPtr;    BEGIN_OBJECT_FRAME2(eFrameNamed, typeInfo);    objectPtr = typeInfo->Create();    CRef<CObject> ref;    if ( typeInfo->IsCObject() )        ref.Reset(static_cast<CObject*>(objectPtr));    RegisterObject(objectPtr, typeInfo);    ReadObject(objectPtr, typeInfo);    if ( typeInfo->IsCObject() )        ref.Release();    END_OBJECT_FRAME();    return make_pair(objectPtr, typeInfo);}void CObjectIStream::ReadObject(const CObjectInfo& object){    ReadObject(object.GetObjectPtr(), object.GetTypeInfo());}void CObjectIStream::SkipObject(const CObjectTypeInfo& objectType){    SkipObject(objectType.GetTypeInfo());}void CObjectIStream::ReadClassMember(const CObjectInfo::CMemberIterator& member){    const CMemberInfo* memberInfo = member.GetMemberInfo();    TObjectPtr classPtr = member.GetClassObject().GetObjectPtr();    ReadObject(memberInfo->GetMemberPtr(classPtr),               memberInfo->GetTypeInfo());}void CObjectIStream::ReadChoiceVariant(const CObjectInfoCV& object){    const CVariantInfo* variantInfo = object.GetVariantInfo();    TObjectPtr choicePtr = object.GetChoiceObject().GetObjectPtr();    variantInfo->DefaultReadVariant(*this, choicePtr);}string CObjectIStream::ReadFileHeader(void){    return NcbiEmptyString;}string CObjectIStream::PeekNextTypeName(void){    return NcbiEmptyString;}pair<TObjectPtr, TTypeInfo> CObjectIStream::ReadPointer(TTypeInfo declaredType){    _TRACE("CObjectIStream::ReadPointer("<<declaredType->GetName()<<")");    TObjectPtr objectPtr;    TTypeInfo objectType;    switch ( ReadPointerType() ) {    case eNullPointer:        _TRACE("CObjectIStream::ReadPointer: null");        return pair<TObjectPtr, TTypeInfo>(0, declaredType);    case eObjectPointer:        {            _TRACE("CObjectIStream::ReadPointer: @...");            TObjectIndex index = ReadObjectPointer();            _TRACE("CObjectIStream::ReadPointer: @" << index);            const CReadObjectInfo& info = GetRegisteredObject(index);            objectType = info.GetTypeInfo();            objectPtr = info.GetObjectPtr();            if ( !objectPtr ) {                ThrowError(fFormatError,                    "invalid reference to skipped object: object ptr is NULL");            }            break;        }    case eThisPointer:        {            _TRACE("CObjectIStream::ReadPointer: new");            objectPtr = declaredType->Create();            CRef<CObject> ref;            if ( declaredType->IsCObject() )                ref.Reset(static_cast<CObject*>(objectPtr));            RegisterObject(objectPtr, declaredType);            ReadObject(objectPtr, declaredType);            if ( declaredType->IsCObject() )                ref.Release();            return make_pair(objectPtr, declaredType);        }    case eOtherPointer:        {            _TRACE("CObjectIStream::ReadPointer: new...");            string className = ReadOtherPointer();            _TRACE("CObjectIStream::ReadPointer: new " << className);            objectType = MapType(className);            BEGIN_OBJECT_FRAME2(eFrameNamed, objectType);                            objectPtr = objectType->Create();            CRef<CObject> ref;            if ( declaredType->IsCObject() )                ref.Reset(static_cast<CObject*>(objectPtr));            RegisterObject(objectPtr, objectType);            ReadObject(objectPtr, objectType);            if ( declaredType->IsCObject() )                ref.Release();                            END_OBJECT_FRAME();            ReadOtherPointerEnd();            break;        }    default:        ThrowError(fFormatError,"illegal pointer type");        objectPtr = 0;        objectType = 0;        break;    }    while ( objectType != declaredType ) {        // try to check parent class pointer        if ( objectType->GetTypeFamily() != eTypeFamilyClass ) {            ThrowError(fFormatError,"incompatible member type");        }        const CClassTypeInfo* parentClass =            CTypeConverter<CClassTypeInfo>::SafeCast(objectType)->GetParentClassInfo();        if ( parentClass ) {            objectType = parentClass;        }        else {            ThrowError(fFormatError,"incompatible member type");        }    }    return make_pair(objectPtr, objectType);}void CObjectIStream::ReadOtherPointerEnd(void){}void CObjectIStream::SkipExternalObject(TTypeInfo typeInfo){    _TRACE("CObjectIStream::SkipExternalObject("<<typeInfo->GetName()<<")");    RegisterObject(typeInfo);    SkipObject(typeInfo);}void CObjectIStream::SkipPointer(TTypeInfo declaredType){    _TRACE("CObjectIStream::SkipPointer("<<declaredType->GetName()<<")");    switch ( ReadPointerType() ) {    case eNullPointer:        _TRACE("CObjectIStream::SkipPointer: null");        return;    case eObjectPointer:        {            _TRACE("CObjectIStream::SkipPointer: @...");            TObjectIndex index = ReadObjectPointer();            _TRACE("CObjectIStream::SkipPointer: @" << index);            GetRegisteredObject(index);            break;        }    case eThisPointer:        {            _TRACE("CObjectIStream::ReadPointer: new");            RegisterObject(declaredType);            SkipObject(declaredType);            break;        }    case eOtherPointer:        {            _TRACE("CObjectIStream::ReadPointer: new...");            string className = ReadOtherPointer();            _TRACE("CObjectIStream::ReadPointer: new " << className);            TTypeInfo typeInfo = MapType(className);            BEGIN_OBJECT_FRAME2(eFrameNamed, typeInfo);                            RegisterObject(typeInfo);            SkipObject(typeInfo);            END_OBJECT_FRAME();            ReadOtherPointerEnd();            break;        }    default:        ThrowError(fFormatError,"illegal pointer type");    }}void CObjectIStream::BeginNamedType(TTypeInfo /*namedTypeInfo*/){}void CObjectIStream::EndNamedType(void){}void CObjectIStream::ReadNamedType(TTypeInfo#ifndef VIRTUAL_MID_LEVEL_IO                                   namedTypeInfo#endif                                   ,                                   TTypeInfo typeInfo, TObjectPtr object){#ifndef VIRTUAL_MID_LEVEL_IO    BEGIN_OBJECT_FRAME2(eFrameNamed, namedTypeInfo);    BeginNamedType(namedTypeInfo);#endif    ReadObject(object, typeInfo);#ifndef VIRTUAL_MID_LEVEL_IO    EndNamedType();    END_OBJECT_FRAME();#endif}void CObjectIStream::SkipNamedType(TTypeInfo namedTypeInfo,                                   TTypeInfo typeInfo){    BEGIN_OBJECT_FRAME2(eFrameNamed, namedTypeInfo);    BeginNamedType(namedTypeInfo);    SkipObject(typeInfo);    EndNamedType();    END_OBJECT_FRAME();}void CObjectIStream::EndContainerElement(void){}void CObjectIStream::ReadContainer(const CContainerTypeInfo* containerType,                                   TObjectPtr containerPtr){    BEGIN_OBJECT_FRAME2(eFrameArray, containerType);    BeginContainer(containerType);    TTypeInfo elementType = containerType->GetElementType();    BEGIN_OBJECT_FRAME2(eFrameArrayElement, elementType);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -