1 /****************************************************************************
4 ** Definition of QXmlSimpleReader and related classes.
8 ** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
10 ** This file is part of the XML module of the Qt GUI Toolkit.
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.
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.
21 ** Licensees holding valid Qt Enterprise Edition licenses may use this
22 ** file in accordance with the Qt Commercial License Agreement provided
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.
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.
33 ** Contact info@trolltech.com if any conditions of this licensing are
36 **********************************************************************/
43 #if !defined(QT_MODULE_XML)
46 #define QM_EXPORT Q_EXPORT
50 #include <qtextstream.h>
53 #include <qstringlist.h>
54 #include <qvaluestack.h>
60 class QXmlNamespaceSupport;
62 class QXmlContentHandler;
63 class QXmlDefaultHandler;
65 class QXmlEntityResolver;
66 class QXmlErrorHandler;
67 class QXmlLexicalHandler;
68 class QXmlDeclHandler;
69 class QXmlInputSource;
71 class QXmlNamespaceSupport;
72 class QXmlParseException;
75 class QXmlSimpleReader;
77 class QXmlSimpleReaderPrivate;
78 class QXmlNamespaceSupportPrivate;
79 class QXmlAttributesPrivate;
80 class QXmlInputSourcePrivate;
81 class QXmlParseExceptionPrivate;
82 class QXmlLocatorPrivate;
83 class QXmlDefaultHandlerPrivate;
87 // SAX Namespace Support
90 #if defined(Q_TEMPLATEDLL)
92 template class QM_EXPORT QMap<QString, QString>;
93 template class QM_EXPORT QValueStack<QMap<QString, QString> >;
94 template class QM_EXPORT QValueStack<QString>;
98 class QM_EXPORT QXmlNamespaceSupport
101 QXmlNamespaceSupport();
102 ~QXmlNamespaceSupport();
104 void setPrefix( const QString&, const QString& );
106 QString prefix( const QString& ) const;
107 QString uri( const QString& ) const;
108 void splitName( const QString&, QString&, QString& ) const;
109 void processName( const QString&, bool, QString&, QString& ) const;
110 QStringList prefixes() const;
111 QStringList prefixes( const QString& ) const;
117 QValueStack<QMap<QString, QString> > nsStack;
118 QMap<QString, QString> ns;
120 QXmlNamespaceSupportPrivate *d;
128 class QM_EXPORT QXmlAttributes
132 virtual ~QXmlAttributes() {}
134 int index( const QString& qName ) const;
135 int index( const QString& uri, const QString& localPart ) const;
137 QString localName( int index ) const;
138 QString qName( int index ) const;
139 QString uri( int index ) const;
140 QString type( int index ) const;
141 QString type( const QString& qName ) const;
142 QString type( const QString& uri, const QString& localName ) const;
143 QString value( int index ) const;
144 QString value( const QString& qName ) const;
145 QString value( const QString& uri, const QString& localName ) const;
148 QStringList qnameList;
150 QStringList localnameList;
151 QStringList valueList;
153 QXmlAttributesPrivate *d;
155 friend class QXmlSimpleReader;
162 class QM_EXPORT QXmlInputSource
166 QXmlInputSource( QTextStream& stream );
167 QXmlInputSource( QFile& file );
168 virtual ~QXmlInputSource();
170 virtual const QString& data() const;
171 virtual void setData( const QString& d );
174 void readInput( QByteArray& rawData );
178 QXmlInputSourcePrivate *d;
182 // SAX Exception Classes
185 class QM_EXPORT QXmlParseException
188 QXmlParseException( const QString& name="", int c=-1, int l=-1, const QString& p="", const QString& s="" )
189 : msg( name ), column( c ), line( l ), pub( p ), sys( s )
192 int columnNumber() const;
193 int lineNumber() const;
194 QString publicId() const;
195 QString systemId() const;
196 QString message() const;
205 QXmlParseExceptionPrivate *d;
213 class QM_EXPORT QXmlReader
216 virtual ~QXmlReader() {}
217 virtual bool feature( const QString& name, bool *ok = 0 ) const = 0;
218 virtual void setFeature( const QString& name, bool value ) = 0;
219 virtual bool hasFeature( const QString& name ) const = 0;
220 virtual void* property( const QString& name, bool *ok = 0 ) const = 0;
221 virtual void setProperty( const QString& name, void* value ) = 0;
222 virtual bool hasProperty( const QString& name ) const = 0;
223 virtual void setEntityResolver( QXmlEntityResolver* handler ) = 0;
224 virtual QXmlEntityResolver* entityResolver() const = 0;
225 virtual void setDTDHandler( QXmlDTDHandler* handler ) = 0;
226 virtual QXmlDTDHandler* DTDHandler() const = 0;
227 virtual void setContentHandler( QXmlContentHandler* handler ) = 0;
228 virtual QXmlContentHandler* contentHandler() const = 0;
229 virtual void setErrorHandler( QXmlErrorHandler* handler ) = 0;
230 virtual QXmlErrorHandler* errorHandler() const = 0;
231 virtual void setLexicalHandler( QXmlLexicalHandler* handler ) = 0;
232 virtual QXmlLexicalHandler* lexicalHandler() const = 0;
233 virtual void setDeclHandler( QXmlDeclHandler* handler ) = 0;
234 virtual QXmlDeclHandler* declHandler() const = 0;
235 virtual bool parse( const QXmlInputSource& input ) = 0;
238 class QM_EXPORT QXmlSimpleReader : public QXmlReader
242 virtual ~QXmlSimpleReader();
244 bool feature( const QString& name, bool *ok = 0 ) const;
245 void setFeature( const QString& name, bool value );
246 bool hasFeature( const QString& name ) const;
248 void* property( const QString& name, bool *ok = 0 ) const;
249 void setProperty( const QString& name, void* value );
250 bool hasProperty( const QString& name ) const;
252 void setEntityResolver( QXmlEntityResolver* handler );
253 QXmlEntityResolver* entityResolver() const;
254 void setDTDHandler( QXmlDTDHandler* handler );
255 QXmlDTDHandler* DTDHandler() const;
256 void setContentHandler( QXmlContentHandler* handler );
257 QXmlContentHandler* contentHandler() const;
258 void setErrorHandler( QXmlErrorHandler* handler );
259 QXmlErrorHandler* errorHandler() const;
260 void setLexicalHandler( QXmlLexicalHandler* handler );
261 QXmlLexicalHandler* lexicalHandler() const;
262 void setDeclHandler( QXmlDeclHandler* handler );
263 QXmlDeclHandler* declHandler() const;
265 bool parse( const QXmlInputSource& input );
269 QXmlContentHandler* contentHnd;
270 QXmlErrorHandler* errorHnd;
271 QXmlDTDHandler* dtdHnd;
272 QXmlEntityResolver* entityRes;
273 QXmlLexicalHandler* lexicalHnd;
274 QXmlDeclHandler* declHnd;
276 QChar c; // the character at reading position
277 int lineNr; // number of line
278 int columnNr; // position in line
279 int pos; // position in string
282 QChar nameArray[256]; // only used for names
283 QString nameValue; // only used for names
285 QChar refArray[256]; // only used for references
286 QString refValue; // only used for references
288 QChar stringArray[256]; // used for any other strings that are parsed
289 QString stringValue; // used for any other strings that are parsed
293 QString xmlRef; // used for parsing of entity references
295 QValueStack<QString> tags;
297 QXmlSimpleReaderPrivate* d;
299 static const QChar QEOF;
302 virtual bool is_S( const QChar& );
303 virtual bool is_Letter( const QChar& );
304 virtual bool is_NameBeginning( const QChar& );
305 virtual bool is_Digit( const QChar& );
306 virtual bool is_CombiningChar( const QChar& );
307 virtual bool is_Extender( const QChar& );
308 virtual bool is_NameChar( const QChar& );
313 void stringAddC(const QChar&);
317 void nameAddC(const QChar&);
321 void refAddC(const QChar&);
323 // used by parseReference() and parsePEReference()
324 enum EntityRecognitionContext { InContent, InAttributeValue, InEntityValue, InDTD };
333 void init( const QXmlInputSource& i );
335 bool entityExist( const QString& ) const;
339 bool parseElementEmptyTag( bool &t, QString &uri, QString &lname );
340 bool parseElementETagBegin2( QString &uri, QString &lname );
341 bool parseElementAttribute( QString &prefix, QString &uri, QString &lname );
345 bool parsePI(bool xmldecl=FALSE);
349 bool parseName( bool useRef=FALSE );
351 bool parseAttribute();
352 bool parseReference( bool &charDataRead, EntityRecognitionContext context );
353 bool processReference( bool &charDataRead, EntityRecognitionContext context );
355 bool parseExternalID( bool allowPublicID = FALSE );
356 bool parsePEReference( EntityRecognitionContext context );
357 bool parseMarkupdecl();
358 bool parseAttlistDecl();
360 bool parseAttValue();
361 bool parseElementDecl();
362 bool parseNotationDecl();
363 bool parseChoiceSeq();
364 bool parseEntityDecl();
365 bool parseEntityValue();
367 bool parseString( const QString& s );
369 void reportParseError();
371 friend class QXmlSimpleReaderPrivate;
372 friend class QXmlLocator;
379 class QM_EXPORT QXmlLocator
382 QXmlLocator( QXmlSimpleReader* parent )
389 // QString getPublicId()
390 // QString getSystemId()
393 QXmlSimpleReader* reader;
395 QXmlLocatorPrivate *d;
399 // SAX handler classes
402 class QM_EXPORT QXmlContentHandler
405 virtual ~QXmlContentHandler() {}
406 virtual void setDocumentLocator( QXmlLocator* locator ) = 0;
407 virtual bool startDocument() = 0;
408 virtual bool endDocument() = 0;
409 virtual bool startPrefixMapping( const QString& prefix, const QString& uri ) = 0;
410 virtual bool endPrefixMapping( const QString& prefix ) = 0;
411 virtual bool startElement( const QString& namespaceURI, const QString& localName, const QString& qName, const QXmlAttributes& atts ) = 0;
412 virtual bool endElement( const QString& namespaceURI, const QString& localName, const QString& qName ) = 0;
413 virtual bool characters( const QString& ch ) = 0;
414 virtual bool ignorableWhitespace( const QString& ch ) = 0;
415 virtual bool processingInstruction( const QString& target, const QString& data ) = 0;
416 virtual bool skippedEntity( const QString& name ) = 0;
417 virtual QString errorString() = 0;
420 class QM_EXPORT QXmlErrorHandler
423 virtual ~QXmlErrorHandler() {}
424 virtual bool warning( const QXmlParseException& exception ) = 0;
425 virtual bool error( const QXmlParseException& exception ) = 0;
426 virtual bool fatalError( const QXmlParseException& exception ) = 0;
427 virtual QString errorString() = 0;
430 class QM_EXPORT QXmlDTDHandler
433 virtual ~QXmlDTDHandler() {}
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;
439 class QM_EXPORT QXmlEntityResolver
442 virtual ~QXmlEntityResolver() {}
443 virtual bool resolveEntity( const QString& publicId, const QString& systemId, QXmlInputSource* &ret ) = 0;
444 virtual QString errorString() = 0;
447 class QM_EXPORT QXmlLexicalHandler
450 virtual ~QXmlLexicalHandler() {}
451 virtual bool startDTD( const QString& name, const QString& publicId, const QString& systemId ) = 0;
452 virtual bool endDTD() = 0;
453 // virtual bool startEntity( const QString& name ) = 0;
454 // virtual bool endEntity( const QString& name ) = 0;
455 virtual bool startCDATA() = 0;
456 virtual bool endCDATA() = 0;
457 virtual bool comment( const QString& ch ) = 0;
458 virtual QString errorString() = 0;
461 class QM_EXPORT QXmlDeclHandler
464 virtual ~QXmlDeclHandler() {}
465 virtual bool attributeDecl( const QString& eName, const QString& aName, const QString& type, const QString& valueDefault, const QString& value ) = 0;
466 virtual bool internalEntityDecl( const QString& name, const QString& value ) = 0;
467 virtual bool externalEntityDecl( const QString& name, const QString& publicId, const QString& systemId ) = 0;
468 virtual QString errorString() = 0;
472 class QM_EXPORT QXmlDefaultHandler : public QXmlContentHandler, public QXmlErrorHandler, public QXmlDTDHandler, public QXmlEntityResolver, public QXmlLexicalHandler, public QXmlDeclHandler
475 QXmlDefaultHandler() { }
476 virtual ~QXmlDefaultHandler() { }
478 void setDocumentLocator( QXmlLocator* locator );
479 bool startDocument();
481 bool startPrefixMapping( const QString& prefix, const QString& uri );
482 bool endPrefixMapping( const QString& prefix );
483 bool startElement( const QString& namespaceURI, const QString& localName, const QString& qName, const QXmlAttributes& atts );
484 bool endElement( const QString& namespaceURI, const QString& localName, const QString& qName );
485 bool characters( const QString& ch );
486 bool ignorableWhitespace( const QString& ch );
487 bool processingInstruction( const QString& target, const QString& data );
488 bool skippedEntity( const QString& name );
490 bool warning( const QXmlParseException& exception );
491 bool error( const QXmlParseException& exception );
492 bool fatalError( const QXmlParseException& exception );
494 bool notationDecl( const QString& name, const QString& publicId, const QString& systemId );
495 bool unparsedEntityDecl( const QString& name, const QString& publicId, const QString& systemId, const QString& notationName );
497 bool resolveEntity( const QString& publicId, const QString& systemId, QXmlInputSource* &ret );
499 bool startDTD( const QString& name, const QString& publicId, const QString& systemId );
501 // bool startEntity( const QString& name );
502 // bool endEntity( const QString& name );
505 bool comment( const QString& ch );
507 bool attributeDecl( const QString& eName, const QString& aName, const QString& type, const QString& valueDefault, const QString& value );
508 bool internalEntityDecl( const QString& name, const QString& value );
509 bool externalEntityDecl( const QString& name, const QString& publicId, const QString& systemId );
511 QString errorString();
514 QXmlDefaultHandlerPrivate *d;
521 #define QT_NO_XML_INLINE
525 #ifndef QT_NO_XML_INLINE
530 inline bool QXmlSimpleReader::is_S(const QChar& ch)
531 { return ch==' ' || ch=='\t' || ch=='\n' || ch=='\r'; }
533 inline bool QXmlSimpleReader::is_Letter( const QChar& ch )
534 { return ch.isLetter(); }
536 inline bool QXmlSimpleReader::is_NameBeginning( const QChar& ch )
537 { return ch=='_' || ch==':' || ch.isLetter(); }
539 inline bool QXmlSimpleReader::is_Digit( const QChar& ch )
540 { return ch.isDigit(); }
542 inline bool QXmlSimpleReader::is_CombiningChar( const QChar& )
545 inline bool QXmlSimpleReader::is_Extender( const QChar& )
548 inline bool QXmlSimpleReader::is_NameChar( const QChar& ch )
550 return ch=='.' || ch=='-' || ch=='_' || ch==':' ||
551 is_Letter(ch) || is_Digit(ch) ||
552 is_CombiningChar(ch) || is_Extender(ch);
555 inline void QXmlSimpleReader::next()
557 if ( !xmlRef.isEmpty() ) {
559 xmlRef.remove( 0, 1 );
561 if ( c=='\n' || c=='\r' ) {
565 if ( pos >= xmlLength ) {
575 inline bool QXmlSimpleReader::atEnd()
576 { return c == QEOF; }
578 inline void QXmlSimpleReader::eat_ws()
579 { while ( !atEnd() && is_S(c) ) next(); }
581 inline void QXmlSimpleReader::next_eat_ws()
582 { next(); eat_ws(); }
585 // use buffers instead of QString::operator+= when single characters are read
586 inline QString& QXmlSimpleReader::string()
588 stringValue += QString( stringArray, stringPos );
592 inline QString& QXmlSimpleReader::name()
594 nameValue += QString( nameArray, namePos );
598 inline QString& QXmlSimpleReader::ref()
600 refValue += QString( refArray, refPos );
605 inline void QXmlSimpleReader::stringClear()
606 { stringValue = ""; stringPos = 0; }
607 inline void QXmlSimpleReader::nameClear()
608 { nameValue = ""; namePos = 0; }
609 inline void QXmlSimpleReader::refClear()
610 { refValue = ""; refPos = 0; }
612 inline void QXmlSimpleReader::stringAddC()
614 if ( stringPos >= 256 ) {
615 stringValue += QString( stringArray, stringPos );
618 stringArray[stringPos++] = c;
620 inline void QXmlSimpleReader::nameAddC()
622 if ( namePos >= 256 ) {
623 nameValue += QString( nameArray, namePos );
626 nameArray[namePos++] = c;
628 inline void QXmlSimpleReader::refAddC()
630 if ( refPos >= 256 ) {
631 refValue += QString( refArray, refPos );
634 refArray[refPos++] = c;
637 inline void QXmlSimpleReader::stringAddC(const QChar& ch)
639 if ( stringPos >= 256 ) {
640 stringValue += QString( stringArray, stringPos );
643 stringArray[stringPos++] = ch;
645 inline void QXmlSimpleReader::nameAddC(const QChar& ch)
647 if ( namePos >= 256 ) {
648 nameValue += QString( nameArray, namePos );
651 nameArray[namePos++] = ch;
653 inline void QXmlSimpleReader::refAddC(const QChar& ch)
655 if ( refPos >= 256 ) {
656 refValue += QString( refArray, refPos );
659 refArray[refPos++] = ch;