1
/****************************************************************************
2
** $Id: qxml.h,v 1.1 2004/02/29 00:05:06 justin Exp $
4
** Definition of QXmlSimpleReader and related classes.
8
** Copyright (C) 1992-2002 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
**********************************************************************/
42
#include "qtextstream.h"
45
#include "qstringlist.h"
48
#if !defined(QT_MODULE_XML) || defined( QT_LICENSE_PROFESSIONAL ) || defined( QT_INTERNAL_XML )
51
#define QM_EXPORT_XML Q_EXPORT
58
class QXmlNamespaceSupport;
60
class QXmlContentHandler;
61
class QXmlDefaultHandler;
63
class QXmlEntityResolver;
64
class QXmlErrorHandler;
65
class QXmlLexicalHandler;
66
class QXmlDeclHandler;
67
class QXmlInputSource;
69
class QXmlNamespaceSupport;
70
class QXmlParseException;
73
class QXmlSimpleReader;
75
class QXmlSimpleReaderPrivate;
76
class QXmlNamespaceSupportPrivate;
77
class QXmlAttributesPrivate;
78
class QXmlInputSourcePrivate;
79
class QXmlParseExceptionPrivate;
80
class QXmlLocatorPrivate;
81
class QXmlDefaultHandlerPrivate;
85
// SAX Namespace Support
88
class QM_EXPORT_XML QXmlNamespaceSupport
91
QXmlNamespaceSupport();
92
~QXmlNamespaceSupport();
94
void setPrefix( const QString&, const QString& );
96
QString prefix( const QString& ) const;
97
QString uri( const QString& ) const;
98
void splitName( const QString&, QString&, QString& ) const;
99
void processName( const QString&, bool, QString&, QString& ) const;
100
QStringList prefixes() const;
101
QStringList prefixes( const QString& ) const;
108
QXmlNamespaceSupportPrivate *d;
116
class QM_EXPORT_XML QXmlAttributes
120
virtual ~QXmlAttributes() {}
122
int index( const QString& qName ) const;
123
int index( const QString& uri, const QString& localPart ) const;
126
QString localName( int index ) const;
127
QString qName( int index ) const;
128
QString uri( int index ) const;
129
QString type( int index ) const;
130
QString type( const QString& qName ) const;
131
QString type( const QString& uri, const QString& localName ) const;
132
QString value( int index ) const;
133
QString value( const QString& qName ) const;
134
QString value( const QString& uri, const QString& localName ) const;
137
void append( const QString &qName, const QString &uri, const QString &localPart, const QString &value );
140
QStringList qnameList;
142
QStringList localnameList;
143
QStringList valueList;
145
QXmlAttributesPrivate *d;
152
class QM_EXPORT_XML QXmlInputSource
156
QXmlInputSource( QIODevice *dev );
157
QXmlInputSource( QFile& file ); // obsolete
158
QXmlInputSource( QTextStream& stream ); // obsolete
159
virtual ~QXmlInputSource();
161
virtual void setData( const QString& dat );
162
virtual void setData( const QByteArray& dat );
163
virtual void fetchData();
164
virtual QString data();
165
virtual QChar next();
166
virtual void reset();
168
static const QChar EndOfData;
169
static const QChar EndOfDocument;
172
virtual QString fromRawData( const QByteArray &data, bool beginning = FALSE );
177
QIODevice *inputDevice;
178
QTextStream *inputStream;
181
const QChar *unicode;
184
bool nextReturnedEndOfData;
185
QTextDecoder *encMapper;
187
QXmlInputSourcePrivate *d;
191
// SAX Exception Classes
194
class QM_EXPORT_XML QXmlParseException
197
QXmlParseException( const QString& name="", int c=-1, int l=-1, const QString& p="", const QString& s="" )
198
: msg( name ), column( c ), line( l ), pub( p ), sys( s )
201
int columnNumber() const;
202
int lineNumber() const;
203
QString publicId() const;
204
QString systemId() const;
205
QString message() const;
214
QXmlParseExceptionPrivate *d;
222
class QM_EXPORT_XML QXmlReader
225
virtual bool feature( const QString& name, bool *ok = 0 ) const = 0;
226
virtual void setFeature( const QString& name, bool value ) = 0;
227
virtual bool hasFeature( const QString& name ) const = 0;
228
virtual void* property( const QString& name, bool *ok = 0 ) const = 0;
229
virtual void setProperty( const QString& name, void* value ) = 0;
230
virtual bool hasProperty( const QString& name ) const = 0;
231
virtual void setEntityResolver( QXmlEntityResolver* handler ) = 0;
232
virtual QXmlEntityResolver* entityResolver() const = 0;
233
virtual void setDTDHandler( QXmlDTDHandler* handler ) = 0;
234
virtual QXmlDTDHandler* DTDHandler() const = 0;
235
virtual void setContentHandler( QXmlContentHandler* handler ) = 0;
236
virtual QXmlContentHandler* contentHandler() const = 0;
237
virtual void setErrorHandler( QXmlErrorHandler* handler ) = 0;
238
virtual QXmlErrorHandler* errorHandler() const = 0;
239
virtual void setLexicalHandler( QXmlLexicalHandler* handler ) = 0;
240
virtual QXmlLexicalHandler* lexicalHandler() const = 0;
241
virtual void setDeclHandler( QXmlDeclHandler* handler ) = 0;
242
virtual QXmlDeclHandler* declHandler() const = 0;
243
virtual bool parse( const QXmlInputSource& input ) = 0;
244
virtual bool parse( const QXmlInputSource* input ) = 0;
247
class QM_EXPORT_XML QXmlSimpleReader : public QXmlReader
251
virtual ~QXmlSimpleReader();
253
bool feature( const QString& name, bool *ok = 0 ) const;
254
void setFeature( const QString& name, bool value );
255
bool hasFeature( const QString& name ) const;
257
void* property( const QString& name, bool *ok = 0 ) const;
258
void setProperty( const QString& name, void* value );
259
bool hasProperty( const QString& name ) const;
261
void setEntityResolver( QXmlEntityResolver* handler );
262
QXmlEntityResolver* entityResolver() const;
263
void setDTDHandler( QXmlDTDHandler* handler );
264
QXmlDTDHandler* DTDHandler() const;
265
void setContentHandler( QXmlContentHandler* handler );
266
QXmlContentHandler* contentHandler() const;
267
void setErrorHandler( QXmlErrorHandler* handler );
268
QXmlErrorHandler* errorHandler() const;
269
void setLexicalHandler( QXmlLexicalHandler* handler );
270
QXmlLexicalHandler* lexicalHandler() const;
271
void setDeclHandler( QXmlDeclHandler* handler );
272
QXmlDeclHandler* declHandler() const;
274
bool parse( const QXmlInputSource& input );
275
bool parse( const QXmlInputSource* input );
276
virtual bool parse( const QXmlInputSource* input, bool incremental );
277
virtual bool parseContinue();
281
QXmlContentHandler *contentHnd;
282
QXmlErrorHandler *errorHnd;
283
QXmlDTDHandler *dtdHnd;
284
QXmlEntityResolver *entityRes;
285
QXmlLexicalHandler *lexicalHnd;
286
QXmlDeclHandler *declHnd;
288
QXmlInputSource *inputSource;
290
QChar c; // the character at reading position
291
int lineNr; // number of line
292
int columnNr; // position in line
295
QChar nameArray[256]; // only used for names
296
QString nameValue; // only used for names
298
QChar refArray[256]; // only used for references
299
QString refValue; // only used for references
301
QChar stringArray[256]; // used for any other strings that are parsed
302
QString stringValue; // used for any other strings that are parsed
304
QXmlSimpleReaderPrivate* d;
307
bool is_S( const QChar& );
308
bool is_NameBeginning( const QChar& );
309
bool is_NameChar( const QChar& );
314
void stringAddC(const QChar&);
318
void nameAddC(const QChar&);
322
void refAddC(const QChar&);
324
// used by parseReference() and parsePEReference()
325
enum EntityRecognitionContext { InContent, InAttributeValue, InEntityValue, InDTD };
334
void init( const QXmlInputSource* i );
337
bool entityExist( const QString& ) const;
339
bool parseBeginOrContinue( int state, bool incremental );
343
bool processElementEmptyTag();
344
bool processElementETagBegin2();
345
bool processElementAttribute();
355
bool parseAttribute();
356
bool parseReference();
357
bool processReference();
359
bool parseExternalID();
360
bool parsePEReference();
361
bool parseMarkupdecl();
362
bool parseAttlistDecl();
364
bool parseAttValue();
365
bool parseElementDecl();
366
bool parseNotationDecl();
367
bool parseChoiceSeq();
368
bool parseEntityDecl();
369
bool parseEntityValue();
373
bool insertXmlRef( const QString&, const QString&, bool );
375
bool reportEndEntities();
376
void reportParseError( const QString& error );
378
typedef bool (QXmlSimpleReader::*ParseFunction) ();
379
void unexpectedEof( ParseFunction where, int state );
380
void parseFailed( ParseFunction where, int state );
381
void pushParseState( ParseFunction function, int state );
383
friend class QXmlSimpleReaderPrivate;
384
friend class QXmlSimpleReaderLocator;
391
class QM_EXPORT_XML QXmlLocator
395
virtual ~QXmlLocator();
397
virtual int columnNumber() = 0;
398
virtual int lineNumber() = 0;
399
// QString getPublicId()
400
// QString getSystemId()
404
// SAX handler classes
407
class QM_EXPORT_XML QXmlContentHandler
410
virtual void setDocumentLocator( QXmlLocator* locator ) = 0;
411
virtual bool startDocument() = 0;
412
virtual bool endDocument() = 0;
413
virtual bool startPrefixMapping( const QString& prefix, const QString& uri ) = 0;
414
virtual bool endPrefixMapping( const QString& prefix ) = 0;
415
virtual bool startElement( const QString& namespaceURI, const QString& localName, const QString& qName, const QXmlAttributes& atts ) = 0;
416
virtual bool endElement( const QString& namespaceURI, const QString& localName, const QString& qName ) = 0;
417
virtual bool characters( const QString& ch ) = 0;
418
virtual bool ignorableWhitespace( const QString& ch ) = 0;
419
virtual bool processingInstruction( const QString& target, const QString& data ) = 0;
420
virtual bool skippedEntity( const QString& name ) = 0;
421
virtual QString errorString() = 0;
424
class QM_EXPORT_XML QXmlErrorHandler
427
virtual bool warning( const QXmlParseException& exception ) = 0;
428
virtual bool error( const QXmlParseException& exception ) = 0;
429
virtual bool fatalError( const QXmlParseException& exception ) = 0;
430
virtual QString errorString() = 0;
433
class QM_EXPORT_XML QXmlDTDHandler
436
virtual bool notationDecl( const QString& name, const QString& publicId, const QString& systemId ) = 0;
437
virtual bool unparsedEntityDecl( const QString& name, const QString& publicId, const QString& systemId, const QString& notationName ) = 0;
438
virtual QString errorString() = 0;
441
class QM_EXPORT_XML QXmlEntityResolver
444
virtual bool resolveEntity( const QString& publicId, const QString& systemId, QXmlInputSource*& ret ) = 0;
445
virtual QString errorString() = 0;
448
class QM_EXPORT_XML 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_XML QXmlDeclHandler
464
virtual bool attributeDecl( const QString& eName, const QString& aName, const QString& type, const QString& valueDefault, const QString& value ) = 0;
465
virtual bool internalEntityDecl( const QString& name, const QString& value ) = 0;
466
virtual bool externalEntityDecl( const QString& name, const QString& publicId, const QString& systemId ) = 0;
467
virtual QString errorString() = 0;
471
class QM_EXPORT_XML QXmlDefaultHandler : public QXmlContentHandler, public QXmlErrorHandler, public QXmlDTDHandler, public QXmlEntityResolver, public QXmlLexicalHandler, public QXmlDeclHandler
474
QXmlDefaultHandler() { }
475
virtual ~QXmlDefaultHandler() { }
477
void setDocumentLocator( QXmlLocator* locator );
478
bool startDocument();
480
bool startPrefixMapping( const QString& prefix, const QString& uri );
481
bool endPrefixMapping( const QString& prefix );
482
bool startElement( const QString& namespaceURI, const QString& localName, const QString& qName, const QXmlAttributes& atts );
483
bool endElement( const QString& namespaceURI, const QString& localName, const QString& qName );
484
bool characters( const QString& ch );
485
bool ignorableWhitespace( const QString& ch );
486
bool processingInstruction( const QString& target, const QString& data );
487
bool skippedEntity( const QString& name );
489
bool warning( const QXmlParseException& exception );
490
bool error( const QXmlParseException& exception );
491
bool fatalError( const QXmlParseException& exception );
493
bool notationDecl( const QString& name, const QString& publicId, const QString& systemId );
494
bool unparsedEntityDecl( const QString& name, const QString& publicId, const QString& systemId, const QString& notationName );
496
bool resolveEntity( const QString& publicId, const QString& systemId, QXmlInputSource*& ret );
498
bool startDTD( const QString& name, const QString& publicId, const QString& systemId );
500
bool startEntity( const QString& name );
501
bool endEntity( const QString& name );
504
bool comment( const QString& ch );
506
bool attributeDecl( const QString& eName, const QString& aName, const QString& type, const QString& valueDefault, const QString& value );
507
bool internalEntityDecl( const QString& name, const QString& value );
508
bool externalEntityDecl( const QString& name, const QString& publicId, const QString& systemId );
510
QString errorString();
513
QXmlDefaultHandlerPrivate *d;
521
inline bool QXmlSimpleReader::is_S(const QChar& ch)
523
return ch==' ' || ch=='\t' || ch=='\n' || ch=='\r';
525
inline bool QXmlSimpleReader::is_NameBeginning( const QChar& ch )
527
return ch=='_' || ch==':' ||
528
ch.isLetter() || // ### Category Lm is not allowed
529
ch.category()==QChar::Number_Letter;
531
inline bool QXmlSimpleReader::is_NameChar( const QChar& ch )
533
return ch=='.' || ch=='-' || ch=='_' || ch==':' ||
534
ch.isLetterOrNumber() || // ### Category No is not allowed
538
inline bool QXmlSimpleReader::atEnd()
539
{ return (c.unicode()|0x0001) == 0xffff; }
541
inline void QXmlSimpleReader::stringClear()
542
{ stringValue = QString::null; stringPos = 0; }
543
inline void QXmlSimpleReader::nameClear()
544
{ nameValue = QString::null; namePos = 0; }
545
inline void QXmlSimpleReader::refClear()
546
{ refValue = QString::null; refPos = 0; }
548
inline int QXmlAttributes::count() const
551
} // namespace PsiXml
553
using namespace PsiXml;