1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:sensitive reason:trivial-impl-only
4
5#ifndef QXML_H
6#define QXML_H
7
8#include <QtCore5Compat/qcore5global.h>
9
10#include <QtCore/qtextstream.h>
11#include <QtCore/qfile.h>
12#include <QtCore/qstring.h>
13#include <QtCore/qstringlist.h>
14#include <QtCore/qlist.h>
15
16#include <memory>
17
18QT_BEGIN_NAMESPACE
19
20class QXmlNamespaceSupport;
21class QXmlAttributes;
22class QXmlContentHandler;
23class QXmlDefaultHandler;
24class QXmlDTDHandler;
25class QXmlEntityResolver;
26class QXmlErrorHandler;
27class QXmlLexicalHandler;
28class QXmlDeclHandler;
29class QXmlInputSource;
30class QXmlLocator;
31class QXmlNamespaceSupport;
32class QXmlParseException;
33
34class QXmlReader;
35class QXmlSimpleReader;
36
37class QXmlSimpleReaderPrivate;
38class QXmlNamespaceSupportPrivate;
39class QXmlAttributesPrivate;
40class QXmlInputSourcePrivate;
41class QXmlParseExceptionPrivate;
42class QXmlLocatorPrivate;
43class QXmlDefaultHandlerPrivate;
44
45//
46// SAX Namespace Support
47//
48
49class Q_CORE5COMPAT_EXPORT QXmlNamespaceSupport
50{
51public:
52 QXmlNamespaceSupport();
53 ~QXmlNamespaceSupport();
54
55 void setPrefix(const QString&, const QString&);
56
57 QString prefix(const QString&) const;
58 QString uri(const QString&) const;
59 void splitName(const QString&, QString&, QString&) const;
60 void processName(const QString&, bool, QString&, QString&) const;
61 QStringList prefixes() const;
62 QStringList prefixes(const QString&) const;
63
64 void pushContext();
65 void popContext();
66 void reset();
67
68private:
69 QXmlNamespaceSupportPrivate *d;
70
71 friend class QXmlSimpleReaderPrivate;
72 Q_DISABLE_COPY(QXmlNamespaceSupport)
73};
74
75//
76// SAX Attributes
77//
78
79class Q_CORE5COMPAT_EXPORT QXmlAttributes
80{
81public:
82 QXmlAttributes();
83 QXmlAttributes(const QXmlAttributes &) = default;
84 QXmlAttributes(QXmlAttributes &&) noexcept = default;
85 QXmlAttributes &operator=(const QXmlAttributes &) = default;
86 QXmlAttributes &operator=(QXmlAttributes &&) noexcept = default;
87
88 virtual ~QXmlAttributes();
89
90 void swap(QXmlAttributes &other) noexcept
91 {
92 attList.swap(other&: other.attList);
93 qt_ptr_swap(lhs&: d, rhs&: other.d);
94 }
95
96 int index(const QString& qName) const;
97 int index(QLatin1String qName) const;
98 int index(const QString& uri, const QString& localPart) const;
99 int length() const;
100 int count() const;
101 QString localName(int index) const;
102 QString qName(int index) const;
103 QString uri(int index) const;
104 QString type(int index) const;
105 QString type(const QString& qName) const;
106 QString type(const QString& uri, const QString& localName) const;
107 QString value(int index) const;
108 QString value(const QString& qName) const;
109 QString value(QLatin1String qName) const;
110 QString value(const QString& uri, const QString& localName) const;
111
112 void clear();
113 void append(const QString &qName, const QString &uri, const QString &localPart, const QString &value);
114
115private:
116 struct Attribute {
117 QString qname, uri, localname, value;
118 };
119 friend class QTypeInfo<Attribute>;
120 typedef QList<Attribute> AttributeList;
121 AttributeList attList;
122
123 QXmlAttributesPrivate *d;
124};
125
126Q_DECLARE_TYPEINFO(QXmlAttributes::Attribute, Q_RELOCATABLE_TYPE);
127Q_DECLARE_SHARED(QXmlAttributes)
128
129//
130// SAX Input Source
131//
132
133class Q_CORE5COMPAT_EXPORT QXmlInputSource
134{
135public:
136 QXmlInputSource();
137 explicit QXmlInputSource(QIODevice *dev);
138 virtual ~QXmlInputSource();
139
140 virtual void setData(const QString& dat);
141 virtual void setData(const QByteArray& dat);
142 virtual void fetchData();
143 virtual QString data() const;
144 virtual QChar next();
145 virtual void reset();
146
147 static const char16_t EndOfData;
148 static const char16_t EndOfDocument;
149
150protected:
151 virtual QString fromRawData(const QByteArray &data, bool beginning = false);
152
153private:
154 void init();
155 QXmlInputSourcePrivate *d;
156};
157
158//
159// SAX Exception Classes
160//
161
162class Q_CORE5COMPAT_EXPORT QXmlParseException
163{
164public:
165 explicit QXmlParseException(const QString &name = QString(), int c = -1, int l = -1,
166 const QString &p = QString(), const QString &s = QString());
167 QXmlParseException(const QXmlParseException &other);
168 ~QXmlParseException();
169
170 int columnNumber() const;
171 int lineNumber() const;
172 QString publicId() const;
173 QString systemId() const;
174 QString message() const;
175
176private:
177 std::unique_ptr<QXmlParseExceptionPrivate> d;
178};
179
180//
181// XML Reader
182//
183
184class Q_CORE5COMPAT_EXPORT QXmlReader
185{
186public:
187 virtual ~QXmlReader();
188 virtual bool feature(const QString& name, bool *ok = nullptr) const = 0;
189 virtual void setFeature(const QString& name, bool value) = 0;
190 virtual bool hasFeature(const QString& name) const = 0;
191 virtual void* property(const QString& name, bool *ok = nullptr) const = 0;
192 virtual void setProperty(const QString& name, void* value) = 0;
193 virtual bool hasProperty(const QString& name) const = 0;
194 virtual void setEntityResolver(QXmlEntityResolver* handler) = 0;
195 virtual QXmlEntityResolver* entityResolver() const = 0;
196 virtual void setDTDHandler(QXmlDTDHandler* handler) = 0;
197 virtual QXmlDTDHandler* DTDHandler() const = 0;
198 virtual void setContentHandler(QXmlContentHandler* handler) = 0;
199 virtual QXmlContentHandler* contentHandler() const = 0;
200 virtual void setErrorHandler(QXmlErrorHandler* handler) = 0;
201 virtual QXmlErrorHandler* errorHandler() const = 0;
202 virtual void setLexicalHandler(QXmlLexicalHandler* handler) = 0;
203 virtual QXmlLexicalHandler* lexicalHandler() const = 0;
204 virtual void setDeclHandler(QXmlDeclHandler* handler) = 0;
205 virtual QXmlDeclHandler* declHandler() const = 0;
206 virtual bool parse(const QXmlInputSource& input) = 0;
207 virtual bool parse(const QXmlInputSource* input) = 0;
208};
209
210class Q_CORE5COMPAT_EXPORT QXmlSimpleReader
211 : public QXmlReader
212{
213public:
214 QXmlSimpleReader();
215 virtual ~QXmlSimpleReader();
216
217 bool feature(const QString& name, bool *ok = nullptr) const override;
218 void setFeature(const QString& name, bool value) override;
219 bool hasFeature(const QString& name) const override;
220
221 void* property(const QString& name, bool *ok = nullptr) const override;
222 void setProperty(const QString& name, void* value) override;
223 bool hasProperty(const QString& name) const override;
224
225 void setEntityResolver(QXmlEntityResolver* handler) override;
226 QXmlEntityResolver* entityResolver() const override;
227 void setDTDHandler(QXmlDTDHandler* handler) override;
228 QXmlDTDHandler* DTDHandler() const override;
229 void setContentHandler(QXmlContentHandler* handler) override;
230 QXmlContentHandler* contentHandler() const override;
231 void setErrorHandler(QXmlErrorHandler* handler) override;
232 QXmlErrorHandler* errorHandler() const override;
233 void setLexicalHandler(QXmlLexicalHandler* handler) override;
234 QXmlLexicalHandler* lexicalHandler() const override;
235 void setDeclHandler(QXmlDeclHandler* handler) override;
236 QXmlDeclHandler* declHandler() const override;
237
238 bool parse(const QXmlInputSource& input) override;
239 bool parse(const QXmlInputSource* input) override;
240 virtual bool parse(const QXmlInputSource* input, bool incremental);
241 virtual bool parseContinue();
242
243private:
244 Q_DISABLE_COPY(QXmlSimpleReader)
245 Q_DECLARE_PRIVATE(QXmlSimpleReader)
246 std::unique_ptr<QXmlSimpleReaderPrivate> d_ptr;
247
248 friend class QXmlSimpleReaderLocator;
249};
250
251//
252// SAX Locator
253//
254
255class Q_CORE5COMPAT_EXPORT QXmlLocator
256{
257public:
258 QXmlLocator();
259 virtual ~QXmlLocator();
260
261 virtual int columnNumber() const = 0;
262 virtual int lineNumber() const = 0;
263};
264
265//
266// SAX handler classes
267//
268
269class Q_CORE5COMPAT_EXPORT QXmlContentHandler
270{
271public:
272 virtual ~QXmlContentHandler();
273 virtual void setDocumentLocator(QXmlLocator* locator) = 0;
274 virtual bool startDocument() = 0;
275 virtual bool endDocument() = 0;
276 virtual bool startPrefixMapping(const QString& prefix, const QString& uri) = 0;
277 virtual bool endPrefixMapping(const QString& prefix) = 0;
278 virtual bool startElement(const QString& namespaceURI, const QString& localName, const QString& qName, const QXmlAttributes& atts) = 0;
279 virtual bool endElement(const QString& namespaceURI, const QString& localName, const QString& qName) = 0;
280 virtual bool characters(const QString& ch) = 0;
281 virtual bool ignorableWhitespace(const QString& ch) = 0;
282 virtual bool processingInstruction(const QString& target, const QString& data) = 0;
283 virtual bool skippedEntity(const QString& name) = 0;
284 virtual QString errorString() const = 0;
285};
286
287class Q_CORE5COMPAT_EXPORT QXmlErrorHandler
288{
289public:
290 virtual ~QXmlErrorHandler();
291 virtual bool warning(const QXmlParseException& exception) = 0;
292 virtual bool error(const QXmlParseException& exception) = 0;
293 virtual bool fatalError(const QXmlParseException& exception) = 0;
294 virtual QString errorString() const = 0;
295};
296
297class Q_CORE5COMPAT_EXPORT QXmlDTDHandler
298{
299public:
300 virtual ~QXmlDTDHandler();
301 virtual bool notationDecl(const QString& name, const QString& publicId, const QString& systemId) = 0;
302 virtual bool unparsedEntityDecl(const QString& name, const QString& publicId, const QString& systemId, const QString& notationName) = 0;
303 virtual QString errorString() const = 0;
304};
305
306class Q_CORE5COMPAT_EXPORT QXmlEntityResolver
307{
308public:
309 virtual ~QXmlEntityResolver();
310 virtual bool resolveEntity(const QString& publicId, const QString& systemId, QXmlInputSource*& ret) = 0;
311 virtual QString errorString() const = 0;
312};
313
314class Q_CORE5COMPAT_EXPORT QXmlLexicalHandler
315{
316public:
317 virtual ~QXmlLexicalHandler();
318 virtual bool startDTD(const QString& name, const QString& publicId, const QString& systemId) = 0;
319 virtual bool endDTD() = 0;
320 virtual bool startEntity(const QString& name) = 0;
321 virtual bool endEntity(const QString& name) = 0;
322 virtual bool startCDATA() = 0;
323 virtual bool endCDATA() = 0;
324 virtual bool comment(const QString& ch) = 0;
325 virtual QString errorString() const = 0;
326};
327
328class Q_CORE5COMPAT_EXPORT QXmlDeclHandler
329{
330public:
331 virtual ~QXmlDeclHandler();
332 virtual bool attributeDecl(const QString& eName, const QString& aName, const QString& type, const QString& valueDefault, const QString& value) = 0;
333 virtual bool internalEntityDecl(const QString& name, const QString& value) = 0;
334 virtual bool externalEntityDecl(const QString& name, const QString& publicId, const QString& systemId) = 0;
335 virtual QString errorString() const = 0;
336 // ### Conform to SAX by adding elementDecl
337};
338
339class Q_CORE5COMPAT_EXPORT QXmlDefaultHandler : public QXmlContentHandler,
340 public QXmlErrorHandler,
341 public QXmlDTDHandler,
342 public QXmlEntityResolver,
343 public QXmlLexicalHandler,
344 public QXmlDeclHandler
345{
346public:
347 QXmlDefaultHandler();
348 virtual ~QXmlDefaultHandler();
349
350 void setDocumentLocator(QXmlLocator* locator) override;
351 bool startDocument() override;
352 bool endDocument() override;
353 bool startPrefixMapping(const QString& prefix, const QString& uri) override;
354 bool endPrefixMapping(const QString& prefix) override;
355 bool startElement(const QString& namespaceURI, const QString& localName, const QString& qName, const QXmlAttributes& atts) override;
356 bool endElement(const QString& namespaceURI, const QString& localName, const QString& qName) override;
357 bool characters(const QString& ch) override;
358 bool ignorableWhitespace(const QString& ch) override;
359 bool processingInstruction(const QString& target, const QString& data) override;
360 bool skippedEntity(const QString& name) override;
361
362 bool warning(const QXmlParseException& exception) override;
363 bool error(const QXmlParseException& exception) override;
364 bool fatalError(const QXmlParseException& exception) override;
365
366 bool notationDecl(const QString& name, const QString& publicId, const QString& systemId) override;
367 bool unparsedEntityDecl(const QString& name, const QString& publicId, const QString& systemId, const QString& notationName) override;
368
369 bool resolveEntity(const QString& publicId, const QString& systemId, QXmlInputSource*& ret) override;
370
371 bool startDTD(const QString& name, const QString& publicId, const QString& systemId) override;
372 bool endDTD() override;
373 bool startEntity(const QString& name) override;
374 bool endEntity(const QString& name) override;
375 bool startCDATA() override;
376 bool endCDATA() override;
377 bool comment(const QString& ch) override;
378
379 bool attributeDecl(const QString& eName, const QString& aName, const QString& type, const QString& valueDefault, const QString& value) override;
380 bool internalEntityDecl(const QString& name, const QString& value) override;
381 bool externalEntityDecl(const QString& name, const QString& publicId, const QString& systemId) override;
382
383 QString errorString() const override;
384
385private:
386 QXmlDefaultHandlerPrivate *d;
387 Q_DISABLE_COPY(QXmlDefaultHandler)
388};
389
390// inlines
391
392inline int QXmlAttributes::count() const
393{ return length(); }
394
395QT_END_NAMESPACE
396
397#endif // QXML_H
398

source code of qt5compat/src/core5/sax/qxml.h