qxmlstream.h
上传用户:detong
上传日期:2022-06-22
资源大小:20675k
文件大小:17k
源码类别:

系统编程

开发平台:

Unix_Linux

  1. /****************************************************************************
  2. **
  3. ** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
  4. ** Contact: Qt Software Information (qt-info@nokia.com)
  5. **
  6. ** This file is part of the QtCore module of the Qt Toolkit.
  7. **
  8. ** Commercial Usage
  9. ** Licensees holding valid Qt Commercial licenses may use this file in
  10. ** accordance with the Qt Commercial License Agreement provided with the
  11. ** Software or, alternatively, in accordance with the terms contained in
  12. ** a written agreement between you and Nokia.
  13. **
  14. **
  15. ** GNU General Public License Usage
  16. ** Alternatively, this file may be used under the terms of the GNU
  17. ** General Public License versions 2.0 or 3.0 as published by the Free
  18. ** Software Foundation and appearing in the file LICENSE.GPL included in
  19. ** the packaging of this file.  Please review the following information
  20. ** to ensure GNU General Public Licensing requirements will be met:
  21. ** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
  22. ** http://www.gnu.org/copyleft/gpl.html.  In addition, as a special
  23. ** exception, Nokia gives you certain additional rights. These rights
  24. ** are described in the Nokia Qt GPL Exception version 1.3, included in
  25. ** the file GPL_EXCEPTION.txt in this package.
  26. **
  27. ** Qt for Windows(R) Licensees
  28. ** As a special exception, Nokia, as the sole copyright holder for Qt
  29. ** Designer, grants users of the Qt/Eclipse Integration plug-in the
  30. ** right for the Qt/Eclipse Integration to link to functionality
  31. ** provided by Qt Designer and its related libraries.
  32. **
  33. ** If you are unsure which license is appropriate for your use, please
  34. ** contact the sales department at qt-sales@nokia.com.
  35. **
  36. ****************************************************************************/
  37. #ifndef QXMLSTREAM_H
  38. #define QXMLSTREAM_H
  39. #include <QtCore/QIODevice>
  40. #ifndef QT_NO_XMLSTREAM
  41. #include <QtCore/QString>
  42. #include <QtCore/QVector>
  43. QT_BEGIN_HEADER
  44. QT_BEGIN_NAMESPACE
  45. QT_MODULE(Core)
  46. // QXmlStream* was originally in the QtXml module
  47. // since we've moved it to QtCore in Qt 4.4.0, we need to
  48. // keep binary compatibility
  49. //
  50. // The list of supported platforms is in:
  51. //   http://trolltech.com/developer/notes/supported_platforms
  52. //
  53. // These platforms do not support symbol moving nor duplication
  54. // (because duplicate symbols cause warnings when linking):
  55. //   Apple MacOS X (Mach-O executable format)
  56. //   IBM AIX (XCOFF executable format)
  57. //
  58. // These platforms do not support symbol moving but allow it to be duplicated:
  59. //   Microsoft Windows (COFF PE executable format)
  60. //      special case: Windows CE wasn't supported before 4.4.0
  61. //
  62. // These platforms support symbol moving:
  63. //   HP HP-UX (PA-RISC2.0 shared executables)
  64. //   HP HP-UXi (ELF executable format)
  65. //   FreeBSD (ELF executable format)
  66. //   Linux (ELF executable format)
  67. //   SGI IRIX (ELF executable format)
  68. //   Sun Solaris (ELF executable format)
  69. //
  70. // Other platforms are supported through community contributions only.
  71. // We are taking the optimist scenario here to avoid creating more
  72. // symbols to be supported.
  73. #if defined(Q_OS_MAC) || defined(Q_OS_AIX)
  74. # if !defined QT_BUILD_XML_LIB
  75. #  define Q_XMLSTREAM_RENAME_SYMBOLS
  76. # endif
  77. #endif
  78. #if defined QT_BUILD_XML_LIB
  79. # define Q_XMLSTREAM_EXPORT     Q_XML_EXPORT
  80. #else
  81. # define Q_XMLSTREAM_EXPORT     Q_CORE_EXPORT
  82. #endif
  83. #if defined Q_XMLSTREAM_RENAME_SYMBOLS
  84. // don't worry, we'll undef and change to typedef at the bottom of the file
  85. # define QXmlStreamAttribute QCoreXmlStreamAttribute
  86. # define QXmlStreamAttributes QCoreXmlStreamAttributes
  87. # define QXmlStreamEntityDeclaration QCoreXmlStreamEntityDeclaration
  88. # define QXmlStreamEntityDeclarations QCoreXmlStreamEntityDeclarations
  89. # define QXmlStreamEntityResolver QCoreXmlStreamEntityResolver
  90. # define QXmlStreamNamespaceDeclaration QCoreXmlStreamNamespaceDeclaration
  91. # define QXmlStreamNamespaceDeclarations QCoreXmlStreamNamespaceDeclarations
  92. # define QXmlStreamNotationDeclaration QCoreXmlStreamNotationDeclaration
  93. # define QXmlStreamNotationDeclarations QCoreXmlStreamNotationDeclarations
  94. # define QXmlStreamReader QCoreXmlStreamReader
  95. # define QXmlStreamStringRef QCoreXmlStreamStringRef
  96. # define QXmlStreamWriter QCoreXmlStreamWriter
  97. #endif
  98. class Q_XMLSTREAM_EXPORT QXmlStreamStringRef {
  99.     QString m_string;
  100.     int m_position, m_size;
  101. public:
  102.     inline QXmlStreamStringRef():m_position(0), m_size(0){}
  103.     inline QXmlStreamStringRef(const QStringRef &aString)
  104.         :m_string(aString.string()?*aString.string():QString()), m_position(aString.position()), m_size(aString.size()){}
  105.     inline QXmlStreamStringRef(const QString &aString):m_string(aString), m_position(0), m_size(aString.size()){}
  106.     inline ~QXmlStreamStringRef(){}
  107.     inline void clear() { m_string.clear(); m_position = m_size = 0; }
  108.     inline operator QStringRef() const { return QStringRef(&m_string, m_position, m_size); }
  109.     inline const QString *string() const { return &m_string; }
  110.     inline int position() const { return m_position; }
  111.     inline int size() const { return m_size; }
  112. };
  113. class QXmlStreamReaderPrivate;
  114. class QXmlStreamAttributes;
  115. class Q_XMLSTREAM_EXPORT QXmlStreamAttribute {
  116.     QXmlStreamStringRef m_name, m_namespaceUri, m_qualifiedName, m_value;
  117.     void *reserved;
  118.     uint m_isDefault : 1;
  119.     friend class QXmlStreamReaderPrivate;
  120.     friend class QXmlStreamAttributes;
  121. public:
  122.     QXmlStreamAttribute();
  123.     QXmlStreamAttribute(const QString &qualifiedName, const QString &value);
  124.     QXmlStreamAttribute(const QString &namespaceUri, const QString &name, const QString &value);
  125.     QXmlStreamAttribute(const QXmlStreamAttribute &);
  126.     QXmlStreamAttribute& operator=(const QXmlStreamAttribute &);
  127.     ~QXmlStreamAttribute();
  128.     inline QStringRef namespaceUri() const { return m_namespaceUri; }
  129.     inline QStringRef name() const { return m_name; }
  130.     inline QStringRef qualifiedName() const { return m_qualifiedName; }
  131.     inline QStringRef prefix() const {
  132.         return QStringRef(m_qualifiedName.string(),
  133.                           m_qualifiedName.position(),
  134.                           qMax(0, m_qualifiedName.size() - m_name.size() - 1));
  135.     }
  136.     inline QStringRef value() const { return m_value; }
  137.     inline bool isDefault() const { return m_isDefault; }
  138.     inline bool operator==(const QXmlStreamAttribute &other) const {
  139.         return (value() == other.value()
  140.                 && (namespaceUri().isNull() ? (qualifiedName() == other.qualifiedName())
  141.                     : (namespaceUri() == other.namespaceUri() && name() == other.name())));
  142.     }
  143.     inline bool operator!=(const QXmlStreamAttribute &other) const
  144.         { return !operator==(other); }
  145. };
  146. Q_DECLARE_TYPEINFO(QXmlStreamAttribute, Q_MOVABLE_TYPE);
  147. class Q_XMLSTREAM_EXPORT QXmlStreamAttributes : public QVector<QXmlStreamAttribute>
  148. {
  149. public:
  150.     QStringRef value(const QString &namespaceUri, const QString &name) const;
  151.     QStringRef value(const QString &namespaceUri, const QLatin1String &name) const;
  152.     QStringRef value(const QLatin1String &namespaceUri, const QLatin1String &name) const;
  153.     QStringRef value(const QString &qualifiedName) const;
  154.     QStringRef value(const QLatin1String &qualifiedName) const;
  155.     void append(const QString &namespaceUri, const QString &name, const QString &value);
  156.     void append(const QString &qualifiedName, const QString &value);
  157. #if !defined(Q_NO_USING_KEYWORD)
  158.     using QVector<QXmlStreamAttribute>::append;
  159. #else
  160.     inline void append(const QXmlStreamAttribute &attribute)
  161.         { QVector<QXmlStreamAttribute>::append(attribute); }
  162. #endif
  163. };
  164. class Q_XMLSTREAM_EXPORT QXmlStreamNamespaceDeclaration {
  165.     QXmlStreamStringRef m_prefix, m_namespaceUri;
  166.     void *reserved;
  167.     friend class QXmlStreamReaderPrivate;
  168. public:
  169.     QXmlStreamNamespaceDeclaration();
  170.     QXmlStreamNamespaceDeclaration(const QXmlStreamNamespaceDeclaration &);
  171.     QXmlStreamNamespaceDeclaration(const QString &prefix, const QString &namespaceUri);
  172.     ~QXmlStreamNamespaceDeclaration();
  173.     QXmlStreamNamespaceDeclaration& operator=(const QXmlStreamNamespaceDeclaration &);
  174.     inline QStringRef prefix() const { return m_prefix; }
  175.     inline QStringRef namespaceUri() const { return m_namespaceUri; }
  176.     inline bool operator==(const QXmlStreamNamespaceDeclaration &other) const {
  177.         return (prefix() == other.prefix() && namespaceUri() == other.namespaceUri());
  178.     }
  179.     inline bool operator!=(const QXmlStreamNamespaceDeclaration &other) const
  180.         { return !operator==(other); }
  181. };
  182. Q_DECLARE_TYPEINFO(QXmlStreamNamespaceDeclaration, Q_MOVABLE_TYPE);
  183. typedef QVector<QXmlStreamNamespaceDeclaration> QXmlStreamNamespaceDeclarations;
  184. class Q_XMLSTREAM_EXPORT QXmlStreamNotationDeclaration {
  185.     QXmlStreamStringRef m_name, m_systemId, m_publicId;
  186.     void *reserved;
  187.     friend class QXmlStreamReaderPrivate;
  188. public:
  189.     QXmlStreamNotationDeclaration();
  190.     ~QXmlStreamNotationDeclaration();
  191.     QXmlStreamNotationDeclaration(const QXmlStreamNotationDeclaration &);
  192.     QXmlStreamNotationDeclaration& operator=(const QXmlStreamNotationDeclaration &);
  193.     inline QStringRef name() const { return m_name; }
  194.     inline QStringRef systemId() const { return m_systemId; }
  195.     inline QStringRef publicId() const { return m_publicId; }
  196.     inline bool operator==(const QXmlStreamNotationDeclaration &other) const {
  197.         return (name() == other.name() && systemId() == other.systemId()
  198.                 && publicId() == other.publicId());
  199.     }
  200.     inline bool operator!=(const QXmlStreamNotationDeclaration &other) const
  201.         { return !operator==(other); }
  202. };
  203. Q_DECLARE_TYPEINFO(QXmlStreamNotationDeclaration, Q_MOVABLE_TYPE);
  204. typedef QVector<QXmlStreamNotationDeclaration> QXmlStreamNotationDeclarations;
  205. class Q_XMLSTREAM_EXPORT QXmlStreamEntityDeclaration {
  206.     QXmlStreamStringRef m_name, m_notationName, m_systemId, m_publicId, m_value;
  207.     void *reserved;
  208.     friend class QXmlStreamReaderPrivate;
  209. public:
  210.     QXmlStreamEntityDeclaration();
  211.     ~QXmlStreamEntityDeclaration();
  212.     QXmlStreamEntityDeclaration(const QXmlStreamEntityDeclaration &);
  213.     QXmlStreamEntityDeclaration& operator=(const QXmlStreamEntityDeclaration &);
  214.     inline QStringRef name() const { return m_name; }
  215.     inline QStringRef notationName() const { return m_notationName; }
  216.     inline QStringRef systemId() const { return m_systemId; }
  217.     inline QStringRef publicId() const { return m_publicId; }
  218.     inline QStringRef value() const { return m_value; }
  219.     inline bool operator==(const QXmlStreamEntityDeclaration &other) const {
  220.         return (name() == other.name()
  221.                 && notationName() == other.notationName()
  222.                 && systemId() == other.systemId()
  223.                 && publicId() == other.publicId()
  224.                 && value() == other.value());
  225.     }
  226.     inline bool operator!=(const QXmlStreamEntityDeclaration &other) const
  227.         { return !operator==(other); }
  228. };
  229. Q_DECLARE_TYPEINFO(QXmlStreamEntityDeclaration, Q_MOVABLE_TYPE);
  230. typedef QVector<QXmlStreamEntityDeclaration> QXmlStreamEntityDeclarations;
  231. class Q_XMLSTREAM_EXPORT QXmlStreamEntityResolver
  232. {
  233. public:
  234.     virtual ~QXmlStreamEntityResolver();
  235.     virtual QString resolveEntity(const QString& publicId, const QString& systemId);
  236.     virtual QString resolveUndeclaredEntity(const QString &name);
  237. };
  238. #ifndef QT_NO_XMLSTREAMREADER
  239. class Q_XMLSTREAM_EXPORT QXmlStreamReader {
  240.     QDOC_PROPERTY(bool namespaceProcessing READ namespaceProcessing WRITE setNamespaceProcessing)
  241. public:
  242.     enum TokenType {
  243.         NoToken = 0,
  244.         Invalid,
  245.         StartDocument,
  246.         EndDocument,
  247.         StartElement,
  248.         EndElement,
  249.         Characters,
  250.         Comment,
  251.         DTD,
  252.         EntityReference,
  253.         ProcessingInstruction
  254.     };
  255.     QXmlStreamReader();
  256.     QXmlStreamReader(QIODevice *device);
  257.     QXmlStreamReader(const QByteArray &data);
  258.     QXmlStreamReader(const QString &data);
  259.     QXmlStreamReader(const char * data);
  260.     ~QXmlStreamReader();
  261.     void setDevice(QIODevice *device);
  262.     QIODevice *device() const;
  263.     void addData(const QByteArray &data);
  264.     void addData(const QString &data);
  265.     void addData(const char *data);
  266.     void clear();
  267.     bool atEnd() const;
  268.     TokenType readNext();
  269.     TokenType tokenType() const;
  270.     QString tokenString() const;
  271.     void setNamespaceProcessing(bool);
  272.     bool namespaceProcessing() const;
  273.     inline bool isStartDocument() const { return tokenType() == StartDocument; }
  274.     inline bool isEndDocument() const { return tokenType() == EndDocument; }
  275.     inline bool isStartElement() const { return tokenType() == StartElement; }
  276.     inline bool isEndElement() const { return tokenType() == EndElement; }
  277.     inline bool isCharacters() const { return tokenType() == Characters; }
  278.     bool isWhitespace() const;
  279.     bool isCDATA() const;
  280.     inline bool isComment() const { return tokenType() == Comment; }
  281.     inline bool isDTD() const { return tokenType() == DTD; }
  282.     inline bool isEntityReference() const { return tokenType() == EntityReference; }
  283.     inline bool isProcessingInstruction() const { return tokenType() == ProcessingInstruction; }
  284.     bool isStandaloneDocument() const;
  285.     QStringRef documentVersion() const;
  286.     QStringRef documentEncoding() const;
  287.     qint64 lineNumber() const;
  288.     qint64 columnNumber() const;
  289.     qint64 characterOffset() const;
  290.     QXmlStreamAttributes attributes() const;
  291.     QString readElementText();
  292.     QStringRef name() const;
  293.     QStringRef namespaceUri() const;
  294.     QStringRef qualifiedName() const;
  295.     QStringRef prefix() const;
  296.     QStringRef processingInstructionTarget() const;
  297.     QStringRef processingInstructionData() const;
  298.     QStringRef text() const;
  299.     QXmlStreamNamespaceDeclarations namespaceDeclarations() const;
  300.     void addExtraNamespaceDeclaration(const QXmlStreamNamespaceDeclaration &extraNamespaceDeclaraction);
  301.     void addExtraNamespaceDeclarations(const QXmlStreamNamespaceDeclarations &extraNamespaceDeclaractions);
  302.     QXmlStreamNotationDeclarations notationDeclarations() const;
  303.     QXmlStreamEntityDeclarations entityDeclarations() const;
  304.     QStringRef dtdName() const;
  305.     QStringRef dtdPublicId() const;
  306.     QStringRef dtdSystemId() const;
  307.     enum Error {
  308.         NoError,
  309.         UnexpectedElementError,
  310.         CustomError,
  311.         NotWellFormedError,
  312.         PrematureEndOfDocumentError
  313.     };
  314.     void raiseError(const QString& message = QString());
  315.     QString errorString() const;
  316.     Error error() const;
  317.     inline bool hasError() const
  318.     {
  319.         return error() != NoError;
  320.     }
  321.     void setEntityResolver(QXmlStreamEntityResolver *resolver);
  322.     QXmlStreamEntityResolver *entityResolver() const;
  323. private:
  324.     Q_DISABLE_COPY(QXmlStreamReader)
  325.     Q_DECLARE_PRIVATE(QXmlStreamReader)
  326.     QXmlStreamReaderPrivate *d_ptr;
  327. };
  328. #endif // QT_NO_XMLSTREAMREADER
  329. #ifndef QT_NO_XMLSTREAMWRITER
  330. class QXmlStreamWriterPrivate;
  331. class Q_XMLSTREAM_EXPORT QXmlStreamWriter
  332. {
  333.     QDOC_PROPERTY(bool autoFormatting READ autoFormatting WRITE setAutoFormatting)
  334.     QDOC_PROPERTY(int autoFormattingIndent READ autoFormattingIndent WRITE setAutoFormattingIndent)
  335. public:
  336.     QXmlStreamWriter();
  337.     QXmlStreamWriter(QIODevice *device);
  338.     QXmlStreamWriter(QByteArray *array);
  339.     QXmlStreamWriter(QString *string);
  340.     ~QXmlStreamWriter();
  341.     void setDevice(QIODevice *device);
  342.     QIODevice *device() const;
  343. #ifndef QT_NO_TEXTCODEC
  344.     void setCodec(QTextCodec *codec);
  345.     void setCodec(const char *codecName);
  346.     QTextCodec *codec() const;
  347. #endif
  348.     void setAutoFormatting(bool);
  349.     bool autoFormatting() const;
  350.     void setAutoFormattingIndent(int spaces);
  351.     int autoFormattingIndent() const;
  352.     void writeAttribute(const QString &qualifiedName, const QString &value);
  353.     void writeAttribute(const QString &namespaceUri, const QString &name, const QString &value);
  354.     void writeAttribute(const QXmlStreamAttribute& attribute);
  355.     void writeAttributes(const QXmlStreamAttributes& attributes);
  356.     void writeCDATA(const QString &text);
  357.     void writeCharacters(const QString &text);
  358.     void writeComment(const QString &text);
  359.     void writeDTD(const QString &dtd);
  360.     void writeEmptyElement(const QString &qualifiedName);
  361.     void writeEmptyElement(const QString &namespaceUri, const QString &name);
  362.     void writeTextElement(const QString &qualifiedName, const QString &text);
  363.     void writeTextElement(const QString &namespaceUri, const QString &name, const QString &text);
  364.     void writeEndDocument();
  365.     void writeEndElement();
  366.     void writeEntityReference(const QString &name);
  367.     void writeNamespace(const QString &namespaceUri, const QString &prefix = QString());
  368.     void writeDefaultNamespace(const QString &namespaceUri);
  369.     void writeProcessingInstruction(const QString &target, const QString &data = QString());
  370.     void writeStartDocument();
  371.     void writeStartDocument(const QString &version);
  372.     void writeStartElement(const QString &qualifiedName);
  373.     void writeStartElement(const QString &namespaceUri, const QString &name);
  374. #ifndef QT_NO_XMLSTREAMREADER
  375.     void writeCurrentToken(const QXmlStreamReader &reader);
  376. #endif
  377. private:
  378.     Q_DISABLE_COPY(QXmlStreamWriter)
  379.     Q_DECLARE_PRIVATE(QXmlStreamWriter)
  380.     QXmlStreamWriterPrivate *d_ptr;
  381. };
  382. #endif // QT_NO_XMLSTREAMWRITER
  383. QT_END_NAMESPACE
  384. QT_END_HEADER
  385. #endif // QT_NO_XMLSTREAM
  386. #endif // QXMLSTREAM_H