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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: objistrasn.hpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:38:56  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.61
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJISTRASN__HPP
  10. #define OBJISTRASN__HPP
  11. /*  $Id: objistrasn.hpp,v 1000.3 2004/06/01 19:38:56 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 <util/lightstr.hpp>
  44. /** @addtogroup ObjStreamSupport
  45.  *
  46.  * @{
  47.  */
  48. BEGIN_NCBI_SCOPE
  49. class NCBI_XSERIAL_EXPORT CObjectIStreamAsn : public CObjectIStream
  50. {
  51. public:
  52.     CObjectIStreamAsn(EFixNonPrint how = eFNP_Default);
  53.     CObjectIStreamAsn(CNcbiIstream& in,
  54.                       EFixNonPrint how = eFNP_Default);
  55.     CObjectIStreamAsn(CNcbiIstream& in,
  56.                       bool deleteIn,
  57.                       EFixNonPrint how = eFNP_Default);
  58.     virtual string GetPosition(void) const;
  59.     virtual string ReadFileHeader(void);
  60.     virtual TEnumValueType ReadEnum(const CEnumeratedTypeValues& values);
  61.     virtual void ReadNull(void);
  62.     void ReadAnyContent(string& value);
  63.     virtual void ReadAnyContentObject(CAnyContentObject& obj);
  64.     virtual void SkipAnyContentObject(void);
  65.     EFixNonPrint FixNonPrint(EFixNonPrint how)
  66.         {
  67.             EFixNonPrint tmp = m_FixMethod;
  68.             m_FixMethod = how;
  69.             return tmp;
  70.         }
  71. protected:
  72.     TObjectIndex ReadIndex(void);
  73.     // action: read ID into local buffer
  74.     // return: ID pointer and length
  75.     // note: it is not zero ended
  76.     CLightString ScanEndOfId(bool isId);
  77.     CLightString ReadTypeId(char firstChar);
  78.     CLightString ReadMemberId(char firstChar);
  79.     CLightString ReadUCaseId(char firstChar);
  80.     CLightString ReadLCaseId(char firstChar);
  81.     CLightString ReadNumber(void);
  82.     virtual bool ReadBool(void);
  83.     virtual char ReadChar(void);
  84.     virtual Int4 ReadInt4(void);
  85.     virtual Uint4 ReadUint4(void);
  86.     virtual Int8 ReadInt8(void);
  87.     virtual Uint8 ReadUint8(void);
  88.     virtual double ReadDouble(void);
  89.     virtual void ReadString(string& s,EStringType type = eStringTypeVisible);
  90.     void ReadStringValue(string& s, EFixNonPrint fix_method);
  91.     void FixInput(size_t count, EFixNonPrint fix_method, size_t line);
  92.     virtual void SkipBool(void);
  93.     virtual void SkipChar(void);
  94.     virtual void SkipSNumber(void);
  95.     virtual void SkipUNumber(void);
  96.     virtual void SkipFNumber(void);
  97.     virtual void SkipString(EStringType type = eStringTypeVisible);
  98.     virtual void SkipNull(void);
  99.     virtual void SkipByteBlock(void);
  100. protected:
  101. #ifdef VIRTUAL_MID_LEVEL_IO
  102.     virtual void ReadContainer(const CContainerTypeInfo* containerType,
  103.                                TObjectPtr containerPtr);
  104.     virtual void SkipContainer(const CContainerTypeInfo* containerType);
  105.     virtual void ReadClassSequential(const CClassTypeInfo* classType,
  106.                                      TObjectPtr classPtr);
  107.     virtual void ReadClassRandom(const CClassTypeInfo* classType,
  108.                                  TObjectPtr classPtr);
  109.     virtual void SkipClassSequential(const CClassTypeInfo* classType);
  110.     virtual void SkipClassRandom(const CClassTypeInfo* classType);
  111.     virtual void ReadChoice(const CChoiceTypeInfo* choiceType,
  112.                             TObjectPtr choicePtr);
  113.     virtual void SkipChoice(const CChoiceTypeInfo* choiceType);
  114. #endif
  115.     // low level I/O
  116.     virtual void BeginContainer(const CContainerTypeInfo* containerType);
  117.     virtual void EndContainer(void);
  118.     virtual bool BeginContainerElement(TTypeInfo elementType);
  119.     virtual void BeginClass(const CClassTypeInfo* classInfo);
  120.     virtual void EndClass(void);
  121.     virtual TMemberIndex BeginClassMember(const CClassTypeInfo* classType);
  122.     virtual TMemberIndex BeginClassMember(const CClassTypeInfo* classType,
  123.                                           TMemberIndex pos);
  124.     virtual TMemberIndex BeginChoiceVariant(const CChoiceTypeInfo* choiceType);
  125.     virtual void BeginBytes(ByteBlock& block);
  126.     int GetHexChar(void);
  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. private:
  132.     virtual EPointerType ReadPointerType(void);
  133.     virtual TObjectIndex ReadObjectPointer(void);
  134.     virtual string ReadOtherPointer(void);
  135.     void SkipObjectData(void);
  136.     void SkipObjectPointer(void);
  137.     void SkipBlock(void);
  138. private:
  139.     // low level methods
  140.     char GetChar(void);
  141.     char PeekChar(void);
  142.     // parse methods
  143.     char GetChar(bool skipWhiteSpace);
  144.     char PeekChar(bool skipWhiteSpace);
  145.     bool GetChar(char c, bool skipWhiteSpace = false);
  146.     void Expect(char c, bool skipWhiteSpace = false);
  147.     bool Expect(char charTrue, char charFalse, bool skipWhiteSpace = false);
  148.     void ExpectString(const char* s, bool skipWhiteSpace = false);
  149.     static bool FirstIdChar(char c);
  150.     static bool IdChar(char c);
  151.     void SkipEndOfLine(char c);
  152.     char SkipWhiteSpace(void);
  153.     char SkipWhiteSpaceAndGetChar(void);
  154.     void SkipComments(void);
  155.     void UnexpectedMember(const CLightString& id, const CItemsInfo& items);
  156.     void BadStringChar(size_t startLine, char c);
  157.     void UnendedString(size_t startLine);
  158.     void AppendStringData(string& s,
  159.                           size_t count,
  160.                           EFixNonPrint fix_method,
  161.                           size_t line);
  162.     void AppendLongStringData(string& s,
  163.                               size_t count,
  164.                               EFixNonPrint fix_method,
  165.                               size_t line);
  166.     void StartBlock(void);
  167.     bool NextElement(void);
  168.     void EndBlock(void);
  169.     TMemberIndex GetMemberIndex(const CClassTypeInfo* classType,
  170.                                 const CLightString& id);
  171.     TMemberIndex GetMemberIndex(const CClassTypeInfo* classType,
  172.                                 const CLightString& id,
  173.                                 const TMemberIndex pos);
  174.     TMemberIndex GetChoiceIndex(const CChoiceTypeInfo* choiceType,
  175.                                 const CLightString& id);
  176.     bool m_BlockStart;
  177.     EFixNonPrint m_FixMethod; // method of fixing non-printable chars
  178. };
  179. /* @} */
  180. //#include <objistrb.inl>
  181. END_NCBI_SCOPE
  182. #endif  /* OBJISTRB__HPP */
  183. /* ---------------------------------------------------------------------------
  184. * $Log: objistrasn.hpp,v $
  185. * Revision 1000.3  2004/06/01 19:38:56  gouriano
  186. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.61
  187. *
  188. * Revision 1.61  2004/04/30 13:28:40  gouriano
  189. * Remove obsolete function declarations
  190. *
  191. * Revision 1.60  2004/03/05 20:28:37  gouriano
  192. * make it possible to skip unknown data fields
  193. *
  194. * Revision 1.59  2003/11/26 19:59:38  vasilche
  195. * GetPosition() and GetDataFormat() methods now are implemented
  196. * in parent classes CObjectIStream and CObjectOStream to avoid
  197. * pure virtual method call in destructors.
  198. *
  199. * Revision 1.58  2003/08/19 18:32:37  vasilche
  200. * Optimized reading and writing strings.
  201. * Avoid string reallocation when checking char values.
  202. * Try to reuse old string data when string reference counting is not working.
  203. *
  204. * Revision 1.57  2003/08/13 15:47:02  gouriano
  205. * implemented serialization of AnyContent objects
  206. *
  207. * Revision 1.56  2003/05/22 20:08:41  gouriano
  208. * added UTF8 strings
  209. *
  210. * Revision 1.55  2003/04/15 16:18:21  siyan
  211. * Added doxygen support
  212. *
  213. * Revision 1.54  2003/03/26 16:13:33  vasilche
  214. * Removed TAB symbols. Some formatting.
  215. *
  216. * Revision 1.53  2002/12/23 18:38:51  dicuccio
  217. * Added WIn32 export specifier: NCBI_XSERIAL_EXPORT.
  218. * Moved all CVS logs to the end.
  219. *
  220. * Revision 1.52  2002/10/25 14:49:29  vasilche
  221. * NCBI C Toolkit compatibility code extracted to libxcser library.
  222. * Serial streams flags names were renamed to fXxx.
  223. *
  224. * Names of flags
  225. *
  226. * Revision 1.51  2001/10/17 20:41:19  grichenk
  227. * Added CObjectOStream::CharBlock class
  228. *
  229. * Revision 1.50  2001/06/11 14:34:55  grichenk
  230. * Added support for numeric tags in ASN.1 specifications and data streams.
  231. *
  232. * Revision 1.49  2001/06/07 17:12:46  grichenk
  233. * Redesigned checking and substitution of non-printable characters
  234. * in VisibleString
  235. *
  236. * Revision 1.48  2001/05/17 14:59:47  lavr
  237. * Typos corrected
  238. *
  239. * Revision 1.47  2001/01/05 20:10:35  vasilche
  240. * CByteSource, CIStrBuffer, COStrBuffer, CLightString, CChecksum, CWeakMap
  241. * were moved to util.
  242. *
  243. * Revision 1.46  2000/12/15 21:28:47  vasilche
  244. * Moved some typedefs/enums from corelib/ncbistd.hpp.
  245. * Added flags to CObjectIStream/CObjectOStream: eFlagAllowNonAsciiChars.
  246. * TByte typedef replaced by Uint1.
  247. *
  248. * Revision 1.45  2000/12/15 15:38:00  vasilche
  249. * Added support of Int8 and long double.
  250. * Enum values now have type Int4 instead of long.
  251. *
  252. * Revision 1.44  2000/10/20 15:51:26  vasilche
  253. * Fixed data error processing.
  254. * Added interface for constructing container objects directly into output stream.
  255. * object.hpp, object.inl and object.cpp were split to
  256. * objectinfo.*, objecttype.*, objectiter.* and objectio.*.
  257. *
  258. * Revision 1.43  2000/10/17 18:45:24  vasilche
  259. * Added possibility to turn off object cross reference detection in
  260. * CObjectIStream and CObjectOStream.
  261. *
  262. * Revision 1.42  2000/10/04 19:18:54  vasilche
  263. * Fixed processing floating point data.
  264. *
  265. * Revision 1.41  2000/10/03 17:22:34  vasilche
  266. * Reduced header dependency.
  267. * Reduced size of debug libraries on WorkShop by 3 times.
  268. * Fixed tag allocation for parent classes.
  269. * Fixed CObject allocation/deallocation in streams.
  270. * Moved instantiation of several templates in separate source file.
  271. *
  272. * Revision 1.40  2000/09/29 16:18:13  vasilche
  273. * Fixed binary format encoding/decoding on 64 bit compulers.
  274. * Implemented CWeakMap<> for automatic cleaning map entries.
  275. * Added cleaning local hooks via CWeakMap<>.
  276. * Renamed ReadTypeName -> ReadFileHeader, ENoTypeName -> ENoFileHeader.
  277. * Added some user interface methods to CObjectIStream, CObjectOStream and
  278. * CObjectStreamCopier.
  279. *
  280. * Revision 1.39  2000/09/18 20:00:05  vasilche
  281. * Separated CVariantInfo and CMemberInfo.
  282. * Implemented copy hooks.
  283. * All hooks now are stored in CTypeInfo/CMemberInfo/CVariantInfo.
  284. * Most type specific functions now are implemented via function pointers instead of virtual functions.
  285. *
  286. * Revision 1.38  2000/09/01 13:16:00  vasilche
  287. * Implemented class/container/choice iterators.
  288. * Implemented CObjectStreamCopier for copying data without loading into memory.
  289. *
  290. * Revision 1.37  2000/08/15 19:44:40  vasilche
  291. * Added Read/Write hooks:
  292. * CReadObjectHook/CWriteObjectHook for objects of specified type.
  293. * CReadClassMemberHook/CWriteClassMemberHook for specified members.
  294. * CReadChoiceVariantHook/CWriteChoiceVariant for specified choice variants.
  295. * CReadContainerElementHook/CWriteContainerElementsHook for containers.
  296. *
  297. * Revision 1.36  2000/07/03 18:42:35  vasilche
  298. * Added interface to typeinfo via CObjectInfo and CConstObjectInfo.
  299. * Reduced header dependency.
  300. *
  301. * Revision 1.35  2000/06/16 16:31:06  vasilche
  302. * Changed implementation of choices and classes info to allow use of the same classes in generated and user written classes.
  303. *
  304. * Revision 1.34  2000/06/07 19:45:42  vasilche
  305. * Some code cleaning.
  306. * Macros renaming in more clear way.
  307. * BEGIN_NAMED_*_INFO, ADD_*_MEMBER, ADD_NAMED_*_MEMBER.
  308. *
  309. * Revision 1.33  2000/06/01 19:06:56  vasilche
  310. * Added parsing of XML data.
  311. *
  312. * Revision 1.32  2000/05/24 20:08:13  vasilche
  313. * Implemented XML dump.
  314. *
  315. * Revision 1.31  2000/05/09 16:38:33  vasilche
  316. * CObject::GetTypeInfo now moved to CObjectGetTypeInfo::GetTypeInfo to reduce possible errors.
  317. * Added write context to CObjectOStream.
  318. * Inlined most of methods of helping class Member, Block, ByteBlock etc.
  319. *
  320. * Revision 1.30  2000/04/28 16:58:02  vasilche
  321. * Added classes CByteSource and CByteSourceReader for generic reading.
  322. * Added delayed reading of choice variants.
  323. *
  324. * Revision 1.29  2000/04/13 14:50:17  vasilche
  325. * Added CObjectIStream::Open() and CObjectOStream::Open() for easier use.
  326. *
  327. * Revision 1.28  2000/04/06 16:10:50  vasilche
  328. * Fixed bug with iterators in choices.
  329. * Removed unneeded calls to ReadExternalObject/WriteExternalObject.
  330. * Added output buffering to text ASN.1 data.
  331. *
  332. * Revision 1.27  2000/03/14 14:43:30  vasilche
  333. * Fixed error reporting.
  334. *
  335. * Revision 1.26  2000/03/07 14:05:30  vasilche
  336. * Added stream buffering to ASN.1 binary input.
  337. * Optimized class loading/storing.
  338. * Fixed bugs in processing OPTIONAL fields.
  339. *
  340. * Revision 1.25  2000/02/17 20:02:28  vasilche
  341. * Added some standard serialization exceptions.
  342. * Optimized text/binary ASN.1 reading.
  343. * Fixed wrong encoding of StringStore in ASN.1 binary format.
  344. * Optimized logic of object collection.
  345. *
  346. * Revision 1.24  2000/02/11 17:10:19  vasilche
  347. * Optimized text parsing.
  348. *
  349. * Revision 1.23  2000/02/01 21:44:35  vasilche
  350. * Added CGeneratedChoiceTypeInfo for generated choice classes.
  351. * Added buffering to CObjectIStreamAsn.
  352. * Removed CMemberInfo subclasses.
  353. * Added support for DEFAULT/OPTIONAL members.
  354. *
  355. * Revision 1.22  2000/01/10 20:12:37  vasilche
  356. * Fixed duplicate argument names.
  357. * Fixed conflict between template and variable name.
  358. *
  359. * Revision 1.21  2000/01/10 19:46:31  vasilche
  360. * Fixed encoding/decoding of REAL type.
  361. * Fixed encoding/decoding of StringStore.
  362. * Fixed encoding/decoding of NULL type.
  363. * Fixed error reporting.
  364. * Reduced object map (only classes).
  365. *
  366. * Revision 1.20  2000/01/05 19:43:44  vasilche
  367. * Fixed error messages when reading from ASN.1 binary file.
  368. * Fixed storing of integers with enumerated values in ASN.1 binary file.
  369. * Added TAG support to key/value of map.
  370. * Added support of NULL variant in CHOICE.
  371. *
  372. * Revision 1.19  1999/09/24 18:19:13  vasilche
  373. * Removed dependency on NCBI toolkit.
  374. *
  375. * Revision 1.18  1999/09/23 18:56:52  vasilche
  376. * Fixed bugs with overloaded methods in objistr*.hpp & objostr*.hpp
  377. *
  378. * Revision 1.17  1999/09/22 20:11:49  vasilche
  379. * Modified for compilation on IRIX native c++ compiler.
  380. *
  381. * Revision 1.16  1999/08/17 15:13:03  vasilche
  382. * Comments are allowed in ASN.1 text files.
  383. * String values now parsed in accordance with ASN.1 specification.
  384. *
  385. * Revision 1.15  1999/08/13 15:53:43  vasilche
  386. * C++ analog of asntool: datatool
  387. *
  388. * Revision 1.14  1999/07/26 18:31:29  vasilche
  389. * Implemented skipping of unused values.
  390. * Added more useful error report.
  391. *
  392. * Revision 1.13  1999/07/22 17:33:41  vasilche
  393. * Unified reading/writing of objects in all three formats.
  394. *
  395. * Revision 1.12  1999/07/21 14:19:57  vasilche
  396. * Added serialization of bool.
  397. *
  398. * Revision 1.11  1999/07/19 15:50:16  vasilche
  399. * Added interface to old ASN.1 routines.
  400. * Added naming of key/value in STL map.
  401. *
  402. * Revision 1.10  1999/07/09 16:32:53  vasilche
  403. * Added OCTET STRING write/read.
  404. *
  405. * Revision 1.9  1999/07/07 21:15:03  vasilche
  406. * Cleaned processing of string types (string, char*, const char*).
  407. *
  408. * Revision 1.8  1999/07/07 19:58:45  vasilche
  409. * Reduced amount of data allocated on heap
  410. * Cleaned ASN.1 structures info
  411. *
  412. * Revision 1.7  1999/07/07 18:18:32  vasilche
  413. * Fixed some bugs found by MS VC++
  414. *
  415. * Revision 1.6  1999/07/02 21:31:44  vasilche
  416. * Implemented reading from ASN.1 binary format.
  417. *
  418. * Revision 1.5  1999/06/30 16:04:28  vasilche
  419. * Added support for old ASN.1 structures.
  420. *
  421. * Revision 1.4  1999/06/18 16:26:49  vasilche
  422. * Fixed bug with unget() in MSVS
  423. *
  424. * Revision 1.3  1999/06/17 21:08:49  vasilche
  425. * Fixed bug with unget()
  426. *
  427. * Revision 1.2  1999/06/17 20:42:01  vasilche
  428. * Fixed storing/loading of pointers.
  429. *
  430. * Revision 1.1  1999/06/16 20:35:22  vasilche
  431. * Cleaned processing of blocks of data.
  432. * Added input from ASN.1 text format.
  433. *
  434. * Revision 1.4  1999/06/15 16:20:02  vasilche
  435. * Added ASN.1 object output stream.
  436. *
  437. * Revision 1.3  1999/06/10 21:06:38  vasilche
  438. * Working binary output and almost working binary input.
  439. *
  440. * Revision 1.2  1999/06/04 20:51:32  vasilche
  441. * First compilable version of serialization.
  442. *
  443. * Revision 1.1  1999/05/19 19:56:25  vasilche
  444. * Commit just in case.
  445. *
  446. * ===========================================================================
  447. */