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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: objostrasnb.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2003/12/02 20:33:28  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [ORIGINAL] Dev-tree R1.43
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJOSTRASNB__HPP
  10. #define OBJOSTRASNB__HPP
  11. /*  $Id: objostrasnb.hpp,v 1000.1 2003/12/02 20:33:28 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/objostr.hpp>
  43. #include <serial/objstrasnb.hpp>
  44. #include <stack>
  45. /** @addtogroup ObjStreamSupport
  46.  *
  47.  * @{
  48.  */
  49. BEGIN_NCBI_SCOPE
  50. class CObjectIStreamAsnBinary;
  51. class NCBI_XSERIAL_EXPORT CObjectOStreamAsnBinary : public CObjectOStream
  52. {
  53. public:
  54.     typedef CObjectStreamAsnBinaryDefs::TTag TTag;
  55.     typedef CObjectStreamAsnBinaryDefs::ETag ETag;
  56.     typedef CObjectStreamAsnBinaryDefs::EClass EClass;
  57.     CObjectOStreamAsnBinary(CNcbiOstream& out,
  58.                             EFixNonPrint how = eFNP_Default);
  59.     CObjectOStreamAsnBinary(CNcbiOstream& out,
  60.                             bool deleteOut,
  61.                             EFixNonPrint how = eFNP_Default);
  62.     virtual ~CObjectOStreamAsnBinary(void);
  63.     virtual void WriteEnum(const CEnumeratedTypeValues& values, 
  64.                            TEnumValueType value);
  65.     virtual void CopyEnum(const CEnumeratedTypeValues& values,
  66.                           CObjectIStream& in);
  67.     void WriteNull(void);
  68.     virtual void WriteAnyContentObject(const CAnyContentObject& obj);
  69.     virtual void CopyAnyContentObject(CObjectIStream& in);
  70.     void WriteByte(Uint1 byte);
  71.     void WriteBytes(const char* bytes, size_t size);
  72.     void WriteTag(EClass c, bool constructed, TTag index);
  73.     void WriteShortTag(EClass c, bool constructed, TTag index);
  74.     void WriteLongTag(EClass c, bool constructed, TTag index);
  75.     void WriteSysTag(ETag index);
  76.     void WriteClassTag(TTypeInfo typeInfo);
  77.     void WriteLength(size_t length);
  78.     void WriteShortLength(size_t length);
  79.     void WriteLongLength(size_t length);
  80.     void WriteIndefiniteLength(void);
  81.     void WriteEndOfContent(void);
  82.     EFixNonPrint FixNonPrint(EFixNonPrint how)
  83.         {
  84.             EFixNonPrint tmp = m_FixMethod;
  85.             m_FixMethod = how;
  86.             return tmp;
  87.         }
  88. protected:
  89.     virtual void WriteBool(bool data);
  90.     virtual void WriteChar(char data);
  91.     virtual void WriteInt4(Int4 data);
  92.     virtual void WriteUint4(Uint4 data);
  93.     virtual void WriteInt8(Int8 data);
  94.     virtual void WriteUint8(Uint8 data);
  95.     virtual void WriteFloat(float data);
  96.     virtual void WriteDouble(double data);
  97.     void WriteDouble2(double data, size_t digits);
  98.     virtual void WriteCString(const char* str);
  99.     virtual void WriteString(const string& s,
  100.                              EStringType type = eStringTypeVisible);
  101.     virtual void WriteStringStore(const string& s);
  102.     virtual void CopyString(CObjectIStream& in);
  103.     virtual void CopyStringStore(CObjectIStream& in);
  104.     void CopyStringValue(CObjectIStreamAsnBinary& in,
  105.                          bool checkVisible = false);
  106.     virtual void WriteNullPointer(void);
  107.     virtual void WriteObjectReference(TObjectIndex index);
  108.     virtual void WriteOtherBegin(TTypeInfo typeInfo);
  109.     virtual void WriteOtherEnd(TTypeInfo typeInfo);
  110.     virtual void WriteOther(TConstObjectPtr object, TTypeInfo typeInfo);
  111. #ifdef VIRTUAL_MID_LEVEL_IO
  112.     virtual void WriteContainer(const CContainerTypeInfo* containerType,
  113.                                 TConstObjectPtr containerPtr);
  114.     virtual void WriteClass(const CClassTypeInfo* objectType,
  115.                             TConstObjectPtr objectPtr);
  116.     virtual void WriteClassMember(const CMemberId& memberId,
  117.                                   TTypeInfo memberType,
  118.                                   TConstObjectPtr memberPtr);
  119.     virtual bool WriteClassMember(const CMemberId& memberId,
  120.                                   const CDelayBuffer& buffer);
  121.     virtual void WriteChoice(const CChoiceTypeInfo* choiceType,
  122.                              TConstObjectPtr choicePtr);
  123.     // COPY
  124.     virtual void CopyContainer(const CContainerTypeInfo* containerType,
  125.                                CObjectStreamCopier& copier);
  126.     virtual void CopyClassRandom(const CClassTypeInfo* objectType,
  127.                                  CObjectStreamCopier& copier);
  128.     virtual void CopyClassSequential(const CClassTypeInfo* objectType,
  129.                                      CObjectStreamCopier& copier);
  130.     virtual void CopyChoice(const CChoiceTypeInfo* choiceType,
  131.                             CObjectStreamCopier& copier);
  132. #endif
  133.     virtual void BeginContainer(const CContainerTypeInfo* containerType);
  134.     virtual void EndContainer(void);
  135.     virtual void BeginClass(const CClassTypeInfo* classInfo);
  136.     virtual void EndClass(void);
  137.     virtual void BeginClassMember(const CMemberId& id);
  138.     virtual void EndClassMember(void);
  139.     virtual void BeginChoiceVariant(const CChoiceTypeInfo* choiceType,
  140.                                     const CMemberId& id);
  141.     virtual void EndChoiceVariant(void);
  142.     virtual void BeginBytes(const ByteBlock& block);
  143.     virtual void WriteBytes(const ByteBlock& block,
  144.                             const char* bytes, size_t length);
  145.     virtual void BeginChars(const CharBlock& block);
  146.     virtual void WriteChars(const CharBlock& block,
  147.                             const char* chars, size_t length);
  148. #if HAVE_NCBI_C
  149.     friend class CObjectOStream::AsnIo;
  150. #endif
  151. private:
  152. #if CHECK_STREAM_INTEGRITY
  153.     size_t m_CurrentPosition;
  154.     enum ETagState {
  155.         eTagStart,
  156.         eTagValue,
  157.         eLengthStart,
  158.         eLengthValueFirst,
  159.         eLengthValue,
  160.         eData
  161.     };
  162.     ETagState m_CurrentTagState;
  163.     size_t m_CurrentTagPosition;
  164.     Uint1 m_CurrentTagCode;
  165.     size_t m_CurrentTagLengthSize;
  166.     size_t m_CurrentTagLength;
  167.     size_t m_CurrentTagLimit;
  168.     stack<size_t> m_Limits;
  169.     void StartTag(Uint1 code);
  170.     void EndTag(void);
  171.     void SetTagLength(size_t length);
  172. #endif
  173.     EFixNonPrint m_FixMethod; // method of fixing non-printable chars
  174. };
  175. /* @} */
  176. #include <serial/objostrasnb.inl>
  177. END_NCBI_SCOPE
  178. #endif  /* OBJOSTRASNB__HPP */
  179. /* ---------------------------------------------------------------------------
  180. * $Log: objostrasnb.hpp,v $
  181. * Revision 1000.1  2003/12/02 20:33:28  gouriano
  182. * PRODUCTION: UPGRADED [ORIGINAL] Dev-tree R1.43
  183. *
  184. * Revision 1.43  2003/11/26 19:59:39  vasilche
  185. * GetPosition() and GetDataFormat() methods now are implemented
  186. * in parent classes CObjectIStream and CObjectOStream to avoid
  187. * pure virtual method call in destructors.
  188. *
  189. * Revision 1.42  2003/08/13 15:47:02  gouriano
  190. * implemented serialization of AnyContent objects
  191. *
  192. * Revision 1.41  2003/05/22 20:08:42  gouriano
  193. * added UTF8 strings
  194. *
  195. * Revision 1.40  2003/04/15 16:18:31  siyan
  196. * Added doxygen support
  197. *
  198. * Revision 1.39  2002/12/23 18:38:51  dicuccio
  199. * Added WIn32 export specifier: NCBI_XSERIAL_EXPORT.
  200. * Moved all CVS logs to the end.
  201. *
  202. * Revision 1.38  2002/10/25 14:49:29  vasilche
  203. * NCBI C Toolkit compatibility code extracted to libxcser library.
  204. * Serial streams flags names were renamed to fXxx.
  205. *
  206. * Names of flags
  207. *
  208. * Revision 1.37  2001/10/17 20:41:20  grichenk
  209. * Added CObjectOStream::CharBlock class
  210. *
  211. * Revision 1.36  2001/06/07 20:36:31  grichenk
  212. * Fixed location of m_FixMethod member
  213. *
  214. * Revision 1.35  2001/06/07 17:12:46  grichenk
  215. * Redesigned checking and substitution of non-printable characters
  216. * in VisibleString
  217. *
  218. * Revision 1.34  2001/05/17 14:59:47  lavr
  219. * Typos corrected
  220. *
  221. * Revision 1.33  2000/12/15 21:28:48  vasilche
  222. * Moved some typedefs/enums from corelib/ncbistd.hpp.
  223. * Added flags to CObjectIStream/CObjectOStream: eFlagAllowNonAsciiChars.
  224. * TByte typedef replaced by Uint1.
  225. *
  226. * Revision 1.32  2000/12/15 15:38:01  vasilche
  227. * Added support of Int8 and long double.
  228. * Enum values now have type Int4 instead of long.
  229. *
  230. * Revision 1.31  2000/10/20 15:51:27  vasilche
  231. * Fixed data error processing.
  232. * Added interface for constructing container objects directly into output stream.
  233. * object.hpp, object.inl and object.cpp were split to
  234. * objectinfo.*, objecttype.*, objectiter.* and objectio.*.
  235. *
  236. * Revision 1.30  2000/10/04 19:18:54  vasilche
  237. * Fixed processing floating point data.
  238. *
  239. * Revision 1.29  2000/09/29 16:18:14  vasilche
  240. * Fixed binary format encoding/decoding on 64 bit compulers.
  241. * Implemented CWeakMap<> for automatic cleaning map entries.
  242. * Added cleaning local hooks via CWeakMap<>.
  243. * Renamed ReadTypeName -> ReadFileHeader, ENoTypeName -> ENoFileHeader.
  244. * Added some user interface methods to CObjectIStream, CObjectOStream and
  245. * CObjectStreamCopier.
  246. *
  247. * Revision 1.28  2000/09/18 20:00:07  vasilche
  248. * Separated CVariantInfo and CMemberInfo.
  249. * Implemented copy hooks.
  250. * All hooks now are stored in CTypeInfo/CMemberInfo/CVariantInfo.
  251. * Most type specific functions now are implemented via function pointers instead of virtual functions.
  252. *
  253. * Revision 1.27  2000/09/01 13:16:02  vasilche
  254. * Implemented class/container/choice iterators.
  255. * Implemented CObjectStreamCopier for copying data without loading into memory.
  256. *
  257. * Revision 1.26  2000/08/15 19:44:41  vasilche
  258. * Added Read/Write hooks:
  259. * CReadObjectHook/CWriteObjectHook for objects of specified type.
  260. * CReadClassMemberHook/CWriteClassMemberHook for specified members.
  261. * CReadChoiceVariantHook/CWriteChoiceVariant for specified choice variants.
  262. * CReadContainerElementHook/CWriteContainerElementsHook for containers.
  263. *
  264. * Revision 1.25  2000/07/03 18:42:36  vasilche
  265. * Added interface to typeinfo via CObjectInfo and CConstObjectInfo.
  266. * Reduced header dependency.
  267. *
  268. * Revision 1.24  2000/06/16 16:31:07  vasilche
  269. * Changed implementation of choices and classes info to allow use of the same classes in generated and user written classes.
  270. *
  271. * Revision 1.23  2000/06/07 19:45:43  vasilche
  272. * Some code cleaning.
  273. * Macros renaming in more clear way.
  274. * BEGIN_NAMED_*_INFO, ADD_*_MEMBER, ADD_NAMED_*_MEMBER.
  275. *
  276. * Revision 1.22  2000/06/01 19:06:57  vasilche
  277. * Added parsing of XML data.
  278. *
  279. * Revision 1.21  2000/05/24 20:08:14  vasilche
  280. * Implemented XML dump.
  281. *
  282. * Revision 1.20  2000/04/28 16:58:03  vasilche
  283. * Added classes CByteSource and CByteSourceReader for generic reading.
  284. * Added delayed reading of choice variants.
  285. *
  286. * Revision 1.19  2000/04/13 14:50:18  vasilche
  287. * Added CObjectIStream::Open() and CObjectOStream::Open() for easier use.
  288. *
  289. * Revision 1.18  2000/04/06 16:10:51  vasilche
  290. * Fixed bug with iterators in choices.
  291. * Removed unneeded calls to ReadExternalObject/WriteExternalObject.
  292. * Added output buffering to text ASN.1 data.
  293. *
  294. * Revision 1.17  2000/02/17 20:02:28  vasilche
  295. * Added some standard serialization exceptions.
  296. * Optimized text/binary ASN.1 reading.
  297. * Fixed wrong encoding of StringStore in ASN.1 binary format.
  298. * Optimized logic of object collection.
  299. *
  300. * Revision 1.16  2000/01/10 20:12:37  vasilche
  301. * Fixed duplicate argument names.
  302. * Fixed conflict between template and variable name.
  303. *
  304. * Revision 1.15  2000/01/10 19:46:32  vasilche
  305. * Fixed encoding/decoding of REAL type.
  306. * Fixed encoding/decoding of StringStore.
  307. * Fixed encoding/decoding of NULL type.
  308. * Fixed error reporting.
  309. * Reduced object map (only classes).
  310. *
  311. * Revision 1.14  1999/09/24 18:19:14  vasilche
  312. * Removed dependency on NCBI toolkit.
  313. *
  314. * Revision 1.13  1999/09/23 18:56:54  vasilche
  315. * Fixed bugs with overloaded methods in objistr*.hpp & objostr*.hpp
  316. *
  317. * Revision 1.12  1999/09/22 20:11:50  vasilche
  318. * Modified for compilation on IRIX native c++ compiler.
  319. *
  320. * Revision 1.11  1999/08/16 16:07:44  vasilche
  321. * Added ENUMERATED type.
  322. *
  323. * Revision 1.10  1999/07/26 18:31:31  vasilche
  324. * Implemented skipping of unused values.
  325. * Added more useful error report.
  326. *
  327. * Revision 1.9  1999/07/22 17:33:45  vasilche
  328. * Unified reading/writing of objects in all three formats.
  329. *
  330. * Revision 1.8  1999/07/21 14:20:00  vasilche
  331. * Added serialization of bool.
  332. *
  333. * Revision 1.7  1999/07/19 15:50:19  vasilche
  334. * Added interface to old ASN.1 routines.
  335. * Added naming of key/value in STL map.
  336. *
  337. * Revision 1.6  1999/07/09 16:32:54  vasilche
  338. * Added OCTET STRING write/read.
  339. *
  340. * Revision 1.5  1999/07/07 21:15:03  vasilche
  341. * Cleaned processing of string types (string, char*, const char*).
  342. *
  343. * Revision 1.4  1999/07/02 21:31:47  vasilche
  344. * Implemented reading from ASN.1 binary format.
  345. *
  346. * Revision 1.3  1999/07/01 17:55:21  vasilche
  347. * Implemented ASN.1 binary write.
  348. *
  349. * Revision 1.2  1999/06/30 16:04:33  vasilche
  350. * Added support for old ASN.1 structures.
  351. *
  352. * Revision 1.1  1999/06/24 14:44:42  vasilche
  353. * Added binary ASN.1 output.
  354. *
  355. *
  356. * ===========================================================================
  357. */