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

📄 asntypes.cpp

📁 ncbi源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
void COctetStringTypeInfo::WriteOctetString(CObjectOStream& out,                                            TTypeInfo /*objectType*/,                                            TConstObjectPtr objectPtr){    bytestore* bs = const_cast<bytestore*>(Get(objectPtr));    if ( bs == 0 )        out.ThrowError(out.fIllegalCall, "null bytestore pointer");    Int4 len = BSLen(bs);    CObjectOStream::ByteBlock block(out, len);    BSSeek(bs, 0, SEEK_SET);    char buff[1024];    while ( len > 0 ) {        Int4 chunk = Int4(sizeof(buff));        if ( chunk > len )            chunk = len;        BSRead(bs, buff, chunk);        block.Write(buff, chunk);        len -= chunk;    }    block.End();}void COctetStringTypeInfo::CopyOctetString(CObjectStreamCopier& copier,                                           TTypeInfo /*objectType*/){    copier.CopyByteBlock();}void COctetStringTypeInfo::SkipOctetString(CObjectIStream& in,                                           TTypeInfo /*objectType*/){    in.SkipByteBlock();}void COctetStringTypeInfo::GetValueOctetString(TConstObjectPtr objectPtr,                                               vector<char>& value) const{    bytestore* bs = const_cast<bytestore*>(Get(objectPtr));    if ( bs == 0 ) {        NCBI_THROW(CSerialException,eInvalidData, "null bytestore pointer");    }    Int4 len = BSLen(bs);    value.resize(len);    BSSeek(bs, 0, SEEK_SET);    BSRead(bs, &value.front(), len);}void COctetStringTypeInfo::SetValueOctetString(TObjectPtr objectPtr,                                               const vector<char>& value) const{    Int4 count = Int4(value.size());    bytestore* bs = Get(objectPtr) = BSNew(count);    BSWrite(bs, const_cast<char*>(&value.front()), count);}TTypeInfo COctetStringTypeInfo::GetTypeInfo(void){    static TTypeInfo typeInfo = 0;    if ( !typeInfo )        typeInfo = new COctetStringTypeInfo();    return typeInfo;}COldAsnTypeInfo::COldAsnTypeInfo(const char* name,                                 TAsnNewProc newProc,                                 TAsnFreeProc freeProc,                                 TAsnReadProc readProc,                                 TAsnWriteProc writeProc)    : CParent(sizeof(TObjectType), name, ePrimitiveValueSpecial),      m_NewProc(newProc), m_FreeProc(freeProc),      m_ReadProc(readProc), m_WriteProc(writeProc){    SetReadFunction(&ReadOldAsnStruct);    SetWriteFunction(&WriteOldAsnStruct);}COldAsnTypeInfo::COldAsnTypeInfo(const string& name,                                 TAsnNewProc newProc,                                 TAsnFreeProc freeProc,                                 TAsnReadProc readProc,                                 TAsnWriteProc writeProc)    : CParent(sizeof(TObjectType), name, ePrimitiveValueSpecial),      m_NewProc(newProc), m_FreeProc(freeProc),      m_ReadProc(readProc), m_WriteProc(writeProc){    SetReadFunction(&ReadOldAsnStruct);    SetWriteFunction(&WriteOldAsnStruct);}bool COldAsnTypeInfo::IsDefault(TConstObjectPtr object) const{    return Get(object) == 0;}bool COldAsnTypeInfo::Equals(TConstObjectPtr object1, TConstObjectPtr object2,                             ESerialRecursionMode) const{    return Get(object1) == 0 && Get(object2) == 0;}void COldAsnTypeInfo::SetDefault(TObjectPtr dst) const{    Get(dst) = 0;}void COldAsnTypeInfo::Assign(TObjectPtr , TConstObjectPtr,                             ESerialRecursionMode ) const{    NCBI_THROW(CSerialException,eInvalidData, "cannot assign non default value");}void COldAsnTypeInfo::ReadOldAsnStruct(CObjectIStream& in,                                       TTypeInfo objectType,                                       TObjectPtr objectPtr){    const COldAsnTypeInfo* oldAsnType =        CTypeConverter<COldAsnTypeInfo>::SafeCast(objectType);    CObjectIStream::AsnIo io(in, oldAsnType->GetName());    if ( (Get(objectPtr) = oldAsnType->m_ReadProc(io, 0)) == 0 )        in.ThrowError(in.fFail, "read fault");    io.End();}void COldAsnTypeInfo::WriteOldAsnStruct(CObjectOStream& out,                                        TTypeInfo objectType,                                        TConstObjectPtr objectPtr){    const COldAsnTypeInfo* oldAsnType =        CTypeConverter<COldAsnTypeInfo>::SafeCast(objectType);    CObjectOStream::AsnIo io(out, oldAsnType->GetName());    if ( !oldAsnType->m_WriteProc(Get(objectPtr), io, 0) )        out.ThrowError(out.fFail, "write fault");    io.End();}// CObjectOStream, CObjectIStream, and corresponding AsnIoextern "C" {    Int2 LIBCALLBACK WriteAsn(Pointer object, CharPtr data, Uint2 length)    {        if ( !object || !data )            return -1;            static_cast<CObjectOStream::AsnIo*>(object)->Write(data, length);        return length;    }    Int2 LIBCALLBACK ReadAsn(Pointer object, CharPtr data, Uint2 length)    {        if ( !object || !data )            return -1;        CObjectIStream::AsnIo* asnio =            static_cast<CObjectIStream::AsnIo*>(object);        return Uint2(asnio->Read(data, length));    }}CObjectOStream::AsnIo::AsnIo(CObjectOStream& out, const string& rootTypeName)    : m_Stream(out), m_RootTypeName(rootTypeName), m_Ended(false), m_Count(0){    Int1 flags = ASNIO_OUT;    ESerialDataFormat format = out.GetDataFormat();    if ( format == eSerial_AsnText )        flags |= ASNIO_TEXT;    else if ( format == eSerial_AsnBinary )        flags |= ASNIO_BIN;    else        out.ThrowError(out.fIllegalCall,                       "incompatible stream format - must be ASN.1 (text or binary)");    m_AsnIo = AsnIoNew(flags, 0, this, 0, WriteAsn);    if ( format == eSerial_AsnText ) {        // adjust indent level and buffer        size_t indent = out.m_Output.GetIndentLevel();        m_AsnIo->indent_level = Int1(indent);        size_t max_indent = m_AsnIo->max_indent;        if ( indent >= max_indent ) {            Boolean* tmp = m_AsnIo->first;            m_AsnIo->first = (BoolPtr) MemNew((sizeof(Boolean) * (indent + 10)));            MemCopy(m_AsnIo->first, tmp, (size_t)(sizeof(Boolean) * max_indent));            MemFree(tmp);            m_AsnIo->max_indent = Int1(indent);        }    }}void CObjectOStream::AsnIo::End(void){    _ASSERT(!m_Ended);    if ( GetStream().InGoodState() ) {        AsnIoClose(*this);        m_Ended = true;    }}CObjectOStream::AsnIo::~AsnIo(void){    if ( !m_Ended ) {        try {            GetStream().Unended("AsnIo write error");        }        catch (...) {            ERR_POST("AsnIo write error");        }    }}CObjectOStream& CObjectOStream::AsnIo::GetStream(void) const{    return m_Stream;}CObjectOStream::AsnIo::operator asnio*(void){    return m_AsnIo;}asnio* CObjectOStream::AsnIo::operator->(void){    return m_AsnIo;}const string& CObjectOStream::AsnIo::GetRootTypeName(void) const{    return m_RootTypeName;}void CObjectOStream::AsnIo::Write(const char* data, size_t length){    if ( GetStream().GetDataFormat() == eSerial_AsnText ) {        if ( m_Count == 0 ) {            // dirty hack to skip structure name with '::='            const char* p = (const char*)memchr(data, ':', length);            if ( p && p[1] == ':' && p[2] == '=' ) {                // check type name                const char* beg = data;                const char* end = p;                while ( beg < end && isspace(beg[0]) )                    beg++;                while ( end > beg && isspace(end[-1]) )                    end--;                if ( string(beg, end) != GetRootTypeName() ) {                    ERR_POST("AsnWrite: wrong ASN.1 type name: is \""                             << string(beg, end) << "\", must be \""                             << GetRootTypeName() << "\"");                }                // skip header                size_t skip = p + 3 - data;                _TRACE(Warning <<                       "AsnWrite: skipping \"" << string(data, skip) << "\"");                data += skip;                length -= skip;            }            else {                ERR_POST("AsnWrite: no \"Asn-Type ::=\" header  (data=\""                         << data << "\")");            }            m_Count = 1;        }        GetStream().m_Output.PutString(data, length);    }    else {        if ( length == 0 )            return;        CObjectOStreamAsnBinary& out =            static_cast<CObjectOStreamAsnBinary&>(GetStream());#if CHECK_STREAM_INTEGRITY        _TRACE("WriteBytes: " << length);        if ( out.m_CurrentTagState != out.eTagStart )            out.ThrowError(out.fIllegalCall,                string("AsnWrite only allowed at tag start: data= ")+data);        if ( out.m_CurrentPosition + length > out.m_CurrentTagLimit )            out.ThrowError(out.fIllegalCall,                string("tag DATA overflow: data= ")+data);        out.m_CurrentPosition += length;#endif        out.m_Output.PutString(data, length);    }}CObjectIStream::AsnIo::AsnIo(CObjectIStream& in, const string& rootTypeName)    : m_Stream(in), m_Ended(false),      m_RootTypeName(rootTypeName), m_Count(0){    Int1 flags = ASNIO_IN;    ESerialDataFormat format = in.GetDataFormat();    if ( format == eSerial_AsnText )        flags |= ASNIO_TEXT;    else if ( format == eSerial_AsnBinary )        flags |= ASNIO_BIN;    else        in.ThrowError(in.fIllegalCall,            "incompatible stream format - must be ASN.1 (text or binary)");    m_AsnIo = AsnIoNew(flags, 0, this, ReadAsn, 0);    if ( format == eSerial_AsnBinary ) {#if CHECK_STREAM_INTEGRITY        CObjectIStreamAsnBinary& sin =            static_cast<CObjectIStreamAsnBinary&>(in);        if ( sin.m_CurrentTagState != sin.eTagStart ) {            in.ThrowError(in.fIllegalCall,                string("double tag read: rootTypeName= ")+ rootTypeName);        }#endif    }}void CObjectIStream::AsnIo::End(void){    _ASSERT(!m_Ended);    if ( GetStream().InGoodState() ) {        AsnIoClose(*this);        m_Ended = true;    }}CObjectIStream::AsnIo::~AsnIo(void){    if ( !m_Ended )        GetStream().Unended("AsnIo read error");}CObjectIStream& CObjectIStream::AsnIo::GetStream(void) const{    return m_Stream;}CObjectIStream::AsnIo::operator asnio*(void){    return m_AsnIo;}asnio* CObjectIStream::AsnIo::operator->(void){    return m_AsnIo;}const string& CObjectIStream::AsnIo::GetRootTypeName(void) const{    return m_RootTypeName;}size_t CObjectIStream::AsnIo::Read(char* data, size_t length){    if ( GetStream().GetDataFormat() == eSerial_AsnText ) {        size_t count = 0;        if ( m_Count == 0 ) {            // dirty hack to add structure name with '::='            const string& name = GetRootTypeName();            SIZE_TYPE nameLength = name.size();            count = nameLength + 3;            if ( length < count ) {                GetStream().ThrowError(GetStream().fFail,                    string("buffer too small to put structure name in: name= ")                    + name);            }            memcpy(data, name.data(), nameLength);            data[nameLength] = ':';            data[nameLength + 1] = ':';            data[nameLength + 2] = '=';            data += count;            length -= count;            m_Count = 1;        }        return count + GetStream().m_Input.ReadLine(data, length);    }    else {        *data = GetStream().m_Input.GetChar();        return 1;    }}END_NCBI_SCOPE#endif

⌨️ 快捷键说明

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