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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: objistrasnb.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/04/12 17:15:09  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.44
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJISTRASNB__HPP
  10. #define OBJISTRASNB__HPP
  11. /*  $Id: objistrasnb.hpp,v 1000.2 2004/04/12 17:15:09 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 <serial/objistr.hpp>
  43. #include <serial/objstrasnb.hpp>
  44. #include <stack>
  45. /** @addtogroup ObjStreamSupport
  46.  *
  47.  * @{
  48.  */
  49. BEGIN_NCBI_SCOPE
  50. class CObjectOStreamAsnBinary;
  51. class NCBI_XSERIAL_EXPORT CObjectIStreamAsnBinary : public CObjectIStream
  52. {
  53. public:
  54.     typedef CObjectStreamAsnBinaryDefs::TTag TTag;
  55.     typedef CObjectStreamAsnBinaryDefs::ETag ETag;
  56.     typedef CObjectStreamAsnBinaryDefs::EClass EClass;
  57.     CObjectIStreamAsnBinary(EFixNonPrint how = eFNP_Default);
  58.     CObjectIStreamAsnBinary(CNcbiIstream& in,
  59.                             EFixNonPrint how = eFNP_Default);
  60.     CObjectIStreamAsnBinary(CNcbiIstream& in,
  61.                             bool deleteIn,
  62.                             EFixNonPrint how = eFNP_Default);
  63.     CObjectIStreamAsnBinary(CByteSourceReader& reader,
  64.                             EFixNonPrint how = eFNP_Default);
  65.     virtual TEnumValueType ReadEnum(const CEnumeratedTypeValues& values);
  66.     virtual void ReadNull(void);
  67.     bool ReadAnyContent();
  68.     virtual void ReadAnyContentObject(CAnyContentObject& obj);
  69.     virtual void SkipAnyContentObject(void);
  70.     EFixNonPrint FixNonPrint(EFixNonPrint how)
  71.         {
  72.             EFixNonPrint tmp = m_FixMethod;
  73.             m_FixMethod = how;
  74.             return tmp;
  75.         }
  76. protected:
  77.     virtual bool ReadBool(void);
  78.     virtual char ReadChar(void);
  79.     virtual Int4 ReadInt4(void);
  80.     virtual Uint4 ReadUint4(void);
  81.     virtual Int8 ReadInt8(void);
  82.     virtual Uint8 ReadUint8(void);
  83.     virtual double ReadDouble(void);
  84.     virtual void ReadString(string& s,EStringType type = eStringTypeVisible);
  85.     virtual void ReadString(string& s,
  86.                             CPackString& pack_string,
  87.                             EStringType type);
  88.     virtual char* ReadCString(void);
  89.     virtual void ReadStringStore(string& s);
  90.     virtual void SkipBool(void);
  91.     virtual void SkipChar(void);
  92.     virtual void SkipSNumber(void);
  93.     virtual void SkipUNumber(void);
  94.     virtual void SkipFNumber(void);
  95.     virtual void SkipString(EStringType type = eStringTypeVisible);
  96.     virtual void SkipStringStore(void);
  97.     virtual void SkipNull(void);
  98.     virtual void SkipByteBlock(void);
  99. protected:
  100. #ifdef VIRTUAL_MID_LEVEL_IO
  101.     virtual void ReadContainer(const CContainerTypeInfo* containerType,
  102.                                TObjectPtr containerPtr);
  103.     virtual void SkipContainer(const CContainerTypeInfo* containerType);
  104.     virtual void ReadClassSequential(const CClassTypeInfo* classType,
  105.                                      TObjectPtr classPtr);
  106.     virtual void ReadClassRandom(const CClassTypeInfo* classType,
  107.                                  TObjectPtr classPtr);
  108.     virtual void SkipClassSequential(const CClassTypeInfo* classType);
  109.     virtual void SkipClassRandom(const CClassTypeInfo* classType);
  110.     virtual void ReadChoice(const CChoiceTypeInfo* choiceType,
  111.                             TObjectPtr choicePtr);
  112.     virtual void SkipChoice(const CChoiceTypeInfo* choiceType);
  113. #endif
  114.     // low level I/O
  115.     virtual void BeginContainer(const CContainerTypeInfo* containerType);
  116.     virtual void EndContainer(void);
  117.     virtual bool BeginContainerElement(TTypeInfo elementType);
  118.     virtual void BeginClass(const CClassTypeInfo* classInfo);
  119.     virtual void EndClass(void);
  120.     virtual TMemberIndex BeginClassMember(const CClassTypeInfo* classType);
  121.     virtual TMemberIndex BeginClassMember(const CClassTypeInfo* classType,
  122.                                           TMemberIndex pos);
  123.     virtual void EndClassMember(void);
  124.     virtual TMemberIndex BeginChoiceVariant(const CChoiceTypeInfo* choiceType);
  125.     virtual void EndChoiceVariant(void);
  126.     virtual void BeginBytes(ByteBlock& block);
  127.     virtual size_t ReadBytes(ByteBlock& block, char* dst, size_t length);
  128.     virtual void EndBytes(const ByteBlock& block);
  129.     virtual void BeginChars(CharBlock& block);
  130.     virtual size_t ReadChars(CharBlock& block, char* dst, size_t length);
  131.     virtual void EndChars(const CharBlock& block);
  132. #if HAVE_NCBI_C
  133.     friend class CObjectIStream::AsnIo;
  134. #endif
  135. private:
  136.     virtual EPointerType ReadPointerType(void);
  137.     virtual TObjectIndex ReadObjectPointer(void);
  138.     virtual string ReadOtherPointer(void);
  139.     virtual void ReadOtherPointerEnd(void);
  140.     bool SkipRealValue(void);
  141.     // states:
  142.     // before StartTag (Peek*Tag/ExpectSysTag) tag:
  143.     //     m_CurrentTagLength == 0
  144.     //     stream position on tag start
  145.     // after Peek*Tag/ExpectSysTag tag:
  146.     //     m_CurrentTagLength == beginning of LENGTH field
  147.     //     stream position on tag start
  148.     // after FlushTag (Read*Length/ExpectIndefiniteLength):
  149.     //     m_CurrentTagLength == 0
  150.     //     stream position on tad DATA start
  151.     //     tag limit is pushed on stack and new tag limit is updated
  152.     // after EndOfTag
  153.     //     m_CurrentTagLength == 0
  154.     //     stream position on tag DATA end
  155.     //     tag limit is popped from stack
  156.     // m_CurrentTagLength == beginning of LENGTH field
  157.     //                         -- after any of Peek?Tag or ExpectSysTag
  158.     // 
  159.     size_t m_CurrentTagLength;  // length of tag header (without length field)
  160.     size_t m_CurrentTagLimit;   // end of current tag data (INT_MAX if unlimited)
  161.     stack<size_t> m_Limits;
  162.     EFixNonPrint m_FixMethod; // method of fixing non-printable chars
  163. #if CHECK_STREAM_INTEGRITY
  164.     enum ETagState {
  165.         eTagStart,
  166.         eTagParsed,
  167.         eLengthValue,
  168.         eData
  169.     };
  170.     ETagState m_CurrentTagState;
  171. #endif
  172.     // low level interface
  173. private:
  174.     Uint1 PeekTagByte(size_t index = 0);
  175.     Uint1 StartTag(void);
  176.     TTag PeekTag(void);
  177.     TTag PeekTag(EClass c, bool constructed);
  178.     string PeekClassTag(void);
  179.     Uint1 PeekAnyTag(void);
  180.     void ExpectSysTag(EClass c, bool constructed, ETag tag);
  181.     void ExpectSysTag(ETag tag);
  182.     Uint1 FlushTag(void);
  183.     void ExpectIndefiniteLength(void);
  184.     bool PeekIndefiniteLength(void);
  185. public:
  186.     size_t ReadShortLength(void);
  187. private:
  188.     size_t ReadLength(void);
  189.     size_t StartTagData(size_t length);
  190.     void ExpectShortLength(size_t length);
  191.     void ExpectEndOfContent(void);
  192. public:
  193.     void EndOfTag(void);
  194.     Uint1 ReadByte(void);
  195.     Int1 ReadSByte(void);
  196.     void ExpectByte(Uint1 byte);
  197. private:
  198.     void ReadBytes(char* buffer, size_t count);
  199.     void SkipBytes(size_t count);
  200.     void ReadStringValue(size_t length, string& s, EFixNonPrint fix_type);
  201.     void SkipTagData(void);
  202.     bool HaveMoreElements(void);
  203.     void UnexpectedMember(TTag tag);
  204.     void UnexpectedTag(TTag tag);
  205.     void UnexpectedByte(Uint1 byte);
  206.     friend class CObjectOStreamAsnBinary;
  207. };
  208. /* @} */
  209. #include <serial/objistrasnb.inl>
  210. END_NCBI_SCOPE
  211. #endif  /* OBJISTRASNB__HPP */
  212. /* ---------------------------------------------------------------------------
  213. * $Log: objistrasnb.hpp,v $
  214. * Revision 1000.2  2004/04/12 17:15:09  gouriano
  215. * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.44
  216. *
  217. * Revision 1.44  2004/03/16 17:48:39  gouriano
  218. * make it possible to skip unknown data members
  219. *
  220. * Revision 1.43  2003/11/26 19:59:38  vasilche
  221. * GetPosition() and GetDataFormat() methods now are implemented
  222. * in parent classes CObjectIStream and CObjectOStream to avoid
  223. * pure virtual method call in destructors.
  224. *
  225. * Revision 1.42  2003/10/15 18:00:32  vasilche
  226. * Fixed integer overflow in asn binary input stream after 2GB.
  227. * Added constructor of CObjectIStreamAsnBinary() from CByteSourceReader.
  228. *
  229. * Revision 1.41  2003/08/19 18:32:37  vasilche
  230. * Optimized reading and writing strings.
  231. * Avoid string reallocation when checking char values.
  232. * Try to reuse old string data when string reference counting is not working.
  233. *
  234. * Revision 1.40  2003/08/13 15:47:02  gouriano
  235. * implemented serialization of AnyContent objects
  236. *
  237. * Revision 1.39  2003/05/22 20:08:41  gouriano
  238. * added UTF8 strings
  239. *
  240. * Revision 1.38  2003/04/15 16:18:23  siyan
  241. * Added doxygen support
  242. *
  243. * Revision 1.37  2002/12/23 18:38:51  dicuccio
  244. * Added WIn32 export specifier: NCBI_XSERIAL_EXPORT.
  245. * Moved all CVS logs to the end.
  246. *
  247. * Revision 1.36  2002/10/25 14:49:29  vasilche
  248. * NCBI C Toolkit compatibility code extracted to libxcser library.
  249. * Serial streams flags names were renamed to fXxx.
  250. *
  251. * Names of flags
  252. *
  253. * Revision 1.35  2001/10/17 20:41:19  grichenk
  254. * Added CObjectOStream::CharBlock class
  255. *
  256. * Revision 1.34  2001/06/07 17:12:46  grichenk
  257. * Redesigned checking and substitution of non-printable characters
  258. * in VisibleString
  259. *
  260. * Revision 1.33  2000/12/15 21:28:47  vasilche
  261. * Moved some typedefs/enums from corelib/ncbistd.hpp.
  262. * Added flags to CObjectIStream/CObjectOStream: eFlagAllowNonAsciiChars.
  263. * TByte typedef replaced by Uint1.
  264. *
  265. * Revision 1.32  2000/12/15 15:38:00  vasilche
  266. * Added support of Int8 and long double.
  267. * Enum values now have type Int4 instead of long.
  268. *
  269. * Revision 1.31  2000/10/17 18:45:25  vasilche
  270. * Added possibility to turn off object cross reference detection in
  271. * CObjectIStream and CObjectOStream.
  272. *
  273. * Revision 1.30  2000/09/18 20:00:05  vasilche
  274. * Separated CVariantInfo and CMemberInfo.
  275. * Implemented copy hooks.
  276. * All hooks now are stored in CTypeInfo/CMemberInfo/CVariantInfo.
  277. * Most type specific functions now are implemented via function pointers instead of virtual functions.
  278. *
  279. * Revision 1.29  2000/09/01 13:16:01  vasilche
  280. * Implemented class/container/choice iterators.
  281. * Implemented CObjectStreamCopier for copying data without loading into memory.
  282. *
  283. * Revision 1.28  2000/08/15 19:44:40  vasilche
  284. * Added Read/Write hooks:
  285. * CReadObjectHook/CWriteObjectHook for objects of specified type.
  286. * CReadClassMemberHook/CWriteClassMemberHook for specified members.
  287. * CReadChoiceVariantHook/CWriteChoiceVariant for specified choice variants.
  288. * CReadContainerElementHook/CWriteContainerElementsHook for containers.
  289. *
  290. * Revision 1.27  2000/07/03 18:42:35  vasilche
  291. * Added interface to typeinfo via CObjectInfo and CConstObjectInfo.
  292. * Reduced header dependency.
  293. *
  294. * Revision 1.26  2000/06/16 16:31:06  vasilche
  295. * Changed implementation of choices and classes info to allow use of the same classes in generated and user written classes.
  296. *
  297. * Revision 1.25  2000/06/07 19:45:43  vasilche
  298. * Some code cleaning.
  299. * Macros renaming in more clear way.
  300. * BEGIN_NAMED_*_INFO, ADD_*_MEMBER, ADD_NAMED_*_MEMBER.
  301. *
  302. * Revision 1.24  2000/06/01 19:06:56  vasilche
  303. * Added parsing of XML data.
  304. *
  305. * Revision 1.23  2000/05/24 20:08:13  vasilche
  306. * Implemented XML dump.
  307. *
  308. * Revision 1.22  2000/05/09 16:38:33  vasilche
  309. * CObject::GetTypeInfo now moved to CObjectGetTypeInfo::GetTypeInfo to reduce possible errors.
  310. * Added write context to CObjectOStream.
  311. * Inlined most of methods of helping class Member, Block, ByteBlock etc.
  312. *
  313. * Revision 1.21  2000/04/28 16:58:02  vasilche
  314. * Added classes CByteSource and CByteSourceReader for generic reading.
  315. * Added delayed reading of choice variants.
  316. *
  317. * Revision 1.20  2000/04/13 14:50:17  vasilche
  318. * Added CObjectIStream::Open() and CObjectOStream::Open() for easier use.
  319. *
  320. * Revision 1.19  2000/04/06 16:10:51  vasilche
  321. * Fixed bug with iterators in choices.
  322. * Removed unneeded calls to ReadExternalObject/WriteExternalObject.
  323. * Added output buffering to text ASN.1 data.
  324. *
  325. * Revision 1.18  2000/03/14 14:43:30  vasilche
  326. * Fixed error reporting.
  327. *
  328. * Revision 1.17  2000/03/07 14:05:31  vasilche
  329. * Added stream buffering to ASN.1 binary input.
  330. * Optimized class loading/storing.
  331. * Fixed bugs in processing OPTIONAL fields.
  332. *
  333. * Revision 1.16  2000/02/17 20:02:28  vasilche
  334. * Added some standard serialization exceptions.
  335. * Optimized text/binary ASN.1 reading.
  336. * Fixed wrong encoding of StringStore in ASN.1 binary format.
  337. * Optimized logic of object collection.
  338. *
  339. * Revision 1.15  2000/01/10 20:04:08  vasilche
  340. * Fixed duplicate name.
  341. *
  342. * Revision 1.14  2000/01/10 19:46:32  vasilche
  343. * Fixed encoding/decoding of REAL type.
  344. * Fixed encoding/decoding of StringStore.
  345. * Fixed encoding/decoding of NULL type.
  346. * Fixed error reporting.
  347. * Reduced object map (only classes).
  348. *
  349. * Revision 1.13  2000/01/05 19:43:45  vasilche
  350. * Fixed error messages when reading from ASN.1 binary file.
  351. * Fixed storing of integers with enumerated values in ASN.1 binary file.
  352. * Added TAG support to key/value of map.
  353. * Added support of NULL variant in CHOICE.
  354. *
  355. * Revision 1.12  1999/10/18 20:11:16  vasilche
  356. * Enum values now have long type.
  357. * Fixed template generation for enums.
  358. *
  359. * Revision 1.11  1999/09/24 18:19:13  vasilche
  360. * Removed dependency on NCBI toolkit.
  361. *
  362. * Revision 1.10  1999/09/23 18:56:53  vasilche
  363. * Fixed bugs with overloaded methods in objistr*.hpp & objostr*.hpp
  364. *
  365. * Revision 1.9  1999/09/22 20:11:49  vasilche
  366. * Modified for compilation on IRIX native c++ compiler.
  367. *
  368. * Revision 1.8  1999/08/16 16:07:43  vasilche
  369. * Added ENUMERATED type.
  370. *
  371. * Revision 1.7  1999/07/26 18:31:30  vasilche
  372. * Implemented skipping of unused values.
  373. * Added more useful error report.
  374. *
  375. * Revision 1.6  1999/07/22 17:33:42  vasilche
  376. * Unified reading/writing of objects in all three formats.
  377. *
  378. * Revision 1.5  1999/07/21 20:02:14  vasilche
  379. * Added embedding of ASN.1 binary output from ToolKit to our binary format.
  380. *
  381. * Revision 1.4  1999/07/21 14:19:57  vasilche
  382. * Added serialization of bool.
  383. *
  384. * Revision 1.3  1999/07/09 16:32:53  vasilche
  385. * Added OCTET STRING write/read.
  386. *
  387. * Revision 1.2  1999/07/07 21:15:03  vasilche
  388. * Cleaned processing of string types (string, char*, const char*).
  389. *
  390. * Revision 1.1  1999/07/02 21:31:45  vasilche
  391. * Implemented reading from ASN.1 binary format.
  392. *
  393. * ===========================================================================
  394. */