objostr.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:41k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: objostr.cpp,v $
  4.  * PRODUCTION Revision 1000.4  2004/06/01 19:41:09  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.95
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: objostr.cpp,v 1000.4 2004/06/01 19:41:09 gouriano Exp $
  10. * ===========================================================================
  11. *
  12. *                            PUBLIC DOMAIN NOTICE
  13. *               National Center for Biotechnology Information
  14. *
  15. *  This software/database is a "United States Government Work" under the
  16. *  terms of the United States Copyright Act.  It was written as part of
  17. *  the author's official duties as a United States Government employee and
  18. *  thus cannot be copyrighted.  This software/database is freely available
  19. *  to the public for use. The National Library of Medicine and the U.S.
  20. *  Government have not placed any restriction on its use or reproduction.
  21. *
  22. *  Although all reasonable efforts have been taken to ensure the accuracy
  23. *  and reliability of the software and data, the NLM and the U.S.
  24. *  Government do not and cannot warrant the performance or results that
  25. *  may be obtained by using this software or data. The NLM and the U.S.
  26. *  Government disclaim all warranties, express or implied, including
  27. *  warranties of performance, merchantability or fitness for any particular
  28. *  purpose.
  29. *
  30. *  Please cite the author in any work or product based on this material.
  31. *
  32. * ===========================================================================
  33. *
  34. * Author: Eugene Vasilchenko
  35. *
  36. * File Description:
  37. *   !!! PUT YOUR DESCRIPTION HERE !!!
  38. *
  39. * ===========================================================================
  40. */
  41. #include <ncbi_pch.hpp>
  42. #include <corelib/ncbistd.hpp>
  43. #include <corelib/ncbi_safe_static.hpp>
  44. #include <corelib/ncbimtx.hpp>
  45. #include <util/bytesrc.hpp>
  46. #include <serial/objostr.hpp>
  47. #include <serial/objistr.hpp>
  48. #include <serial/objcopy.hpp>
  49. #include <serial/typeref.hpp>
  50. #include <serial/objlist.hpp>
  51. #include <serial/memberid.hpp>
  52. #include <serial/typeinfo.hpp>
  53. #include <serial/enumvalues.hpp>
  54. #include <serial/memberlist.hpp>
  55. #include <serial/delaybuf.hpp>
  56. #include <serial/classinfo.hpp>
  57. #include <serial/choice.hpp>
  58. #include <serial/aliasinfo.hpp>
  59. #include <serial/continfo.hpp>
  60. #include <serial/member.hpp>
  61. #include <serial/variant.hpp>
  62. #include <serial/objectinfo.hpp>
  63. #include <serial/objectiter.hpp>
  64. #include <serial/objlist.hpp>
  65. #include <serial/serialimpl.hpp>
  66. #undef _TRACE
  67. #define _TRACE(arg) ((void)0)
  68. BEGIN_NCBI_SCOPE
  69. CObjectOStream* CObjectOStream::Open(ESerialDataFormat format,
  70.                                      const string& fileName,
  71.                                      TSerialOpenFlags openFlags)
  72. {
  73.     CNcbiOstream* outStream = 0;
  74.     bool deleteStream;
  75.     if ( (openFlags & eSerial_StdWhenEmpty) && fileName.empty() ||
  76.          (openFlags & eSerial_StdWhenDash) && fileName == "-" ||
  77.          (openFlags & eSerial_StdWhenStd) && fileName == "stdout" ) {
  78.         outStream = &NcbiCout;
  79.         deleteStream = false;
  80.     }
  81.     else {
  82.         switch ( format ) {
  83.         case eSerial_AsnText:
  84.         case eSerial_Xml:
  85.             outStream = new CNcbiOfstream(fileName.c_str());
  86.             break;
  87.         case eSerial_AsnBinary:
  88.             outStream = new CNcbiOfstream(fileName.c_str(),
  89.                                           IOS_BASE::out | IOS_BASE::binary);
  90.             break;
  91.         default:
  92.             NCBI_THROW(CSerialException,eFail,
  93.                        "CObjectOStream::Open: unsupported format");
  94.         }
  95.         if ( !*outStream ) {
  96.             delete outStream;
  97.             NCBI_THROW(CSerialException,eFail, "cannot open file");
  98.         }
  99.         deleteStream = true;
  100.     }
  101.     return Open(format, *outStream, deleteStream);
  102. }
  103. CObjectOStream* CObjectOStream::Open(ESerialDataFormat format,
  104.                                      CNcbiOstream& outStream,
  105.                                      bool deleteStream)
  106. {
  107.     switch ( format ) {
  108.     case eSerial_AsnText:
  109.         return OpenObjectOStreamAsn(outStream, deleteStream);
  110.     case eSerial_AsnBinary:
  111.         return OpenObjectOStreamAsnBinary(outStream, deleteStream);
  112.     case eSerial_Xml:
  113.         return OpenObjectOStreamXml(outStream, deleteStream);
  114.     default:
  115.         break;
  116.     }
  117.     NCBI_THROW(CSerialException,eFail,
  118.                "CObjectOStream::Open: unsupported format");
  119. }
  120. /////////////////////////////////////////////////////////////////////////////
  121. // data verification setup
  122. ESerialVerifyData CObjectOStream::ms_VerifyDataDefault = eSerialVerifyData_Default;
  123. static CSafeStaticRef< CTls<int> > s_VerifyTLS;
  124. void CObjectOStream::SetVerifyDataThread(ESerialVerifyData verify)
  125. {
  126.     x_GetVerifyDataDefault();
  127.     ESerialVerifyData tls_verify = ESerialVerifyData(long(s_VerifyTLS->GetValue()));
  128.     if (tls_verify != eSerialVerifyData_Never &&
  129.         tls_verify != eSerialVerifyData_Always &&
  130.         tls_verify != eSerialVerifyData_DefValueAlways) {
  131.         s_VerifyTLS->SetValue(reinterpret_cast<int*>(verify));
  132.     }
  133. }
  134. void CObjectOStream::SetVerifyDataGlobal(ESerialVerifyData verify)
  135. {
  136.     x_GetVerifyDataDefault();
  137.     if (ms_VerifyDataDefault != eSerialVerifyData_Never &&
  138.         ms_VerifyDataDefault != eSerialVerifyData_Always &&
  139.         ms_VerifyDataDefault != eSerialVerifyData_DefValueAlways) {
  140.         ms_VerifyDataDefault = verify;
  141.     }
  142. }
  143. ESerialVerifyData CObjectOStream::x_GetVerifyDataDefault(void)
  144. {
  145.     ESerialVerifyData verify;
  146.     if (ms_VerifyDataDefault == eSerialVerifyData_Never ||
  147.         ms_VerifyDataDefault == eSerialVerifyData_Always ||
  148.         ms_VerifyDataDefault == eSerialVerifyData_DefValueAlways) {
  149.         verify = ms_VerifyDataDefault;
  150.     } else {
  151.         verify = ESerialVerifyData(long(s_VerifyTLS->GetValue()));
  152.         if (verify == eSerialVerifyData_Default) {
  153.             if (ms_VerifyDataDefault == eSerialVerifyData_Default) {
  154.                 // change the default here, if you wish
  155.                 ms_VerifyDataDefault = eSerialVerifyData_Yes;
  156.                 //ms_VerifyDataDefault = eSerialVerifyData_No;
  157.                 const char* str = getenv(SERIAL_VERIFY_DATA_WRITE);
  158.                 if (str) {
  159.                     if (NStr::CompareNocase(str,"YES") == 0) {
  160.                         ms_VerifyDataDefault = eSerialVerifyData_Yes;
  161.                     } else if (NStr::CompareNocase(str,"NO") == 0) {
  162.                         ms_VerifyDataDefault = eSerialVerifyData_No;
  163.                     } else if (NStr::CompareNocase(str,"NEVER") == 0) {
  164.                         ms_VerifyDataDefault = eSerialVerifyData_Never;
  165.                     } else  if (NStr::CompareNocase(str,"ALWAYS") == 0) {
  166.                         ms_VerifyDataDefault = eSerialVerifyData_Always;
  167.                     } else  if (NStr::CompareNocase(str,"DEFVALUE") == 0) {
  168.                         ms_VerifyDataDefault = eSerialVerifyData_DefValue;
  169.                     } else  if (NStr::CompareNocase(str,"DEFVALUE_ALWAYS") == 0) {
  170.                         ms_VerifyDataDefault = eSerialVerifyData_DefValueAlways;
  171.                     }
  172.                 }
  173.             }
  174.             verify = ms_VerifyDataDefault;
  175.         }
  176.     }
  177.     return verify;
  178. }
  179. /////////////////////////////////////////////////////////////////////////////
  180. CObjectOStream::CObjectOStream(ESerialDataFormat format,
  181.                                CNcbiOstream& out, bool deleteOut)
  182.     : m_Output(out, deleteOut), m_Fail(fNoError), m_Flags(fFlagNone),
  183.       m_Separator(""), m_AutoSeparator(false),
  184.       m_DataFormat(format),
  185.       m_VerifyData(x_GetVerifyDataDefault())
  186. {
  187. }
  188. CObjectOStream::~CObjectOStream(void)
  189. {
  190.     try {
  191.         Close();
  192.         ResetLocalHooks();
  193.     }
  194.     catch (...) {
  195.         ERR_POST("Can not close output stream");
  196.     }
  197. }
  198. void CObjectOStream::Close(void)
  199. {
  200.     if (m_Fail != fNotOpen) {
  201.         try {
  202.             m_Output.Flush();
  203.             if ( m_Objects )
  204.                 m_Objects->Clear();
  205.             ClearStack();
  206.             m_Fail = fNotOpen;
  207.         }
  208.         catch (...) {
  209.             if ( InGoodState() )
  210.                 ThrowError(fWriteError, "cannot close output stream");
  211.         }
  212.     }
  213. }
  214. void CObjectOStream::ResetLocalHooks(void)
  215. {
  216.     CMutexGuard guard(GetTypeInfoMutex());
  217.     m_ObjectHookKey.Clear();
  218.     m_ClassMemberHookKey.Clear();
  219.     m_ChoiceVariantHookKey.Clear();
  220. }
  221. CObjectOStream::TFailFlags CObjectOStream::SetFailFlagsNoError(TFailFlags flags)
  222. {
  223.     TFailFlags old = m_Fail;
  224.     m_Fail |= flags;
  225.     return old;
  226. }
  227. CObjectOStream::TFailFlags CObjectOStream::SetFailFlags(TFailFlags flags,
  228.                                                         const char* message)
  229. {
  230.     TFailFlags old = m_Fail;
  231.     m_Fail |= flags;
  232.     if ( !old && flags ) {
  233.         // first fail
  234.         ERR_POST("CObjectOStream: error at "<<
  235.                  GetPosition()<<": "<<GetStackTrace() << ": " << message);
  236.     }
  237.     return old;
  238. }
  239. bool CObjectOStream::InGoodState(void)
  240. {
  241.     if ( fail() ) {
  242.         // fail flag already set
  243.         return false;
  244.     }
  245.     else if ( m_Output.fail() ) {
  246.         // IO exception thrown without setting fail flag
  247.         SetFailFlags(fWriteError, m_Output.GetError());
  248.         m_Output.ResetFail();
  249.         return false;
  250.     }
  251.     else {
  252.         // ok
  253.         return true;
  254.     }
  255. }
  256. void CObjectOStream::Unended(const string& msg)
  257. {
  258.     if ( InGoodState() )
  259.         ThrowError(fFail, msg);
  260. }
  261. void CObjectOStream::UnendedFrame(void)
  262. {
  263.     Unended("internal error: unended object stack frame");
  264. }
  265. void CObjectOStream::x_SetPathHooks(bool set)
  266. {
  267.     if (!m_PathWriteObjectHooks.IsEmpty()) {
  268.         CWriteObjectHook* hook = m_PathWriteObjectHooks.GetHook(*this);
  269.         if (hook) {
  270.             CTypeInfo* item = m_PathWriteObjectHooks.FindType(*this);
  271.             if (item) {
  272.                 if (set) {
  273.                     item->SetLocalWriteHook(*this, hook);
  274.                 } else {
  275.                     item->ResetLocalWriteHook(*this);
  276.                 }
  277.             }
  278.         }
  279.     }
  280.     if (!m_PathWriteMemberHooks.IsEmpty()) {
  281.         CWriteClassMemberHook* hook = m_PathWriteMemberHooks.GetHook(*this);
  282.         if (hook) {
  283.             CMemberInfo* item = m_PathWriteMemberHooks.FindItem(*this);
  284.             if (item) {
  285.                 if (set) {
  286.                     item->SetLocalWriteHook(*this, hook);
  287.                 } else {
  288.                     item->ResetLocalWriteHook(*this);
  289.                 }
  290.             }
  291.         }
  292.     }
  293.     if (!m_PathWriteVariantHooks.IsEmpty()) {
  294.         CWriteChoiceVariantHook* hook = m_PathWriteVariantHooks.GetHook(*this);
  295.         if (hook) {
  296.             CVariantInfo* item = m_PathWriteVariantHooks.FindItem(*this);
  297.             if (item) {
  298.                 if (set) {
  299.                     item->SetLocalWriteHook(*this, hook);
  300.                 } else {
  301.                     item->ResetLocalWriteHook(*this);
  302.                 }
  303.             }
  304.         }
  305.     }
  306. }
  307. void CObjectOStream::SetPathWriteObjectHook(const string& path,
  308.                                             CWriteObjectHook*   hook)
  309. {
  310.     m_PathWriteObjectHooks.SetHook(path,hook);
  311.     WatchPathHooks();
  312. }
  313. void CObjectOStream::SetPathWriteMemberHook(const string& path,
  314.                                             CWriteClassMemberHook*   hook)
  315. {
  316.     m_PathWriteMemberHooks.SetHook(path,hook);
  317.     WatchPathHooks();
  318. }
  319. void CObjectOStream::SetPathWriteVariantHook(const string& path,
  320.                                              CWriteChoiceVariantHook* hook)
  321. {
  322.     m_PathWriteVariantHooks.SetHook(path,hook);
  323.     WatchPathHooks();
  324. }
  325. string CObjectOStream::GetStackTrace(void) const
  326. {
  327.     return GetStackTraceASN();
  328. }
  329. size_t CObjectOStream::GetStreamOffset(void) const
  330. {
  331.     return m_Output.GetStreamOffset();
  332. }
  333. string CObjectOStream::GetPosition(void) const
  334. {
  335.     return "byte "+NStr::UIntToString(GetStreamOffset());
  336. }
  337. void CObjectOStream::ThrowError1(const char* file, int line, 
  338.                                  TFailFlags fail, const char* message)
  339. {
  340.     ThrowError1(file,line,fail,string(message));
  341. }
  342. void CObjectOStream::ThrowError1(const char* file, int line, 
  343.                                  TFailFlags fail, const string& message)
  344. {
  345.     CSerialException::EErrCode err;
  346.     SetFailFlags(fail, message.c_str());
  347.     try {
  348.         Flush();
  349.     } catch(...) {
  350.     }
  351.     switch(fail)
  352.     {
  353.     case fNoError:
  354.         CNcbiDiag(file, line, eDiag_Trace) << message;
  355.         return;
  356.     case fEOF:         err = CSerialException::eEOF;         break;
  357.     default:
  358.     case fWriteError:  err = CSerialException::eIoError;     break;
  359.     case fFormatError: err = CSerialException::eFormatError; break;
  360.     case fOverflow:    err = CSerialException::eOverflow;    break;
  361.     case fInvalidData: err = CSerialException::eInvalidData; break;
  362.     case fIllegalCall: err = CSerialException::eIllegalCall; break;
  363.     case fFail:        err = CSerialException::eFail;        break;
  364.     case fNotOpen:     err = CSerialException::eNotOpen;     break;
  365.     case fUnassigned:
  366.         throw CUnassignedMember(file,line,0,CUnassignedMember::eWrite,
  367.                                 GetPosition()+": "+message);
  368.     }
  369.     throw CSerialException(file,line,0,err,GetPosition()+": "+message);
  370. }
  371. void CObjectOStream::EndOfWrite(void)
  372. {
  373.     FlushBuffer();
  374.     if ( m_Objects )
  375.         m_Objects->Clear();
  376. }    
  377. void CObjectOStream::WriteObject(const CConstObjectInfo& object)
  378. {
  379.     WriteObject(object.GetObjectPtr(), object.GetTypeInfo());
  380. }
  381. void CObjectOStream::WriteClassMember(const CConstObjectInfo::CMemberIterator& member)
  382. {
  383.     const CMemberInfo* memberInfo = member.GetMemberInfo();
  384.     TConstObjectPtr classPtr = member.GetClassObject().GetObjectPtr();
  385.     WriteClassMember(memberInfo->GetId(),
  386.                      memberInfo->GetTypeInfo(),
  387.                      memberInfo->GetMemberPtr(classPtr));
  388. }
  389. void CObjectOStream::WriteChoiceVariant(const CConstObjectInfoCV& object)
  390. {
  391.     const CVariantInfo* variantInfo = object.GetVariantInfo();
  392.     TConstObjectPtr choicePtr = object.GetChoiceObject().GetObjectPtr();
  393.     variantInfo->DefaultWriteVariant(*this, choicePtr);
  394. }
  395. void CObjectOStream::Write(const CConstObjectInfo& object)
  396. {
  397.     // root writer
  398.     BEGIN_OBJECT_FRAME2(eFrameNamed, object.GetTypeInfo());
  399.     
  400.     WriteFileHeader(object.GetTypeInfo());
  401.     WriteObject(object);
  402.     EndOfWrite();
  403.     
  404.     END_OBJECT_FRAME();
  405.     if ( GetAutoSeparator() )
  406.         Separator(*this);
  407. }
  408. void CObjectOStream::Write(TConstObjectPtr object, TTypeInfo typeInfo)
  409. {
  410.     // root writer
  411.     BEGIN_OBJECT_FRAME2(eFrameNamed, typeInfo);
  412.     
  413.     WriteFileHeader(typeInfo);
  414.     WriteObject(object, typeInfo);
  415.     EndOfWrite();
  416.     
  417.     END_OBJECT_FRAME();
  418.     if ( GetAutoSeparator() )
  419.         Separator(*this);
  420. }
  421. void CObjectOStream::Write(TConstObjectPtr object, const CTypeRef& type)
  422. {
  423.     Write(object, type.Get());
  424. }
  425. void CObjectOStream::RegisterObject(TTypeInfo typeInfo)
  426. {
  427.     if ( m_Objects )
  428.         m_Objects->RegisterObject(typeInfo);
  429. }
  430. void CObjectOStream::RegisterObject(TConstObjectPtr object,
  431.                                     TTypeInfo typeInfo)
  432. {
  433.     if ( m_Objects )
  434.         m_Objects->RegisterObject(object, typeInfo);
  435. }
  436. void CObjectOStream::WriteSeparateObject(const CConstObjectInfo& object)
  437. {
  438.     if ( m_Objects ) {
  439.         size_t firstObject = m_Objects->GetObjectCount();
  440.         WriteObject(object);
  441.         size_t lastObject = m_Objects->GetObjectCount();
  442.         m_Objects->ForgetObjects(firstObject, lastObject);
  443.     }
  444.     else {
  445.         WriteObject(object);
  446.     }
  447. }
  448. void CObjectOStream::WriteExternalObject(TConstObjectPtr objectPtr,
  449.                                          TTypeInfo typeInfo)
  450. {
  451.     _TRACE("CObjectOStream::WriteExternalObject(" <<
  452.            NStr::PtrToString(objectPtr) << ", "
  453.            << typeInfo->GetName() << ')');
  454.     RegisterObject(objectPtr, typeInfo);
  455.     WriteObject(objectPtr, typeInfo);
  456. }
  457. bool CObjectOStream::Write(CByteSource& source)
  458. {
  459.     m_Output.Write(*source.Open());
  460.     return true;
  461. }
  462. void CObjectOStream::WriteFileHeader(TTypeInfo /*type*/)
  463. {
  464.     // do nothing by default
  465. }
  466. void CObjectOStream::WritePointer(TConstObjectPtr objectPtr,
  467.                                   TTypeInfo declaredTypeInfo)
  468. {
  469.     _TRACE("WritePointer("<<NStr::PtrToString(objectPtr)<<", "
  470.            <<declaredTypeInfo->GetName()<<")");
  471.     if ( objectPtr == 0 ) {
  472.         _TRACE("WritePointer: "<<NStr::PtrToString(objectPtr)<<": null");
  473.         WriteNullPointer();
  474.         return;
  475.     }
  476.     TTypeInfo realTypeInfo = declaredTypeInfo->GetRealTypeInfo(objectPtr);
  477.     if ( m_Objects ) {
  478.         const CWriteObjectInfo* info =
  479.             m_Objects->RegisterObject(objectPtr, realTypeInfo);
  480.         if ( info ) {
  481.             // old object
  482.             WriteObjectReference(info->GetIndex());
  483.             return;
  484.         }
  485.     }
  486.     if ( declaredTypeInfo == realTypeInfo ) {
  487.         _TRACE("WritePointer: "<<NStr::PtrToString(objectPtr)<<": new");
  488.         WriteThis(objectPtr, realTypeInfo);
  489.     }
  490.     else {
  491.         _TRACE("WritePointer: "<<NStr::PtrToString(objectPtr)<<
  492.                ": new "<<realTypeInfo->GetName());
  493.         WriteOther(objectPtr, realTypeInfo);
  494.     }
  495. }
  496. void CObjectOStream::WriteThis(TConstObjectPtr object, TTypeInfo typeInfo)
  497. {
  498.     WriteObject(object, typeInfo);
  499. }
  500. void CObjectOStream::WriteFloat(float data)
  501. {
  502.     WriteDouble(data);
  503. }
  504. #if SIZEOF_LONG_DOUBLE != 0
  505. void CObjectOStream::WriteLDouble(long double data)
  506. {
  507.     WriteDouble(data);
  508. }
  509. #endif
  510. void CObjectOStream::BeginNamedType(TTypeInfo /*namedTypeInfo*/)
  511. {
  512. }
  513. void CObjectOStream::EndNamedType(void)
  514. {
  515. }
  516. void CObjectOStream::WriteNamedType(TTypeInfo
  517. #ifndef VIRTUAL_MID_LEVEL_IO
  518.                                     namedTypeInfo
  519. #endif
  520.                                     ,
  521.                                     TTypeInfo objectType,
  522.                                     TConstObjectPtr objectPtr)
  523. {
  524. #ifndef VIRTUAL_MID_LEVEL_IO
  525.     BEGIN_OBJECT_FRAME2(eFrameNamed, namedTypeInfo);
  526.     BeginNamedType(namedTypeInfo);
  527. #endif
  528.     WriteObject(objectPtr, objectType);
  529. #ifndef VIRTUAL_MID_LEVEL_IO
  530.     EndNamedType();
  531.     END_OBJECT_FRAME();
  532. #endif
  533. }
  534. void CObjectOStream::CopyNamedType(TTypeInfo namedTypeInfo,
  535.                                    TTypeInfo objectType,
  536.                                    CObjectStreamCopier& copier)
  537. {
  538. #ifndef VIRTUAL_MID_LEVEL_IO
  539.     BEGIN_OBJECT_2FRAMES_OF2(copier, eFrameNamed, namedTypeInfo);
  540.     copier.In().BeginNamedType(namedTypeInfo);
  541.     BeginNamedType(namedTypeInfo);
  542.     CopyObject(objectType, copier);
  543.     EndNamedType();
  544.     copier.In().EndNamedType();
  545.     END_OBJECT_2FRAMES_OF(copier);
  546. #else
  547.     BEGIN_OBJECT_FRAME_OF2(copier.In(), eFrameNamed, namedTypeInfo);
  548.     copier.In().BeginNamedType(namedTypeInfo);
  549.     CopyObject(objectType, copier);
  550.     copier.In().EndNamedType();
  551.     END_OBJECT_FRAME_OF(copier.In());
  552. #endif
  553. }
  554. void CObjectOStream::WriteOther(TConstObjectPtr object,
  555.                                 TTypeInfo typeInfo)
  556. {
  557.     WriteOtherBegin(typeInfo);
  558.     WriteObject(object, typeInfo);
  559.     WriteOtherEnd(typeInfo);
  560. }
  561. void CObjectOStream::WriteOtherEnd(TTypeInfo /*typeInfo*/)
  562. {
  563. }
  564. void CObjectOStream::EndContainer(void)
  565. {
  566. }
  567. void CObjectOStream::BeginContainerElement(TTypeInfo /*elementType*/)
  568. {
  569. }
  570. void CObjectOStream::EndContainerElement(void)
  571. {
  572. }
  573. void CObjectOStream::WriteContainer(const CContainerTypeInfo* cType,
  574.                                     TConstObjectPtr containerPtr)
  575. {
  576.     BEGIN_OBJECT_FRAME2(eFrameArray, cType);
  577.     BeginContainer(cType);
  578.         
  579.     CContainerTypeInfo::CConstIterator i;
  580.     if ( cType->InitIterator(i, containerPtr) ) {
  581.         TTypeInfo elementType = cType->GetElementType();
  582.         BEGIN_OBJECT_FRAME2(eFrameArrayElement, elementType);
  583.         do {
  584.             BeginContainerElement(elementType);
  585.             
  586.             WriteObject(cType->GetElementPtr(i), elementType);
  587.             
  588.             EndContainerElement();
  589.         } while ( cType->NextElement(i) );
  590.         END_OBJECT_FRAME();
  591.     }
  592.     EndContainer();
  593.     END_OBJECT_FRAME();
  594. }
  595. void CObjectOStream::WriteContainerElement(const CConstObjectInfo& element)
  596. {
  597.     BeginContainerElement(element.GetTypeInfo());
  598.     WriteObject(element);
  599.     EndContainerElement();
  600. }
  601. void CObjectOStream::CopyContainer(const CContainerTypeInfo* cType,
  602.                                    CObjectStreamCopier& copier)
  603. {
  604.     BEGIN_OBJECT_2FRAMES_OF2(copier, eFrameArray, cType);
  605.     copier.In().BeginContainer(cType);
  606.     BeginContainer(cType);
  607.     TTypeInfo elementType = cType->GetElementType();
  608.     BEGIN_OBJECT_2FRAMES_OF2(copier, eFrameArrayElement, elementType);
  609.     while ( copier.In().BeginContainerElement(elementType) ) {
  610.         BeginContainerElement(elementType);
  611.         CopyObject(elementType, copier);
  612.         EndContainerElement();
  613.         copier.In().EndContainerElement();
  614.     }
  615.     END_OBJECT_2FRAMES_OF(copier);
  616.     
  617.     EndContainer();
  618.     copier.In().EndContainer();
  619.     END_OBJECT_2FRAMES_OF(copier);
  620. }
  621. void CObjectOStream::EndClass(void)
  622. {
  623. }
  624. void CObjectOStream::EndClassMember(void)
  625. {
  626. }
  627. void CObjectOStream::WriteClass(const CClassTypeInfo* classType,
  628.                                 TConstObjectPtr classPtr)
  629. {
  630.     BEGIN_OBJECT_FRAME2(eFrameClass, classType);
  631.     BeginClass(classType);
  632.     
  633.     for ( CClassTypeInfo::CIterator i(classType); i.Valid(); ++i ) {
  634.         classType->GetMemberInfo(*i)->WriteMember(*this, classPtr);
  635.     }
  636.     
  637.     EndClass();
  638.     END_OBJECT_FRAME();
  639. }
  640. void CObjectOStream::WriteClassMember(const CMemberId& memberId,
  641.                                       TTypeInfo memberType,
  642.                                       TConstObjectPtr memberPtr)
  643. {
  644.     BEGIN_OBJECT_FRAME2(eFrameClassMember, memberId);
  645.     BeginClassMember(memberId);
  646.     WriteObject(memberPtr, memberType);
  647.     EndClassMember();
  648.     END_OBJECT_FRAME();
  649. }
  650. bool CObjectOStream::WriteClassMember(const CMemberId& memberId,
  651.                                       const CDelayBuffer& buffer)
  652. {
  653.     if ( !buffer.HaveFormat(GetDataFormat()) )
  654.         return false;
  655.     BEGIN_OBJECT_FRAME2(eFrameClassMember, memberId);
  656.     BeginClassMember(memberId);
  657.     Write(buffer.GetSource());
  658.     EndClassMember();
  659.     END_OBJECT_FRAME();
  660.     return true;
  661. }
  662. void CObjectOStream::CopyClassRandom(const CClassTypeInfo* classType,
  663.                                      CObjectStreamCopier& copier)
  664. {
  665.     BEGIN_OBJECT_2FRAMES_OF2(copier, eFrameClass, classType);
  666.     copier.In().BeginClass(classType);
  667.     BeginClass(classType);
  668.     vector<bool> read(classType->GetMembers().LastIndex() + 1);
  669.     BEGIN_OBJECT_2FRAMES_OF(copier, eFrameClassMember);
  670.     TMemberIndex index;
  671.     while ( (index = copier.In().BeginClassMember(classType)) !=
  672.             kInvalidMember ) {
  673.         const CMemberInfo* memberInfo = classType->GetMemberInfo(index);
  674.         copier.In().SetTopMemberId(memberInfo->GetId());
  675.         SetTopMemberId(memberInfo->GetId());
  676.         copier.SetPathHooks(*this, true);
  677.         if ( read[index] ) {
  678.             copier.In().DuplicatedMember(memberInfo);
  679.         }
  680.         else {
  681.             read[index] = true;
  682.             BeginClassMember(memberInfo->GetId());
  683.             memberInfo->CopyMember(copier);
  684.             EndClassMember();
  685.         }
  686.         
  687.         copier.SetPathHooks(*this, false);
  688.         copier.In().EndClassMember();
  689.     }
  690.     END_OBJECT_2FRAMES_OF(copier);
  691.     // init all absent members
  692.     for ( CClassTypeInfo::CIterator i(classType); i.Valid(); ++i ) {
  693.         if ( !read[*i] ) {
  694.             classType->GetMemberInfo(*i)->CopyMissingMember(copier);
  695.         }
  696.     }
  697.     EndClass();
  698.     copier.In().EndClass();
  699.     END_OBJECT_2FRAMES_OF(copier);
  700. }
  701. void CObjectOStream::CopyClassSequential(const CClassTypeInfo* classType,
  702.                                          CObjectStreamCopier& copier)
  703. {
  704.     BEGIN_OBJECT_2FRAMES_OF2(copier, eFrameClass, classType);
  705.     copier.In().BeginClass(classType);
  706.     BeginClass(classType);
  707.     CClassTypeInfo::CIterator pos(classType);
  708.     BEGIN_OBJECT_2FRAMES_OF(copier, eFrameClassMember);
  709.     TMemberIndex index;
  710.     while ( (index = copier.In().BeginClassMember(classType, *pos)) !=
  711.             kInvalidMember ) {
  712.         const CMemberInfo* memberInfo = classType->GetMemberInfo(index);
  713.         copier.In().SetTopMemberId(memberInfo->GetId());
  714.         SetTopMemberId(memberInfo->GetId());
  715.         copier.SetPathHooks(*this, true);
  716.         for ( TMemberIndex i = *pos; i < index; ++i ) {
  717.             // init missing member
  718.             classType->GetMemberInfo(i)->CopyMissingMember(copier);
  719.         }
  720.         BeginClassMember(memberInfo->GetId());
  721.         memberInfo->CopyMember(copier);
  722.         
  723.         pos.SetIndex(index + 1);
  724.         EndClassMember();
  725.         copier.SetPathHooks(*this, false);
  726.         copier.In().EndClassMember();
  727.     }
  728.     END_OBJECT_2FRAMES_OF(copier);
  729.     // init all absent members
  730.     for ( ; pos.Valid(); ++pos ) {
  731.         classType->GetMemberInfo(*pos)->CopyMissingMember(copier);
  732.     }
  733.     EndClass();
  734.     copier.In().EndClass();
  735.     END_OBJECT_2FRAMES_OF(copier);
  736. }
  737. void CObjectOStream::BeginChoice(const CChoiceTypeInfo* /*choiceType*/)
  738. {
  739. }
  740. void CObjectOStream::EndChoice(void)
  741. {
  742. }
  743. void CObjectOStream::EndChoiceVariant(void)
  744. {
  745. }
  746. void CObjectOStream::WriteChoice(const CChoiceTypeInfo* choiceType,
  747.                                  TConstObjectPtr choicePtr)
  748. {
  749.     BEGIN_OBJECT_FRAME2(eFrameChoice, choiceType);
  750.     BeginChoice(choiceType);
  751.     TMemberIndex index = choiceType->GetIndex(choicePtr);
  752.     const CVariantInfo* variantInfo = choiceType->GetVariantInfo(index);
  753.     BEGIN_OBJECT_FRAME2(eFrameChoiceVariant, variantInfo->GetId());
  754.     BeginChoiceVariant(choiceType, variantInfo->GetId());
  755.     variantInfo->WriteVariant(*this, choicePtr);
  756.     EndChoiceVariant();
  757.     END_OBJECT_FRAME();
  758.     EndChoice();
  759.     END_OBJECT_FRAME();
  760. }
  761. void CObjectOStream::CopyChoice(const CChoiceTypeInfo* choiceType,
  762.                                 CObjectStreamCopier& copier)
  763. {
  764.     BEGIN_OBJECT_2FRAMES_OF2(copier, eFrameChoice, choiceType);
  765.     BeginChoice(choiceType);
  766.     copier.In().BeginChoice(choiceType);
  767.     BEGIN_OBJECT_2FRAMES_OF(copier, eFrameChoiceVariant);
  768.     TMemberIndex index = copier.In().BeginChoiceVariant(choiceType);
  769.     if ( index == kInvalidMember ) {
  770.         copier.ThrowError(CObjectIStream::fFormatError,
  771.                           "choice variant id expected");
  772.     }
  773.     const CVariantInfo* variantInfo = choiceType->GetVariantInfo(index);
  774.     if (variantInfo->GetId().IsAttlist()) {
  775.         const CMemberInfo* memberInfo =
  776.             dynamic_cast<const CMemberInfo*>(
  777.                 choiceType->GetVariants().GetItemInfo(index));
  778.         BeginClassMember(memberInfo->GetId());
  779.         memberInfo->CopyMember(copier);
  780.         EndClassMember();
  781.         index = copier.In().BeginChoiceVariant(choiceType);
  782.         if ( index == kInvalidMember )
  783.             copier.ThrowError(CObjectIStream::fFormatError,
  784.                           "choice variant id expected");
  785.         variantInfo = choiceType->GetVariantInfo(index);
  786.     }
  787.     copier.In().SetTopMemberId(variantInfo->GetId());
  788.     copier.Out().SetTopMemberId(variantInfo->GetId());
  789.     copier.SetPathHooks(copier.Out(), true);
  790.     BeginChoiceVariant(choiceType, variantInfo->GetId());
  791.     variantInfo->CopyVariant(copier);
  792.     EndChoiceVariant();
  793.     copier.SetPathHooks(copier.Out(), false);
  794.     copier.In().EndChoiceVariant();
  795.     END_OBJECT_2FRAMES_OF(copier);
  796.     copier.In().EndChoice();
  797.     EndChoice();
  798.     END_OBJECT_2FRAMES_OF(copier);
  799. }
  800. void CObjectOStream::WriteAlias(const CAliasTypeInfo* aliasType,
  801.                                 TConstObjectPtr aliasPtr)
  802. {
  803.     WriteNamedType(aliasType, aliasType->GetPointedType(),
  804.         aliasType->GetDataPtr(aliasPtr));
  805. }
  806. void CObjectOStream::CopyAlias(const CAliasTypeInfo* aliasType,
  807.                                 CObjectStreamCopier& copier)
  808. {
  809.     CopyNamedType(aliasType, aliasType->GetPointedType(),
  810.         copier);
  811. }
  812. void CObjectOStream::BeginBytes(const ByteBlock& )
  813. {
  814. }
  815. void CObjectOStream::EndBytes(const ByteBlock& )
  816. {
  817. }
  818. void CObjectOStream::ByteBlock::End(void)
  819. {
  820.     _ASSERT(!m_Ended);
  821.     _ASSERT(m_Length == 0);
  822.     if ( GetStream().InGoodState() ) {
  823.         GetStream().EndBytes(*this);
  824.         m_Ended = true;
  825.     }
  826. }
  827. CObjectOStream::ByteBlock::~ByteBlock(void)
  828. {
  829.     if ( !m_Ended ) {
  830.         try {
  831.             GetStream().Unended("byte block not fully written");
  832.         }
  833.         catch (...) {
  834.             ERR_POST("unended byte block");
  835.         }
  836.     }
  837. }
  838. void CObjectOStream::BeginChars(const CharBlock& )
  839. {
  840. }
  841. void CObjectOStream::EndChars(const CharBlock& )
  842. {
  843. }
  844. void CObjectOStream::CharBlock::End(void)
  845. {
  846.     _ASSERT(!m_Ended);
  847.     _ASSERT(m_Length == 0);
  848.     if ( GetStream().InGoodState() ) {
  849.         GetStream().EndChars(*this);
  850.         m_Ended = true;
  851.     }
  852. }
  853. CObjectOStream::CharBlock::~CharBlock(void)
  854. {
  855.     if ( !m_Ended ) {
  856.         try {
  857.             GetStream().Unended("char block not fully written");
  858.         }
  859.         catch (...) {
  860.             ERR_POST("unended char block");
  861.         }
  862.     }
  863. }
  864. void CObjectOStream::WriteSeparator(void)
  865. {
  866.     // do nothing by default
  867.     return;
  868. }
  869. END_NCBI_SCOPE
  870. /*
  871. * ---------------------------------------------------------------------------
  872. * $Log: objostr.cpp,v $
  873. * Revision 1000.4  2004/06/01 19:41:09  gouriano
  874. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.95
  875. *
  876. * Revision 1.95  2004/05/17 21:03:03  gorelenk
  877. * Added include of PCH ncbi_pch.hpp
  878. *
  879. * Revision 1.94  2004/02/09 18:22:34  gouriano
  880. * enforced checking environment vars when setting initialization
  881. * verification parameters
  882. *
  883. * Revision 1.93  2004/01/05 14:25:21  gouriano
  884. * Added possibility to set serialization hooks by stack path
  885. *
  886. * Revision 1.92  2003/11/26 20:04:47  vasilche
  887. * Method put in wrong file.
  888. *
  889. * Revision 1.91  2003/11/26 19:59:40  vasilche
  890. * GetPosition() and GetDataFormat() methods now are implemented
  891. * in parent classes CObjectIStream and CObjectOStream to avoid
  892. * pure virtual method call in destructors.
  893. *
  894. * Revision 1.90  2003/11/24 14:10:05  grichenk
  895. * Changed base class for CAliasTypeInfo to CPointerTypeInfo
  896. *
  897. * Revision 1.89  2003/11/13 14:07:38  gouriano
  898. * Elaborated data verification on read/write/get to enable skipping mandatory class data members
  899. *
  900. * Revision 1.88  2003/10/24 15:54:28  grichenk
  901. * Removed or blocked exceptions in destructors
  902. *
  903. * Revision 1.87  2003/10/21 21:08:46  grichenk
  904. * Fixed aliases-related bug in XML stream
  905. *
  906. * Revision 1.86  2003/07/29 18:47:48  vasilche
  907. * Fixed thread safeness of object stream hooks.
  908. *
  909. * Revision 1.85  2003/07/17 18:48:01  gouriano
  910. * re-enabled initialization verification
  911. *
  912. * Revision 1.84  2003/06/25 17:49:05  gouriano
  913. * fixed verification flag initialization, disabled verification
  914. *
  915. * Revision 1.83  2003/05/16 18:02:18  gouriano
  916. * revised exception error messages
  917. *
  918. * Revision 1.82  2003/05/15 17:44:38  gouriano
  919. * added GetStreamOffset method
  920. *
  921. * Revision 1.81  2003/05/13 20:13:29  vasilche
  922. * Catch errors while closing broken CObjectOStream.
  923. *
  924. * Revision 1.80  2003/04/30 15:45:38  gouriano
  925. * added catching all exceptions when flashing stream in ThrowError
  926. *
  927. * Revision 1.79  2003/04/30 15:38:43  gouriano
  928. * added Flush stream when throwing an exception
  929. *
  930. * Revision 1.78  2003/04/29 18:30:37  gouriano
  931. * object data member initialization verification
  932. *
  933. * Revision 1.77  2003/04/10 20:13:39  vakatov
  934. * Rollback the "uninitialized member" verification -- it still needs to
  935. * be worked upon...
  936. *
  937. * Revision 1.75  2003/04/03 21:47:24  gouriano
  938. * verify initialization of data members
  939. *
  940. * Revision 1.74  2003/03/10 18:54:26  gouriano
  941. * use new structured exceptions (based on CException)
  942. *
  943. * Revision 1.73  2003/01/22 18:53:27  gouriano
  944. * corrected stream destruction
  945. *
  946. * Revision 1.72  2002/12/26 21:35:49  gouriano
  947. * corrected handling choice's XML attributes
  948. *
  949. * Revision 1.71  2002/12/26 19:32:34  gouriano
  950. * changed XML I/O streams to properly handle object copying
  951. *
  952. * Revision 1.70  2002/12/13 21:50:42  gouriano
  953. * corrected reading of choices
  954. *
  955. * Revision 1.69  2002/11/14 20:59:48  gouriano
  956. * added BeginChoice/EndChoice methods
  957. *
  958. * Revision 1.68  2002/11/04 21:29:20  grichenk
  959. * Fixed usage of const CRef<> and CRef<> constructor
  960. *
  961. * Revision 1.67  2002/10/25 14:49:27  vasilche
  962. * NCBI C Toolkit compatibility code extracted to libxcser library.
  963. * Serial streams flags names were renamed to fXxx.
  964. *
  965. * Names of flags
  966. *
  967. * Revision 1.66  2002/09/19 14:00:38  grichenk
  968. * Implemented CObjectHookGuard for write and copy hooks
  969. * Added DefaultRead/Write/Copy methods to base hook classes
  970. *
  971. * Revision 1.65  2002/08/30 16:22:22  vasilche
  972. * Removed excessive _TRACEs
  973. *
  974. * Revision 1.64  2002/08/26 18:32:29  grichenk
  975. * Added Get/SetAutoSeparator() to CObjectOStream to control
  976. * output of separators.
  977. *
  978. * Revision 1.63  2002/03/07 22:02:01  grichenk
  979. * Added "Separator" modifier for CObjectOStream
  980. *
  981. * Revision 1.62  2001/10/17 20:41:25  grichenk
  982. * Added CObjectOStream::CharBlock class
  983. *
  984. * Revision 1.61  2001/07/30 14:42:46  lavr
  985. * eDiag_Trace and eDiag_Fatal always print as much as possible
  986. *
  987. * Revision 1.60  2001/05/17 15:07:08  lavr
  988. * Typos corrected
  989. *
  990. * Revision 1.59  2001/01/05 20:10:51  vasilche
  991. * CByteSource, CIStrBuffer, COStrBuffer, CLightString, CChecksum, CWeakMap
  992. * were moved to util.
  993. *
  994. * Revision 1.58  2000/12/26 22:24:13  vasilche
  995. * Fixed errors of compilation on Mac.
  996. *
  997. * Revision 1.57  2000/12/15 22:07:02  vasilche
  998. * Fixed typo eNotOpen -> eNoError.
  999. *
  1000. * Revision 1.56  2000/12/15 21:29:02  vasilche
  1001. * Moved some typedefs/enums from corelib/ncbistd.hpp.
  1002. * Added flags to CObjectIStream/CObjectOStream: eFlagAllowNonAsciiChars.
  1003. * TByte typedef replaced by Uint1.
  1004. *
  1005. * Revision 1.55  2000/12/15 15:38:44  vasilche
  1006. * Added support of Int8 and long double.
  1007. * Enum values now have type Int4 instead of long.
  1008. *
  1009. * Revision 1.54  2000/10/20 19:29:36  vasilche
  1010. * Adapted for MSVC which doesn't like explicit operator templates.
  1011. *
  1012. * Revision 1.53  2000/10/20 15:51:42  vasilche
  1013. * Fixed data error processing.
  1014. * Added interface for constructing container objects directly into output stream.
  1015. * object.hpp, object.inl and object.cpp were split to
  1016. * objectinfo.*, objecttype.*, objectiter.* and objectio.*.
  1017. *
  1018. * Revision 1.52  2000/10/17 18:45:35  vasilche
  1019. * Added possibility to turn off object cross reference detection in
  1020. * CObjectIStream and CObjectOStream.
  1021. *
  1022. * Revision 1.51  2000/10/13 16:28:39  vasilche
  1023. * Reduced header dependency.
  1024. * Avoid use of templates with virtual methods.
  1025. * Reduced amount of different maps used.
  1026. * All this lead to smaller compiled code size (libraries and programs).
  1027. *
  1028. * Revision 1.50  2000/10/03 17:22:44  vasilche
  1029. * Reduced header dependency.
  1030. * Reduced size of debug libraries on WorkShop by 3 times.
  1031. * Fixed tag allocation for parent classes.
  1032. * Fixed CObject allocation/deallocation in streams.
  1033. * Moved instantiation of several templates in separate source file.
  1034. *
  1035. * Revision 1.49  2000/09/29 16:18:24  vasilche
  1036. * Fixed binary format encoding/decoding on 64 bit compulers.
  1037. * Implemented CWeakMap<> for automatic cleaning map entries.
  1038. * Added cleaning local hooks via CWeakMap<>.
  1039. * Renamed ReadTypeName -> ReadFileHeader, ENoTypeName -> ENoFileHeader.
  1040. * Added some user interface methods to CObjectIStream, CObjectOStream and
  1041. * CObjectStreamCopier.
  1042. *
  1043. * Revision 1.48  2000/09/26 19:24:57  vasilche
  1044. * Added user interface for setting read/write/copy hooks.
  1045. *
  1046. * Revision 1.47  2000/09/26 17:38:22  vasilche
  1047. * Fixed incomplete choiceptr implementation.
  1048. * Removed temporary comments.
  1049. *
  1050. * Revision 1.46  2000/09/18 20:00:24  vasilche
  1051. * Separated CVariantInfo and CMemberInfo.
  1052. * Implemented copy hooks.
  1053. * All hooks now are stored in CTypeInfo/CMemberInfo/CVariantInfo.
  1054. * Most type specific functions now are implemented via function pointers instead of virtual functions.
  1055. *
  1056. * Revision 1.45  2000/09/01 13:16:18  vasilche
  1057. * Implemented class/container/choice iterators.
  1058. * Implemented CObjectStreamCopier for copying data without loading into memory.
  1059. *
  1060. * Revision 1.44  2000/08/15 19:44:50  vasilche
  1061. * Added Read/Write hooks:
  1062. * CReadObjectHook/CWriteObjectHook for objects of specified type.
  1063. * CReadClassMemberHook/CWriteClassMemberHook for specified members.
  1064. * CReadChoiceVariantHook/CWriteChoiceVariant for specified choice variants.
  1065. * CReadContainerElementHook/CWriteContainerElementsHook for containers.
  1066. *
  1067. * Revision 1.43  2000/07/03 18:42:45  vasilche
  1068. * Added interface to typeinfo via CObjectInfo and CConstObjectInfo.
  1069. * Reduced header dependency.
  1070. *
  1071. * Revision 1.42  2000/06/16 16:31:21  vasilche
  1072. * Changed implementation of choices and classes info to allow use of the same classes in generated and user written classes.
  1073. *
  1074. * Revision 1.41  2000/06/07 19:46:00  vasilche
  1075. * Some code cleaning.
  1076. * Macros renaming in more clear way.
  1077. * BEGIN_NAMED_*_INFO, ADD_*_MEMBER, ADD_NAMED_*_MEMBER.
  1078. *
  1079. * Revision 1.40  2000/06/01 19:07:04  vasilche
  1080. * Added parsing of XML data.
  1081. *
  1082. * Revision 1.39  2000/05/24 20:08:48  vasilche
  1083. * Implemented XML dump.
  1084. *
  1085. * Revision 1.38  2000/05/09 16:38:39  vasilche
  1086. * CObject::GetTypeInfo now moved to CObjectGetTypeInfo::GetTypeInfo to reduce possible errors.
  1087. * Added write context to CObjectOStream.
  1088. * Inlined most of methods of helping class Member, Block, ByteBlock etc.
  1089. *
  1090. * Revision 1.37  2000/05/04 16:22:20  vasilche
  1091. * Cleaned and optimized blocks and members.
  1092. *
  1093. * Revision 1.36  2000/04/28 16:58:13  vasilche
  1094. * Added classes CByteSource and CByteSourceReader for generic reading.
  1095. * Added delayed reading of choice variants.
  1096. *
  1097. * Revision 1.35  2000/04/13 14:50:27  vasilche
  1098. * Added CObjectIStream::Open() and CObjectOStream::Open() for easier use.
  1099. *
  1100. * Revision 1.34  2000/04/06 16:11:00  vasilche
  1101. * Fixed bug with iterators in choices.
  1102. * Removed unneeded calls to ReadExternalObject/WriteExternalObject.
  1103. * Added output buffering to text ASN.1 data.
  1104. *
  1105. * Revision 1.33  2000/03/29 15:55:29  vasilche
  1106. * Added two versions of object info - CObjectInfo and CConstObjectInfo.
  1107. * Added generic iterators by class -
  1108. *  CTypeIterator<class>, CTypeConstIterator<class>,
  1109. *  CStdTypeIterator<type>, CStdTypeConstIterator<type>,
  1110. *  CObjectsIterator and CObjectsConstIterator.
  1111. *
  1112. * Revision 1.32  2000/02/17 20:02:44  vasilche
  1113. * Added some standard serialization exceptions.
  1114. * Optimized text/binary ASN.1 reading.
  1115. * Fixed wrong encoding of StringStore in ASN.1 binary format.
  1116. * Optimized logic of object collection.
  1117. *
  1118. * Revision 1.31  2000/02/11 17:10:25  vasilche
  1119. * Optimized text parsing.
  1120. *
  1121. * Revision 1.30  2000/01/10 19:46:41  vasilche
  1122. * Fixed encoding/decoding of REAL type.
  1123. * Fixed encoding/decoding of StringStore.
  1124. * Fixed encoding/decoding of NULL type.
  1125. * Fixed error reporting.
  1126. * Reduced object map (only classes).
  1127. *
  1128. * Revision 1.29  2000/01/05 19:43:56  vasilche
  1129. * Fixed error messages when reading from ASN.1 binary file.
  1130. * Fixed storing of integers with enumerated values in ASN.1 binary file.
  1131. * Added TAG support to key/value of map.
  1132. * Added support of NULL variant in CHOICE.
  1133. *
  1134. * Revision 1.28  1999/12/28 18:55:51  vasilche
  1135. * Reduced size of compiled object files:
  1136. * 1. avoid inline or implicit virtual methods (especially destructors).
  1137. * 2. avoid std::string's methods usage in inline methods.
  1138. * 3. avoid string literals ("xxx") in inline methods.
  1139. *
  1140. * Revision 1.27  1999/12/20 15:29:35  vasilche
  1141. * Fixed bug with old ASN structures.
  1142. *
  1143. * Revision 1.26  1999/12/17 19:05:03  vasilche
  1144. * Simplified generation of GetTypeInfo methods.
  1145. *
  1146. * Revision 1.25  1999/10/04 16:22:18  vasilche
  1147. * Fixed bug with old ASN.1 structures.
  1148. *
  1149. * Revision 1.24  1999/09/27 14:18:02  vasilche
  1150. * Fixed bug with overloaded constructors of Block.
  1151. *
  1152. * Revision 1.23  1999/09/24 18:19:19  vasilche
  1153. * Removed dependency on NCBI toolkit.
  1154. *
  1155. * Revision 1.22  1999/09/23 21:16:08  vasilche
  1156. * Removed dependence on asn.h
  1157. *
  1158. * Revision 1.21  1999/09/23 20:25:04  vasilche
  1159. * Added support HAVE_NCBI_C
  1160. *
  1161. * Revision 1.20  1999/09/23 18:57:00  vasilche
  1162. * Fixed bugs with overloaded methods in objistr*.hpp & objostr*.hpp
  1163. *
  1164. * Revision 1.19  1999/09/14 18:54:19  vasilche
  1165. * Fixed bugs detected by gcc & egcs.
  1166. * Removed unneeded includes.
  1167. *
  1168. * Revision 1.18  1999/08/16 16:08:31  vasilche
  1169. * Added ENUMERATED type.
  1170. *
  1171. * Revision 1.17  1999/08/13 20:22:58  vasilche
  1172. * Fixed lot of bugs in datatool
  1173. *
  1174. * Revision 1.16  1999/08/13 15:53:51  vasilche
  1175. * C++ analog of asntool: datatool
  1176. *
  1177. * Revision 1.15  1999/07/22 17:33:55  vasilche
  1178. * Unified reading/writing of objects in all three formats.
  1179. *
  1180. * Revision 1.14  1999/07/19 15:50:35  vasilche
  1181. * Added interface to old ASN.1 routines.
  1182. * Added naming of key/value in STL map.
  1183. *
  1184. * Revision 1.13  1999/07/09 16:32:54  vasilche
  1185. * Added OCTET STRING write/read.
  1186. *
  1187. * Revision 1.12  1999/07/07 21:15:03  vasilche
  1188. * Cleaned processing of string types (string, char*, const char*).
  1189. *
  1190. * Revision 1.11  1999/07/02 21:31:58  vasilche
  1191. * Implemented reading from ASN.1 binary format.
  1192. *
  1193. * Revision 1.10  1999/07/01 17:55:33  vasilche
  1194. * Implemented ASN.1 binary write.
  1195. *
  1196. * Revision 1.9  1999/06/30 16:04:59  vasilche
  1197. * Added support for old ASN.1 structures.
  1198. *
  1199. * Revision 1.8  1999/06/24 14:44:57  vasilche
  1200. * Added binary ASN.1 output.
  1201. *
  1202. * Revision 1.7  1999/06/17 20:42:06  vasilche
  1203. * Fixed storing/loading of pointers.
  1204. *
  1205. * Revision 1.6  1999/06/16 20:35:33  vasilche
  1206. * Cleaned processing of blocks of data.
  1207. * Added input from ASN.1 text format.
  1208. *
  1209. * Revision 1.5  1999/06/15 16:19:50  vasilche
  1210. * Added ASN.1 object output stream.
  1211. *
  1212. * Revision 1.4  1999/06/10 21:06:48  vasilche
  1213. * Working binary output and almost working binary input.
  1214. *
  1215. * Revision 1.3  1999/06/07 19:30:27  vasilche
  1216. * More bug fixes
  1217. *
  1218. * Revision 1.2  1999/06/04 20:51:47  vasilche
  1219. * First compilable version of serialization.
  1220. *
  1221. * Revision 1.1  1999/05/19 19:56:54  vasilche
  1222. * Commit just in case.
  1223. *
  1224. * ===========================================================================
  1225. */