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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: objostrxml.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/04/12 17:15:24  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.38
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJOSTRXML__HPP
  10. #define OBJOSTRXML__HPP
  11. /*  $Id: objostrxml.hpp,v 1000.2 2004/04/12 17:15:24 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. *   XML objects output stream
  40. */
  41. #include <corelib/ncbistd.hpp>
  42. #include <serial/objostr.hpp>
  43. #include <stack>
  44. /** @addtogroup ObjStreamSupport
  45.  *
  46.  * @{
  47.  */
  48. BEGIN_NCBI_SCOPE
  49. class NCBI_XSERIAL_EXPORT CObjectOStreamXml : public CObjectOStream
  50. {
  51. public:
  52.     CObjectOStreamXml(CNcbiOstream& out, bool deleteOut);
  53.     virtual ~CObjectOStreamXml(void);
  54.     virtual string GetPosition(void) const;
  55.     enum EEncoding {
  56.         eEncoding_Unknown,
  57.         eEncoding_UTF8,
  58.         eEncoding_ISO8859_1,
  59.         eEncoding_Windows_1252
  60.     };
  61.     void SetEncoding(EEncoding enc);
  62.     EEncoding GetEncoding(void) const;
  63.     void SetReferenceSchema(bool use_schema = true);
  64.     bool GetReferenceSchema(void) const;
  65.     void SetReferenceDTD(bool use_dtd = true);
  66.     bool GetReferenceDTD(void) const;
  67.     void SetUseSchemaLocation(bool use_loc = true);
  68.     bool GetUseSchemaLocation(void) const;
  69.     static void   SetDefaultSchemaNamespace(const string& schema_ns);
  70.     static string GetDefaultSchemaNamespace(void);
  71.     virtual void WriteFileHeader(TTypeInfo type);
  72.     // DTD file name and prefix. The final module name is built as
  73.     // DTDFilePrefix + DTDFileName.
  74.     // If "DTDFilePrefix" has never been set for this stream, then
  75.     // the global "DefaultDTDFilePrefix" will be used.
  76.     // If it has been set to any value (including empty string), then
  77.     // that value will be used.
  78.     void   SetDTDFilePrefix(const string& prefix);
  79.     string GetDTDFilePrefix(void) const;
  80.     // Default (global) DTD file prefix.
  81.     static void   SetDefaultDTDFilePrefix(const string& prefix);
  82.     static string GetDefaultDTDFilePrefix(void);
  83.     // If "DTDFileName" is not set or set to empty string for this stream,
  84.     // then type name will be used as the file name.
  85.     void   SetDTDFileName(const string& filename);
  86.     string GetDTDFileName(void) const;
  87.     // Enable/disable DTD public identifier.
  88.     // If disabled (it is ENABLED by default), only system identifier
  89.     // will be written in the output XML stream
  90.     void EnableDTDPublicId(void);
  91.     void DisableDTDPublicId(void);
  92.     // DTD public identifier. If set to non-empty string, the stream will
  93.     // write this in the output XML file. Otherwise the "default" public id
  94.     // will be generated
  95.     void SetDTDPublicId(const string& publicId);
  96.     string GetDTDPublicId(void) const;
  97.     enum ERealValueFormat {
  98.         eRealFixedFormat,
  99.         eRealScientificFormat
  100.     };
  101.     ERealValueFormat GetRealValueFormat(void) const;
  102.     void SetRealValueFormat(ERealValueFormat fmt);
  103.     void SetEnforcedStdXml(bool set = true);
  104.     bool GetEnforcedStdXml(void)     {return m_EnforcedStdXml;}
  105. protected:
  106.     virtual void WriteBool(bool data);
  107.     virtual void WriteChar(char data);
  108.     virtual void WriteInt4(Int4 data);
  109.     virtual void WriteUint4(Uint4 data);
  110.     virtual void WriteInt8(Int8 data);
  111.     virtual void WriteUint8(Uint8 data);
  112.     virtual void WriteFloat(float data);
  113.     virtual void WriteDouble(double data);
  114.     void WriteDouble2(double data, size_t digits);
  115.     virtual void WriteCString(const char* str);
  116.     virtual void WriteString(const string& s,
  117.                              EStringType type = eStringTypeVisible);
  118.     virtual void WriteStringStore(const string& s);
  119.     virtual void CopyString(CObjectIStream& in);
  120.     virtual void CopyStringStore(CObjectIStream& in);
  121.     virtual void WriteNullPointer(void);
  122.     virtual void WriteObjectReference(TObjectIndex index);
  123.     virtual void WriteOtherBegin(TTypeInfo typeInfo);
  124.     virtual void WriteOtherEnd(TTypeInfo typeInfo);
  125.     virtual void WriteOther(TConstObjectPtr object, TTypeInfo typeInfo);
  126.     void WriteId(const string& str);
  127.     void WriteNull(void);
  128.     virtual void WriteAnyContentObject(const CAnyContentObject& obj);
  129.     virtual void CopyAnyContentObject(CObjectIStream& in);
  130.     void WriteEscapedChar(char c);
  131.     virtual void WriteEnum(const CEnumeratedTypeValues& values,
  132.                            TEnumValueType value);
  133.     virtual void CopyEnum(const CEnumeratedTypeValues& values,
  134.                           CObjectIStream& in);
  135.     void WriteEnum(const CEnumeratedTypeValues& values,
  136.                    TEnumValueType value, const string& valueName);
  137. #ifdef VIRTUAL_MID_LEVEL_IO
  138.     virtual void WriteNamedType(TTypeInfo namedTypeInfo,
  139.                                 TTypeInfo typeInfo, TConstObjectPtr object);
  140.     virtual void CopyNamedType(TTypeInfo namedTypeInfo,
  141.                                TTypeInfo typeInfo,
  142.                                CObjectStreamCopier& copier);
  143.     virtual void WriteContainer(const CContainerTypeInfo* containerType,
  144.                                 TConstObjectPtr containerPtr);
  145.     void WriteContainerContents(const CContainerTypeInfo* containerType,
  146.                                 TConstObjectPtr containerPtr);
  147.     virtual void WriteClass(const CClassTypeInfo* objectType,
  148.                             TConstObjectPtr objectPtr);
  149.     virtual void WriteClassMember(const CMemberId& memberId,
  150.                                   TTypeInfo memberType,
  151.                                   TConstObjectPtr memberPtr);
  152.     virtual bool WriteClassMember(const CMemberId& memberId,
  153.                                   const CDelayBuffer& buffer);
  154.     virtual void WriteChoice(const CChoiceTypeInfo* choiceType,
  155.                              TConstObjectPtr choicePtr);
  156.     void WriteChoiceContents(const CChoiceTypeInfo* choiceType,
  157.                              TConstObjectPtr choicePtr);
  158. /*
  159.     // COPY
  160.     virtual void CopyNamedType(TTypeInfo namedTypeInfo,
  161.                                TTypeInfo typeInfo,
  162.                                CObjectStreamCopier& copier);
  163.     virtual void CopyContainer(const CContainerTypeInfo* containerType,
  164.                                CObjectStreamCopier& copier);
  165.     virtual void CopyClassRandom(const CClassTypeInfo* objectType,
  166.                                  CObjectStreamCopier& copier);
  167.     virtual void CopyClassSequential(const CClassTypeInfo* objectType,
  168.                                      CObjectStreamCopier& copier);
  169.     virtual void CopyChoice(const CChoiceTypeInfo* choiceType,
  170.                             CObjectStreamCopier& copier);
  171. */
  172. #endif
  173.     // low level I/O
  174.     virtual void BeginNamedType(TTypeInfo namedTypeInfo);
  175.     virtual void EndNamedType(void);
  176.     virtual void BeginContainer(const CContainerTypeInfo* containerType);
  177.     virtual void EndContainer(void);
  178.     virtual void BeginContainerElement(TTypeInfo elementType);
  179.     virtual void EndContainerElement(void);
  180.     void BeginArrayElement(TTypeInfo elementType);
  181.     void EndArrayElement(void);
  182.     void CheckStdXml(const CClassTypeInfoBase* classType);
  183.     ETypeFamily GetRealTypeFamily(TTypeInfo typeInfo);
  184.     ETypeFamily GetContainerElementTypeFamily(TTypeInfo typeInfo);
  185.     virtual void BeginClass(const CClassTypeInfo* classInfo);
  186.     virtual void EndClass(void);
  187.     virtual void BeginClassMember(const CMemberId& id);
  188.     void BeginClassMember(TTypeInfo memberType,
  189.                           const CMemberId& id);
  190.     virtual void EndClassMember(void);
  191.     virtual void BeginChoice(const CChoiceTypeInfo* choiceType);
  192.     virtual void EndChoice(void);
  193.     virtual void BeginChoiceVariant(const CChoiceTypeInfo* choiceType,
  194.                                     const CMemberId& id);
  195.     virtual void EndChoiceVariant(void);
  196.     virtual void WriteBytes(const ByteBlock& block,
  197.                             const char* bytes, size_t length);
  198.     virtual void WriteChars(const CharBlock& block,
  199.                             const char* chars, size_t length);
  200.     // Write current separator to the stream
  201.     virtual void WriteSeparator(void);
  202. #if defined(NCBI_SERIAL_IO_TRACE)
  203.     void TraceTag(const string& name);
  204. #endif
  205. private:
  206.     void WriteString(const char* str, size_t length);
  207.     void OpenTagStart(void);
  208.     void OpenTagEnd(void);
  209.     void OpenTagEndBack(void);
  210.     void SelfCloseTagEnd(void);
  211.     void CloseTagStart(void);
  212.     void CloseTagEnd(void);
  213.     void WriteTag(const string& name);
  214.     void OpenTag(const string& name);
  215.     void EolIfEmptyTag(void);
  216.     void CloseTag(const string& name);
  217.     void OpenStackTag(size_t level);
  218.     void CloseStackTag(size_t level);
  219.     void OpenTag(TTypeInfo type);
  220.     void CloseTag(TTypeInfo type);
  221.     void OpenTagIfNamed(TTypeInfo type);
  222.     void CloseTagIfNamed(TTypeInfo type);
  223.     void PrintTagName(size_t level);
  224.     bool WillHaveName(TTypeInfo elementType);
  225.     string GetModuleName(TTypeInfo type);
  226.     bool x_IsStdXml(void) {return m_StdXml || m_EnforcedStdXml;}
  227.     void x_WriteClassNamespace(TTypeInfo type);
  228.     bool x_ProcessTypeNamespace(TTypeInfo type);
  229.     void x_EndTypeNamespace(void);
  230.     bool x_BeginNamespace(const string& ns_name, const string& ns_prefix);
  231.     void x_EndNamespace(const string& ns_name);
  232.     enum ETagAction {
  233.         eTagOpen,
  234.         eTagClose,
  235.         eTagSelfClosed,
  236.         eAttlistTag
  237.     };
  238.     ETagAction m_LastTagAction;
  239.     bool m_EndTag;
  240.     // DTD file name and prefix
  241.     bool   m_UseDefaultDTDFilePrefix;
  242.     string m_DTDFilePrefix;
  243.     string m_DTDFileName;
  244.     bool   m_UsePublicId;
  245.     string m_PublicId;
  246.     static string sm_DefaultDTDFilePrefix;
  247.     bool m_Attlist;
  248.     bool m_StdXml;
  249.     bool m_EnforcedStdXml;
  250.     ERealValueFormat m_RealFmt;
  251.     EEncoding m_Encoding;
  252.     bool m_UseSchemaRef;
  253.     bool m_UseSchemaLoc;
  254.     bool m_UseDTDRef;
  255.     static string sm_DefaultSchemaNamespace;
  256.     string m_CurrNsPrefix;
  257.     map<string,string> m_NsNameToPrefix;
  258.     map<string,string> m_NsPrefixToName;
  259.     stack<string> m_NsPrefixes;
  260. };
  261. /* @} */
  262. #include <serial/objostrxml.inl>
  263. END_NCBI_SCOPE
  264. #endif
  265. /* ---------------------------------------------------------------------------
  266. * $Log: objostrxml.hpp,v $
  267. * Revision 1000.2  2004/04/12 17:15:24  gouriano
  268. * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.38
  269. *
  270. * Revision 1.38  2004/01/08 17:42:34  gouriano
  271. * Added encoding Windows-1252.
  272. * Made it possible to omit document type declaration
  273. *
  274. * Revision 1.37  2003/11/26 19:59:39  vasilche
  275. * GetPosition() and GetDataFormat() methods now are implemented
  276. * in parent classes CObjectIStream and CObjectOStream to avoid
  277. * pure virtual method call in destructors.
  278. *
  279. * Revision 1.36  2003/09/16 14:49:15  gouriano
  280. * Enhanced AnyContent objects to support XML namespaces and attribute info items.
  281. *
  282. * Revision 1.35  2003/08/25 15:58:32  gouriano
  283. * added possibility to use namespaces in XML i/o streams
  284. *
  285. * Revision 1.34  2003/08/13 15:47:02  gouriano
  286. * implemented serialization of AnyContent objects
  287. *
  288. * Revision 1.33  2003/07/02 13:01:00  gouriano
  289. * added ability to read/write XML files with reference to schema
  290. *
  291. * Revision 1.32  2003/06/30 15:40:18  gouriano
  292. * added encoding (utf-8 or iso-8859-1)
  293. *
  294. * Revision 1.31  2003/05/22 20:08:42  gouriano
  295. * added UTF8 strings
  296. *
  297. * Revision 1.30  2003/04/15 16:18:32  siyan
  298. * Added doxygen support
  299. *
  300. * Revision 1.29  2003/03/26 16:13:33  vasilche
  301. * Removed TAB symbols. Some formatting.
  302. *
  303. * Revision 1.28  2003/02/05 17:08:51  gouriano
  304. * added possibility to read/write objects generated from an ASN.1 spec as "standard" XML - without scope prefixes
  305. *
  306. * Revision 1.27  2003/01/22 20:51:10  gouriano
  307. * more control on how a float value is to be written
  308. *
  309. * Revision 1.26  2003/01/10 16:53:36  gouriano
  310. * fixed a bug with optional class members
  311. *
  312. * Revision 1.25  2002/12/26 19:33:06  gouriano
  313. * changed XML I/O streams to properly handle object copying
  314. *
  315. * Revision 1.24  2002/12/23 18:38:51  dicuccio
  316. * Added WIn32 export specifier: NCBI_XSERIAL_EXPORT.
  317. * Moved all CVS logs to the end.
  318. *
  319. * Revision 1.23  2002/12/12 21:10:26  gouriano
  320. * implemented handling of complex XML containers
  321. *
  322. * Revision 1.22  2002/11/14 20:52:55  gouriano
  323. * added support of attribute lists
  324. *
  325. * Revision 1.21  2002/10/18 14:25:52  gouriano
  326. * added possibility to enable/disable/set public identifier
  327. *
  328. * Revision 1.20  2002/03/07 22:02:00  grichenk
  329. * Added "Separator" modifier for CObjectOStream
  330. *
  331. * Revision 1.19  2001/11/09 19:07:22  grichenk
  332. * Fixed DTDFilePrefix functions
  333. *
  334. * Revision 1.18  2001/10/17 20:41:20  grichenk
  335. * Added CObjectOStream::CharBlock class
  336. *
  337. * Revision 1.17  2001/10/17 18:18:28  grichenk
  338. * Added CObjectOStreamXml::xxxFilePrefix() and
  339. * CObjectOStreamXml::xxxFileName()
  340. *
  341. * Revision 1.16  2001/05/17 14:59:47  lavr
  342. * Typos corrected
  343. *
  344. * Revision 1.15  2001/04/13 14:57:21  kholodov
  345. * Added: SetDTDFileName function to set DTD module name in XML header
  346. *
  347. * Revision 1.14  2000/12/15 21:28:48  vasilche
  348. * Moved some typedefs/enums from corelib/ncbistd.hpp.
  349. * Added flags to CObjectIStream/CObjectOStream: eFlagAllowNonAsciiChars.
  350. * TByte typedef replaced by Uint1.
  351. *
  352. * Revision 1.13  2000/12/15 15:38:01  vasilche
  353. * Added support of Int8 and long double.
  354. * Enum values now have type Int4 instead of long.
  355. *
  356. * Revision 1.12  2000/11/07 17:25:12  vasilche
  357. * Fixed encoding of XML:
  358. *     removed unnecessary apostrophes in OCTET STRING
  359. *     removed unnecessary content in NULL
  360. * Added module names to CTypeInfo and CEnumeratedTypeValues
  361. *
  362. * Revision 1.11  2000/10/20 15:51:27  vasilche
  363. * Fixed data error processing.
  364. * Added interface for constructing container objects directly into output stream.
  365. * object.hpp, object.inl and object.cpp were split to
  366. * objectinfo.*, objecttype.*, objectiter.* and objectio.*.
  367. *
  368. * Revision 1.10  2000/10/04 19:18:54  vasilche
  369. * Fixed processing floating point data.
  370. *
  371. * Revision 1.9  2000/09/29 16:18:15  vasilche
  372. * Fixed binary format encoding/decoding on 64 bit compulers.
  373. * Implemented CWeakMap<> for automatic cleaning map entries.
  374. * Added cleaning local hooks via CWeakMap<>.
  375. * Renamed ReadTypeName -> ReadFileHeader, ENoTypeName -> ENoFileHeader.
  376. * Added some user interface methods to CObjectIStream, CObjectOStream and
  377. * CObjectStreamCopier.
  378. *
  379. * Revision 1.8  2000/09/18 20:00:07  vasilche
  380. * Separated CVariantInfo and CMemberInfo.
  381. * Implemented copy hooks.
  382. * All hooks now are stored in CTypeInfo/CMemberInfo/CVariantInfo.
  383. * Most type specific functions now are implemented via function pointers instead of virtual functions.
  384. *
  385. * Revision 1.7  2000/09/01 13:16:02  vasilche
  386. * Implemented class/container/choice iterators.
  387. * Implemented CObjectStreamCopier for copying data without loading into memory.
  388. *
  389. * Revision 1.6  2000/08/15 19:44:41  vasilche
  390. * Added Read/Write hooks:
  391. * CReadObjectHook/CWriteObjectHook for objects of specified type.
  392. * CReadClassMemberHook/CWriteClassMemberHook for specified members.
  393. * CReadChoiceVariantHook/CWriteChoiceVariant for specified choice variants.
  394. * CReadContainerElementHook/CWriteContainerElementsHook for containers.
  395. *
  396. * Revision 1.5  2000/07/03 18:42:36  vasilche
  397. * Added interface to typeinfo via CObjectInfo and CConstObjectInfo.
  398. * Reduced header dependency.
  399. *
  400. * Revision 1.4  2000/06/16 16:31:07  vasilche
  401. * Changed implementation of choices and classes info to allow use of the same classes in generated and user written classes.
  402. *
  403. * Revision 1.3  2000/06/07 19:45:44  vasilche
  404. * Some code cleaning.
  405. * Macros renaming in more clear way.
  406. * BEGIN_NAMED_*_INFO, ADD_*_MEMBER, ADD_NAMED_*_MEMBER.
  407. *
  408. * Revision 1.2  2000/06/01 19:06:58  vasilche
  409. * Added parsing of XML data.
  410. *
  411. * Revision 1.1  2000/05/24 20:08:14  vasilche
  412. * Implemented XML dump.
  413. *
  414. * ===========================================================================
  415. */