home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / qt3_emx.zip / include / qxml.h < prev   
C/C++ Source or Header  |  2001-10-11  |  17KB  |  552 lines

  1. /****************************************************************************
  2. ** $Id:  qt/qxml.h   3.0.0   edited Sep 19 19:31 $
  3. **
  4. ** Definition of QXmlSimpleReader and related classes.
  5. **
  6. ** Created : 000518
  7. **
  8. ** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
  9. **
  10. ** This file is part of the XML module of the Qt GUI Toolkit.
  11. **
  12. ** This file may be distributed under the terms of the Q Public License
  13. ** as defined by Trolltech AS of Norway and appearing in the file
  14. ** LICENSE.QPL included in the packaging of this file.
  15. **
  16. ** This file may be distributed and/or modified under the terms of the
  17. ** GNU General Public License version 2 as published by the Free Software
  18. ** Foundation and appearing in the file LICENSE.GPL included in the
  19. ** packaging of this file.
  20. **
  21. ** Licensees holding valid Qt Enterprise Edition licenses may use this
  22. ** file in accordance with the Qt Commercial License Agreement provided
  23. ** with the Software.
  24. **
  25. ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
  26. ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  27. **
  28. ** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
  29. **   information about Qt Commercial License Agreements.
  30. ** See http://www.trolltech.com/qpl/ for QPL licensing information.
  31. ** See http://www.trolltech.com/gpl/ for GPL licensing information.
  32. **
  33. ** Contact info@trolltech.com if any conditions of this licensing are
  34. ** not clear to you.
  35. **
  36. **********************************************************************/
  37.  
  38. #ifndef QXML_H
  39. #define QXML_H
  40.  
  41. #ifndef QT_H
  42. #include "qtextstream.h"
  43. #include "qfile.h"
  44. #include "qstring.h"
  45. #include "qstringlist.h"
  46. #endif // QT_H
  47.  
  48. #if !defined(QT_MODULE_XML) || defined( QT_LICENSE_PROFESSIONAL ) || defined( QT_INTERNAL_XML )
  49. #define QM_EXPORT_XML
  50. #else
  51. #define QM_EXPORT_XML Q_EXPORT
  52. #endif
  53.  
  54. #ifndef QT_NO_XML
  55.  
  56. class QXmlNamespaceSupport;
  57. class QXmlAttributes;
  58. class QXmlContentHandler;
  59. class QXmlDefaultHandler;
  60. class QXmlDTDHandler;
  61. class QXmlEntityResolver;
  62. class QXmlErrorHandler;
  63. class QXmlLexicalHandler;
  64. class QXmlDeclHandler;
  65. class QXmlInputSource;
  66. class QXmlLocator;
  67. class QXmlNamespaceSupport;
  68. class QXmlParseException;
  69.  
  70. class QXmlReader;
  71. class QXmlSimpleReader;
  72.  
  73. class QXmlSimpleReaderPrivate;
  74. class QXmlNamespaceSupportPrivate;
  75. class QXmlAttributesPrivate;
  76. class QXmlInputSourcePrivate;
  77. class QXmlParseExceptionPrivate;
  78. class QXmlLocatorPrivate;
  79. class QXmlDefaultHandlerPrivate;
  80.  
  81.  
  82. //
  83. // SAX Namespace Support
  84. //
  85.  
  86. class QM_EXPORT_XML QXmlNamespaceSupport
  87. {
  88. public:
  89.     QXmlNamespaceSupport();
  90.     ~QXmlNamespaceSupport();
  91.  
  92.     void setPrefix( const QString&, const QString& );
  93.  
  94.     QString prefix( const QString& ) const;
  95.     QString uri( const QString& ) const;
  96.     void splitName( const QString&, QString&, QString& ) const;
  97.     void processName( const QString&, bool, QString&, QString& ) const;
  98.     QStringList prefixes() const;
  99.     QStringList prefixes( const QString& ) const;
  100.  
  101.     void pushContext();
  102.     void popContext();
  103.     void reset();
  104.  
  105. private:
  106.     QXmlNamespaceSupportPrivate *d;
  107. };
  108.  
  109.  
  110. //
  111. // SAX Attributes
  112. //
  113.  
  114. class QM_EXPORT_XML QXmlAttributes
  115. {
  116. public:
  117.     QXmlAttributes() {}
  118.     virtual ~QXmlAttributes() {}
  119.  
  120.     int index( const QString& qName ) const;
  121.     int index( const QString& uri, const QString& localPart ) const;
  122.     int length() const;
  123.     int count() const;
  124.     QString localName( int index ) const;
  125.     QString qName( int index ) const;
  126.     QString uri( int index ) const;
  127.     QString type( int index ) const;
  128.     QString type( const QString& qName ) const;
  129.     QString type( const QString& uri, const QString& localName ) const;
  130.     QString value( int index ) const;
  131.     QString value( const QString& qName ) const;
  132.     QString value( const QString& uri, const QString& localName ) const;
  133.  
  134.     void clear();
  135.     void append( const QString &qName, const QString &uri, const QString &localPart, const QString &value );
  136.  
  137. private:
  138.     QStringList qnameList;
  139.     QStringList uriList;
  140.     QStringList localnameList;
  141.     QStringList valueList;
  142.  
  143.     QXmlAttributesPrivate *d;
  144. };
  145.  
  146. //
  147. // SAX Input Source
  148. //
  149.  
  150. class QM_EXPORT_XML QXmlInputSource
  151. {
  152. public:
  153.     QXmlInputSource();
  154.     QXmlInputSource( QIODevice *dev );
  155.     QXmlInputSource( QFile& file ); // obsolete
  156.     QXmlInputSource( QTextStream& stream ); // obsolete
  157.     virtual ~QXmlInputSource();
  158.  
  159.     virtual void setData( const QString& dat );
  160.     virtual void setData( const QByteArray& dat );
  161.     virtual void fetchData();
  162.     virtual QString data();
  163.     virtual QChar next();
  164.     virtual void reset();
  165.  
  166.     static const QChar EndOfData;
  167.     static const QChar EndOfDocument;
  168.  
  169. protected:
  170.     virtual QString fromRawData( const QByteArray &data, bool beginning = FALSE );
  171.  
  172. private:
  173.     void init();
  174.  
  175.     QIODevice *inputDevice;
  176.     QTextStream *inputStream;
  177.  
  178.     QString str;
  179.     const QChar *unicode;
  180.     int pos;
  181.     int length;
  182.     bool nextReturnedEndOfData;
  183.     QTextDecoder *encMapper;
  184.  
  185.     QXmlInputSourcePrivate *d;
  186. };
  187.  
  188. //
  189. // SAX Exception Classes
  190. //
  191.  
  192. class QM_EXPORT_XML QXmlParseException
  193. {
  194. public:
  195.     QXmlParseException( const QString& name="", int c=-1, int l=-1, const QString& p="", const QString& s="" )
  196.     : msg( name ), column( c ), line( l ), pub( p ), sys( s )
  197.     { }
  198.  
  199.     int columnNumber() const;
  200.     int lineNumber() const;
  201.     QString publicId() const;
  202.     QString systemId() const;
  203.     QString message() const;
  204.  
  205. private:
  206.     QString msg;
  207.     int column;
  208.     int line;
  209.     QString pub;
  210.     QString sys;
  211.  
  212.     QXmlParseExceptionPrivate *d;
  213. };
  214.  
  215.  
  216. //
  217. // XML Reader
  218. //
  219.  
  220. class QM_EXPORT_XML QXmlReader
  221. {
  222. public:
  223.     virtual bool feature( const QString& name, bool *ok = 0 ) const = 0;
  224.     virtual void setFeature( const QString& name, bool value ) = 0;
  225.     virtual bool hasFeature( const QString& name ) const = 0;
  226.     virtual void* property( const QString& name, bool *ok = 0 ) const = 0;
  227.     virtual void setProperty( const QString& name, void* value ) = 0;
  228.     virtual bool hasProperty( const QString& name ) const = 0;
  229.     virtual void setEntityResolver( QXmlEntityResolver* handler ) = 0;
  230.     virtual QXmlEntityResolver* entityResolver() const = 0;
  231.     virtual void setDTDHandler( QXmlDTDHandler* handler ) = 0;
  232.     virtual QXmlDTDHandler* DTDHandler() const = 0;
  233.     virtual void setContentHandler( QXmlContentHandler* handler ) = 0;
  234.     virtual QXmlContentHandler* contentHandler() const = 0;
  235.     virtual void setErrorHandler( QXmlErrorHandler* handler ) = 0;
  236.     virtual QXmlErrorHandler* errorHandler() const = 0;
  237.     virtual void setLexicalHandler( QXmlLexicalHandler* handler ) = 0;
  238.     virtual QXmlLexicalHandler* lexicalHandler() const = 0;
  239.     virtual void setDeclHandler( QXmlDeclHandler* handler ) = 0;
  240.     virtual QXmlDeclHandler* declHandler() const = 0;
  241.     virtual bool parse( const QXmlInputSource& input ) = 0;
  242.     virtual bool parse( const QXmlInputSource* input ) = 0;
  243. };
  244.  
  245. class QM_EXPORT_XML QXmlSimpleReader : public QXmlReader
  246. {
  247. public:
  248.     QXmlSimpleReader();
  249.     virtual ~QXmlSimpleReader();
  250.  
  251.     bool feature( const QString& name, bool *ok = 0 ) const;
  252.     void setFeature( const QString& name, bool value );
  253.     bool hasFeature( const QString& name ) const;
  254.  
  255.     void* property( const QString& name, bool *ok = 0 ) const;
  256.     void setProperty( const QString& name, void* value );
  257.     bool hasProperty( const QString& name ) const;
  258.  
  259.     void setEntityResolver( QXmlEntityResolver* handler );
  260.     QXmlEntityResolver* entityResolver() const;
  261.     void setDTDHandler( QXmlDTDHandler* handler );
  262.     QXmlDTDHandler* DTDHandler() const;
  263.     void setContentHandler( QXmlContentHandler* handler );
  264.     QXmlContentHandler* contentHandler() const;
  265.     void setErrorHandler( QXmlErrorHandler* handler );
  266.     QXmlErrorHandler* errorHandler() const;
  267.     void setLexicalHandler( QXmlLexicalHandler* handler );
  268.     QXmlLexicalHandler* lexicalHandler() const;
  269.     void setDeclHandler( QXmlDeclHandler* handler );
  270.     QXmlDeclHandler* declHandler() const;
  271.  
  272.     bool parse( const QXmlInputSource& input );
  273.     bool parse( const QXmlInputSource* input );
  274.     virtual bool parse( const QXmlInputSource* input, bool incremental );
  275.     virtual bool parseContinue();
  276.  
  277. private:
  278.     // variables
  279.     QXmlContentHandler *contentHnd;
  280.     QXmlErrorHandler   *errorHnd;
  281.     QXmlDTDHandler     *dtdHnd;
  282.     QXmlEntityResolver *entityRes;
  283.     QXmlLexicalHandler *lexicalHnd;
  284.     QXmlDeclHandler    *declHnd;
  285.  
  286.     QXmlInputSource *inputSource;
  287.  
  288.     QChar c; // the character at reading position
  289.     int   lineNr; // number of line
  290.     int   columnNr; // position in line
  291.  
  292.     int     namePos;
  293.     QChar   nameArray[256]; // only used for names
  294.     QString nameValue; // only used for names
  295.     int     refPos;
  296.     QChar   refArray[256]; // only used for references
  297.     QString refValue; // only used for references
  298.     int     stringPos;
  299.     QChar   stringArray[256]; // used for any other strings that are parsed
  300.     QString stringValue; // used for any other strings that are parsed
  301.  
  302.     QXmlSimpleReaderPrivate* d;
  303.  
  304.     // inlines
  305.     bool is_S( const QChar& );
  306.     bool is_NameBeginning( const QChar& );
  307.     bool is_NameChar( const QChar& );
  308.  
  309.     QString& string();
  310.     void stringClear();
  311.     void stringAddC();
  312.     void stringAddC(const QChar&);
  313.     QString& name();
  314.     void nameClear();
  315.     void nameAddC();
  316.     void nameAddC(const QChar&);
  317.     QString& ref();
  318.     void refClear();
  319.     void refAddC();
  320.     void refAddC(const QChar&);
  321.  
  322.     // used by parseReference() and parsePEReference()
  323.     enum EntityRecognitionContext { InContent, InAttributeValue, InEntityValue, InDTD };
  324.  
  325.     // private functions
  326.     bool eat_ws();
  327.     bool next_eat_ws();
  328.  
  329.     void next();
  330.     bool atEnd();
  331.  
  332.     void init( const QXmlInputSource* i );
  333.     void initData();
  334.  
  335.     bool entityExist( const QString& ) const;
  336.  
  337.     bool parseBeginOrContinue( int state, bool incremental );
  338.  
  339.     bool parseProlog();
  340.     bool parseElement();
  341.     bool processElementEmptyTag();
  342.     bool processElementETagBegin2();
  343.     bool processElementAttribute();
  344.     bool parseMisc();
  345.     bool parseContent();
  346.  
  347.     bool parsePI();
  348.     bool parseDoctype();
  349.     bool parseComment();
  350.  
  351.     bool parseName();
  352.     bool parseNmtoken();
  353.     bool parseAttribute();
  354.     bool parseReference();
  355.     bool processReference();
  356.  
  357.     bool parseExternalID();
  358.     bool parsePEReference();
  359.     bool parseMarkupdecl();
  360.     bool parseAttlistDecl();
  361.     bool parseAttType();
  362.     bool parseAttValue();
  363.     bool parseElementDecl();
  364.     bool parseNotationDecl();
  365.     bool parseChoiceSeq();
  366.     bool parseEntityDecl();
  367.     bool parseEntityValue();
  368.  
  369.     bool parseString();
  370.  
  371.     bool insertXmlRef( const QString&, const QString&, bool );
  372.  
  373.     bool reportEndEntities();
  374.     void reportParseError( const QString& error );
  375.  
  376.     typedef bool (QXmlSimpleReader::*ParseFunction) ();
  377.     void unexpectedEof( ParseFunction where, int state );
  378.     void parseFailed( ParseFunction where, int state );
  379.     void pushParseState( ParseFunction function, int state );
  380.  
  381.     friend class QXmlSimpleReaderPrivate;
  382.     friend class QXmlSimpleReaderLocator;
  383. };
  384.  
  385. //
  386. // SAX Locator
  387. //
  388.  
  389. class QM_EXPORT_XML QXmlLocator
  390. {
  391. public:
  392.     QXmlLocator();
  393.     virtual ~QXmlLocator();
  394.  
  395.     virtual int columnNumber() = 0;
  396.     virtual int lineNumber() = 0;
  397. //    QString getPublicId()
  398. //    QString getSystemId()
  399. };
  400.  
  401. //
  402. // SAX handler classes
  403. //
  404.  
  405. class QM_EXPORT_XML QXmlContentHandler
  406. {
  407. public:
  408.     virtual void setDocumentLocator( QXmlLocator* locator ) = 0;
  409.     virtual bool startDocument() = 0;
  410.     virtual bool endDocument() = 0;
  411.     virtual bool startPrefixMapping( const QString& prefix, const QString& uri ) = 0;
  412.     virtual bool endPrefixMapping( const QString& prefix ) = 0;
  413.     virtual bool startElement( const QString& namespaceURI, const QString& localName, const QString& qName, const QXmlAttributes& atts ) = 0;
  414.     virtual bool endElement( const QString& namespaceURI, const QString& localName, const QString& qName ) = 0;
  415.     virtual bool characters( const QString& ch ) = 0;
  416.     virtual bool ignorableWhitespace( const QString& ch ) = 0;
  417.     virtual bool processingInstruction( const QString& target, const QString& data ) = 0;
  418.     virtual bool skippedEntity( const QString& name ) = 0;
  419.     virtual QString errorString() = 0;
  420. };
  421.  
  422. class QM_EXPORT_XML QXmlErrorHandler
  423. {
  424. public:
  425.     virtual bool warning( const QXmlParseException& exception ) = 0;
  426.     virtual bool error( const QXmlParseException& exception ) = 0;
  427.     virtual bool fatalError( const QXmlParseException& exception ) = 0;
  428.     virtual QString errorString() = 0;
  429. };
  430.  
  431. class QM_EXPORT_XML QXmlDTDHandler
  432. {
  433. public:
  434.     virtual bool notationDecl( const QString& name, const QString& publicId, const QString& systemId ) = 0;
  435.     virtual bool unparsedEntityDecl( const QString& name, const QString& publicId, const QString& systemId, const QString& notationName ) = 0;
  436.     virtual QString errorString() = 0;
  437. };
  438.  
  439. class QM_EXPORT_XML QXmlEntityResolver
  440. {
  441. public:
  442.     virtual bool resolveEntity( const QString& publicId, const QString& systemId, QXmlInputSource*& ret ) = 0;
  443.     virtual QString errorString() = 0;
  444. };
  445.  
  446. class QM_EXPORT_XML QXmlLexicalHandler
  447. {
  448. public:
  449.     virtual bool startDTD( const QString& name, const QString& publicId, const QString& systemId ) = 0;
  450.     virtual bool endDTD() = 0;
  451.     virtual bool startEntity( const QString& name ) = 0;
  452.     virtual bool endEntity( const QString& name ) = 0;
  453.     virtual bool startCDATA() = 0;
  454.     virtual bool endCDATA() = 0;
  455.     virtual bool comment( const QString& ch ) = 0;
  456.     virtual QString errorString() = 0;
  457. };
  458.  
  459. class QM_EXPORT_XML QXmlDeclHandler
  460. {
  461. public:
  462.     virtual bool attributeDecl( const QString& eName, const QString& aName, const QString& type, const QString& valueDefault, const QString& value ) = 0;
  463.     virtual bool internalEntityDecl( const QString& name, const QString& value ) = 0;
  464.     virtual bool externalEntityDecl( const QString& name, const QString& publicId, const QString& systemId ) = 0;
  465.     virtual QString errorString() = 0;
  466. };
  467.  
  468.  
  469. class QM_EXPORT_XML QXmlDefaultHandler : public QXmlContentHandler, public QXmlErrorHandler, public QXmlDTDHandler, public QXmlEntityResolver, public QXmlLexicalHandler, public QXmlDeclHandler
  470. {
  471. public:
  472.     QXmlDefaultHandler() { }
  473.     virtual ~QXmlDefaultHandler() { }
  474.  
  475.     void setDocumentLocator( QXmlLocator* locator );
  476.     bool startDocument();
  477.     bool endDocument();
  478.     bool startPrefixMapping( const QString& prefix, const QString& uri );
  479.     bool endPrefixMapping( const QString& prefix );
  480.     bool startElement( const QString& namespaceURI, const QString& localName, const QString& qName, const QXmlAttributes& atts );
  481.     bool endElement( const QString& namespaceURI, const QString& localName, const QString& qName );
  482.     bool characters( const QString& ch );
  483.     bool ignorableWhitespace( const QString& ch );
  484.     bool processingInstruction( const QString& target, const QString& data );
  485.     bool skippedEntity( const QString& name );
  486.  
  487.     bool warning( const QXmlParseException& exception );
  488.     bool error( const QXmlParseException& exception );
  489.     bool fatalError( const QXmlParseException& exception );
  490.  
  491.     bool notationDecl( const QString& name, const QString& publicId, const QString& systemId );
  492.     bool unparsedEntityDecl( const QString& name, const QString& publicId, const QString& systemId, const QString& notationName );
  493.  
  494.     bool resolveEntity( const QString& publicId, const QString& systemId, QXmlInputSource*& ret );
  495.  
  496.     bool startDTD( const QString& name, const QString& publicId, const QString& systemId );
  497.     bool endDTD();
  498.     bool startEntity( const QString& name );
  499.     bool endEntity( const QString& name );
  500.     bool startCDATA();
  501.     bool endCDATA();
  502.     bool comment( const QString& ch );
  503.  
  504.     bool attributeDecl( const QString& eName, const QString& aName, const QString& type, const QString& valueDefault, const QString& value );
  505.     bool internalEntityDecl( const QString& name, const QString& value );
  506.     bool externalEntityDecl( const QString& name, const QString& publicId, const QString& systemId );
  507.  
  508.     QString errorString();
  509.  
  510. private:
  511.     QXmlDefaultHandlerPrivate *d;
  512. };
  513.  
  514.  
  515. //
  516. // inlines
  517. //
  518.  
  519. inline bool QXmlSimpleReader::is_S(const QChar& ch)
  520. {
  521.     return ch==' ' || ch=='\t' || ch=='\n' || ch=='\r';
  522. }
  523. inline bool QXmlSimpleReader::is_NameBeginning( const QChar& ch )
  524. {
  525.     return ch=='_' || ch==':' ||
  526.     ch.isLetter() || // ### Category Lm is not allowed
  527.     ch.category()==QChar::Number_Letter;
  528. }
  529. inline bool QXmlSimpleReader::is_NameChar( const QChar& ch )
  530. {
  531.     return ch=='.' || ch=='-' || ch=='_' || ch==':' ||
  532.     ch.isLetterOrNumber() || // ### Category No is not allowed
  533.     ch.isMark();
  534. }
  535.  
  536. inline bool QXmlSimpleReader::atEnd()
  537. { return (c.unicode()|0x0001) == 0xffff; }
  538.  
  539. inline void QXmlSimpleReader::stringClear()
  540. { stringValue = ""; stringPos = 0; }
  541. inline void QXmlSimpleReader::nameClear()
  542. { nameValue = ""; namePos = 0; }
  543. inline void QXmlSimpleReader::refClear()
  544. { refValue = ""; refPos = 0; }
  545.  
  546. inline int QXmlAttributes::count() const
  547. { return length(); }
  548.  
  549. #endif //QT_NO_XML
  550.  
  551. #endif
  552.