source: psi/trunk/src/tools/qxml/qxml.h

Last change on this file was 2, checked in by dmik, 19 years ago

Imported original Psi 0.10 sources from Affinix

File size: 17.3 KB
Line 
1/****************************************************************************
2** $Id: qxml.h,v 1.1 2004/02/29 00:05:06 justin Exp $
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
56namespace PsiXml {
57
58class QXmlNamespaceSupport;
59class QXmlAttributes;
60class QXmlContentHandler;
61class QXmlDefaultHandler;
62class QXmlDTDHandler;
63class QXmlEntityResolver;
64class QXmlErrorHandler;
65class QXmlLexicalHandler;
66class QXmlDeclHandler;
67class QXmlInputSource;
68class QXmlLocator;
69class QXmlNamespaceSupport;
70class QXmlParseException;
71
72class QXmlReader;
73class QXmlSimpleReader;
74
75class QXmlSimpleReaderPrivate;
76class QXmlNamespaceSupportPrivate;
77class QXmlAttributesPrivate;
78class QXmlInputSourcePrivate;
79class QXmlParseExceptionPrivate;
80class QXmlLocatorPrivate;
81class QXmlDefaultHandlerPrivate;
82
83
84//
85// SAX Namespace Support
86//
87
88class QM_EXPORT_XML QXmlNamespaceSupport
89{
90public:
91 QXmlNamespaceSupport();
92 ~QXmlNamespaceSupport();
93
94 void setPrefix( const QString&, const QString& );
95
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;
102
103 void pushContext();
104 void popContext();
105 void reset();
106
107private:
108 QXmlNamespaceSupportPrivate *d;
109};
110
111
112//
113// SAX Attributes
114//
115
116class QM_EXPORT_XML QXmlAttributes
117{
118public:
119 QXmlAttributes() {}
120 virtual ~QXmlAttributes() {}
121
122 int index( const QString& qName ) const;
123 int index( const QString& uri, const QString& localPart ) const;
124 int length() const;
125 int count() 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;
135
136 void clear();
137 void append( const QString &qName, const QString &uri, const QString &localPart, const QString &value );
138
139private:
140 QStringList qnameList;
141 QStringList uriList;
142 QStringList localnameList;
143 QStringList valueList;
144
145 QXmlAttributesPrivate *d;
146};
147
148//
149// SAX Input Source
150//
151
152class QM_EXPORT_XML QXmlInputSource
153{
154public:
155 QXmlInputSource();
156 QXmlInputSource( QIODevice *dev );
157 QXmlInputSource( QFile& file ); // obsolete
158 QXmlInputSource( QTextStream& stream ); // obsolete
159 virtual ~QXmlInputSource();
160
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();
167
168 static const QChar EndOfData;
169 static const QChar EndOfDocument;
170
171protected:
172 virtual QString fromRawData( const QByteArray &data, bool beginning = FALSE );
173
174private:
175 void init();
176
177 QIODevice *inputDevice;
178 QTextStream *inputStream;
179
180 QString str;
181 const QChar *unicode;
182 int pos;
183 int length;
184 bool nextReturnedEndOfData;
185 QTextDecoder *encMapper;
186
187 QXmlInputSourcePrivate *d;
188};
189
190//
191// SAX Exception Classes
192//
193
194class QM_EXPORT_XML QXmlParseException
195{
196public:
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 )
199 { }
200
201 int columnNumber() const;
202 int lineNumber() const;
203 QString publicId() const;
204 QString systemId() const;
205 QString message() const;
206
207private:
208 QString msg;
209 int column;
210 int line;
211 QString pub;
212 QString sys;
213
214 QXmlParseExceptionPrivate *d;
215};
216
217
218//
219// XML Reader
220//
221
222class QM_EXPORT_XML QXmlReader
223{
224public:
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;
245};
246
247class QM_EXPORT_XML QXmlSimpleReader : public QXmlReader
248{
249public:
250 QXmlSimpleReader();
251 virtual ~QXmlSimpleReader();
252
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;
256
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;
260
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;
273
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();
278
279private:
280 // variables
281 QXmlContentHandler *contentHnd;
282 QXmlErrorHandler *errorHnd;
283 QXmlDTDHandler *dtdHnd;
284 QXmlEntityResolver *entityRes;
285 QXmlLexicalHandler *lexicalHnd;
286 QXmlDeclHandler *declHnd;
287
288 QXmlInputSource *inputSource;
289
290 QChar c; // the character at reading position
291 int lineNr; // number of line
292 int columnNr; // position in line
293
294 int namePos;
295 QChar nameArray[256]; // only used for names
296 QString nameValue; // only used for names
297 int refPos;
298 QChar refArray[256]; // only used for references
299 QString refValue; // only used for references
300 int stringPos;
301 QChar stringArray[256]; // used for any other strings that are parsed
302 QString stringValue; // used for any other strings that are parsed
303
304 QXmlSimpleReaderPrivate* d;
305
306 // inlines
307 bool is_S( const QChar& );
308 bool is_NameBeginning( const QChar& );
309 bool is_NameChar( const QChar& );
310
311 QString& string();
312 void stringClear();
313 void stringAddC();
314 void stringAddC(const QChar&);
315 QString& name();
316 void nameClear();
317 void nameAddC();
318 void nameAddC(const QChar&);
319 QString& ref();
320 void refClear();
321 void refAddC();
322 void refAddC(const QChar&);
323
324 // used by parseReference() and parsePEReference()
325 enum EntityRecognitionContext { InContent, InAttributeValue, InEntityValue, InDTD };
326
327 // private functions
328 bool eat_ws();
329 bool next_eat_ws();
330
331 void next();
332 bool atEnd();
333
334 void init( const QXmlInputSource* i );
335 void initData();
336
337 bool entityExist( const QString& ) const;
338
339 bool parseBeginOrContinue( int state, bool incremental );
340
341 bool parseProlog();
342 bool parseElement();
343 bool processElementEmptyTag();
344 bool processElementETagBegin2();
345 bool processElementAttribute();
346 bool parseMisc();
347 bool parseContent();
348
349 bool parsePI();
350 bool parseDoctype();
351 bool parseComment();
352
353 bool parseName();
354 bool parseNmtoken();
355 bool parseAttribute();
356 bool parseReference();
357 bool processReference();
358
359 bool parseExternalID();
360 bool parsePEReference();
361 bool parseMarkupdecl();
362 bool parseAttlistDecl();
363 bool parseAttType();
364 bool parseAttValue();
365 bool parseElementDecl();
366 bool parseNotationDecl();
367 bool parseChoiceSeq();
368 bool parseEntityDecl();
369 bool parseEntityValue();
370
371 bool parseString();
372
373 bool insertXmlRef( const QString&, const QString&, bool );
374
375 bool reportEndEntities();
376 void reportParseError( const QString& error );
377
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 );
382
383 friend class QXmlSimpleReaderPrivate;
384 friend class QXmlSimpleReaderLocator;
385};
386
387//
388// SAX Locator
389//
390
391class QM_EXPORT_XML QXmlLocator
392{
393public:
394 QXmlLocator();
395 virtual ~QXmlLocator();
396
397 virtual int columnNumber() = 0;
398 virtual int lineNumber() = 0;
399// QString getPublicId()
400// QString getSystemId()
401};
402
403//
404// SAX handler classes
405//
406
407class QM_EXPORT_XML QXmlContentHandler
408{
409public:
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;
422};
423
424class QM_EXPORT_XML QXmlErrorHandler
425{
426public:
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;
431};
432
433class QM_EXPORT_XML QXmlDTDHandler
434{
435public:
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;
439};
440
441class QM_EXPORT_XML QXmlEntityResolver
442{
443public:
444 virtual bool resolveEntity( const QString& publicId, const QString& systemId, QXmlInputSource*& ret ) = 0;
445 virtual QString errorString() = 0;
446};
447
448class QM_EXPORT_XML QXmlLexicalHandler
449{
450public:
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;
459};
460
461class QM_EXPORT_XML QXmlDeclHandler
462{
463public:
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;
468};
469
470
471class QM_EXPORT_XML QXmlDefaultHandler : public QXmlContentHandler, public QXmlErrorHandler, public QXmlDTDHandler, public QXmlEntityResolver, public QXmlLexicalHandler, public QXmlDeclHandler
472{
473public:
474 QXmlDefaultHandler() { }
475 virtual ~QXmlDefaultHandler() { }
476
477 void setDocumentLocator( QXmlLocator* locator );
478 bool startDocument();
479 bool endDocument();
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 );
488
489 bool warning( const QXmlParseException& exception );
490 bool error( const QXmlParseException& exception );
491 bool fatalError( const QXmlParseException& exception );
492
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 );
495
496 bool resolveEntity( const QString& publicId, const QString& systemId, QXmlInputSource*& ret );
497
498 bool startDTD( const QString& name, const QString& publicId, const QString& systemId );
499 bool endDTD();
500 bool startEntity( const QString& name );
501 bool endEntity( const QString& name );
502 bool startCDATA();
503 bool endCDATA();
504 bool comment( const QString& ch );
505
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 );
509
510 QString errorString();
511
512private:
513 QXmlDefaultHandlerPrivate *d;
514};
515
516
517//
518// inlines
519//
520
521inline bool QXmlSimpleReader::is_S(const QChar& ch)
522{
523 return ch==' ' || ch=='\t' || ch=='\n' || ch=='\r';
524}
525inline bool QXmlSimpleReader::is_NameBeginning( const QChar& ch )
526{
527 return ch=='_' || ch==':' ||
528 ch.isLetter() || // ### Category Lm is not allowed
529 ch.category()==QChar::Number_Letter;
530}
531inline bool QXmlSimpleReader::is_NameChar( const QChar& ch )
532{
533 return ch=='.' || ch=='-' || ch=='_' || ch==':' ||
534 ch.isLetterOrNumber() || // ### Category No is not allowed
535 ch.isMark();
536}
537
538inline bool QXmlSimpleReader::atEnd()
539{ return (c.unicode()|0x0001) == 0xffff; }
540
541inline void QXmlSimpleReader::stringClear()
542{ stringValue = QString::null; stringPos = 0; }
543inline void QXmlSimpleReader::nameClear()
544{ nameValue = QString::null; namePos = 0; }
545inline void QXmlSimpleReader::refClear()
546{ refValue = QString::null; refPos = 0; }
547
548inline int QXmlAttributes::count() const
549{ return length(); }
550
551} // namespace PsiXml
552
553using namespace PsiXml;
554
555#endif //QT_NO_XML
556
557#endif
Note: See TracBrowser for help on using the repository browser.