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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: objistr.hpp,v $
  4.  * PRODUCTION Revision 1000.5  2004/06/01 19:38:53  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.103
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJISTR__HPP
  10. #define OBJISTR__HPP
  11. /*  $Id: objistr.hpp,v 1000.5 2004/06/01 19:38:53 gouriano Exp $
  12. * ===========================================================================
  13. *
  14. *                            PUBLIC DOMAIN NOTICE
  15. *               National Center for Biotechnology Information
  16. *
  17. *  This software/database is a "United States Government Work" under the
  18. *  terms of the United States Copyright Act.  It was written as part of
  19. *  the author's official duties as a United States Government employee and
  20. *  thus cannot be copyrighted.  This software/database is freely available
  21. *  to the public for use. The National Library of Medicine and the U.S.
  22. *  Government have not placed any restriction on its use or reproduction.
  23. *
  24. *  Although all reasonable efforts have been taken to ensure the accuracy
  25. *  and reliability of the software and data, the NLM and the U.S.
  26. *  Government do not and cannot warrant the performance or results that
  27. *  may be obtained by using this software or data. The NLM and the U.S.
  28. *  Government disclaim all warranties, express or implied, including
  29. *  warranties of performance, merchantability or fitness for any particular
  30. *  purpose.
  31. *
  32. *  Please cite the author in any work or product based on this material.
  33. *
  34. * ===========================================================================
  35. *
  36. * Author: Eugene Vasilchenko
  37. *
  38. * File Description:
  39. *   !!! PUT YOUR DESCRIPTION HERE !!!
  40. */
  41. #include <corelib/ncbistd.hpp>
  42. #include <corelib/ncbiobj.hpp>
  43. #include <corelib/ncbiutil.hpp>
  44. #include <serial/serialdef.hpp>
  45. #include <serial/typeinfo.hpp>
  46. #include <util/strbuffer.hpp>
  47. #include <serial/objlist.hpp>
  48. #include <serial/objstack.hpp>
  49. #include <serial/objhook.hpp>
  50. #include <serial/hookdatakey.hpp>
  51. #include <serial/pathhook.hpp>
  52. /** @addtogroup ObjStreamSupport
  53.  *
  54.  * @{
  55.  */
  56. struct asnio;
  57. BEGIN_NCBI_SCOPE
  58. class CMemberId;
  59. class CItemsInfo;
  60. class CItemInfo;
  61. class CMemberInfo;
  62. class CVariantInfo;
  63. class CDelayBuffer;
  64. class CByteSource;
  65. class CByteSourceReader;
  66. class CObjectInfo;
  67. class CObjectInfoMI;
  68. class CClassTypeInfo;
  69. class CChoiceTypeInfo;
  70. class CContainerTypeInfo;
  71. class CObjectStreamCopier;
  72. class CAliasTypeInfo;
  73. class CReadObjectHook;
  74. class CReadClassMemberHook;
  75. class CReadChoiceVariantHook;
  76. class CSkipObjectHook;
  77. class CSkipClassMemberHook;
  78. class CSkipChoiceVariantHook;
  79. class CReadObjectInfo;
  80. class CReadObjectList;
  81. class CPackString;
  82. class NCBI_XSERIAL_EXPORT CObjectIStream : public CObjectStack
  83. {
  84. public:
  85.     // typedefs
  86.     typedef size_t TObjectIndex;
  87.     // open methods
  88.     virtual void Open(CByteSourceReader& reader);
  89.     void Open(CByteSource& source);
  90.     void Open(CNcbiIstream& inStream, bool deleteInStream = false);
  91.     void Close(void);
  92.     void ResetLocalHooks(void);
  93.     static CObjectIStream* Open(ESerialDataFormat format,
  94.                                 CNcbiIstream& inStream,
  95.                                 bool deleteInStream = false);
  96.     static CObjectIStream* Open(ESerialDataFormat format,
  97.                                 const string& fileName,
  98.                                 TSerialOpenFlags openFlags = 0);
  99.     static CObjectIStream* Open(const string& fileName,
  100.                                 ESerialDataFormat format);
  101.     bool DetectLoops(void) const;
  102.     // when enabled, stream verifies data on input
  103.     // and throws CSerialException with eFormatError err.code
  104.     // for this particular stream
  105.     void SetVerifyData(ESerialVerifyData verify);
  106.     ESerialVerifyData GetVerifyData(void) const;
  107.     // for streams created by the current thread
  108.     static  void SetVerifyDataThread(ESerialVerifyData verify);
  109.     // for streams created by the current process
  110.     static  void SetVerifyDataGlobal(ESerialVerifyData verify);
  111.     // for this particular stream
  112.     void SetSkipUnknownMembers(ESerialSkipUnknown skip);
  113.     ESerialSkipUnknown GetSkipUnknownMembers(void);
  114.     // for streams created by the current thread
  115.     static  void SetSkipUnknownThread(ESerialSkipUnknown skip);
  116.     // for streams created by the current process
  117.     static  void SetSkipUnknownGlobal(ESerialSkipUnknown skip);
  118.     // constructors
  119. protected:
  120.     CObjectIStream(ESerialDataFormat format);
  121.     CObjectIStream(CNcbiIstream& in, bool deleteIn = false);
  122. public:
  123.     virtual ~CObjectIStream(void);
  124.     // get data format
  125.     ESerialDataFormat GetDataFormat(void) const;
  126.     // USER INTERFACE
  127.     // root reader
  128.     void Read(const CObjectInfo& object);
  129.     void Read(TObjectPtr object, TTypeInfo type);
  130.     CObjectInfo Read(const CObjectTypeInfo& type);
  131.     CObjectInfo Read(TTypeInfo type);
  132.     void Skip(const CObjectTypeInfo& type);
  133.     void Skip(TTypeInfo type);
  134.     // file header readers
  135.     virtual string ReadFileHeader(void);
  136.     void SkipFileHeader(TTypeInfo typeInfo);
  137.     virtual string PeekNextTypeName(void);
  138.     enum ENoFileHeader {
  139.         eNoFileHeader
  140.     };
  141.     void Read(const CObjectInfo& object, ENoFileHeader noFileHeader);
  142.     void Read(TObjectPtr object, TTypeInfo type, ENoFileHeader noFileHeader);
  143.     void Skip(TTypeInfo type, ENoFileHeader noFileHeader);
  144.     // subtree reader
  145.     void ReadObject(const CObjectInfo& object);
  146.     void ReadObject(TObjectPtr object, TTypeInfo typeInfo);
  147.     void SkipObject(const CObjectTypeInfo& objectType);
  148.     void SkipObject(TTypeInfo typeInfo);
  149.     // temporary reader
  150.     void ReadSeparateObject(const CObjectInfo& object);
  151.     // member
  152.     void ReadClassMember(const CObjectInfoMI& member);
  153.     // variant
  154.     void ReadChoiceVariant(const CObjectInfoCV& object);
  155.     // END OF USER INTERFACE
  156.     // internal reader
  157.     void ReadExternalObject(TObjectPtr object, TTypeInfo typeInfo);
  158.     void SkipExternalObject(TTypeInfo typeInfo);
  159.     CObjectInfo ReadObject(void);
  160.     virtual void EndOfRead(void);
  161.     
  162.     // try to read enum value name, "" if none
  163.     virtual TEnumValueType ReadEnum(const CEnumeratedTypeValues& values) = 0;
  164.     // std C types readers
  165.     // bool
  166.     void ReadStd(bool& data);
  167.     void SkipStd(const bool &);
  168.     // char
  169.     void ReadStd(char& data);
  170.     void SkipStd(const char& );
  171.     // integer numbers
  172.     void ReadStd(signed char& data);
  173.     void ReadStd(unsigned char& data);
  174.     void SkipStd(const signed char& );
  175.     void SkipStd(const unsigned char& );
  176.     void ReadStd(short& data);
  177.     void ReadStd(unsigned short& data);
  178.     void SkipStd(const short& );
  179.     void SkipStd(const unsigned short& );
  180.     void ReadStd(int& data);
  181.     void ReadStd(unsigned& data);
  182.     void SkipStd(const int& );
  183.     void SkipStd(const unsigned& );
  184. #if SIZEOF_LONG == 4
  185.     void ReadStd(long& data);
  186.     void ReadStd(unsigned long& data);
  187.     void SkipStd(const long& );
  188.     void SkipStd(const unsigned long& );
  189. #endif
  190.     void ReadStd(Int8& data);
  191.     void ReadStd(Uint8& data);
  192.     void SkipStd(const Int8& );
  193.     void SkipStd(const Uint8& );
  194.     // float numbers
  195.     void ReadStd(float& data);
  196.     void ReadStd(double& data);
  197.     void SkipStd(const float& );
  198.     void SkipStd(const double& );
  199. #if SIZEOF_LONG_DOUBLE != 0
  200.     virtual void ReadStd(long double& data);
  201.     virtual void SkipStd(const long double& );
  202. #endif
  203.     // string
  204.     void ReadStd(string& data);
  205.     void SkipStd(const string& );
  206.     void ReadStd(CStringUTF8& data);
  207.     void SkipStd(CStringUTF8& data);
  208.     // C string
  209.     void ReadStd(char* & data);
  210.     void ReadStd(const char* & data);
  211.     void SkipStd(char* const& );
  212.     void SkipStd(const char* const& );
  213.     // primitive readers
  214.     // bool
  215.     virtual bool ReadBool(void) = 0;
  216.     virtual void SkipBool(void) = 0;
  217.     // char
  218.     virtual char ReadChar(void) = 0;
  219.     virtual void SkipChar(void) = 0;
  220.     // integer numbers
  221.     virtual Int1 ReadInt1(void);
  222.     virtual Uint1 ReadUint1(void);
  223.     virtual Int2 ReadInt2(void);
  224.     virtual Uint2 ReadUint2(void);
  225.     virtual Int4 ReadInt4(void);
  226.     virtual Uint4 ReadUint4(void);
  227.     virtual Int8 ReadInt8(void) = 0;
  228.     virtual Uint8 ReadUint8(void) = 0;
  229.     virtual void SkipInt1(void);
  230.     virtual void SkipUint1(void);
  231.     virtual void SkipInt2(void);
  232.     virtual void SkipUint2(void);
  233.     virtual void SkipInt4(void);
  234.     virtual void SkipUint4(void);
  235.     virtual void SkipInt8(void);
  236.     virtual void SkipUint8(void);
  237.     virtual void SkipSNumber(void) = 0;
  238.     virtual void SkipUNumber(void) = 0;
  239.     // float numbers
  240.     virtual float ReadFloat(void);
  241.     virtual double ReadDouble(void) = 0;
  242.     virtual void SkipFloat(void);
  243.     virtual void SkipDouble(void);
  244. #if SIZEOF_LONG_DOUBLE != 0
  245.     virtual long double ReadLDouble(void);
  246.     virtual void SkipLDouble(void);
  247. #endif
  248.     virtual void SkipFNumber(void) = 0;
  249.     // string
  250.     virtual void ReadString(string& s,
  251.                             EStringType type = eStringTypeVisible) = 0;
  252.     virtual void ReadString(string& s,
  253.                             CPackString& pack_string,
  254.                             EStringType type = eStringTypeVisible);
  255.     virtual void SkipString(EStringType type = eStringTypeVisible) = 0;
  256.     // StringStore
  257.     virtual void ReadStringStore(string& s);
  258.     virtual void SkipStringStore(void);
  259.     
  260.     // C string
  261.     virtual char* ReadCString(void);
  262.     virtual void SkipCString(void);
  263.     // null
  264.     virtual void ReadNull(void) = 0;
  265.     virtual void SkipNull(void) = 0;
  266.     // any content object
  267.     virtual void ReadAnyContentObject(CAnyContentObject& obj) = 0;
  268.     virtual void SkipAnyContentObject(void) = 0;
  269.     // octet string
  270.     virtual void SkipByteBlock(void) = 0;
  271.     // reads type info
  272.     virtual pair<TObjectPtr, TTypeInfo> ReadPointer(TTypeInfo declaredType);
  273.     enum EPointerType {
  274.         eNullPointer,
  275.         eObjectPointer,
  276.         eThisPointer,
  277.         eOtherPointer
  278.     };
  279.     void SkipPointer(TTypeInfo declaredType);
  280.     // low level readers:
  281.     enum EFailFlags {
  282.         fNoError       = 0,             eNoError     = fNoError,
  283.         fEOF           = 1 << 0,        eEOF         = fEOF,
  284.         fReadError     = 1 << 1,        eReadError   = fReadError,
  285.         fFormatError   = 1 << 2,        eFormatError = fFormatError,
  286.         fOverflow      = 1 << 3,        eOverflow    = fOverflow,
  287.         fInvalidData   = 1 << 4,        eInvalidData = fInvalidData,
  288.         fIllegalCall   = 1 << 5,        eIllegalCall = fIllegalCall,
  289.         fFail          = 1 << 6,        eFail        = fFail,
  290.         fNotOpen       = 1 << 7,        eNotOpen     = fNotOpen,
  291.         fMissingValue  = 1 << 8,        eMissingValue= fMissingValue
  292.     };
  293.     typedef int TFailFlags;
  294.     bool fail(void) const;
  295.     TFailFlags GetFailFlags(void) const;
  296.     TFailFlags SetFailFlags(TFailFlags flags, const char* message);
  297.     TFailFlags ClearFailFlags(TFailFlags flags);
  298.     bool InGoodState(void);
  299.     virtual string GetStackTrace(void) const;
  300.     virtual string GetPosition(void) const;
  301.     size_t GetStreamOffset(void) const;
  302.     void   SetStreamOffset(size_t pos);
  303.     void ThrowError1(const char* file, int line,
  304.                      TFailFlags fail, const char* message);
  305.     void ThrowError1(const char* file, int line,
  306.                      TFailFlags fail, const string& message);
  307. #define ThrowError(flag, mess) ThrowError1(__FILE__, __LINE__,flag,mess)
  308.     enum EFlags {
  309.         fFlagNone                = 0,
  310.         eFlagNone                = fFlagNone,
  311.         fFlagAllowNonAsciiChars  = 1 << 0,
  312.         eFlagAllowNonAsciiChars  = fFlagAllowNonAsciiChars
  313.     };
  314.     typedef int TFlags;
  315.     TFlags GetFlags(void) const;
  316.     TFlags SetFlags(TFlags flags);
  317.     TFlags ClearFlags(TFlags flags);
  318.     class ByteBlock
  319.     {
  320.     public:
  321.         ByteBlock(CObjectIStream& in);
  322.         ~ByteBlock(void);
  323.         void End(void);
  324.         CObjectIStream& GetStream(void) const;
  325.         size_t Read(void* dst, size_t length, bool forceLength = false);
  326.         bool KnownLength(void) const;
  327.         size_t GetExpectedLength(void) const;
  328.         void SetLength(size_t length);
  329.         void EndOfBlock(void);
  330.         
  331.     private:
  332.         CObjectIStream& m_Stream;
  333.         bool m_KnownLength;
  334.         bool m_Ended;
  335.         size_t m_Length;
  336.         friend class CObjectIStream;
  337.     };
  338.     class CharBlock
  339.     {
  340.     public:
  341.         CharBlock(CObjectIStream& in);
  342.         ~CharBlock(void);
  343.         void End(void);
  344.         CObjectIStream& GetStream(void) const;
  345.         size_t Read(char* dst, size_t length, bool forceLength = false);
  346.         bool KnownLength(void) const;
  347.         size_t GetExpectedLength(void) const;
  348.         void SetLength(size_t length);
  349.         void EndOfBlock(void);
  350.         
  351.     private:
  352.         CObjectIStream& m_Stream;
  353.         bool m_KnownLength;
  354.         bool m_Ended;
  355.         size_t m_Length;
  356.         friend class CObjectIStream;
  357.     };
  358. #if HAVE_NCBI_C
  359.     // ASN.1 interface
  360.     class AsnIo
  361.     {
  362.     public:
  363.         AsnIo(CObjectIStream& in, const string& rootTypeName);
  364.         ~AsnIo(void);
  365.         void End(void);
  366.         CObjectIStream& GetStream(void) const;
  367.         size_t Read(char* data, size_t length);
  368.         
  369.         operator asnio*(void);
  370.         asnio* operator->(void);
  371.         const string& GetRootTypeName(void) const;
  372.     private:
  373.         CObjectIStream& m_Stream;
  374.         bool m_Ended;
  375.         string m_RootTypeName;
  376.         asnio* m_AsnIo;
  377.         
  378.     public:
  379.         size_t m_Count;
  380.     };
  381.     friend class AsnIo;
  382. public:
  383. #endif
  384.     
  385.     // mid level I/O
  386.     // named type
  387.     MLIOVIR void ReadNamedType(TTypeInfo namedTypeInfo,
  388.                                TTypeInfo typeInfo, TObjectPtr object);
  389.     MLIOVIR void SkipNamedType(TTypeInfo namedTypeInfo,
  390.                                TTypeInfo typeInfo);
  391.     // container
  392.     MLIOVIR void ReadContainer(const CContainerTypeInfo* containerType,
  393.                                TObjectPtr containerPtr);
  394.     MLIOVIR void SkipContainer(const CContainerTypeInfo* containerType);
  395.     
  396.     // class
  397.     MLIOVIR void ReadClassSequential(const CClassTypeInfo* classType,
  398.                                      TObjectPtr classPtr);
  399.     MLIOVIR void ReadClassRandom(const CClassTypeInfo* classType,
  400.                                  TObjectPtr classPtr);
  401.     MLIOVIR void SkipClassSequential(const CClassTypeInfo* classType);
  402.     MLIOVIR void SkipClassRandom(const CClassTypeInfo* classType);
  403.     // choice
  404.     MLIOVIR void ReadChoice(const CChoiceTypeInfo* choiceType,
  405.                             TObjectPtr choicePtr);
  406.     MLIOVIR void SkipChoice(const CChoiceTypeInfo* choiceType);
  407.     // alias
  408.     MLIOVIR void ReadAlias(const CAliasTypeInfo* aliasType,
  409.                            TObjectPtr aliasPtr);
  410.     MLIOVIR void SkipAlias(const CAliasTypeInfo* aliasType);
  411.     // low level I/O
  412.     // named type (alias)
  413.     virtual void BeginNamedType(TTypeInfo namedTypeInfo);
  414.     virtual void EndNamedType(void);
  415.     // container
  416.     virtual void BeginContainer(const CContainerTypeInfo* containerType) = 0;
  417.     virtual void EndContainer(void) = 0;
  418.     virtual bool BeginContainerElement(TTypeInfo elementType) = 0;
  419.     virtual void EndContainerElement(void);
  420.     // class
  421.     virtual void BeginClass(const CClassTypeInfo* classInfo) = 0;
  422.     virtual void EndClass(void);
  423.     virtual TMemberIndex BeginClassMember(const CClassTypeInfo* classType) = 0;
  424.     virtual TMemberIndex BeginClassMember(const CClassTypeInfo* classType,
  425.                                           TMemberIndex pos) = 0;
  426.     virtual void EndClassMember(void);
  427.     virtual void UndoClassMember(void) {}
  428.     // choice
  429.     virtual void BeginChoice(const CChoiceTypeInfo* choiceType);
  430.     virtual void EndChoice(void);
  431.     virtual TMemberIndex BeginChoiceVariant(const CChoiceTypeInfo* choiceType) = 0;
  432.     virtual void EndChoiceVariant(void);
  433.     // byte block
  434.     virtual void BeginBytes(ByteBlock& block) = 0;
  435.     virtual size_t ReadBytes(ByteBlock& block, char* buffer, size_t count) = 0;
  436.     virtual void EndBytes(const ByteBlock& block);
  437.     // char block
  438.     virtual void BeginChars(CharBlock& block) = 0;
  439.     virtual size_t ReadChars(CharBlock& block, char* buffer, size_t count) = 0;
  440.     virtual void EndChars(const CharBlock& block);
  441.     // report error about unended block
  442.     void Unended(const string& msg);
  443.     // report error about unended object stack frame
  444.     virtual void UnendedFrame(void);
  445.     void SetPathReadObjectHook( const string& path, CReadObjectHook*        hook);
  446.     void SetPathSkipObjectHook( const string& path, CSkipObjectHook*        hook);
  447.     void SetPathReadMemberHook( const string& path, CReadClassMemberHook*   hook);
  448.     void SetPathSkipMemberHook( const string& path, CSkipClassMemberHook*   hook);
  449.     void SetPathReadVariantHook(const string& path, CReadChoiceVariantHook* hook);
  450.     void SetPathSkipVariantHook(const string& path, CSkipChoiceVariantHook* hook);
  451.     // report error about class members
  452.     void DuplicatedMember(const CMemberInfo* memberInfo);
  453.     void ExpectedMember(const CMemberInfo* memberInfo);
  454.     void StartDelayBuffer(void);
  455.     CRef<CByteSource> EndDelayBuffer(void);
  456.     void EndDelayBuffer(CDelayBuffer& buffer,
  457.                         const CItemInfo* itemInfo, TObjectPtr objectPtr);
  458.     void SetDiscardCurrObject(bool discard=true)
  459.         {m_DiscardCurrObject = discard;}
  460.     bool GetDiscardCurrObject(void) const
  461.         {return m_DiscardCurrObject;}
  462.     bool HaveMoreData(void);
  463. protected:
  464.     friend class CObjectStreamCopier;
  465.     // low level readers
  466.     pair<TObjectPtr, TTypeInfo> ReadObjectInfo(void);
  467.     virtual EPointerType ReadPointerType(void) = 0;
  468.     virtual TObjectIndex ReadObjectPointer(void) = 0;
  469.     virtual string ReadOtherPointer(void) = 0;
  470.     virtual void ReadOtherPointerEnd(void);
  471.     void RegisterObject(TTypeInfo typeInfo);
  472.     void RegisterObject(TObjectPtr object, TTypeInfo typeInfo);
  473.     const CReadObjectInfo& GetRegisteredObject(TObjectIndex index);
  474.     virtual void x_SetPathHooks(bool set);
  475. public:
  476.     // open helpers
  477.     static CObjectIStream* Create(ESerialDataFormat format);
  478.     static CObjectIStream* Create(ESerialDataFormat format,
  479.                                   CByteSource& source);
  480.     static CObjectIStream* Create(ESerialDataFormat format,
  481.                                   CByteSourceReader& reader);
  482. private:
  483.     static CRef<CByteSource> GetSource(ESerialDataFormat format,
  484.                                        const string& fileName,
  485.                                        TSerialOpenFlags openFlags = 0);
  486.     static CRef<CByteSource> GetSource(CNcbiIstream& inStream,
  487.                                        bool deleteInStream = false);
  488.     static CObjectIStream* CreateObjectIStreamAsn(void);
  489.     static CObjectIStream* CreateObjectIStreamAsnBinary(void);
  490.     static CObjectIStream* CreateObjectIStreamXml(void);
  491. protected:
  492.     CIStreamBuffer m_Input;
  493.     bool m_DiscardCurrObject;
  494.     ESerialDataFormat   m_DataFormat;
  495.     
  496. private:
  497.     ESerialVerifyData   m_VerifyData;
  498.     static ESerialVerifyData ms_VerifyDataDefault;
  499.     static ESerialVerifyData x_GetVerifyDataDefault(void);
  500.     ESerialSkipUnknown m_SkipUnknown;
  501.     static ESerialSkipUnknown ms_SkipUnknownDefault;
  502.     static ESerialSkipUnknown x_GetSkipUnknownDefault(void);
  503.     AutoPtr<CReadObjectList> m_Objects;
  504.     TFailFlags m_Fail;
  505.     TFlags m_Flags;
  506.     CStreamObjectPathHook<CReadObjectHook*>                m_PathReadObjectHooks;
  507.     CStreamObjectPathHook<CSkipObjectHook*>                m_PathSkipObjectHooks;
  508.     CStreamPathHook<CMemberInfo*, CReadClassMemberHook*>   m_PathReadMemberHooks;
  509.     CStreamPathHook<CMemberInfo*, CSkipClassMemberHook*>   m_PathSkipMemberHooks;
  510.     CStreamPathHook<CVariantInfo*,CReadChoiceVariantHook*> m_PathReadVariantHooks;
  511.     CStreamPathHook<CVariantInfo*,CSkipChoiceVariantHook*> m_PathSkipVariantHooks;
  512. public:
  513.     // hook support
  514.     CLocalHookSet<CReadObjectHook> m_ObjectHookKey;
  515.     CLocalHookSet<CReadClassMemberHook> m_ClassMemberHookKey;
  516.     CLocalHookSet<CReadChoiceVariantHook> m_ChoiceVariantHookKey;
  517.     CLocalHookSet<CSkipObjectHook> m_ObjectSkipHookKey;
  518.     CLocalHookSet<CSkipClassMemberHook> m_ClassMemberSkipHookKey;
  519.     CLocalHookSet<CSkipChoiceVariantHook> m_ChoiceVariantSkipHookKey;
  520. };
  521. inline
  522. bool GoodVisibleChar(char c);
  523. char ReplaceVisibleChar(char c, EFixNonPrint fix_method, size_t at_line);
  524. inline
  525. void FixVisibleChar(char& c, EFixNonPrint fix_method, size_t at_line = 0);
  526. /// Guard class for CObjectIStream::StartDelayBuffer/EndDelayBuffer
  527. ///
  528. /// CObjectIStream::StartDelayBuffer() should be follwed by 
  529. /// CObjectIStream::EndDelayBuffer() call. If it's not called we have a delay 
  530. /// buffer leak. This class works as an guard (or auto pointer) to avoid call
  531. /// leaks.
  532. class NCBI_XSERIAL_EXPORT CStreamDelayBufferGuard 
  533. {
  534. public:
  535.     /// Construct instance on a given CObjectIStream object.
  536.     /// Call istr.StartDelayBuffer()
  537.     ///
  538.     /// @param istr  guard protected instance
  539.     CStreamDelayBufferGuard(CObjectIStream& istr);
  540.     ~CStreamDelayBufferGuard();
  541.     /// Redirect call to protected CObjectIStream
  542.     /// After this call guarding is finished.
  543.     CRef<CByteSource> EndDelayBuffer(void);
  544.     /// Redirect call to protected CObjectIStream
  545.     /// After this call guarding is finished.
  546.     void EndDelayBuffer(CDelayBuffer&    buffer,
  547.                         const CItemInfo* itemInfo, 
  548.                         TObjectPtr       objectPtr);
  549.     
  550. private:
  551.     CStreamDelayBufferGuard(const CStreamDelayBufferGuard&);
  552.     CStreamDelayBufferGuard& operator=(const CStreamDelayBufferGuard& );
  553. private:
  554.     CObjectIStream*  m_ObjectIStream;
  555. };
  556. /* @} */
  557. #include <serial/objistr.inl>
  558. END_NCBI_SCOPE
  559. #endif  /* OBJISTR__HPP */
  560. /* ---------------------------------------------------------------------------
  561. * $Log: objistr.hpp,v $
  562. * Revision 1000.5  2004/06/01 19:38:53  gouriano
  563. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.103
  564. *
  565. * Revision 1.103  2004/04/30 13:28:40  gouriano
  566. * Remove obsolete function declarations
  567. *
  568. * Revision 1.102  2004/03/23 15:39:52  gouriano
  569. * Added setup options for skipping unknown data members
  570. *
  571. * Revision 1.101  2004/03/05 20:28:37  gouriano
  572. * make it possible to skip unknown data fields
  573. *
  574. * Revision 1.100  2004/02/09 18:21:52  gouriano
  575. * enforced checking environment vars when setting initialization
  576. * verification parameters
  577. *
  578. * Revision 1.99  2004/01/22 20:47:25  gouriano
  579. * Added new exception error code (eMissingValue)
  580. *
  581. * Revision 1.98  2004/01/05 14:24:08  gouriano
  582. * Added possibility to set serialization hooks by stack path
  583. *
  584. * Revision 1.97  2003/12/31 21:02:20  gouriano
  585. * added possibility to seek (when possible) in CObjectIStream
  586. *
  587. * Revision 1.96  2003/11/26 19:59:37  vasilche
  588. * GetPosition() and GetDataFormat() methods now are implemented
  589. * in parent classes CObjectIStream and CObjectOStream to avoid
  590. * pure virtual method call in destructors.
  591. *
  592. * Revision 1.95  2003/11/19 15:42:09  vasilche
  593. * Added CObjectIStream::HaveMoreData().
  594. *
  595. * Revision 1.94  2003/11/13 14:06:45  gouriano
  596. * Elaborated data verification on read/write/get to enable skipping mandatory class data members
  597. *
  598. * Revision 1.93  2003/10/21 21:08:45  grichenk
  599. * Fixed aliases-related bug in XML stream
  600. *
  601. * Revision 1.92  2003/09/30 16:10:34  vasilche
  602. * Added one more variant of object streams creation.
  603. *
  604. * Revision 1.91  2003/09/25 12:39:08  kuznets
  605. * Added dllexport for CStreamDelayBufferGuard
  606. *
  607. * Revision 1.90  2003/09/24 20:55:13  kuznets
  608. * Implemented CStreamDelayBufferGuard
  609. *
  610. * Revision 1.89  2003/09/16 14:49:15  gouriano
  611. * Enhanced AnyContent objects to support XML namespaces and attribute info items.
  612. *
  613. * Revision 1.88  2003/09/10 20:57:23  gouriano
  614. * added possibility to ignore missing mandatory members on reading
  615. *
  616. * Revision 1.87  2003/08/26 19:24:48  gouriano
  617. * added possibility to discard a member of an STL container
  618. * (from a read hook)
  619. *
  620. * Revision 1.86  2003/08/19 18:32:37  vasilche
  621. * Optimized reading and writing strings.
  622. * Avoid string reallocation when checking char values.
  623. * Try to reuse old string data when string reference counting is not working.
  624. *
  625. * Revision 1.85  2003/08/13 15:47:02  gouriano
  626. * implemented serialization of AnyContent objects
  627. *
  628. * Revision 1.84  2003/07/29 18:47:46  vasilche
  629. * Fixed thread safeness of object stream hooks.
  630. *
  631. * Revision 1.83  2003/05/22 20:08:41  gouriano
  632. * added UTF8 strings
  633. *
  634. * Revision 1.82  2003/05/15 17:45:25  gouriano
  635. * added GetStreamOffset method
  636. *
  637. * Revision 1.81  2003/04/15 16:18:20  siyan
  638. * Added doxygen support
  639. *
  640. * Revision 1.80  2003/03/10 18:52:37  gouriano
  641. * use new structured exceptions (based on CException)
  642. *
  643. * Revision 1.79  2003/01/28 15:26:23  vasilche
  644. * Added low level CObjectIStream::EndDelayBuffer(void);
  645. *
  646. * Revision 1.78  2002/12/23 18:38:51  dicuccio
  647. * Added WIn32 export specifier: NCBI_XSERIAL_EXPORT.
  648. * Moved all CVS logs to the end.
  649. *
  650. * Revision 1.77  2002/12/13 21:51:05  gouriano
  651. * corrected reading of choices
  652. *
  653. * Revision 1.76  2002/12/12 21:10:26  gouriano
  654. * implemented handling of complex XML containers
  655. *
  656. * Revision 1.75  2002/11/14 20:49:52  gouriano
  657. * added BeginChoice/EndChoice methods
  658. *
  659. * Revision 1.74  2002/11/04 21:28:59  grichenk
  660. * Fixed usage of const CRef<> and CRef<> constructor
  661. *
  662. * Revision 1.73  2002/10/25 14:49:29  vasilche
  663. * NCBI C Toolkit compatibility code extracted to libxcser library.
  664. * Serial streams flags names were renamed to fXxx.
  665. *
  666. * Names of flags
  667. *
  668. * Revision 1.72  2002/10/15 13:45:15  gouriano
  669. * added "UndoClassMember" function
  670. *
  671. * Revision 1.71  2002/09/09 18:13:59  grichenk
  672. * Added CObjectHookGuard class.
  673. * Added methods to be used by hooks for data
  674. * reading and skipping.
  675. *
  676. * Revision 1.70  2001/10/17 20:41:19  grichenk
  677. * Added CObjectOStream::CharBlock class
  678. *
  679. * Revision 1.69  2001/07/17 14:52:39  kholodov
  680. * Fixed: replaced int argument by size_t in CheckVisibleChar() and
  681. * ReplaceVisibleChar to avoid truncation in 64 bit mode.
  682. *
  683. * Revision 1.68  2001/06/11 14:34:55  grichenk
  684. * Added support for numeric tags in ASN.1 specifications and data streams.
  685. *
  686. * Revision 1.67  2001/06/07 17:12:46  grichenk
  687. * Redesigned checking and substitution of non-printable characters
  688. * in VisibleString
  689. *
  690. * Revision 1.66  2001/05/17 14:59:11  lavr
  691. * Typos corrected
  692. *
  693. * Revision 1.65  2001/05/16 17:55:33  grichenk
  694. * Redesigned support for non-blocking stream read operations
  695. *
  696. * Revision 1.64  2001/05/11 20:41:11  grichenk
  697. * Added support for non-blocking stream reading
  698. *
  699. * Revision 1.63  2001/01/05 20:10:35  vasilche
  700. * CByteSource, CIStrBuffer, COStrBuffer, CLightString, CChecksum, CWeakMap
  701. * were moved to util.
  702. *
  703. * Revision 1.62  2001/01/05 13:57:18  vasilche
  704. * Fixed overloaded method ambiguity on Mac.
  705. *
  706. * Revision 1.61  2000/12/26 22:23:44  vasilche
  707. * Fixed errors of compilation on Mac.
  708. *
  709. * Revision 1.60  2000/12/26 17:26:09  vasilche
  710. * Added one more Read() interface method.
  711. *
  712. * Revision 1.59  2000/12/15 21:28:46  vasilche
  713. * Moved some typedefs/enums from corelib/ncbistd.hpp.
  714. * Added flags to CObjectIStream/CObjectOStream: eFlagAllowNonAsciiChars.
  715. * TByte typedef replaced by Uint1.
  716. *
  717. * Revision 1.58  2000/12/15 15:37:59  vasilche
  718. * Added support of Int8 and long double.
  719. * Enum values now have type Int4 instead of long.
  720. *
  721. * Revision 1.57  2000/10/20 19:29:15  vasilche
  722. * Adapted for MSVC which doesn't like explicit operator templates.
  723. *
  724. * Revision 1.56  2000/10/20 15:51:26  vasilche
  725. * Fixed data error processing.
  726. * Added interface for constructing container objects directly into output stream.
  727. * object.hpp, object.inl and object.cpp were split to
  728. * objectinfo.*, objecttype.*, objectiter.* and objectio.*.
  729. *
  730. * Revision 1.55  2000/10/17 18:45:24  vasilche
  731. * Added possibility to turn off object cross reference detection in
  732. * CObjectIStream and CObjectOStream.
  733. *
  734. * Revision 1.54  2000/10/13 20:59:12  vasilche
  735. * Avoid using of ssize_t absent on some compilers.
  736. *
  737. * Revision 1.53  2000/10/13 20:22:46  vasilche
  738. * Fixed warnings on 64 bit compilers.
  739. * Fixed missing typename in templates.
  740. *
  741. * Revision 1.52  2000/10/13 16:28:31  vasilche
  742. * Reduced header dependency.
  743. * Avoid use of templates with virtual methods.
  744. * Reduced amount of different maps used.
  745. * All this lead to smaller compiled code size (libraries and programs).
  746. *
  747. * Revision 1.51  2000/10/03 17:22:34  vasilche
  748. * Reduced header dependency.
  749. * Reduced size of debug libraries on WorkShop by 3 times.
  750. * Fixed tag allocation for parent classes.
  751. * Fixed CObject allocation/deallocation in streams.
  752. * Moved instantiation of several templates in separate source file.
  753. *
  754. * Revision 1.50  2000/09/29 16:18:13  vasilche
  755. * Fixed binary format encoding/decoding on 64 bit compulers.
  756. * Implemented CWeakMap<> for automatic cleaning map entries.
  757. * Added cleaning local hooks via CWeakMap<>.
  758. * Renamed ReadTypeName -> ReadFileHeader, ENoTypeName -> ENoFileHeader.
  759. * Added some user interface methods to CObjectIStream, CObjectOStream and
  760. * CObjectStreamCopier.
  761. *
  762. * Revision 1.49  2000/09/18 20:00:04  vasilche
  763. * Separated CVariantInfo and CMemberInfo.
  764. * Implemented copy hooks.
  765. * All hooks now are stored in CTypeInfo/CMemberInfo/CVariantInfo.
  766. * Most type specific functions now are implemented via function pointers instead of virtual functions.
  767. *
  768. * Revision 1.48  2000/09/01 13:16:00  vasilche
  769. * Implemented class/container/choice iterators.
  770. * Implemented CObjectStreamCopier for copying data without loading into memory.
  771. *
  772. * Revision 1.47  2000/08/15 19:44:40  vasilche
  773. * Added Read/Write hooks:
  774. * CReadObjectHook/CWriteObjectHook for objects of specified type.
  775. * CReadClassMemberHook/CWriteClassMemberHook for specified members.
  776. * CReadChoiceVariantHook/CWriteChoiceVariant for specified choice variants.
  777. * CReadContainerElementHook/CWriteContainerElementsHook for containers.
  778. *
  779. * Revision 1.46  2000/07/03 18:42:35  vasilche
  780. * Added interface to typeinfo via CObjectInfo and CConstObjectInfo.
  781. * Reduced header dependency.
  782. *
  783. * Revision 1.45  2000/06/16 20:01:20  vasilche
  784. * Avoid use of unexpected_exception() which is unimplemented on Mac.
  785. *
  786. * Revision 1.44  2000/06/16 16:31:06  vasilche
  787. * Changed implementation of choices and classes info to allow use of the same classes in generated and user written classes.
  788. *
  789. * Revision 1.43  2000/06/07 19:45:42  vasilche
  790. * Some code cleaning.
  791. * Macros renaming in more clear way.
  792. * BEGIN_NAMED_*_INFO, ADD_*_MEMBER, ADD_NAMED_*_MEMBER.
  793. *
  794. * Revision 1.42  2000/06/01 19:06:56  vasilche
  795. * Added parsing of XML data.
  796. *
  797. * Revision 1.41  2000/05/24 20:08:13  vasilche
  798. * Implemented XML dump.
  799. *
  800. * Revision 1.40  2000/05/09 16:38:33  vasilche
  801. * CObject::GetTypeInfo now moved to CObjectGetTypeInfo::GetTypeInfo to reduce possible errors.
  802. * Added write context to CObjectOStream.
  803. * Inlined most of methods of helping class Member, Block, ByteBlock etc.
  804. *
  805. * Revision 1.39  2000/05/04 16:22:23  vasilche
  806. * Cleaned and optimized blocks and members.
  807. *
  808. * Revision 1.38  2000/04/28 16:58:02  vasilche
  809. * Added classes CByteSource and CByteSourceReader for generic reading.
  810. * Added delayed reading of choice variants.
  811. *
  812. * Revision 1.37  2000/04/13 14:50:17  vasilche
  813. * Added CObjectIStream::Open() and CObjectOStream::Open() for easier use.
  814. *
  815. * Revision 1.36  2000/04/06 16:10:50  vasilche
  816. * Fixed bug with iterators in choices.
  817. * Removed unneeded calls to ReadExternalObject/WriteExternalObject.
  818. * Added output buffering to text ASN.1 data.
  819. *
  820. * Revision 1.35  2000/03/14 14:43:29  vasilche
  821. * Fixed error reporting.
  822. *
  823. * Revision 1.34  2000/03/07 14:05:30  vasilche
  824. * Added stream buffering to ASN.1 binary input.
  825. * Optimized class loading/storing.
  826. * Fixed bugs in processing OPTIONAL fields.
  827. *
  828. * Revision 1.33  2000/01/10 20:04:07  vasilche
  829. * Fixed duplicate name.
  830. *
  831. * Revision 1.32  2000/01/10 19:46:31  vasilche
  832. * Fixed encoding/decoding of REAL type.
  833. * Fixed encoding/decoding of StringStore.
  834. * Fixed encoding/decoding of NULL type.
  835. * Fixed error reporting.
  836. * Reduced object map (only classes).
  837. *
  838. * Revision 1.31  2000/01/05 19:43:44  vasilche
  839. * Fixed error messages when reading from ASN.1 binary file.
  840. * Fixed storing of integers with enumerated values in ASN.1 binary file.
  841. * Added TAG support to key/value of map.
  842. * Added support of NULL variant in CHOICE.
  843. *
  844. * Revision 1.30  1999/12/20 15:29:31  vasilche
  845. * Fixed bug with old ASN structures.
  846. *
  847. * Revision 1.29  1999/12/17 19:04:53  vasilche
  848. * Simplified generation of GetTypeInfo methods.
  849. *
  850. * Revision 1.28  1999/10/18 20:11:15  vasilche
  851. * Enum values now have long type.
  852. * Fixed template generation for enums.
  853. *
  854. * Revision 1.27  1999/10/04 16:22:08  vasilche
  855. * Fixed bug with old ASN.1 structures.
  856. *
  857. * Revision 1.26  1999/09/27 14:17:59  vasilche
  858. * Fixed bug with overloaded constructors of Block.
  859. *
  860. * Revision 1.25  1999/09/24 18:19:13  vasilche
  861. * Removed dependency on NCBI toolkit.
  862. *
  863. * Revision 1.24  1999/09/23 18:56:51  vasilche
  864. * Fixed bugs with overloaded methods in objistr*.hpp & objostr*.hpp
  865. *
  866. * Revision 1.23  1999/09/22 20:11:48  vasilche
  867. * Modified for compilation on IRIX native c++ compiler.
  868. *
  869. * Revision 1.22  1999/09/14 18:54:03  vasilche
  870. * Fixed bugs detected by gcc & egcs.
  871. * Removed unneeded includes.
  872. *
  873. * Revision 1.21  1999/08/16 16:07:43  vasilche
  874. * Added ENUMERATED type.
  875. *
  876. * Revision 1.20  1999/08/13 15:53:43  vasilche
  877. * C++ analog of asntool: datatool
  878. *
  879. * Revision 1.19  1999/07/26 18:31:28  vasilche
  880. * Implemented skipping of unused values.
  881. * Added more useful error report.
  882. *
  883. * Revision 1.18  1999/07/22 20:36:37  vasilche
  884. * Fixed 'using namespace' declaration for MSVC.
  885. *
  886. * Revision 1.17  1999/07/22 17:33:40  vasilche
  887. * Unified reading/writing of objects in all three formats.
  888. *
  889. * Revision 1.16  1999/07/21 14:19:55  vasilche
  890. * Added serialization of bool.
  891. *
  892. * Revision 1.15  1999/07/19 15:50:15  vasilche
  893. * Added interface to old ASN.1 routines.
  894. * Added naming of key/value in STL map.
  895. *
  896. * Revision 1.14  1999/07/15 16:54:42  vasilche
  897. * Implemented vector<X> & vector<char> as special case.
  898. *
  899. * Revision 1.13  1999/07/09 16:32:53  vasilche
  900. * Added OCTET STRING write/read.
  901. *
  902. * Revision 1.12  1999/07/07 21:15:03  vasilche
  903. * Cleaned processing of string types (string, char*, const char*).
  904. *
  905. * Revision 1.11  1999/07/02 21:31:43  vasilche
  906. * Implemented reading from ASN.1 binary format.
  907. *
  908. * Revision 1.10  1999/07/01 17:55:19  vasilche
  909. * Implemented ASN.1 binary write.
  910. *
  911. * Revision 1.9  1999/06/30 16:04:27  vasilche
  912. * Added support for old ASN.1 structures.
  913. *
  914. * Revision 1.8  1999/06/24 14:44:39  vasilche
  915. * Added binary ASN.1 output.
  916. *
  917. * Revision 1.7  1999/06/17 20:42:00  vasilche
  918. * Fixed storing/loading of pointers.
  919. *
  920. * Revision 1.6  1999/06/16 20:35:21  vasilche
  921. * Cleaned processing of blocks of data.
  922. * Added input from ASN.1 text format.
  923. *
  924. * Revision 1.5  1999/06/15 16:20:01  vasilche
  925. * Added ASN.1 object output stream.
  926. *
  927. * Revision 1.4  1999/06/10 21:06:38  vasilche
  928. * Working binary output and almost working binary input.
  929. *
  930. * Revision 1.3  1999/06/07 19:30:15  vasilche
  931. * More bug fixes
  932. *
  933. * Revision 1.2  1999/06/04 20:51:32  vasilche
  934. * First compilable version of serialization.
  935. *
  936. * Revision 1.1  1999/05/19 19:56:24  vasilche
  937. * Commit just in case.
  938. *
  939. * ===========================================================================
  940. */