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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: objistrxml.hpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:38:59  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.35
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJISTRXML__HPP
  10. #define OBJISTRXML__HPP
  11. /*  $Id: objistrxml.hpp,v 1000.3 2004/06/01 19:38:59 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 CItemsInfo;
  50. class NCBI_XSERIAL_EXPORT CObjectIStreamXml : public CObjectIStream
  51. {
  52. public:
  53.     CObjectIStreamXml(void);
  54.     ~CObjectIStreamXml(void);
  55.     virtual string GetPosition(void) const;
  56.     virtual string ReadFileHeader(void);
  57.     virtual string PeekNextTypeName(void);
  58.     enum EEncoding {
  59.         eEncoding_Unknown,
  60.         eEncoding_UTF8,
  61.         eEncoding_ISO8859_1,
  62.         eEncoding_Windows_1252
  63.     };
  64.     EEncoding GetEncoding(void) const;
  65.     void SetEnforcedStdXml(bool set = true);
  66.     bool GetEnforcedStdXml(void)     {return m_EnforcedStdXml;}
  67. protected:
  68.     EPointerType ReadPointerType(void);
  69.     TObjectIndex ReadObjectPointer(void);
  70.     string ReadOtherPointer(void);
  71.     virtual bool ReadBool(void);
  72.     virtual char ReadChar(void);
  73.     virtual Int4 ReadInt4(void);
  74.     virtual Uint4 ReadUint4(void);
  75.     virtual Int8 ReadInt8(void);
  76.     virtual Uint8 ReadUint8(void);
  77.     virtual double ReadDouble(void);
  78.     virtual void ReadNull(void);
  79.     virtual void ReadString(string& s,EStringType type = eStringTypeVisible);
  80.     virtual char* ReadCString(void);
  81.     TEnumValueType ReadEnum(const CEnumeratedTypeValues& values);
  82.     void ReadAnyContentTo(const string& ns_prefix, string& value,
  83.                           const CLightString& tagName);
  84.     virtual void ReadAnyContentObject(CAnyContentObject& obj);
  85.     virtual void SkipAnyContentObject(void);
  86.     virtual void SkipBool(void);
  87.     virtual void SkipChar(void);
  88.     virtual void SkipSNumber(void);
  89.     virtual void SkipUNumber(void);
  90.     virtual void SkipFNumber(void);
  91.     virtual void SkipString(EStringType type = eStringTypeVisible);
  92.     virtual void SkipNull(void);
  93.     virtual void SkipByteBlock(void);
  94.     CLightString SkipTagName(CLightString tag, const char* s, size_t length);
  95.     CLightString SkipTagName(CLightString tag, const char* s);
  96.     CLightString SkipTagName(CLightString tag, const string& s);
  97.     CLightString SkipStackTagName(CLightString tag, size_t level);
  98.     CLightString SkipStackTagName(CLightString tag, size_t level, char c);
  99.     bool HasAttlist(void);
  100.     bool NextIsTag(void);
  101.     bool NextTagIsClosing(void);
  102.     bool ThisTagIsSelfClosed(void);
  103.     void OpenTag(const string& e);
  104.     void CloseTag(const string& e);
  105.     void OpenStackTag(size_t level);
  106.     void CloseStackTag(size_t level);
  107.     void OpenTag(TTypeInfo type);
  108.     void CloseTag(TTypeInfo type);
  109.     void OpenTagIfNamed(TTypeInfo type);
  110.     void CloseTagIfNamed(TTypeInfo type);
  111.     bool WillHaveName(TTypeInfo elementType);
  112. #ifdef VIRTUAL_MID_LEVEL_IO
  113.     virtual void ReadNamedType(TTypeInfo namedTypeInfo,
  114.                                TTypeInfo typeInfo,
  115.                                TObjectPtr object);
  116.     bool HasAnyContent(const CClassTypeInfoBase* classType);
  117.     bool HasMoreElements(TTypeInfo elementType);
  118.     TMemberIndex FindDeep(TTypeInfo type, const CLightString& name) const;
  119.     virtual void ReadContainer(const CContainerTypeInfo* containerType,
  120.                                TObjectPtr containerPtr);
  121.     virtual void SkipContainer(const CContainerTypeInfo* containerType);
  122.     void ReadContainerContents(const CContainerTypeInfo* containerType,
  123.                                TObjectPtr containerPtr);
  124.     void SkipContainerContents(const CContainerTypeInfo* containerType);
  125.     virtual void ReadChoice(const CChoiceTypeInfo* choiceType,
  126.                             TObjectPtr choicePtr);
  127.     virtual void SkipChoice(const CChoiceTypeInfo* choiceType);
  128.     void ReadChoiceContents(const CChoiceTypeInfo* choiceType,
  129.                             TObjectPtr choicePtr);
  130.     void SkipChoiceContents(const CChoiceTypeInfo* choiceType);
  131. #endif
  132.     // low level I/O
  133.     virtual void BeginNamedType(TTypeInfo namedTypeInfo);
  134.     virtual void EndNamedType(void);
  135.     virtual void BeginContainer(const CContainerTypeInfo* containerType);
  136.     virtual void EndContainer(void);
  137.     virtual bool BeginContainerElement(TTypeInfo elementType);
  138.     virtual void EndContainerElement(void);
  139.     void BeginArrayElement(TTypeInfo elementType);
  140.     void EndArrayElement(void);
  141.     void CheckStdXml(const CClassTypeInfoBase* classType);
  142.     ETypeFamily GetRealTypeFamily(TTypeInfo typeInfo);
  143.     ETypeFamily GetContainerElementTypeFamily(TTypeInfo typeInfo);
  144.     virtual void BeginClass(const CClassTypeInfo* classInfo);
  145.     virtual void EndClass(void);
  146.     virtual TMemberIndex BeginClassMember(const CClassTypeInfo* classType);
  147.     virtual TMemberIndex BeginClassMember(const CClassTypeInfo* classType,
  148.                                           TMemberIndex pos);
  149.     void EndClassMember(void);
  150.     virtual void UndoClassMember(void);
  151.     virtual void BeginChoice(const CChoiceTypeInfo* choiceType);
  152.     virtual void EndChoice(void);
  153.     virtual TMemberIndex BeginChoiceVariant(const CChoiceTypeInfo* choiceType);
  154.     virtual void EndChoiceVariant(void);
  155.     void BeginBytes(ByteBlock& );
  156.     int GetHexChar(void);
  157.     size_t ReadBytes(ByteBlock& block, char* dst, size_t length);
  158.     void BeginChars(CharBlock& );
  159.     size_t ReadChars(CharBlock& block, char* dst, size_t length);
  160. private:
  161.     bool OutsideTag(void) const;
  162.     bool InsideTag(void) const;
  163.     bool InsideOpeningTag(void) const;
  164.     bool InsideClosingTag(void) const;
  165.     bool SelfClosedTag(void) const;
  166.     void Found_lt(void);
  167.     void Back_lt(void);
  168.     void Found_lt_slash(void);
  169.     void Found_gt(void);
  170.     void Found_slash_gt(void);
  171.     void EndSelfClosedTag(void);
  172.     void EndTag(void);
  173.     void EndOpeningTag(void);
  174.     bool EndOpeningTagSelfClosed(void); // true if '/>' found, false if '>'
  175.     void EndClosingTag(void);
  176.     char BeginOpeningTag(void);
  177.     char BeginClosingTag(void);
  178.     void BeginData(void);
  179.     int ReadEscapedChar(char endingChar, bool* encoded=0);
  180.     void ReadTagData(string& s);
  181.     CLightString ReadName(char c);
  182.     CLightString RejectedName(void);
  183.     CLightString ReadAttributeName(void);
  184.     void ReadAttributeValue(string& value, bool skipClosing=false);
  185.     char ReadUndefinedAttributes(void);
  186.     void SkipAttributeValue(char c);
  187.     void SkipQDecl(void);
  188.     char SkipWS(void);
  189.     char SkipWSAndComments(void);
  190.     void UnexpectedMember(const CLightString& id, const CItemsInfo& items);
  191.     bool x_IsStdXml(void) {return m_StdXml || m_EnforcedStdXml;}
  192.     void x_EndTypeNamespace(void);
  193.     enum ETagState {
  194.         eTagOutside,
  195.         eTagInsideOpening,
  196.         eTagInsideClosing,
  197.         eTagSelfClosed
  198.     };
  199.     ETagState m_TagState;
  200.     string m_LastTag;
  201.     string m_RejectedTag;
  202.     bool m_Attlist;
  203.     bool m_StdXml;
  204.     bool m_EnforcedStdXml;
  205.     string m_LastPrimitive;
  206.     EEncoding m_Encoding;
  207.     string m_CurrNsPrefix;
  208.     map<string,string> m_NsPrefixToName;
  209.     map<string,string> m_NsNameToPrefix;
  210. };
  211. /* @} */
  212. #include <serial/objistrxml.inl>
  213. END_NCBI_SCOPE
  214. #endif  /* OBJISTRXML__HPP */
  215. /* ---------------------------------------------------------------------------
  216. * $Log: objistrxml.hpp,v $
  217. * Revision 1000.3  2004/06/01 19:38:59  gouriano
  218. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.35
  219. *
  220. * Revision 1.35  2004/04/28 19:24:53  gouriano
  221. * Corrected reading of containers
  222. *
  223. * Revision 1.34  2004/01/30 20:31:05  gouriano
  224. * Corrected reading white spaces
  225. *
  226. * Revision 1.33  2004/01/22 20:47:55  gouriano
  227. * Corrected reading of AnyContent object attributes
  228. *
  229. * Revision 1.32  2004/01/08 17:38:23  gouriano
  230. * Added encoding Windows-1252
  231. *
  232. * Revision 1.31  2003/11/26 19:59:38  vasilche
  233. * GetPosition() and GetDataFormat() methods now are implemented
  234. * in parent classes CObjectIStream and CObjectOStream to avoid
  235. * pure virtual method call in destructors.
  236. *
  237. * Revision 1.30  2003/09/16 14:49:15  gouriano
  238. * Enhanced AnyContent objects to support XML namespaces and attribute info items.
  239. *
  240. * Revision 1.29  2003/08/25 15:58:32  gouriano
  241. * added possibility to use namespaces in XML i/o streams
  242. *
  243. * Revision 1.28  2003/08/13 15:47:02  gouriano
  244. * implemented serialization of AnyContent objects
  245. *
  246. * Revision 1.27  2003/06/30 15:40:18  gouriano
  247. * added encoding (utf-8 or iso-8859-1)
  248. *
  249. * Revision 1.26  2003/06/24 20:54:13  gouriano
  250. * corrected code generation and serialization of non-empty unnamed containers (XML)
  251. *
  252. * Revision 1.25  2003/05/22 20:08:41  gouriano
  253. * added UTF8 strings
  254. *
  255. * Revision 1.24  2003/04/15 16:18:25  siyan
  256. * Added doxygen support
  257. *
  258. * Revision 1.23  2003/02/05 17:08:51  gouriano
  259. * added possibility to read/write objects generated from an ASN.1 spec as "standard" XML - without scope prefixes
  260. *
  261. * Revision 1.22  2003/01/21 19:28:44  gouriano
  262. * corrected reading containers of primitive types
  263. *
  264. * Revision 1.21  2002/12/26 19:33:06  gouriano
  265. * changed XML I/O streams to properly handle object copying
  266. *
  267. * Revision 1.20  2002/12/23 18:38:51  dicuccio
  268. * Added WIn32 export specifier: NCBI_XSERIAL_EXPORT.
  269. * Moved all CVS logs to the end.
  270. *
  271. * Revision 1.19  2002/12/12 21:10:26  gouriano
  272. * implemented handling of complex XML containers
  273. *
  274. * Revision 1.18  2002/11/26 22:01:38  gouriano
  275. * added HasMoreElements method
  276. *
  277. * Revision 1.17  2002/11/20 21:21:58  gouriano
  278. * corrected processing of unnamed sequences as choice variants
  279. *
  280. * Revision 1.16  2002/11/14 20:51:27  gouriano
  281. * added support of attribute lists
  282. *
  283. * Revision 1.15  2002/10/15 13:45:15  gouriano
  284. * added "UndoClassMember" function
  285. *
  286. * Revision 1.14  2001/10/17 20:41:19  grichenk
  287. * Added CObjectOStream::CharBlock class
  288. *
  289. * Revision 1.13  2001/01/05 20:10:36  vasilche
  290. * CByteSource, CIStrBuffer, COStrBuffer, CLightString, CChecksum, CWeakMap
  291. * were moved to util.
  292. *
  293. * Revision 1.12  2000/12/15 21:28:47  vasilche
  294. * Moved some typedefs/enums from corelib/ncbistd.hpp.
  295. * Added flags to CObjectIStream/CObjectOStream: eFlagAllowNonAsciiChars.
  296. * TByte typedef replaced by Uint1.
  297. *
  298. * Revision 1.11  2000/12/15 15:38:00  vasilche
  299. * Added support of Int8 and long double.
  300. * Enum values now have type Int4 instead of long.
  301. *
  302. * Revision 1.10  2000/11/07 17:25:12  vasilche
  303. * Fixed encoding of XML:
  304. *     removed unnecessary apostrophes in OCTET STRING
  305. *     removed unnecessary content in NULL
  306. * Added module names to CTypeInfo and CEnumeratedTypeValues
  307. *
  308. * Revision 1.9  2000/10/03 17:22:35  vasilche
  309. * Reduced header dependency.
  310. * Reduced size of debug libraries on WorkShop by 3 times.
  311. * Fixed tag allocation for parent classes.
  312. * Fixed CObject allocation/deallocation in streams.
  313. * Moved instantiation of several templates in separate source file.
  314. *
  315. * Revision 1.8  2000/09/29 16:18:14  vasilche
  316. * Fixed binary format encoding/decoding on 64 bit compulers.
  317. * Implemented CWeakMap<> for automatic cleaning map entries.
  318. * Added cleaning local hooks via CWeakMap<>.
  319. * Renamed ReadTypeName -> ReadFileHeader, ENoTypeName -> ENoFileHeader.
  320. * Added some user interface methods to CObjectIStream, CObjectOStream and
  321. * CObjectStreamCopier.
  322. *
  323. * Revision 1.7  2000/09/18 20:00:06  vasilche
  324. * Separated CVariantInfo and CMemberInfo.
  325. * Implemented copy hooks.
  326. * All hooks now are stored in CTypeInfo/CMemberInfo/CVariantInfo.
  327. * Most type specific functions now are implemented via function pointers instead of virtual functions.
  328. *
  329. * Revision 1.6  2000/09/01 13:16:01  vasilche
  330. * Implemented class/container/choice iterators.
  331. * Implemented CObjectStreamCopier for copying data without loading into memory.
  332. *
  333. * Revision 1.5  2000/08/15 19:44:40  vasilche
  334. * Added Read/Write hooks:
  335. * CReadObjectHook/CWriteObjectHook for objects of specified type.
  336. * CReadClassMemberHook/CWriteClassMemberHook for specified members.
  337. * CReadChoiceVariantHook/CWriteChoiceVariant for specified choice variants.
  338. * CReadContainerElementHook/CWriteContainerElementsHook for containers.
  339. *
  340. * Revision 1.4  2000/07/03 18:42:36  vasilche
  341. * Added interface to typeinfo via CObjectInfo and CConstObjectInfo.
  342. * Reduced header dependency.
  343. *
  344. * Revision 1.3  2000/06/16 16:31:06  vasilche
  345. * Changed implementation of choices and classes info to allow use of the same classes in generated and user written classes.
  346. *
  347. * Revision 1.2  2000/06/07 19:45:43  vasilche
  348. * Some code cleaning.
  349. * Macros renaming in more clear way.
  350. * BEGIN_NAMED_*_INFO, ADD_*_MEMBER, ADD_NAMED_*_MEMBER.
  351. *
  352. * Revision 1.1  2000/06/01 19:06:57  vasilche
  353. * Added parsing of XML data.
  354. *
  355. * ===========================================================================
  356. */