source: trunk/include/qxml.h@ 203

Last change on this file since 203 was 2, checked in by dmik, 20 years ago

Imported xplatform parts of the official release 3.3.1 from Trolltech

  • Property svn:keywords set to Id
File size: 17.1 KB
Line 
1/****************************************************************************
2** $Id: qxml.h 2 2005-11-16 15:49:26Z dmik $
3**
4** Definition of QXmlSimpleReader and related classes.
5**
6** Created : 000518
7**
8** Copyright (C) 1992-2002 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
56class QXmlNamespaceSupport;
57class QXmlAttributes;
58class QXmlContentHandler;
59class QXmlDefaultHandler;
60class QXmlDTDHandler;
61class QXmlEntityResolver;
62class QXmlErrorHandler;
63class QXmlLexicalHandler;
64class QXmlDeclHandler;
65class QXmlInputSource;
66class QXmlLocator;
67class QXmlNamespaceSupport;
68class QXmlParseException;
69
70class QXmlReader;
71class QXmlSimpleReader;
72
73class QXmlSimpleReaderPrivate;
74class QXmlNamespaceSupportPrivate;
75class QXmlAttributesPrivate;
76class QXmlInputSourcePrivate;
77class QXmlParseExceptionPrivate;
78class QXmlLocatorPrivate;
79class QXmlDefaultHandlerPrivate;
80
81
82//
83// SAX Namespace Support
84//
85
86class QM_EXPORT_XML QXmlNamespaceSupport
87{
88public:
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
105private:
106 QXmlNamespaceSupportPrivate *d;
107};
108
109
110//
111// SAX Attributes
112//
113
114class QM_EXPORT_XML QXmlAttributes
115{
116public:
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
137private:
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
150class QM_EXPORT_XML QXmlInputSource
151{
152public:
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
169protected:
170 virtual QString fromRawData( const QByteArray &data, bool beginning = FALSE );
171
172private:
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
192class QM_EXPORT_XML QXmlParseException
193{
194public:
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
205private:
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
220class QM_EXPORT_XML QXmlReader
221{
222public:
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
245class QM_EXPORT_XML QXmlSimpleReader : public QXmlReader
246{
247public:
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
277private:
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
389class QM_EXPORT_XML QXmlLocator
390{
391public:
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
405class QM_EXPORT_XML QXmlContentHandler
406{
407public:
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
422class QM_EXPORT_XML QXmlErrorHandler
423{
424public:
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
431class QM_EXPORT_XML QXmlDTDHandler
432{
433public:
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
439class QM_EXPORT_XML QXmlEntityResolver
440{
441public:
442 virtual bool resolveEntity( const QString& publicId, const QString& systemId, QXmlInputSource*& ret ) = 0;
443 virtual QString errorString() = 0;
444};
445
446class QM_EXPORT_XML QXmlLexicalHandler
447{
448public:
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
459class QM_EXPORT_XML QXmlDeclHandler
460{
461public:
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
469class QM_EXPORT_XML QXmlDefaultHandler : public QXmlContentHandler, public QXmlErrorHandler, public QXmlDTDHandler, public QXmlEntityResolver, public QXmlLexicalHandler, public QXmlDeclHandler
470{
471public:
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
510private:
511 QXmlDefaultHandlerPrivate *d;
512};
513
514
515//
516// inlines
517//
518
519inline bool QXmlSimpleReader::is_S(const QChar& ch)
520{
521 return ch==' ' || ch=='\t' || ch=='\n' || ch=='\r';
522}
523inline 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}
529inline 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
536inline bool QXmlSimpleReader::atEnd()
537{ return (c.unicode()|0x0001) == 0xffff; }
538
539inline void QXmlSimpleReader::stringClear()
540{ stringValue = QString::null; stringPos = 0; }
541inline void QXmlSimpleReader::nameClear()
542{ nameValue = QString::null; namePos = 0; }
543inline void QXmlSimpleReader::refClear()
544{ refValue = QString::null; refPos = 0; }
545
546inline int QXmlAttributes::count() const
547{ return length(); }
548
549#endif //QT_NO_XML
550
551#endif
Note: See TracBrowser for help on using the repository browser.