summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2020-09-07 14:01:20 +0200
committerLars Knoll <lars.knoll@qt.io>2020-09-15 08:12:20 +0200
commit79e0374143ab385cb12a17443e91c8eb9d2f3a4b (patch)
tree821f3b5d1111b4f6b2de72e6f94995c67d0635d0 /src
parent0aaebc3378c9264e5b5ac0facbd0d8961fd57a9f (diff)
Remove the SAX parser from QtXml
It has been deprecated and will live in qt5compat from now on. Fixes: QTBUG-86480 Change-Id: I3744c7cee058d51d0fce633a174ab1a0f9235d2c Reviewed-by: Karsten Heimrich <karsten.heimrich@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/tools/bootstrap/CMakeLists.txt1
-rw-r--r--src/tools/bootstrap/bootstrap.pro3
-rw-r--r--src/tools/uic/qclass_lib_map.h14
-rw-r--r--src/xml/CMakeLists.txt1
-rw-r--r--src/xml/doc/snippets/simpleparse/main.cpp97
-rw-r--r--src/xml/dom/qdom.cpp111
-rw-r--r--src/xml/dom/qdom_p.h10
-rw-r--r--src/xml/dom/qdomhelpers.cpp194
-rw-r--r--src/xml/dom/qdomhelpers_p.h92
-rw-r--r--src/xml/sax/qxml.cpp7999
-rw-r--r--src/xml/sax/qxml.h469
-rw-r--r--src/xml/sax/qxml_p.h328
-rw-r--r--src/xml/sax/sax.pri3
-rw-r--r--src/xml/xml.pro1
14 files changed, 3 insertions, 9320 deletions
diff --git a/src/tools/bootstrap/CMakeLists.txt b/src/tools/bootstrap/CMakeLists.txt
index 272cd92128..fe69c371cb 100644
--- a/src/tools/bootstrap/CMakeLists.txt
+++ b/src/tools/bootstrap/CMakeLists.txt
@@ -127,7 +127,6 @@ qt_extend_target(Bootstrap
../../corelib/tools/qsize.cpp
../../corelib/tools/qversionnumber.cpp
../../xml/dom/qdom.cpp
- ../../xml/sax/qxml.cpp
DEFINES
HAVE_CONFIG_H
PCRE2_CODE_UNIT_WIDTH=16
diff --git a/src/tools/bootstrap/bootstrap.pro b/src/tools/bootstrap/bootstrap.pro
index c9277735c8..d2a780593e 100644
--- a/src/tools/bootstrap/bootstrap.pro
+++ b/src/tools/bootstrap/bootstrap.pro
@@ -112,8 +112,7 @@ SOURCES += \
../../corelib/tools/qsize.cpp \
../../corelib/tools/qline.cpp \
../../corelib/tools/qversionnumber.cpp \
- ../../xml/dom/qdom.cpp \
- ../../xml/sax/qxml.cpp
+ ../../xml/dom/qdom.cpp
unix:SOURCES += ../../corelib/kernel/qcore_unix.cpp \
../../corelib/kernel/qsharedmemory_posix.cpp \
diff --git a/src/tools/uic/qclass_lib_map.h b/src/tools/uic/qclass_lib_map.h
index 4bd3051cf2..5e11d61089 100644
--- a/src/tools/uic/qclass_lib_map.h
+++ b/src/tools/uic/qclass_lib_map.h
@@ -313,20 +313,6 @@ QT_CLASS_LIB(QDomNotation, QtXml, qdom.h)
QT_CLASS_LIB(QDomEntity, QtXml, qdom.h)
QT_CLASS_LIB(QDomEntityReference, QtXml, qdom.h)
QT_CLASS_LIB(QDomProcessingInstruction, QtXml, qdom.h)
-QT_CLASS_LIB(QXmlNamespaceSupport, QtXml, qxml.h)
-QT_CLASS_LIB(QXmlAttributes, QtXml, qxml.h)
-QT_CLASS_LIB(QXmlInputSource, QtXml, qxml.h)
-QT_CLASS_LIB(QXmlParseException, QtXml, qxml.h)
-QT_CLASS_LIB(QXmlReader, QtXml, qxml.h)
-QT_CLASS_LIB(QXmlSimpleReader, QtXml, qxml.h)
-QT_CLASS_LIB(QXmlLocator, QtXml, qxml.h)
-QT_CLASS_LIB(QXmlContentHandler, QtXml, qxml.h)
-QT_CLASS_LIB(QXmlErrorHandler, QtXml, qxml.h)
-QT_CLASS_LIB(QXmlDTDHandler, QtXml, qxml.h)
-QT_CLASS_LIB(QXmlEntityResolver, QtXml, qxml.h)
-QT_CLASS_LIB(QXmlLexicalHandler, QtXml, qxml.h)
-QT_CLASS_LIB(QXmlDeclHandler, QtXml, qxml.h)
-QT_CLASS_LIB(QXmlDefaultHandler, QtXml, qxml.h)
QT_CLASS_LIB(QXmlStreamAttribute, QtXml, qxmlstream.h)
QT_CLASS_LIB(QXmlStreamAttributes, QtXml, qxmlstream.h)
QT_CLASS_LIB(QXmlStreamEntityDeclaration, QtXml, qxmlstream.h)
diff --git a/src/xml/CMakeLists.txt b/src/xml/CMakeLists.txt
index 8b79b9df45..53cbeeaddc 100644
--- a/src/xml/CMakeLists.txt
+++ b/src/xml/CMakeLists.txt
@@ -9,7 +9,6 @@ qt_add_module(Xml
dom/qdom.cpp dom/qdom.h dom/qdom_p.h
dom/qdomhelpers.cpp dom/qdomhelpers_p.h
qtxmlglobal.h
- sax/qxml.cpp sax/qxml.h sax/qxml_p.h
DEFINES
QT_NO_FOREACH
QT_NO_USING_NAMESPACE
diff --git a/src/xml/doc/snippets/simpleparse/main.cpp b/src/xml/doc/snippets/simpleparse/main.cpp
deleted file mode 100644
index 57aeb82457..0000000000
--- a/src/xml/doc/snippets/simpleparse/main.cpp
+++ /dev/null
@@ -1,97 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-** * Redistributions of source code must retain the above copyright
-** notice, this list of conditions and the following disclaimer.
-** * Redistributions in binary form must reproduce the above copyright
-** notice, this list of conditions and the following disclaimer in
-** the documentation and/or other materials provided with the
-** distribution.
-** * Neither the name of The Qt Company Ltd nor the names of its
-** contributors may be used to endorse or promote products derived
-** from this software without specific prior written permission.
-**
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <qfile.h>
-#include <qxml.h>
-#include "handler.h"
-
-#include <iostream>
-
-int main(int argc, char **argv)
-{
- if (argc != 2) {
- std::cout << "Usage: " << argv[0] << " <filename>" << std::endl;
- return 1;
- }
-
- QFile *file = new QFile(argv[1]);
-
-//! [0]
- QXmlSimpleReader xmlReader;
- QXmlInputSource *source = new QXmlInputSource(file);
-//! [0]
-
-//! [1]
- Handler *handler = new Handler;
- xmlReader.setContentHandler(handler);
- xmlReader.setErrorHandler(handler);
-//! [1]
-
-//! [2]
- bool ok = xmlReader.parse(source);
-
- if (!ok)
- std::cout << "Parsing failed." << std::endl;
-//! [2]
- else {
- QStringList names = handler->names();
- QList<int> indentations = handler->indentations();
-
- int items = names.count();
-
- for (int i = 0; i < items; ++i) {
- for (int j = 0; j < indentations[i]; ++j)
- std::cout << ' ';
- std::cout << names[i].toLocal8Bit().constData() << std::endl;
- }
- }
-
- return 0;
-}
diff --git a/src/xml/dom/qdom.cpp b/src/xml/dom/qdom.cpp
index 0856a83a52..571e7fb0ac 100644
--- a/src/xml/dom/qdom.cpp
+++ b/src/xml/dom/qdom.cpp
@@ -53,7 +53,6 @@
#include <qregularexpression.h>
#endif
#include <qtextstream.h>
-#include <qxml.h>
#include <qvariant.h>
#include <qshareddata.h>
#include <qdebug.h>
@@ -5683,57 +5682,6 @@ void QDomDocumentPrivate::clear()
QDomNodePrivate::clear();
}
-#if QT_DEPRECATED_SINCE(5, 15)
-
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
-static void initializeReader(QXmlSimpleReader &reader, bool namespaceProcessing)
-{
- reader.setFeature(QLatin1String("http://xml.org/sax/features/namespaces"), namespaceProcessing);
- reader.setFeature(QLatin1String("http://xml.org/sax/features/namespace-prefixes"), !namespaceProcessing);
- reader.setFeature(QLatin1String("http://trolltech.com/xml/features/report-whitespace-only-CharData"), false); // Shouldn't change in Qt 4
-}
-
-bool QDomDocumentPrivate::setContent(QXmlInputSource *source, bool namespaceProcessing, QString *errorMsg, int *errorLine, int *errorColumn)
-{
- QXmlSimpleReader reader;
- initializeReader(reader, namespaceProcessing);
- return setContent(source, &reader, &reader, errorMsg, errorLine, errorColumn);
-}
-
-bool QDomDocumentPrivate::setContent(QXmlInputSource *source, QXmlReader *reader, QXmlSimpleReader *simpleReader, QString *errorMsg, int *errorLine, int *errorColumn)
-{
- clear();
- impl = new QDomImplementationPrivate;
- type = new QDomDocumentTypePrivate(this, this);
- type->ref.deref();
-
- bool namespaceProcessing = reader->feature(QLatin1String("http://xml.org/sax/features/namespaces"))
- && !reader->feature(QLatin1String("http://xml.org/sax/features/namespace-prefixes"));
-
- QDomHandler hnd(this, simpleReader, namespaceProcessing);
- reader->setContentHandler(&hnd);
- reader->setErrorHandler(&hnd);
- reader->setLexicalHandler(&hnd);
- reader->setDeclHandler(&hnd);
- reader->setDTDHandler(&hnd);
-
- if (!reader->parse(source)) {
- if (errorMsg)
- *errorMsg = std::get<0>(hnd.errorInfo());
- if (errorLine)
- *errorLine = std::get<1>(hnd.errorInfo());
- if (errorColumn)
- *errorColumn = std::get<2>(hnd.errorInfo());
- return false;
- }
-
- return true;
-}
-QT_WARNING_POP
-
-#endif // QT_DEPRECATED_SINCE(5, 15)
-
bool QDomDocumentPrivate::setContent(QXmlStreamReader *reader, bool namespaceProcessing,
QString *errorMsg, int *errorLine, int *errorColumn)
{
@@ -6273,43 +6221,11 @@ bool QDomDocument::setContent(QIODevice* dev, bool namespaceProcessing, QString
if (!impl)
impl = new QDomDocumentPrivate();
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) && QT_DEPRECATED_SINCE(5, 15)
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- QXmlInputSource source(dev);
-QT_WARNING_POP
- return IMPL->setContent(&source, namespaceProcessing, errorMsg, errorLine, errorColumn);
-#else
QXmlStreamReader streamReader(dev);
streamReader.setNamespaceProcessing(namespaceProcessing);
return IMPL->setContent(&streamReader, namespaceProcessing, errorMsg, errorLine, errorColumn);
-#endif
}
-#if QT_DEPRECATED_SINCE(5, 15)
-/*!
- \overload
- \obsolete
- \since 4.5
-
- This function reads the XML document from the QXmlInputSource \a source,
- returning true if the content was successfully parsed; otherwise returns \c false.
-
-*/
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
-bool QDomDocument::setContent(QXmlInputSource *source, bool namespaceProcessing, QString *errorMsg, int *errorLine, int *errorColumn )
-{
- if (!impl)
- impl = new QDomDocumentPrivate();
- QXmlSimpleReader reader;
- initializeReader(reader, namespaceProcessing);
- return IMPL->setContent(source, &reader, &reader, errorMsg, errorLine, errorColumn);
-}
-QT_WARNING_POP
-
-#endif
-
/*!
\overload
@@ -6353,33 +6269,6 @@ bool QDomDocument::setContent(QIODevice* dev, QString *errorMsg, int *errorLine,
return setContent(dev, false, errorMsg, errorLine, errorColumn);
}
-#if QT_DEPRECATED_SINCE(5, 15)
-/*!
- \overload
- \obsolete
-
- This function reads the XML document from the QXmlInputSource \a source and
- parses it with the QXmlReader \a reader, returning true if the content was
- successfully parsed; otherwise returns \c false.
-
- This function doesn't change the features of the \a reader. If you want to
- use certain features for parsing you can use this function to set up the
- reader appropriately.
-
- \sa QXmlSimpleReader
-*/
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
-bool QDomDocument::setContent(QXmlInputSource *source, QXmlReader *reader, QString *errorMsg, int *errorLine, int *errorColumn )
-{
- if (!impl)
- impl = new QDomDocumentPrivate();
- return IMPL->setContent(source, reader, nullptr, errorMsg, errorLine, errorColumn);
-}
-QT_WARNING_POP
-
-#endif
-
/*!
\overload
\since 5.15
diff --git a/src/xml/dom/qdom_p.h b/src/xml/dom/qdom_p.h
index 8ab81aa083..82c533b141 100644
--- a/src/xml/dom/qdom_p.h
+++ b/src/xml/dom/qdom_p.h
@@ -45,7 +45,6 @@
#include <qhash.h>
#include <qstring.h>
#include <qlist.h>
-#include <qxml.h>
#include <qshareddata.h>
QT_BEGIN_NAMESPACE
@@ -462,15 +461,6 @@ public:
QDomDocumentPrivate(QDomDocumentPrivate *n, bool deep);
~QDomDocumentPrivate();
-#if QT_DEPRECATED_SINCE(5, 15)
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- bool setContent(QXmlInputSource *source, bool namespaceProcessing, QString *errorMsg,
- int *errorLine, int *errorColumn);
- bool setContent(QXmlInputSource *source, QXmlReader *reader, QXmlSimpleReader *simpleReader,
- QString *errorMsg, int *errorLine, int *errorColumn);
-QT_WARNING_POP
-#endif
bool setContent(QXmlStreamReader *reader, bool namespaceProcessing, QString *errorMsg,
int *errorLine, int *errorColumn);
diff --git a/src/xml/dom/qdomhelpers.cpp b/src/xml/dom/qdomhelpers.cpp
index 69fb99715d..75d4c2c2b7 100644
--- a/src/xml/dom/qdomhelpers.cpp
+++ b/src/xml/dom/qdomhelpers.cpp
@@ -44,132 +44,10 @@
#include "qdomhelpers_p.h"
#include "qdom_p.h"
#include "qxmlstream.h"
-#include "private/qxml_p.h"
-QT_BEGIN_NAMESPACE
-
-#if QT_DEPRECATED_SINCE(5, 15)
-
-/**************************************************************
- *
- * QDomHandler
- *
- **************************************************************/
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
-QDomHandler::QDomHandler(QDomDocumentPrivate *adoc, QXmlSimpleReader *areader,
- bool namespaceProcessing)
- : cdata(false), reader(areader), domBuilder(adoc, &locator, namespaceProcessing)
-{
-}
-
-QDomHandler::~QDomHandler() {}
-
-bool QDomHandler::endDocument()
-{
- return domBuilder.endDocument();
-}
-
-bool QDomHandler::startDTD(const QString &name, const QString &publicId, const QString &systemId)
-{
- return domBuilder.startDTD(name, publicId, systemId);
-}
-
-bool QDomHandler::startElement(const QString &nsURI, const QString &, const QString &qName,
- const QXmlAttributes &atts)
-{
- return domBuilder.startElement(nsURI, qName, atts);
-}
-
-bool QDomHandler::endElement(const QString &, const QString &, const QString &)
-{
- return domBuilder.endElement();
-}
-
-bool QDomHandler::characters(const QString &ch)
-{
- return domBuilder.characters(ch, cdata);
-}
-
-bool QDomHandler::processingInstruction(const QString &target, const QString &data)
-{
- return domBuilder.processingInstruction(target, data);
-}
-
-bool QDomHandler::skippedEntity(const QString &name)
-{
- // we can only handle inserting entity references into content
- if (reader && !reader->d_ptr->skipped_entity_in_content)
- return true;
-
- return domBuilder.skippedEntity(name);
-}
-
-bool QDomHandler::fatalError(const QXmlParseException &exception)
-{
- domBuilder.errorMsg = exception.message();
- domBuilder.errorLine = exception.lineNumber();
- domBuilder.errorColumn = exception.columnNumber();
- return QXmlDefaultHandler::fatalError(exception);
-}
-
-bool QDomHandler::startCDATA()
-{
- cdata = true;
- return true;
-}
-
-bool QDomHandler::endCDATA()
-{
- cdata = false;
- return true;
-}
-
-bool QDomHandler::startEntity(const QString &name)
-{
- return domBuilder.startEntity(name);
-}
-
-bool QDomHandler::endEntity(const QString &)
-{
- return domBuilder.endEntity();
-}
-
-bool QDomHandler::comment(const QString &ch)
-{
- return domBuilder.comment(ch);
-}
-
-bool QDomHandler::unparsedEntityDecl(const QString &name, const QString &publicId,
- const QString &systemId, const QString &notationName)
-{
- return domBuilder.unparsedEntityDecl(name, publicId, systemId, notationName);
-}
-
-bool QDomHandler::externalEntityDecl(const QString &name, const QString &publicId,
- const QString &systemId)
-{
- return unparsedEntityDecl(name, publicId, systemId, QString());
-}
-
-bool QDomHandler::notationDecl(const QString &name, const QString &publicId,
- const QString &systemId)
-{
- return domBuilder.notationDecl(name, publicId, systemId);
-}
-
-void QDomHandler::setDocumentLocator(QXmlLocator *locator)
-{
- this->locator.setLocator(locator);
-}
-
-QDomBuilder::ErrorInfo QDomHandler::errorInfo() const
-{
- return domBuilder.error();
-}
-QT_WARNING_POP
+#include <stack>
-#endif // QT_DEPRECATED_SINCE(5, 15)
+QT_BEGIN_NAMESPACE
/**************************************************************
*
@@ -189,36 +67,6 @@ int QDomDocumentLocator::line() const
return static_cast<int>(reader->lineNumber());
}
-#if QT_DEPRECATED_SINCE(5, 15)
-
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
-
-void QSAXDocumentLocator::setLocator(QXmlLocator *l)
-{
- locator = l;
-}
-
-int QSAXDocumentLocator::column() const
-{
- if (!locator)
- return 0;
-
- return static_cast<int>(locator->columnNumber());
-}
-
-int QSAXDocumentLocator::line() const
-{
- if (!locator)
- return 0;
-
- return static_cast<int>(locator->lineNumber());
-}
-
-QT_WARNING_POP
-
-#endif // QT_DEPRECATED_SINCE(5, 15)
-
/**************************************************************
*
* QDomBuilder
@@ -253,44 +101,6 @@ bool QDomBuilder::startDTD(const QString &name, const QString &publicId, const Q
return true;
}
-#if QT_DEPRECATED_SINCE(5, 15)
-
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
-bool QDomBuilder::startElement(const QString &nsURI, const QString &qName,
- const QXmlAttributes &atts)
-{
- // tag name
- QDomNodePrivate *n;
- if (nsProcessing) {
- n = doc->createElementNS(nsURI, qName);
- } else {
- n = doc->createElement(qName);
- }
-
- if (!n)
- return false;
-
- n->setLocation(locator->line(), locator->column());
-
- node->appendChild(n);
- node = n;
-
- // attributes
- for (int i = 0; i < atts.length(); i++) {
- auto domElement = static_cast<QDomElementPrivate *>(node);
- if (nsProcessing)
- domElement->setAttributeNS(atts.uri(i), atts.qName(i), atts.value(i));
- else
- domElement->setAttribute(atts.qName(i), atts.value(i));
- }
-
- return true;
-}
-QT_WARNING_POP
-
-#endif // QT_DEPRECATED_SINCE(5, 15)
-
bool QDomBuilder::startElement(const QString &nsURI, const QString &qName,
const QXmlStreamAttributes &atts)
{
diff --git a/src/xml/dom/qdomhelpers_p.h b/src/xml/dom/qdomhelpers_p.h
index 4de18f7d4d..f7264daf4b 100644
--- a/src/xml/dom/qdomhelpers_p.h
+++ b/src/xml/dom/qdomhelpers_p.h
@@ -41,7 +41,6 @@
#include <qcoreapplication.h>
#include <qglobal.h>
-#include <qxml.h>
QT_BEGIN_NAMESPACE
@@ -93,29 +92,6 @@ private:
QXmlStreamReader *reader;
};
-#if QT_DEPRECATED_SINCE(5, 15)
-
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
-
-class QSAXDocumentLocator : public QXmlDocumentLocator
-{
-public:
- ~QSAXDocumentLocator() override = default;
-
- int column() const override;
- int line() const override;
-
- void setLocator(QXmlLocator *l);
-
-private:
- QXmlLocator *locator = nullptr;
-};
-
-QT_WARNING_POP
-
-#endif
-
/**************************************************************
*
* QDomBuilder
@@ -129,12 +105,6 @@ public:
~QDomBuilder();
bool endDocument();
-#if QT_DEPRECATED_SINCE(5, 15)
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- bool startElement(const QString &nsURI, const QString &qName, const QXmlAttributes &atts);
-QT_WARNING_POP
-#endif
bool startElement(const QString &nsURI, const QString &qName, const QXmlStreamAttributes &atts);
bool endElement();
bool characters(const QString &characters, bool cdata = false);
@@ -166,68 +136,6 @@ private:
bool nsProcessing;
};
-#if QT_DEPRECATED_SINCE(5, 15)
-
-/**************************************************************
- *
- * QDomHandler
- *
- **************************************************************/
-
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
-
-class QDomHandler : public QXmlDefaultHandler
-{
-public:
- QDomHandler(QDomDocumentPrivate *d, QXmlSimpleReader *reader, bool namespaceProcessing);
- ~QDomHandler() override;
-
- // content handler
- bool endDocument() override;
- bool startElement(const QString &nsURI, const QString &localName, const QString &qName,
- const QXmlAttributes &atts) override;
- bool endElement(const QString &nsURI, const QString &localName, const QString &qName) override;
- bool characters(const QString &ch) override;
- bool processingInstruction(const QString &target, const QString &data) override;
- bool skippedEntity(const QString &name) override;
-
- // error handler
- bool fatalError(const QXmlParseException &exception) override;
-
- // lexical handler
- bool startCDATA() override;
- bool endCDATA() override;
- bool startEntity(const QString &) override;
- bool endEntity(const QString &) override;
- bool startDTD(const QString &name, const QString &publicId, const QString &systemId) override;
- bool comment(const QString &ch) override;
-
- // decl handler
- bool externalEntityDecl(const QString &name, const QString &publicId,
- const QString &systemId) override;
-
- // DTD handler
- bool notationDecl(const QString &name, const QString &publicId,
- const QString &systemId) override;
- bool unparsedEntityDecl(const QString &name, const QString &publicId, const QString &systemId,
- const QString &notationName) override;
-
- void setDocumentLocator(QXmlLocator *locator) override;
-
- QDomBuilder::ErrorInfo errorInfo() const;
-
-private:
- bool cdata;
- QXmlSimpleReader *reader;
- QSAXDocumentLocator locator;
- QDomBuilder domBuilder;
-};
-
-QT_WARNING_POP
-
-#endif // QT_DEPRECATED_SINCE(5, 15)
-
/**************************************************************
*
* QDomParser
diff --git a/src/xml/sax/qxml.cpp b/src/xml/sax/qxml.cpp
deleted file mode 100644
index f1f485b9bb..0000000000
--- a/src/xml/sax/qxml.cpp
+++ /dev/null
@@ -1,7999 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtXml module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qglobal.h"
-
-// Disable warning about use of deprecated QXmlStreamLocator in QScopedPointer<>
-QT_WARNING_DISABLE_MSVC(4996)
-
-#include "qxml.h"
-#include "qxml_p.h"
-#include "qbuffer.h"
-#include "qstringconverter.h"
-#if QT_CONFIG(regularexpression)
-#include "qregularexpression.h"
-#endif
-#include "qmap.h"
-#include "qhash.h"
-#include "qstack.h"
-#include <qdebug.h>
-
-#if QT_DEPRECATED_SINCE(5, 15)
-
-#ifdef Q_CC_BOR // borland 6 finds bogus warnings when building this file in uic3
-# pragma warn -8080
-#endif
-
-//#define QT_QXML_DEBUG
-
-// Error strings for the XML reader
-#define XMLERR_OK QT_TRANSLATE_NOOP("QXml", "no error occurred")
-#define XMLERR_ERRORBYCONSUMER QT_TRANSLATE_NOOP("QXml", "error triggered by consumer")
-#define XMLERR_UNEXPECTEDEOF QT_TRANSLATE_NOOP("QXml", "unexpected end of file")
-#define XMLERR_MORETHANONEDOCTYPE QT_TRANSLATE_NOOP("QXml", "more than one document type definition")
-#define XMLERR_ERRORPARSINGELEMENT QT_TRANSLATE_NOOP("QXml", "error occurred while parsing element")
-#define XMLERR_TAGMISMATCH QT_TRANSLATE_NOOP("QXml", "tag mismatch")
-#define XMLERR_ERRORPARSINGCONTENT QT_TRANSLATE_NOOP("QXml", "error occurred while parsing content")
-#define XMLERR_UNEXPECTEDCHARACTER QT_TRANSLATE_NOOP("QXml", "unexpected character")
-#define XMLERR_INVALIDNAMEFORPI QT_TRANSLATE_NOOP("QXml", "invalid name for processing instruction")
-#define XMLERR_VERSIONEXPECTED QT_TRANSLATE_NOOP("QXml", "version expected while reading the XML declaration")
-#define XMLERR_WRONGVALUEFORSDECL QT_TRANSLATE_NOOP("QXml", "wrong value for standalone declaration")
-#define XMLERR_EDECLORSDDECLEXPECTED QT_TRANSLATE_NOOP("QXml", "encoding declaration or standalone declaration expected while reading the XML declaration")
-#define XMLERR_SDDECLEXPECTED QT_TRANSLATE_NOOP("QXml", "standalone declaration expected while reading the XML declaration")
-#define XMLERR_ERRORPARSINGDOCTYPE QT_TRANSLATE_NOOP("QXml", "error occurred while parsing document type definition")
-#define XMLERR_LETTEREXPECTED QT_TRANSLATE_NOOP("QXml", "letter is expected")
-#define XMLERR_ERRORPARSINGCOMMENT QT_TRANSLATE_NOOP("QXml", "error occurred while parsing comment")
-#define XMLERR_ERRORPARSINGREFERENCE QT_TRANSLATE_NOOP("QXml", "error occurred while parsing reference")
-#define XMLERR_INTERNALGENERALENTITYINDTD QT_TRANSLATE_NOOP("QXml", "internal general entity reference not allowed in DTD")
-#define XMLERR_EXTERNALGENERALENTITYINAV QT_TRANSLATE_NOOP("QXml", "external parsed general entity reference not allowed in attribute value")
-#define XMLERR_EXTERNALGENERALENTITYINDTD QT_TRANSLATE_NOOP("QXml", "external parsed general entity reference not allowed in DTD")
-#define XMLERR_UNPARSEDENTITYREFERENCE QT_TRANSLATE_NOOP("QXml", "unparsed entity reference in wrong context")
-#define XMLERR_RECURSIVEENTITIES QT_TRANSLATE_NOOP("QXml", "recursive entities")
-#define XMLERR_ERRORINTEXTDECL QT_TRANSLATE_NOOP("QXml", "error in the text declaration of an external entity")
-
-QT_BEGIN_NAMESPACE
-
-namespace {
-
-// work around missing std::stack::clear()
-template <typename Container>
-void clear(Container &c) { c = Container(); }
-
-}
-
-// the constants for the lookup table
-static const signed char cltWS = 0; // white space
-static const signed char cltPer = 1; // %
-static const signed char cltAmp = 2; // &
-static const signed char cltGt = 3; // >
-static const signed char cltLt = 4; // <
-static const signed char cltSlash = 5; // /
-static const signed char cltQm = 6; // ?
-static const signed char cltEm = 7; // !
-static const signed char cltDash = 8; // -
-static const signed char cltCB = 9; // ]
-static const signed char cltOB = 10; // [
-static const signed char cltEq = 11; // =
-static const signed char cltDq = 12; // "
-static const signed char cltSq = 13; // '
-static const signed char cltUnknown = 14;
-
-// character lookup table
-static const signed char charLookupTable[256]={
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x00 - 0x07
- cltUnknown, // 0x08
- cltWS, // 0x09 \t
- cltWS, // 0x0A \n
- cltUnknown, // 0x0B
- cltUnknown, // 0x0C
- cltWS, // 0x0D \r
- cltUnknown, // 0x0E
- cltUnknown, // 0x0F
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x17 - 0x16
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x18 - 0x1F
- cltWS, // 0x20 Space
- cltEm, // 0x21 !
- cltDq, // 0x22 "
- cltUnknown, // 0x23
- cltUnknown, // 0x24
- cltPer, // 0x25 %
- cltAmp, // 0x26 &
- cltSq, // 0x27 '
- cltUnknown, // 0x28
- cltUnknown, // 0x29
- cltUnknown, // 0x2A
- cltUnknown, // 0x2B
- cltUnknown, // 0x2C
- cltDash, // 0x2D -
- cltUnknown, // 0x2E
- cltSlash, // 0x2F /
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x30 - 0x37
- cltUnknown, // 0x38
- cltUnknown, // 0x39
- cltUnknown, // 0x3A
- cltUnknown, // 0x3B
- cltLt, // 0x3C <
- cltEq, // 0x3D =
- cltGt, // 0x3E >
- cltQm, // 0x3F ?
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x40 - 0x47
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x48 - 0x4F
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x50 - 0x57
- cltUnknown, // 0x58
- cltUnknown, // 0x59
- cltUnknown, // 0x5A
- cltOB, // 0x5B [
- cltUnknown, // 0x5C
- cltCB, // 0x5D]
- cltUnknown, // 0x5E
- cltUnknown, // 0x5F
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x60 - 0x67
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x68 - 0x6F
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x70 - 0x77
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x78 - 0x7F
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x80 - 0x87
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x88 - 0x8F
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x90 - 0x97
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x98 - 0x9F
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xA0 - 0xA7
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xA8 - 0xAF
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xB0 - 0xB7
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xB8 - 0xBF
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xC0 - 0xC7
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xC8 - 0xCF
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xD0 - 0xD7
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xD8 - 0xDF
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xE0 - 0xE7
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xE8 - 0xEF
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xF0 - 0xF7
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown // 0xF8 - 0xFF
-};
-
-//
-// local helper functions
-//
-
-/*
- This function strips the TextDecl [77] ("<?xml ...?>") from the string \a
- str. The stripped version is stored in \a str. If this function finds an
- invalid TextDecl, it returns \c false, otherwise true.
-
- This function is used for external entities since those can include an
- TextDecl that must be stripped before inserting the entity.
-*/
-static bool stripTextDecl(QString& str)
-{
- QLatin1String textDeclStart("<?xml");
- if (str.startsWith(textDeclStart)) {
-#if QT_CONFIG(regularexpression)
- QRegularExpression textDecl(QString::fromLatin1(
- "^<\\?xml\\s+"
- "(version\\s*=\\s*((['\"])[-a-zA-Z0-9_.:]+\\3))?"
- "\\s*"
- "(encoding\\s*=\\s*((['\"])[A-Za-z][-a-zA-Z0-9_.]*\\6))?"
- "\\s*\\?>"
- ));
- QString strTmp = str.replace(textDecl, QLatin1String(""));
- if (strTmp.length() != str.length())
- return false; // external entity has wrong TextDecl
- str = strTmp;
-#else
- return false;
-#endif
- }
- return true;
-}
-
-
-class QXmlAttributesPrivate
-{
-};
-
-/* \class QXmlInputSourcePrivate
- \internal
-
- There's a slight misdesign in this class that can
- be worth to keep in mind: the `str' member is
- a buffer which QXmlInputSource::next() returns from,
- and which is populated from the input device or input
- stream. However, when the input is a QString(the user called
- QXmlInputSource::setData()), `str' has two roles: it's the
- buffer, but also the source. This /seems/ to be no problem
- because in the case of having no device or stream, the QString
- is read in one go.
- */
-class QXmlInputSourcePrivate
-{
-public:
- QIODevice *inputDevice;
- QTextStream *inputStream;
-
- QString str;
- const QChar *unicode;
- int pos;
- int length;
- bool nextReturnedEndOfData;
- QStringDecoder toUnicode;
-
- QByteArray encodingDeclBytes;
- QString encodingDeclChars;
- bool lookingForEncodingDecl;
-};
-class QXmlParseExceptionPrivate
-{
-public:
- QXmlParseExceptionPrivate()
- : column(-1), line(-1)
- {
- }
- QXmlParseExceptionPrivate(const QXmlParseExceptionPrivate &other)
- : msg(other.msg), column(other.column), line(other.line),
- pub(other.pub), sys(other.sys)
- {
- }
-
- QString msg;
- int column;
- int line;
- QString pub;
- QString sys;
-
-};
-
-class QXmlLocatorPrivate
-{
-};
-
-class QXmlDefaultHandlerPrivate
-{
-};
-
-/*!
- \class QXmlParseException
- \obsolete
- \reentrant
- \brief The QXmlParseException class is used to report errors with
- the QXmlErrorHandler interface.
-
- \inmodule QtXml
- \ingroup xml-tools
-
- The XML subsystem constructs an instance of this class when it
- detects an error. You can retrieve the place where the error
- occurred using systemId(), publicId(), lineNumber() and
- columnNumber(), along with the error message(). The possible error
- messages are:
-
-
- \list
- \li "no error occurred"
- \li "error triggered by consumer"
- \li "unexpected end of file"
- \li "more than one document type definition"
- \li "error occurred while parsing element"
- \li "tag mismatch"
- \li "error occurred while parsing content"
- \li "unexpected character"
- \li "invalid name for processing instruction"
- \li "version expected while reading the XML declaration"
- \li "wrong value for standalone declaration"
- \li "encoding declaration or standalone declaration expected while reading the XML declaration"
- \li "standalone declaration expected while reading the XML declaration"
- \li "error occurred while parsing document type definition"
- \li "letter is expected"
- \li "error occurred while parsing comment"
- \li "error occurred while parsing reference"
- \li "internal general entity reference not allowed in DTD"
- \li "external parsed general entity reference not allowed in attribute value"
- \li "external parsed general entity reference not allowed in DTD"
- \li "unparsed entity reference n wrong context"
- \li "recursive entities"
- \li "error in the text declaration of an external entity"
- \endlist
-
- Note that, if you want to display these error messages to your
- application's users, they will be displayed in English unless
- they are explicitly translated.
-
- \sa QXmlErrorHandler, QXmlReader
-*/
-
-/*!
- Constructs a parse exception with the error string \a name for
- column \a c and line \a l for the public identifier \a p and the
- system identifier \a s.
-*/
-
-QXmlParseException::QXmlParseException(const QString& name, int c, int l,
- const QString& p, const QString& s)
- : d(new QXmlParseExceptionPrivate)
-{
- d->msg = name;
- d->column = c;
- d->line = l;
- d->pub = p;
- d->sys = s;
-}
-
-/*!
- Creates a copy of \a other.
-*/
-QXmlParseException::QXmlParseException(const QXmlParseException& other) :
- d(new QXmlParseExceptionPrivate(*other.d))
-{
-
-}
-
-/*!
- Destroys the QXmlParseException.
-*/
-QXmlParseException::~QXmlParseException()
-{
-}
-
-/*!
- Returns the error message.
-*/
-QString QXmlParseException::message() const
-{
- return d->msg;
-}
-/*!
- Returns the column number where the error occurred.
-*/
-int QXmlParseException::columnNumber() const
-{
- return d->column;
-}
-/*!
- Returns the line number where the error occurred.
-*/
-int QXmlParseException::lineNumber() const
-{
- return d->line;
-}
-/*!
- Returns the public identifier where the error occurred.
-*/
-QString QXmlParseException::publicId() const
-{
- return d->pub;
-}
-/*!
- Returns the system identifier where the error occurred.
-*/
-QString QXmlParseException::systemId() const
-{
- return d->sys;
-}
-
-
-/*!
- \class QXmlLocator
- \obsolete
- \reentrant
- \brief The QXmlLocator class provides the XML handler classes with
- information about the parsing position within a file.
-
- \inmodule QtXml
- \ingroup xml-tools
-
- The reader reports a QXmlLocator to the content handler before it
- starts to parse the document. This is done with the
- QXmlContentHandler::setDocumentLocator() function. The handler
- classes can now use this locator to get the position (lineNumber()
- and columnNumber()) that the reader has reached.
-*/
-
-/*!
- Constructor.
-*/
-QXmlLocator::QXmlLocator()
-{
-}
-
-/*!
- Destructor.
-*/
-QXmlLocator::~QXmlLocator()
-{
-}
-
-/*!
- \fn int QXmlLocator::columnNumber() const
-
- Returns the column number (starting at 1) or -1 if there is no
- column number available.
-*/
-
-/*!
- \fn int QXmlLocator::lineNumber() const
-
- Returns the line number (starting at 1) or -1 if there is no line
- number available.
-*/
-
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
-
-class QXmlSimpleReaderLocator : public QXmlLocator
-{
-public:
- QXmlSimpleReaderLocator(QXmlSimpleReader* parent)
- {
- reader = parent;
- }
- ~QXmlSimpleReaderLocator()
- {
- }
-
- int columnNumber() const override
- {
- return (reader->d_ptr->columnNr == -1 ? -1 : reader->d_ptr->columnNr + 1);
- }
- int lineNumber() const override
- {
- return (reader->d_ptr->lineNr == -1 ? -1 : reader->d_ptr->lineNr + 1);
- }
-// QString getPublicId()
-// QString getSystemId()
-
-private:
- QXmlSimpleReader *reader;
-};
-
-/*********************************************
- *
- * QXmlNamespaceSupport
- *
- *********************************************/
-
-typedef QMap<QString, QString> NamespaceMap;
-
-class QXmlNamespaceSupportPrivate
-{
-public:
- QXmlNamespaceSupportPrivate()
- {
- ns.insert(QLatin1String("xml"), QLatin1String("http://www.w3.org/XML/1998/namespace")); // the XML namespace
- }
-
- ~QXmlNamespaceSupportPrivate()
- {
- }
-
- QStack<NamespaceMap> nsStack;
- NamespaceMap ns;
-};
-
-/*!
- \class QXmlNamespaceSupport
- \obsolete
- \since 4.4
- \reentrant
- \brief The QXmlNamespaceSupport class is a helper class for XML
- readers which want to include namespace support.
-
- \inmodule QtXml
- \ingroup xml-tools
-
- You can set the prefix for the current namespace with setPrefix(),
- and get the list of current prefixes (or those for a given URI)
- with prefixes(). The namespace URI is available from uri(). Use
- pushContext() to start a new namespace context, and popContext()
- to return to the previous namespace context. Use splitName() or
- processName() to split a name into its prefix and local name.
-*/
-
-/*!
- Constructs a QXmlNamespaceSupport.
-*/
-QXmlNamespaceSupport::QXmlNamespaceSupport()
-{
- d = new QXmlNamespaceSupportPrivate;
-}
-
-/*!
- Destroys a QXmlNamespaceSupport.
-*/
-QXmlNamespaceSupport::~QXmlNamespaceSupport()
-{
- delete d;
-}
-
-/*!
- This function declares a prefix \a pre in the current namespace
- context to be the namespace URI \a uri. The prefix remains in
- force until this context is popped, unless it is shadowed in a
- descendant context.
-
- Note that there is an asymmetry in this library. prefix() does not
- return the default "" prefix, even if you have declared one; to
- check for a default prefix, you must look it up explicitly using
- uri(). This asymmetry exists to make it easier to look up prefixes
- for attribute names, where the default prefix is not allowed.
-*/
-void QXmlNamespaceSupport::setPrefix(const QString& pre, const QString& uri)
-{
- if(pre.isNull()) {
- d->ns.insert(QLatin1String(""), uri);
- } else {
- d->ns.insert(pre, uri);
- }
-}
-
-/*!
- Returns one of the prefixes mapped to the namespace URI \a uri.
-
- If more than one prefix is currently mapped to the same URI, this
- function makes an arbitrary selection; if you want all of the
- prefixes, use prefixes() instead.
-
- Note: to check for a default prefix, use the uri() function with
- an argument of "".
-*/
-QString QXmlNamespaceSupport::prefix(const QString& uri) const
-{
- NamespaceMap::const_iterator itc, it = d->ns.constBegin();
- while ((itc=it) != d->ns.constEnd()) {
- ++it;
- if (*itc == uri && !itc.key().isEmpty())
- return itc.key();
- }
- return QLatin1String("");
-}
-
-/*!
- Looks up the prefix \a prefix in the current context and returns
- the currently-mapped namespace URI. Use the empty string ("") for
- the default namespace.
-*/
-QString QXmlNamespaceSupport::uri(const QString& prefix) const
-{
- return d->ns[prefix];
-}
-
-/*!
- Splits the name \a qname at the ':' and returns the prefix in \a
- prefix and the local name in \a localname.
-
- \sa processName()
-*/
-void QXmlNamespaceSupport::splitName(const QString& qname, QString& prefix,
- QString& localname) const
-{
- int pos = qname.indexOf(QLatin1Char(':'));
- if (pos == -1)
- pos = qname.size();
-
- prefix = qname.left(pos);
- localname = qname.mid(pos+1);
-}
-
-/*!
- Processes a raw XML 1.0 name in the current context by removing
- the prefix and looking it up among the prefixes currently
- declared.
-
- \a qname is the raw XML 1.0 name to be processed. \a isAttribute
- is true if the name is an attribute name.
-
- This function stores the namespace URI in \a nsuri (which will be
- set to an empty string if the raw name has an undeclared prefix),
- and stores the local name (without prefix) in \a localname (which
- will be set to an empty string if no namespace is in use).
-
- Note that attribute names are processed differently than element
- names: an unprefixed element name gets the default namespace (if
- any), while an unprefixed attribute name does not.
-*/
-void QXmlNamespaceSupport::processName(const QString& qname,
- bool isAttribute,
- QString& nsuri, QString& localname) const
-{
- int len = qname.size();
- const QChar *data = qname.constData();
- for (int pos = 0; pos < len; ++pos) {
- if (data[pos] == QLatin1Char(':')) {
- nsuri = uri(qname.left(pos));
- localname = qname.mid(pos + 1);
- return;
- }
- }
-
- // there was no ':'
- nsuri.clear();
- // attributes don't take default namespace
- if (!isAttribute && !d->ns.isEmpty()) {
- /*
- We want to access d->ns.value(""), but as an optimization
- we use the fact that "" compares less than any other
- string, so it's either first in the map or not there.
- */
- NamespaceMap::const_iterator first = d->ns.constBegin();
- if (first.key().isEmpty())
- nsuri = first.value(); // get default namespace
- }
- localname = qname;
-}
-
-/*!
- Returns a list of all the prefixes currently declared.
-
- If there is a default prefix, this function does not return it in
- the list; check for the default prefix using uri() with an
- argument of "".
-*/
-QStringList QXmlNamespaceSupport::prefixes() const
-{
- QStringList list;
-
- NamespaceMap::const_iterator itc, it = d->ns.constBegin();
- while ((itc=it) != d->ns.constEnd()) {
- ++it;
- if (!itc.key().isEmpty())
- list.append(itc.key());
- }
- return list;
-}
-
-/*!
- \overload
-
- Returns a list of all prefixes currently declared for the
- namespace URI \a uri.
-
- The "xml:" prefix is included. If you only want one prefix that is
- mapped to the namespace URI, and you don't care which one you get,
- use the prefix() function instead.
-
- Note: The empty (default) prefix is never included in this list;
- to check for the presence of a default namespace, call uri() with
- "" as the argument.
-*/
-QStringList QXmlNamespaceSupport::prefixes(const QString& uri) const
-{
- QStringList list;
-
- NamespaceMap::const_iterator itc, it = d->ns.constBegin();
- while ((itc=it) != d->ns.constEnd()) {
- ++it;
- if (*itc == uri && !itc.key().isEmpty())
- list.append(itc.key());
- }
- return list;
-}
-
-/*!
- Starts a new namespace context.
-
- Normally, you should push a new context at the beginning of each
- XML element: the new context automatically inherits the
- declarations of its parent context, and it also keeps track of
- which declarations were made within this context.
-
- \sa popContext()
-*/
-void QXmlNamespaceSupport::pushContext()
-{
- d->nsStack.push(d->ns);
-}
-
-/*!
- Reverts to the previous namespace context.
-
- Normally, you should pop the context at the end of each XML
- element. After popping the context, all namespace prefix mappings
- that were previously in force are restored.
-
- \sa pushContext()
-*/
-void QXmlNamespaceSupport::popContext()
-{
- d->ns.clear();
- if(!d->nsStack.isEmpty())
- d->ns = d->nsStack.pop();
-}
-
-/*!
- Resets this namespace support object ready for reuse.
-*/
-void QXmlNamespaceSupport::reset()
-{
- QXmlNamespaceSupportPrivate *newD = new QXmlNamespaceSupportPrivate;
- delete d;
- d = newD;
-}
-
-
-
-/*********************************************
- *
- * QXmlAttributes
- *
- *********************************************/
-
-/*!
- \class QXmlAttributes
- \obsolete
- \reentrant
- \brief The QXmlAttributes class provides XML attributes.
-
- \inmodule QtXml
- \ingroup xml-tools
-
- If attributes are reported by QXmlContentHandler::startElement()
- this class is used to pass the attribute values.
-
- Use index() to locate the position of an attribute in the list,
- count() to retrieve the number of attributes, and clear() to
- remove the attributes. New attributes can be added with append().
- Use type() to get an attribute's type and value() to get its
- value. The attribute's name is available from localName() or
- qName(), and its namespace URI from uri().
-
-*/
-
-/*!
- \fn QXmlAttributes::QXmlAttributes()
-
- Constructs an empty attribute list.
-*/
-QXmlAttributes::QXmlAttributes()
-{
- // ### In Qt 5.0, this function was inlined and d was not initialized
- // The member cannot be used until Qt 6.0
- Q_UNUSED(d);
-}
-
-/*!
- \fn QXmlAttributes::~QXmlAttributes()
-
- Destroys the attributes object.
-*/
-QXmlAttributes::~QXmlAttributes()
-{
-}
-
-/*!
- \fn void QXmlAttributes::swap(QXmlAttributes &other)
-
- Swaps \c this with \a other.
- */
-
-/*!
- Looks up the index of an attribute by the qualified name \a qName.
-
- Returns the index of the attribute or -1 if it wasn't found.
-*/
-int QXmlAttributes::index(const QString& qName) const
-{
- for (int i = 0; i < attList.size(); ++i) {
- if (attList.at(i).qname == qName)
- return i;
- }
- return -1;
-}
-
-/*! \overload
- */
-int QXmlAttributes::index(QLatin1String qName) const
-{
- for (int i = 0; i < attList.size(); ++i) {
- if (attList.at(i).qname == qName)
- return i;
- }
- return -1;
-}
-
-/*!
- \overload
-
- Looks up the index of an attribute by a namespace name.
-
- \a uri specifies the namespace URI, or an empty string if the name
- has no namespace URI. \a localPart specifies the attribute's local
- name.
-
- Returns the index of the attribute, or -1 if it wasn't found.
-*/
-int QXmlAttributes::index(const QString& uri, const QString& localPart) const
-{
- for (int i = 0; i < attList.size(); ++i) {
- const Attribute &att = attList.at(i);
- if (att.uri == uri && att.localname == localPart)
- return i;
- }
- return -1;
-}
-
-/*!
- Returns the number of attributes in the list.
-
- \sa count()
-*/
-int QXmlAttributes::length() const
-{
- return attList.count();
-}
-
-/*!
- \fn int QXmlAttributes::count() const
-
- Returns the number of attributes in the list. This function is
- equivalent to length().
-*/
-
-/*!
- Looks up an attribute's local name for the attribute at position
- \a index. If no namespace processing is done, the local name is
- an empty string.
-*/
-QString QXmlAttributes::localName(int index) const
-{
- return attList.at(index).localname;
-}
-
-/*!
- Looks up an attribute's XML 1.0 qualified name for the attribute
- at position \a index.
-*/
-QString QXmlAttributes::qName(int index) const
-{
- return attList.at(index).qname;
-}
-
-/*!
- Looks up an attribute's namespace URI for the attribute at
- position \a index. If no namespace processing is done or if the
- attribute has no namespace, the namespace URI is an empty string.
-*/
-QString QXmlAttributes::uri(int index) const
-{
- return attList.at(index).uri;
-}
-
-/*!
- Looks up an attribute's type for the attribute at position \a
- index.
-
- Currently only "CDATA" is returned.
-*/
-QString QXmlAttributes::type(int) const
-{
- return QLatin1String("CDATA");
-}
-
-/*!
- \overload
-
- Looks up an attribute's type for the qualified name \a qName.
-
- Currently only "CDATA" is returned.
-*/
-QString QXmlAttributes::type(const QString&) const
-{
- return QLatin1String("CDATA");
-}
-
-/*!
- \overload
-
- Looks up an attribute's type by namespace name.
-
- \a uri specifies the namespace URI and \a localName specifies the
- local name. If the name has no namespace URI, use an empty string
- for \a uri.
-
- Currently only "CDATA" is returned.
-*/
-QString QXmlAttributes::type(const QString&, const QString&) const
-{
- return QLatin1String("CDATA");
-}
-
-/*!
- Returns an attribute's value for the attribute at position \a
- index. The index must be a valid position
- (i.e., 0 <= \a index < count()).
-*/
-QString QXmlAttributes::value(int index) const
-{
- return attList.at(index).value;
-}
-
-/*!
- \overload
-
- Returns an attribute's value for the qualified name \a qName, or an
- empty string if no attribute exists for the name given.
-*/
-QString QXmlAttributes::value(const QString& qName) const
-{
- int i = index(qName);
- if (i == -1)
- return QString();
- return attList.at(i).value;
-}
-
-/*!
- \overload
-
- Returns an attribute's value for the qualified name \a qName, or an
- empty string if no attribute exists for the name given.
-*/
-QString QXmlAttributes::value(QLatin1String qName) const
-{
- int i = index(qName);
- if (i == -1)
- return QString();
- return attList.at(i).value;
-}
-
-/*!
- \overload
-
- Returns an attribute's value by namespace name.
-
- \a uri specifies the namespace URI, or an empty string if the name
- has no namespace URI. \a localName specifies the attribute's local
- name.
-*/
-QString QXmlAttributes::value(const QString& uri, const QString& localName) const
-{
- int i = index(uri, localName);
- if (i == -1)
- return QString();
- return attList.at(i).value;
-}
-
-/*!
- Clears the list of attributes.
-
- \sa append()
-*/
-void QXmlAttributes::clear()
-{
- attList.clear();
-}
-
-/*!
- Appends a new attribute entry to the list of attributes. The
- qualified name of the attribute is \a qName, the namespace URI is
- \a uri and the local name is \a localPart. The value of the
- attribute is \a value.
-
- \sa qName(), uri(), localName(), value()
-*/
-void QXmlAttributes::append(const QString &qName, const QString &uri, const QString &localPart, const QString &value)
-{
- Attribute att;
- att.qname = qName;
- att.uri = uri;
- att.localname = localPart;
- att.value = value;
-
- attList.append(att);
-}
-
-
-/*********************************************
- *
- * QXmlInputSource
- *
- *********************************************/
-
-/*!
- \class QXmlInputSource
- \obsolete
- \reentrant
- \brief The QXmlInputSource class provides the input data for the
- QXmlReader subclasses.
-
- \inmodule QtXml
- \ingroup xml-tools
-
- All subclasses of QXmlReader read the input XML document from this
- class.
-
- This class recognizes the encoding of the data by reading the
- encoding declaration in the XML file if it finds one, and reading
- the data using the corresponding encoding. If it does not find an
- encoding declaration, then it assumes that the data is either in
- UTF-8 or UTF-16, depending on whether it can find a byte-order
- mark.
-
- There are two ways to populate the input source with data: you can
- construct it with a QIODevice* so that the input source reads the
- data from that device. Or you can set the data explicitly with one
- of the setData() functions.
-
- Usually you either construct a QXmlInputSource that works on a
- QIODevice* or you construct an empty QXmlInputSource and set the
- data with setData(). There are only rare occasions where you would
- want to mix both methods.
-
- The QXmlReader subclasses use the next() function to read the
- input character by character. If you want to start from the
- beginning again, use reset().
-
- The functions data() and fetchData() are useful if you want to do
- something with the data other than parsing, e.g. displaying the
- raw XML file. The benefit of using the QXmlInputClass in such
- cases is that it tries to use the correct encoding.
-
- \sa QXmlReader, QXmlSimpleReader
-*/
-
-// the following two are guaranteed not to be a character
-const char16_t QXmlInputSource::EndOfData = 0xfffe;
-const char16_t QXmlInputSource::EndOfDocument = 0xffff;
-
-/*
- Common part of the constructors.
-*/
-void QXmlInputSource::init()
-{
- d = new QXmlInputSourcePrivate;
-
- QT_TRY {
- d->inputDevice = nullptr;
- d->inputStream = nullptr;
-
- setData(QString());
- d->nextReturnedEndOfData = true; // first call to next() will call fetchData()
-
- d->encodingDeclBytes.clear();
- d->encodingDeclChars.clear();
- d->lookingForEncodingDecl = true;
- } QT_CATCH(...) {
- delete(d);
- QT_RETHROW;
- }
-}
-
-/*!
- Constructs an input source which contains no data.
-
- \sa setData()
-*/
-QXmlInputSource::QXmlInputSource()
-{
- init();
-}
-
-/*!
- Constructs an input source and gets the data from device \a dev.
- If \a dev is not open, it is opened in read-only mode. If \a dev
- is 0 or it is not possible to read from the device, the input
- source will contain no data.
-
- \sa setData(), fetchData(), QIODevice
-*/
-QXmlInputSource::QXmlInputSource(QIODevice *dev)
-{
- init();
- d->inputDevice = dev;
- if (dev->isOpen())
- d->inputDevice->setTextModeEnabled(false);
-}
-
-/*!
- Destructor.
-*/
-QXmlInputSource::~QXmlInputSource()
-{
- // ### close the input device.
- delete d;
-}
-
-/*!
-Returns the next character of the input source. If this function
-reaches the end of available data, it returns
-QXmlInputSource::EndOfData. If you call next() after that, it
-tries to fetch more data by calling fetchData(). If the
-fetchData() call results in new data, this function returns the
-first character of that data; otherwise it returns
-QXmlInputSource::EndOfDocument.
-
-Readers, such as QXmlSimpleReader, will assume that the end of
-the XML document has been reached if the this function returns
-QXmlInputSource::EndOfDocument, and will check that the
-supplied input is well-formed. Therefore, when reimplementing
-this function, it is important to ensure that this behavior is
-duplicated.
-
-\sa reset(), fetchData(), QXmlSimpleReader::parse(),
- QXmlSimpleReader::parseContinue()
-*/
-QChar QXmlInputSource::next()
-{
- if (d->pos >= d->length) {
- if (d->nextReturnedEndOfData) {
- d->nextReturnedEndOfData = false;
- fetchData();
- if (d->pos >= d->length) {
- return EndOfDocument;
- }
- return next();
- }
- d->nextReturnedEndOfData = true;
- return EndOfData;
- }
-
- // QXmlInputSource has no way to signal encoding errors. The best we can do
- // is return EndOfDocument. We do *not* return EndOfData, because the reader
- // will then just call this function again to get the next char.
- QChar c = d->unicode[d->pos++];
- if (c == EndOfData)
- c = EndOfDocument;
- return c;
-}
-
-/*!
- This function sets the position used by next() to the beginning of
- the data returned by data(). This is useful if you want to use the
- input source for more than one parse.
-
- \note In the case that the underlying data source is a QIODevice,
- the current position in the device is not automatically set to the
- start of input. Call QIODevice::seek(0) on the device to do this.
-
- \sa next()
-*/
-void QXmlInputSource::reset()
-{
- d->nextReturnedEndOfData = false;
- d->pos = 0;
-}
-
-/*!
- Returns the data the input source contains or an empty string if the
- input source does not contain any data.
-
- \sa setData(), QXmlInputSource(), fetchData()
-*/
-QString QXmlInputSource::data() const
-{
- if (d->nextReturnedEndOfData) {
- QXmlInputSource *that = const_cast<QXmlInputSource*>(this);
- that->d->nextReturnedEndOfData = false;
- that->fetchData();
- }
- return d->str;
-}
-
-/*!
- Sets the data of the input source to \a dat.
-
- If the input source already contains data, this function deletes
- that data first.
-
- \sa data()
-*/
-void QXmlInputSource::setData(const QString& dat)
-{
- d->str = dat;
- d->unicode = dat.unicode();
- d->pos = 0;
- d->length = d->str.length();
- d->nextReturnedEndOfData = false;
-}
-
-/*!
- \overload
-
- The data \a dat is passed through the correct text-codec, before
- it is set.
-*/
-void QXmlInputSource::setData(const QByteArray& dat)
-{
- setData(fromRawData(dat));
-}
-
-/*!
- This function reads more data from the device that was set during
- construction. If the input source already contained data, this
- function deletes that data first.
-
- This object contains no data after a call to this function if the
- object was constructed without a device to read data from or if
- this function was not able to get more data from the device.
-
- There are two occasions where a fetch is done implicitly by
- another function call: during construction (so that the object
- starts out with some initial data where available), and during a
- call to next() (if the data had run out).
-
- You don't normally need to use this function if you use next().
-
- \sa data(), next(), QXmlInputSource()
-*/
-
-void QXmlInputSource::fetchData()
-{
- enum
- {
- BufferSize = 1024
- };
-
- QByteArray rawData;
-
- if (d->inputDevice || d->inputStream) {
- QIODevice *device = d->inputDevice ? d->inputDevice : d->inputStream->device();
-
- if (!device) {
- if (d->inputStream && d->inputStream->string()) {
- QString *s = d->inputStream->string();
- rawData = QByteArray(reinterpret_cast<const char *>(s->constData()),
- int(s->size() * sizeof(QChar)));
- }
- } else if (device->isOpen() || device->open(QIODevice::ReadOnly)) {
- rawData.resize(BufferSize);
- qint64 size = device->read(rawData.data(), BufferSize);
- if (size == 0 && device->waitForReadyRead(-1))
- size = device->read(rawData.data(), BufferSize);
-
- rawData.resize(qMax(qint64(0), size));
- }
-
- /* We do this inside the "if (d->inputDevice ..." scope
- * because if we're not using a stream or device, that is,
- * the user set a QString manually, we don't want to set
- * d->str. */
- setData(fromRawData(rawData));
- }
-}
-
-static QString extractEncodingDecl(const QString &text, bool *needMoreText)
-{
- *needMoreText = false;
-
- int l = text.length();
- const QLatin1String snip("<?xml", std::min(l, 5));
- if (l > 0 && !text.startsWith(snip))
- return QString();
-
- int endPos = text.indexOf(QLatin1Char('>'));
- if (endPos == -1) {
- *needMoreText = l < 255; // we won't look forever
- return QString();
- }
-
- int pos = text.indexOf(QLatin1String("encoding"));
- if (pos == -1 || pos >= endPos)
- return QString();
-
- while (pos < endPos) {
- QChar uc = text.at(pos);
- if (uc == u'\'' || uc == u'"')
- break;
- ++pos;
- }
-
- if (pos == endPos)
- return QString();
-
- QString encoding;
- ++pos;
- while (pos < endPos) {
- QChar uc = text.at(pos);
- if (uc == u'\'' || uc == u'"')
- break;
- encoding.append(uc);
- ++pos;
- }
-
- return encoding;
-}
-
-/*!
- This function reads the XML file from \a data and tries to
- recognize the encoding. It converts the raw data \a data into a
- QString and returns it. It tries its best to get the correct
- encoding for the XML file.
-
- If \a beginning is true, this function assumes that the data
- starts at the beginning of a new XML document and looks for an
- encoding declaration. If \a beginning is false, it converts the
- raw data using the encoding determined from prior calls.
-*/
-QString QXmlInputSource::fromRawData(const QByteArray &data, bool beginning)
-{
- if (data.size() == 0)
- return QString();
-
- if (beginning)
- d->toUnicode = QStringDecoder();
-
- // This is the initial UTF codec we will read the encoding declaration with
- if (!d->toUnicode.isValid()) {
- d->encodingDeclBytes.clear();
- d->encodingDeclChars.clear();
- d->lookingForEncodingDecl = true;
-
- auto encoding = QStringConverter::encodingForData(data.constData(), data.size(), char16_t('<'));
- if (encoding) {
- d->lookingForEncodingDecl = false;
- d->toUnicode = QStringDecoder(*encoding);
- } else {
- d->toUnicode = QStringDecoder(QStringDecoder::Utf8);
- }
- }
-
- QString input = d->toUnicode(data.constData(), data.size());
-
- if (d->lookingForEncodingDecl) {
- d->encodingDeclChars += input;
-
- bool needMoreText;
- QByteArray encoding = extractEncodingDecl(d->encodingDeclChars, &needMoreText).toLatin1();
-
- if (!encoding.isEmpty()) {
- auto e = QStringDecoder::encodingForData(encoding.constData(), encoding.size());
- if (e && *e != QStringDecoder::Utf8) {
- d->toUnicode = QStringDecoder(*e);
-
- /* The variable input can potentially be large, so we deallocate
- * it before calling toUnicode() in order to avoid having two
- * large QStrings in memory simultaneously. */
- input.clear();
-
- // prime the decoder with the data so far
- d->toUnicode(d->encodingDeclBytes.constData(), d->encodingDeclBytes.size());
- // now feed it the new data
- input = d->toUnicode(data.constData(), data.size());
- }
- }
-
- d->encodingDeclBytes += data;
- d->lookingForEncodingDecl = needMoreText;
- }
-
- return input;
-}
-
-
-/*********************************************
- *
- * QXmlDefaultHandler
- *
- *********************************************/
-
-/*!
- \class QXmlContentHandler
- \obsolete
- \reentrant
- \brief The QXmlContentHandler class provides an interface to
- report the logical content of XML data.
-
- \inmodule QtXml
- \ingroup xml-tools
-
- If the application needs to be informed of basic parsing events,
- it can implement this interface and activate it using
- QXmlReader::setContentHandler(). The reader can then report basic
- document-related events like the start and end of elements and
- character data through this interface.
-
- The order of events in this interface is very important, and
- mirrors the order of information in the document itself. For
- example, all of an element's content (character data, processing
- instructions, and sub-elements) appears, in order, between the
- startElement() event and the corresponding endElement() event.
-
- The class QXmlDefaultHandler provides a default implementation for
- this interface; subclassing from the QXmlDefaultHandler class is
- very convenient if you only want to be informed of some parsing
- events.
-
- The startDocument() function is called at the start of the
- document, and endDocument() is called at the end. Before parsing
- begins setDocumentLocator() is called. For each element
- startElement() is called, with endElement() being called at the
- end of each element. The characters() function is called with
- chunks of character data; ignorableWhitespace() is called with
- chunks of whitespace and processingInstruction() is called with
- processing instructions. If an entity is skipped skippedEntity()
- is called. At the beginning of prefix-URI scopes
- startPrefixMapping() is called.
-
- \sa QXmlDTDHandler, QXmlDeclHandler, QXmlEntityResolver, QXmlErrorHandler,
- QXmlLexicalHandler
-*/
-
-/*!
- \fn QXmlContentHandler::~QXmlContentHandler()
-
- Destroys the content handler.
-*/
-
-/*!
- \fn void QXmlContentHandler::setDocumentLocator(QXmlLocator* locator)
-
- The reader calls this function before it starts parsing the
- document. The argument \a locator is a pointer to a QXmlLocator
- which allows the application to get the parsing position within
- the document.
-
- Do not destroy the \a locator; it is destroyed when the reader is
- destroyed. (Do not use the \a locator after the reader is
- destroyed).
-*/
-
-/*!
- \fn bool QXmlContentHandler::startDocument()
-
- The reader calls this function when it starts parsing the
- document. The reader calls this function just once, after the call
- to setDocumentLocator(), and before any other functions in this
- class or in the QXmlDTDHandler class are called.
-
- If this function returns \c false the reader stops parsing and
- reports an error. The reader uses the function errorString() to
- get the error message.
-
- \sa endDocument()
-*/
-
-/*!
- \fn bool QXmlContentHandler::endDocument()
-
- The reader calls this function after it has finished parsing. It
- is called just once, and is the last handler function called. It
- is called after the reader has read all input or has abandoned
- parsing because of a fatal error.
-
- If this function returns \c false the reader stops parsing and
- reports an error. The reader uses the function errorString() to
- get the error message.
-
- \sa startDocument()
-*/
-
-/*!
- \fn bool QXmlContentHandler::startPrefixMapping(const QString& prefix, const QString& uri)
-
- The reader calls this function to signal the begin of a prefix-URI
- namespace mapping scope. This information is not necessary for
- normal namespace processing since the reader automatically
- replaces prefixes for element and attribute names.
-
- Note that startPrefixMapping() and endPrefixMapping() calls are
- not guaranteed to be properly nested relative to each other: all
- startPrefixMapping() events occur before the corresponding
- startElement() event, and all endPrefixMapping() events occur
- after the corresponding endElement() event, but their order is not
- otherwise guaranteed.
-
- The argument \a prefix is the namespace prefix being declared and
- the argument \a uri is the namespace URI the prefix is mapped to.
-
- If this function returns \c false the reader stops parsing and
- reports an error. The reader uses the function errorString() to
- get the error message.
-
- \sa endPrefixMapping()
-*/
-
-/*!
- \fn bool QXmlContentHandler::endPrefixMapping(const QString& prefix)
-
- The reader calls this function to signal the end of a prefix
- mapping for the prefix \a prefix.
-
- If this function returns \c false the reader stops parsing and
- reports an error. The reader uses the function errorString() to
- get the error message.
-
- \sa startPrefixMapping()
-*/
-
-/*!
- \fn bool QXmlContentHandler::startElement(const QString& namespaceURI, const QString& localName, const QString& qName, const QXmlAttributes& atts)
-
- The reader calls this function when it has parsed a start element
- tag.
-
- There is a corresponding endElement() call when the corresponding
- end element tag is read. The startElement() and endElement() calls
- are always nested correctly. Empty element tags (e.g. \c{<x/>})
- cause a startElement() call to be immediately followed by an
- endElement() call.
-
- The attribute list provided only contains attributes with explicit
- values. The attribute list contains attributes used for namespace
- declaration (i.e. attributes starting with xmlns) only if the
- namespace-prefix property of the reader is true.
-
- The argument \a namespaceURI is the namespace URI, or
- an empty string if the element has no namespace URI or if no
- namespace processing is done. \a localName is the local name
- (without prefix), or an empty string if no namespace processing is
- done, \a qName is the qualified name (with prefix) and \a atts are
- the attributes attached to the element. If there are no
- attributes, \a atts is an empty attributes object.
-
- If this function returns \c false the reader stops parsing and
- reports an error. The reader uses the function errorString() to
- get the error message.
-
- \sa endElement()
-*/
-
-/*!
- \fn bool QXmlContentHandler::endElement(const QString& namespaceURI, const QString& localName, const QString& qName)
-
- The reader calls this function when it has parsed an end element
- tag with the qualified name \a qName, the local name \a localName
- and the namespace URI \a namespaceURI.
-
- If this function returns \c false the reader stops parsing and
- reports an error. The reader uses the function errorString() to
- get the error message.
-
- \sa startElement()
-*/
-
-/*!
- \fn bool QXmlContentHandler::characters(const QString& ch)
-
- The reader calls this function when it has parsed a chunk of
- character data (either normal character data or character data
- inside a CDATA section; if you need to distinguish between those
- two types you must use QXmlLexicalHandler::startCDATA() and
- QXmlLexicalHandler::endCDATA()). The character data is reported in
- \a ch.
-
- Some readers report whitespace in element content using the
- ignorableWhitespace() function rather than using this one.
-
- A reader may report the character data of an element in more than
- one chunk; e.g. a reader might want to report "a\<b" in three
- characters() events ("a ", "\<" and " b").
-
- If this function returns \c false the reader stops parsing and
- reports an error. The reader uses the function errorString() to
- get the error message.
-*/
-
-/*!
- \fn bool QXmlContentHandler::ignorableWhitespace(const QString& ch)
-
- Some readers may use this function to report each chunk of
- whitespace in element content. The whitespace is reported in \a ch.
-
- If this function returns \c false the reader stops parsing and
- reports an error. The reader uses the function errorString() to
- get the error message.
-*/
-
-/*!
- \fn bool QXmlContentHandler::processingInstruction(const QString& target, const QString& data)
-
- The reader calls this function when it has parsed a processing
- instruction.
-
- \a target is the target name of the processing instruction and \a
- data is the data in the processing instruction.
-
- If this function returns \c false the reader stops parsing and
- reports an error. The reader uses the function errorString() to
- get the error message.
-*/
-
-/*!
- \fn bool QXmlContentHandler::skippedEntity(const QString& name)
-
- Some readers may skip entities if they have not seen the
- declarations (e.g. because they are in an external DTD). If they
- do so they report that they skipped the entity called \a name by
- calling this function.
-
- If this function returns \c false the reader stops parsing and
- reports an error. The reader uses the function errorString() to
- get the error message.
-*/
-
-/*!
- \fn QString QXmlContentHandler::errorString() const
-
- The reader calls this function to get an error string, e.g. if any
- of the handler functions returns \c false.
-*/
-
-
-/*!
- \class QXmlErrorHandler
- \obsolete
- \reentrant
- \brief The QXmlErrorHandler class provides an interface to report
- errors in XML data.
-
- \inmodule QtXml
- \ingroup xml-tools
-
- If you want your application to report errors to the user or to
- perform customized error handling, you should subclass this class.
-
- You can set the error handler with QXmlReader::setErrorHandler().
-
- Errors can be reported using warning(), error() and fatalError(),
- with the error text being reported with errorString().
-
- \sa QXmlDTDHandler, QXmlDeclHandler, QXmlContentHandler, QXmlEntityResolver,
- QXmlLexicalHandler
-*/
-
-/*!
- \fn QXmlErrorHandler::~QXmlErrorHandler()
-
- Destroys the error handler.
-*/
-
-/*!
- \fn bool QXmlErrorHandler::warning(const QXmlParseException& exception)
-
- A reader might use this function to report a warning. Warnings are
- conditions that are not errors or fatal errors as defined by the
- XML 1.0 specification. Details of the warning are stored in \a
- exception.
-
- If this function returns \c false the reader stops parsing and
- reports an error. The reader uses the function errorString() to
- get the error message.
-*/
-
-/*!
- \fn bool QXmlErrorHandler::error(const QXmlParseException& exception)
-
- A reader might use this function to report a recoverable error. A
- recoverable error corresponds to the definiton of "error" in
- section 1.2 of the XML 1.0 specification. Details of the error are
- stored in \a exception.
-
- The reader must continue to provide normal parsing events after
- invoking this function.
-
- If this function returns \c false the reader stops parsing and
- reports an error. The reader uses the function errorString() to
- get the error message.
-*/
-
-/*!
-\fn bool QXmlErrorHandler::fatalError(const QXmlParseException& exception)
-
-A reader must use this function to report a non-recoverable error.
-Details of the error are stored in \a exception.
-
-If this function returns \c true the reader might try to go on
-parsing and reporting further errors, but no regular parsing
-events are reported.
-*/
-
-/*!
- \fn QString QXmlErrorHandler::errorString() const
-
- The reader calls this function to get an error string if any of
- the handler functions returns \c false.
-*/
-
-
-/*!
- \class QXmlDTDHandler
- \obsolete
- \reentrant
- \brief The QXmlDTDHandler class provides an interface to report
- DTD content of XML data.
-
- \inmodule QtXml
- \ingroup xml-tools
-
- If an application needs information about notations and unparsed
- entities, it can implement this interface and register an instance
- with QXmlReader::setDTDHandler().
-
- Note that this interface includes only those DTD events that the
- XML recommendation requires processors to report, i.e. notation
- and unparsed entity declarations using notationDecl() and
- unparsedEntityDecl() respectively.
-
- \sa QXmlDeclHandler, QXmlContentHandler, QXmlEntityResolver, QXmlErrorHandler,
- QXmlLexicalHandler
-*/
-
-/*!
- \fn QXmlDTDHandler::~QXmlDTDHandler()
-
- Destroys the DTD handler.
-*/
-
-/*!
- \fn bool QXmlDTDHandler::notationDecl(const QString& name, const QString& publicId, const QString& systemId)
-
- The reader calls this function when it has parsed a notation
- declaration.
-
- The argument \a name is the notation name, \a publicId is the
- notation's public identifier and \a systemId is the notation's
- system identifier.
-
- If this function returns \c false the reader stops parsing and
- reports an error. The reader uses the function errorString() to
- get the error message.
-*/
-
-/*!
- \fn bool QXmlDTDHandler::unparsedEntityDecl(const QString& name, const QString& publicId, const QString& systemId, const QString& notationName)
-
- The reader calls this function when it finds an unparsed entity
- declaration.
-
- The argument \a name is the unparsed entity's name, \a publicId is
- the entity's public identifier, \a systemId is the entity's system
- identifier and \a notationName is the name of the associated
- notation.
-
- If this function returns \c false the reader stops parsing and
- reports an error. The reader uses the function errorString() to
- get the error message.
-*/
-
-/*!
- \fn QString QXmlDTDHandler::errorString() const
-
- The reader calls this function to get an error string if any of
- the handler functions returns \c false.
-*/
-
-
-/*!
- \class QXmlEntityResolver
- \obsolete
- \reentrant
- \brief The QXmlEntityResolver class provides an interface to
- resolve external entities contained in XML data.
-
- \inmodule QtXml
- \ingroup xml-tools
-
- If an application needs to implement customized handling for
- external entities, it must implement this interface, i.e.
- resolveEntity(), and register it with
- QXmlReader::setEntityResolver().
-
- \sa QXmlDTDHandler, QXmlDeclHandler, QXmlContentHandler, QXmlErrorHandler,
- QXmlLexicalHandler
-*/
-
-/*!
- \fn QXmlEntityResolver::~QXmlEntityResolver()
-
- Destroys the entity resolver.
-*/
-
-/*!
- \fn bool QXmlEntityResolver::resolveEntity(const QString& publicId, const QString& systemId, QXmlInputSource*& ret)
-
- The reader calls this function before it opens any external
- entity, except the top-level document entity. The application may
- request the reader to resolve the entity itself (\a ret is 0) or
- to use an entirely different input source (\a ret points to the
- input source).
-
- The reader deletes the input source \a ret when it no longer needs
- it, so you should allocate it on the heap with \c new.
-
- The argument \a publicId is the public identifier of the external
- entity, \a systemId is the system identifier of the external
- entity and \a ret is the return value of this function. If \a ret
- is 0 the reader should resolve the entity itself, if it is
- non-zero it must point to an input source which the reader uses
- instead.
-
- If this function returns \c false the reader stops parsing and
- reports an error. The reader uses the function errorString() to
- get the error message.
-*/
-
-/*!
- \fn QString QXmlEntityResolver::errorString() const
-
- The reader calls this function to get an error string if any of
- the handler functions returns \c false.
-*/
-
-
-/*!
- \class QXmlLexicalHandler
- \obsolete
- \reentrant
- \brief The QXmlLexicalHandler class provides an interface to
- report the lexical content of XML data.
-
- \inmodule QtXml
- \ingroup xml-tools
-
- The events in the lexical handler apply to the entire document,
- not just to the document element, and all lexical handler events
- appear between the content handler's startDocument and endDocument
- events.
-
- You can set the lexical handler with
- QXmlReader::setLexicalHandler().
-
- This interface's design is based on the SAX2 extension
- LexicalHandler.
-
- The interface provides the startDTD(), endDTD(), startEntity(),
- endEntity(), startCDATA(), endCDATA() and comment() functions.
-
- \sa QXmlDTDHandler, QXmlDeclHandler, QXmlContentHandler, QXmlEntityResolver,
- QXmlErrorHandler
-*/
-
-/*!
- \fn QXmlLexicalHandler::~QXmlLexicalHandler()
-
- Destroys the lexical handler.
-*/
-
-/*!
- \fn bool QXmlLexicalHandler::startDTD(const QString& name, const QString& publicId, const QString& systemId)
-
- The reader calls this function to report the start of a DTD
- declaration, if any. It reports the name of the document type in
- \a name, the public identifier in \a publicId and the system
- identifier in \a systemId.
-
- If the public identifier is missing, \a publicId is set to
- an empty string. If the system identifier is missing, \a systemId is
- set to an empty string. Note that it is not valid XML to have a
- public identifier but no system identifier; in such cases a parse
- error will occur.
-
- All declarations reported through QXmlDTDHandler or
- QXmlDeclHandler appear between the startDTD() and endDTD() calls.
-
- If this function returns \c false the reader stops parsing and
- reports an error. The reader uses the function errorString() to
- get the error message.
-
- \sa endDTD()
-*/
-
-/*!
- \fn bool QXmlLexicalHandler::endDTD()
-
- The reader calls this function to report the end of a DTD
- declaration, if any.
-
- If this function returns \c false the reader stops parsing and
- reports an error. The reader uses the function errorString() to
- get the error message.
-
- \sa startDTD()
-*/
-
-/*!
- \fn bool QXmlLexicalHandler::startEntity(const QString& name)
-
- The reader calls this function to report the start of an entity
- called \a name.
-
- Note that if the entity is unknown, the reader reports it through
- QXmlContentHandler::skippedEntity() and not through this
- function.
-
- If this function returns \c false the reader stops parsing and
- reports an error. The reader uses the function errorString() to
- get the error message.
-
- \sa endEntity(), QXmlSimpleReader::setFeature()
-*/
-
-/*!
- \fn bool QXmlLexicalHandler::endEntity(const QString& name)
-
- The reader calls this function to report the end of an entity
- called \a name.
-
- For every startEntity() call, there is a corresponding endEntity()
- call. The calls to startEntity() and endEntity() are properly
- nested.
-
- If this function returns \c false the reader stops parsing and
- reports an error. The reader uses the function errorString() to
- get the error message.
-
- \sa startEntity(), QXmlContentHandler::skippedEntity(), QXmlSimpleReader::setFeature()
-*/
-
-/*!
- \fn bool QXmlLexicalHandler::startCDATA()
-
- The reader calls this function to report the start of a CDATA
- section. The content of the CDATA section is reported through the
- QXmlContentHandler::characters() function. This function is
- intended only to report the boundary.
-
- If this function returns \c false the reader stops parsing and
- reports an error. The reader uses the function errorString() to
- get the error message.
-
- \sa endCDATA()
-*/
-
-/*!
- \fn bool QXmlLexicalHandler::endCDATA()
-
- The reader calls this function to report the end of a CDATA
- section.
-
- If this function returns \c false the reader stops parsing and reports
- an error. The reader uses the function errorString() to get the error
- message.
-
- \sa startCDATA(), QXmlContentHandler::characters()
-*/
-
-/*!
- \fn bool QXmlLexicalHandler::comment(const QString& ch)
-
- The reader calls this function to report an XML comment anywhere
- in the document. It reports the text of the comment in \a ch.
-
- If this function returns \c false the reader stops parsing and
- reports an error. The reader uses the function errorString() to
- get the error message.
-*/
-
-/*!
- \fn QString QXmlLexicalHandler::errorString() const
-
- The reader calls this function to get an error string if any of
- the handler functions returns \c false.
-*/
-
-
-/*!
- \class QXmlDeclHandler
- \obsolete
- \reentrant
- \brief The QXmlDeclHandler class provides an interface to report declaration
- content of XML data.
-
- \inmodule QtXml
- \ingroup xml-tools
-
- You can set the declaration handler with
- QXmlReader::setDeclHandler().
-
- This interface is based on the SAX2 extension DeclHandler.
-
- The interface provides attributeDecl(), internalEntityDecl() and
- externalEntityDecl() functions.
-
- \sa QXmlDTDHandler, QXmlContentHandler, QXmlEntityResolver, QXmlErrorHandler,
- QXmlLexicalHandler
-*/
-
-/*!
- \fn QXmlDeclHandler::~QXmlDeclHandler()
-
- Destroys the declaration handler.
-*/
-
-/*!
- \fn bool QXmlDeclHandler::attributeDecl(const QString& eName, const QString& aName, const QString& type, const QString& valueDefault, const QString& value)
-
- The reader calls this function to report an attribute type
- declaration. Only the effective (first) declaration for an
- attribute is reported.
-
- The reader passes the name of the associated element in \a eName
- and the name of the attribute in \a aName. It passes a string that
- represents the attribute type in \a type and a string that
- represents the attribute default in \a valueDefault. This string
- is one of "#IMPLIED", "#REQUIRED", "#FIXED" or an empty string (if
- none of the others applies). The reader passes the attribute's
- default value in \a value. If no default value is specified in the
- XML file, \a value is an empty string.
-
- If this function returns \c false the reader stops parsing and
- reports an error. The reader uses the function errorString() to
- get the error message.
-*/
-
-/*!
- \fn bool QXmlDeclHandler::internalEntityDecl(const QString& name, const QString& value)
-
- The reader calls this function to report an internal entity
- declaration. Only the effective (first) declaration is reported.
-
- The reader passes the name of the entity in \a name and the value
- of the entity in \a value.
-
- If this function returns \c false the reader stops parsing and
- reports an error. The reader uses the function errorString() to
- get the error message.
-*/
-
-/*!
- \fn bool QXmlDeclHandler::externalEntityDecl(const QString& name, const QString& publicId, const QString& systemId)
-
- The reader calls this function to report a parsed external entity
- declaration. Only the effective (first) declaration for each
- entity is reported.
-
- The reader passes the name of the entity in \a name, the public
- identifier in \a publicId and the system identifier in \a
- systemId. If there is no public identifier specified, it passes
- an empty string in \a publicId.
-
- If this function returns \c false the reader stops parsing and
- reports an error. The reader uses the function errorString() to
- get the error message.
-*/
-
-/*!
- \fn QString QXmlDeclHandler::errorString() const
-
- The reader calls this function to get an error string if any of
- the handler functions returns \c false.
-*/
-
-
-/*!
- \class QXmlDefaultHandler
- \obsolete
- \reentrant
- \brief The QXmlDefaultHandler class provides a default implementation of all
- the XML handler classes.
-
- \inmodule QtXml
- \ingroup xml-tools
-
- This class gathers together the features of
- the specialized handler classes, making it a convenient
- starting point when implementing custom handlers for
- subclasses of QXmlReader, particularly QXmlSimpleReader.
- The virtual functions from each of the base classes are
- reimplemented in this class, providing sensible default behavior
- for many common cases. By subclassing this class, and
- overriding these functions, you can concentrate
- on implementing the parts of the handler relevant to your
- application.
-
- The XML reader must be told which handler to use for different
- kinds of events during parsing. This means that, although
- QXmlDefaultHandler provides default implementations of functions
- inherited from all its base classes, we can still use specialized
- handlers for particular kinds of events.
-
- For example, QXmlDefaultHandler subclasses both
- QXmlContentHandler and QXmlErrorHandler, so by subclassing
- it we can use the same handler for both of the following
- reader functions:
-
- \snippet rsslisting/listing.cpp 0
-
- Since the reader will inform the handler of parsing errors, it is
- necessary to reimplement QXmlErrorHandler::fatalError() if, for
- example, we want to stop parsing when such an error occurs:
-
- \snippet rsslisting/handler.cpp 0
-
- The above function returns \c false, which tells the reader to stop
- parsing. To continue to use the same reader,
- it is necessary to create a new handler instance, and set up the
- reader to use it in the manner described above.
-
- It is useful to examine some of the functions inherited by
- QXmlDefaultHandler, and consider why they might be
- reimplemented in a custom handler.
- Custom handlers will typically reimplement
- QXmlContentHandler::startDocument() to prepare the handler for
- new content. Document elements and the text within them can be
- processed by reimplementing QXmlContentHandler::startElement(),
- QXmlContentHandler::endElement(), and
- QXmlContentHandler::characters().
- You may want to reimplement QXmlContentHandler::endDocument()
- to perform some finalization or validation on the content once the
- document has been read completely.
-
- \sa QXmlDTDHandler, QXmlDeclHandler, QXmlContentHandler, QXmlEntityResolver,
- QXmlErrorHandler, QXmlLexicalHandler
-*/
-
-/*!
- \fn QXmlDefaultHandler::QXmlDefaultHandler()
-
- Constructs a handler for use with subclasses of QXmlReader.
-*/
-QXmlDefaultHandler::QXmlDefaultHandler()
-{
- // ### In Qt 5.0, this function was inlined and d was not initialized
- // The member cannot be used until Qt 6.0
- Q_UNUSED(d);
-}
-
-/*!
- \fn QXmlDefaultHandler::~QXmlDefaultHandler()
-
- Destroys the handler.
-*/
-QXmlDefaultHandler::~QXmlDefaultHandler()
-{
-}
-
-/*!
- \reimp
-
- This reimplementation does nothing.
-*/
-void QXmlDefaultHandler::setDocumentLocator(QXmlLocator*)
-{
-}
-
-/*!
- \reimp
-
- This reimplementation does nothing.
-*/
-bool QXmlDefaultHandler::startDocument()
-{
- return true;
-}
-
-/*!
- \reimp
-
- This reimplementation does nothing.
-*/
-bool QXmlDefaultHandler::endDocument()
-{
- return true;
-}
-
-/*!
- \reimp
-
- This reimplementation does nothing.
-*/
-bool QXmlDefaultHandler::startPrefixMapping(const QString&, const QString&)
-{
- return true;
-}
-
-/*!
- \reimp
-
- This reimplementation does nothing.
-*/
-bool QXmlDefaultHandler::endPrefixMapping(const QString&)
-{
- return true;
-}
-
-/*!
- \reimp
-
- This reimplementation does nothing.
-*/
-bool QXmlDefaultHandler::startElement(const QString&, const QString&,
- const QString&, const QXmlAttributes&)
-{
- return true;
-}
-
-/*!
- \reimp
-
- This reimplementation does nothing.
-*/
-bool QXmlDefaultHandler::endElement(const QString&, const QString&,
- const QString&)
-{
- return true;
-}
-
-/*!
- \reimp
-
- This reimplementation does nothing.
-*/
-bool QXmlDefaultHandler::characters(const QString&)
-{
- return true;
-}
-
-/*!
- \reimp
-
- This reimplementation does nothing.
-*/
-bool QXmlDefaultHandler::ignorableWhitespace(const QString&)
-{
- return true;
-}
-
-/*!
- \reimp
-
- This reimplementation does nothing.
-*/
-bool QXmlDefaultHandler::processingInstruction(const QString&,
- const QString&)
-{
- return true;
-}
-
-/*!
- \reimp
-
- This reimplementation does nothing.
-*/
-bool QXmlDefaultHandler::skippedEntity(const QString&)
-{
- return true;
-}
-
-/*!
- \reimp
-
- This reimplementation does nothing.
-*/
-bool QXmlDefaultHandler::warning(const QXmlParseException&)
-{
- return true;
-}
-
-/*!
- \reimp
-
- This reimplementation does nothing.
-*/
-bool QXmlDefaultHandler::error(const QXmlParseException&)
-{
- return true;
-}
-
-/*!
- \reimp
-
- This reimplementation does nothing.
-*/
-bool QXmlDefaultHandler::fatalError(const QXmlParseException&)
-{
- return true;
-}
-
-/*!
- \reimp
-
- This reimplementation does nothing.
-*/
-bool QXmlDefaultHandler::notationDecl(const QString&, const QString&,
- const QString&)
-{
- return true;
-}
-
-/*!
- \reimp
-
- This reimplementation does nothing.
-*/
-bool QXmlDefaultHandler::unparsedEntityDecl(const QString&, const QString&,
- const QString&, const QString&)
-{
- return true;
-}
-
-/*!
- \reimp
-
- Sets \a ret to \nullptr, so that the reader uses the system identifier
- provided in the XML document.
-*/
-bool QXmlDefaultHandler::resolveEntity(const QString&, const QString&,
- QXmlInputSource*& ret)
-{
- ret = nullptr;
- return true;
-}
-
-/*!
- \reimp
-
- Returns the default error string.
-*/
-QString QXmlDefaultHandler::errorString() const
-{
- return QString::fromLatin1(XMLERR_ERRORBYCONSUMER);
-}
-
-/*!
- \reimp
-
- This reimplementation does nothing.
-*/
-bool QXmlDefaultHandler::startDTD(const QString&, const QString&, const QString&)
-{
- return true;
-}
-
-/*!
- \reimp
-
- This reimplementation does nothing.
-*/
-bool QXmlDefaultHandler::endDTD()
-{
- return true;
-}
-
-/*!
- \reimp
-
- This reimplementation does nothing.
-*/
-bool QXmlDefaultHandler::startEntity(const QString&)
-{
- return true;
-}
-
-/*!
- \reimp
-
- This reimplementation does nothing.
-*/
-bool QXmlDefaultHandler::endEntity(const QString&)
-{
- return true;
-}
-
-/*!
- \reimp
-
- This reimplementation does nothing.
-*/
-bool QXmlDefaultHandler::startCDATA()
-{
- return true;
-}
-
-/*!
- \reimp
-
- This reimplementation does nothing.
-*/
-bool QXmlDefaultHandler::endCDATA()
-{
- return true;
-}
-
-/*!
- \reimp
-
- This reimplementation does nothing.
-*/
-bool QXmlDefaultHandler::comment(const QString&)
-{
- return true;
-}
-
-/*!
- \reimp
-
- This reimplementation does nothing.
-*/
-bool QXmlDefaultHandler::attributeDecl(const QString&, const QString&, const QString&, const QString&, const QString&)
-{
- return true;
-}
-
-/*!
- \reimp
-
- This reimplementation does nothing.
-*/
-bool QXmlDefaultHandler::internalEntityDecl(const QString&, const QString&)
-{
- return true;
-}
-
-/*!
- \reimp
-
- This reimplementation does nothing.
-*/
-bool QXmlDefaultHandler::externalEntityDecl(const QString&, const QString&, const QString&)
-{
- return true;
-}
-
-
-/*********************************************
- *
- * QXmlSimpleReaderPrivate
- *
- *********************************************/
-
-inline bool QXmlSimpleReaderPrivate::atEnd()
-{
- return (c.unicode()|0x0001) == 0xffff;
-}
-
-inline void QXmlSimpleReaderPrivate::stringClear()
-{
- stringValueLen = 0; stringArrayPos = 0;
-}
-inline void QXmlSimpleReaderPrivate::nameClear()
-{
- nameValueLen = 0; nameArrayPos = 0;
-}
-
-inline void QXmlSimpleReaderPrivate::refClear()
-{
- refValueLen = 0; refArrayPos = 0;
-}
-
-QXmlSimpleReaderPrivate::QXmlSimpleReaderPrivate(QXmlSimpleReader *reader)
-{
- q_ptr = reader;
- parseStack = nullptr;
-
- locator.reset(new QXmlSimpleReaderLocator(reader));
- entityRes = nullptr;
- dtdHnd = nullptr;
- contentHnd = nullptr;
- errorHnd = nullptr;
- lexicalHnd = nullptr;
- declHnd = nullptr;
-
- // default feature settings
- useNamespaces = true;
- useNamespacePrefixes = false;
- reportWhitespaceCharData = true;
- reportEntities = false;
-}
-
-QXmlSimpleReaderPrivate::~QXmlSimpleReaderPrivate()
-{
- delete parseStack;
-}
-
-void QXmlSimpleReaderPrivate::initIncrementalParsing()
-{
- if(parseStack)
- parseStack->clear();
- else
- parseStack = new QStack<ParseState>;
-}
-
-/*********************************************
- *
- * QXmlSimpleReader
- *
- *********************************************/
-
-/*!
- \class QXmlReader
- \obsolete
- \reentrant
- \brief The QXmlReader class provides an interface for XML readers (i.e.
- parsers).
-
- \inmodule QtXml
- \ingroup xml-tools
-
- This abstract class provides an interface for all of Qt's XML
- readers. Currently there is only one implementation of a reader
- included in Qt's XML module: QXmlSimpleReader. In future releases
- there might be more readers with different properties available
- (e.g. a validating parser).
-
- The design of the XML classes follows the \l{SAX2 Java interface}, with
- the names adapted to fit Qt naming conventions. It should be very
- easy for anybody who has worked with SAX2 to get started with the
- Qt XML classes.
-
- All readers use the class QXmlInputSource to read the input
- document. Since you are normally interested in particular content
- in the XML document, the reader reports the content through
- special handler classes (QXmlDTDHandler, QXmlDeclHandler,
- QXmlContentHandler, QXmlEntityResolver, QXmlErrorHandler and
- QXmlLexicalHandler), which you must subclass, if you want to
- process the contents.
-
- Since the handler classes only describe interfaces you must
- implement all the functions. We provide the QXmlDefaultHandler
- class to make this easier: it implements a default behavior (do
- nothing) for all functions, so you can subclass it and just
- implement the functions you are interested in.
-
- Features and properties of the reader can be set with setFeature()
- and setProperty() respectively. You can set the reader to use your
- own subclasses with setEntityResolver(), setDTDHandler(),
- setContentHandler(), setErrorHandler(), setLexicalHandler() and
- setDeclHandler(). The parse itself is started with a call to
- parse().
-
- Note that this class is now deprecated, please use QXmlStreamReader or
- QDomDocument for reading XML files.
-
- \sa QXmlSimpleReader
-*/
-
-/*!
- \fn QXmlReader::~QXmlReader()
-
- Destroys the reader.
-*/
-
-/*!
- \fn bool QXmlReader::feature(const QString& name, bool *ok) const
-
- If the reader has the feature called \a name, the feature's value
- is returned. If no such feature exists the return value is
- undefined.
-
- If \a ok is not \nullptr: \c{*}\a{ok} is set to true if the
- reader has the feature called \a name; otherwise \c{*}\a{ok} is
- set to false.
-
- \sa setFeature(), hasFeature()
-*/
-
-/*!
- \fn void QXmlReader::setFeature(const QString& name, bool value)
-
- Sets the feature called \a name to the given \a value. If the
- reader doesn't have the feature nothing happens.
-
- \sa feature(), hasFeature()
-*/
-
-/*!
- \fn bool QXmlReader::hasFeature(const QString& name) const
-
- Returns \c true if the reader has the feature called \a name;
- otherwise returns \c false.
-
- \sa feature(), setFeature()
-*/
-
-/*!
- \fn void* QXmlReader::property(const QString& name, bool *ok) const
-
- If the reader has the property \a name, this function returns the
- value of the property; otherwise the return value is undefined.
-
- If \a ok is not \nullptr: if the reader has the \a name property
- \c{*}\a{ok} is set to true; otherwise \c{*}\a{ok} is set to false.
-
- \sa setProperty(), hasProperty()
-*/
-
-/*!
- \fn void QXmlReader::setProperty(const QString& name, void* value)
-
- Sets the property \a name to \a value. If the reader doesn't have
- the property nothing happens.
-
- \sa property(), hasProperty()
-*/
-
-/*!
- \fn bool QXmlReader::hasProperty(const QString& name) const
-
- Returns \c true if the reader has the property \a name; otherwise
- returns \c false.
-
- \sa property(), setProperty()
-*/
-
-/*!
- \fn void QXmlReader::setEntityResolver(QXmlEntityResolver* handler)
-
- Sets the entity resolver to \a handler.
-
- \sa entityResolver()
-*/
-
-/*!
- \fn QXmlEntityResolver *QXmlReader::entityResolver() const
-
- Returns the entity resolver or \nullptr if none was set.
-
- \sa setEntityResolver()
-*/
-
-/*!
- \fn void QXmlReader::setDTDHandler(QXmlDTDHandler* handler)
-
- Sets the DTD handler to \a handler.
-
- \sa DTDHandler()
-*/
-
-/*!
- \fn QXmlDTDHandler *QXmlReader::DTDHandler() const
-
- Returns the DTD handler or \nullptr if none was set.
-
- \sa setDTDHandler()
-*/
-
-/*!
- \fn void QXmlReader::setContentHandler(QXmlContentHandler* handler)
-
- Sets the content handler to \a handler.
-
- \sa contentHandler()
-*/
-
-/*!
- \fn QXmlContentHandler *QXmlReader::contentHandler() const
-
- Returns the content handler or \nullptr if none was set.
-
- \sa setContentHandler()
-*/
-
-/*!
- \fn void QXmlReader::setErrorHandler(QXmlErrorHandler* handler)
-
- Sets the error handler to \a handler. Clears the error handler if
- \a handler is 0.
-
- \sa errorHandler()
-*/
-
-/*!
- \fn QXmlErrorHandler *QXmlReader::errorHandler() const
-
- Returns the error handler or \nullptr if none is set.
-
- \sa setErrorHandler()
-*/
-
-/*!
- \fn void QXmlReader::setLexicalHandler(QXmlLexicalHandler* handler)
-
- Sets the lexical handler to \a handler.
-
- \sa lexicalHandler()
-*/
-
-/*!
- \fn QXmlLexicalHandler *QXmlReader::lexicalHandler() const
-
- Returns the lexical handler or \nullptr if none was set.
-
- \sa setLexicalHandler()
-*/
-
-/*!
- \fn void QXmlReader::setDeclHandler(QXmlDeclHandler* handler)
-
- Sets the declaration handler to \a handler.
-
- \sa declHandler()
-*/
-
-/*!
- \fn QXmlDeclHandler *QXmlReader::declHandler() const
-
- Returns the declaration handler or \nullptr if none was set.
-
- \sa setDeclHandler()
-*/
-
-/*!
- \fn bool QXmlReader::parse(const QXmlInputSource &input)
-
- \obsolete
-
- Parses the given \a input.
-*/
-
-/*!
- \fn bool QXmlReader::parse(const QXmlInputSource *input)
-
- Reads an XML document from \a input and parses it. Returns \c true if
- the parsing was successful; otherwise returns \c false.
-*/
-
-
-/*!
- \class QXmlSimpleReader
- \obsolete
- \nonreentrant
- \brief The QXmlSimpleReader class provides an implementation of a
- simple XML parser.
-
- \inmodule QtXml
- \ingroup xml-tools
-
-
- This XML reader is suitable for a wide range of applications. It
- is able to parse well-formed XML and can report the namespaces of
- elements to a content handler; however, it does not parse any
- external entities. For historical reasons, Attribute Value
- Normalization and End-of-Line Handling as described in the XML 1.0
- specification is not performed.
-
- The easiest pattern of use for this class is to create a reader
- instance, define an input source, specify the handlers to be used
- by the reader, and parse the data.
-
- For example, we could use a QFile to supply the input. Here, we
- create a reader, and define an input source to be used by the
- reader:
-
- \snippet simpleparse/main.cpp 0
-
- A handler lets us perform actions when the reader encounters
- certain types of content, or if errors in the input are found. The
- reader must be told which handler to use for each type of
- event. For many common applications, we can create a custom
- handler by subclassing QXmlDefaultHandler, and use this to handle
- both error and content events:
-
- \snippet simpleparse/main.cpp 1
-
- If you don't set at least the content and error handlers, the
- parser will fall back on its default behavior---and will do
- nothing.
-
- The most convenient way to handle the input is to read it in a
- single pass using the parse() function with an argument that
- specifies the input source:
-
- \snippet simpleparse/main.cpp 2
-
- If you can't parse the entire input in one go (for example, it is
- huge, or is being delivered over a network connection), data can
- be fed to the parser in pieces. This is achieved by telling
- parse() to work incrementally, and making subsequent calls to the
- parseContinue() function, until all the data has been processed.
-
- A common way to perform incremental parsing is to connect the \c
- readyRead() signal of a \l{QNetworkReply} {network reply} a slot,
- and handle the incoming data there. See QNetworkAccessManager.
-
- Aspects of the parsing behavior can be adapted using setFeature()
- and setProperty().
-
- \snippet code/src_xml_sax_qxml.cpp 0
-
- QXmlSimpleReader is not reentrant. If you want to use the class
- in threaded code, lock the code using QXmlSimpleReader with a
- locking mechanism, such as a QMutex.
-
- Note that this class is now deprecated, please use QXmlStreamReader or
- QDomDocument for reading XML files.
-*/
-
-static inline bool is_S(QChar ch)
-{
- ushort uc = ch.unicode();
- return (uc == ' ' || uc == '\t' || uc == '\n' || uc == '\r');
-}
-
-enum NameChar { NameBeginning, NameNotBeginning, NotName };
-
-static const char Begi = (char)NameBeginning;
-static const char NtBg = (char)NameNotBeginning;
-static const char NotN = (char)NotName;
-
-static const char nameCharTable[128] =
-{
-// 0x00
- NotN, NotN, NotN, NotN, NotN, NotN, NotN, NotN,
- NotN, NotN, NotN, NotN, NotN, NotN, NotN, NotN,
-// 0x10
- NotN, NotN, NotN, NotN, NotN, NotN, NotN, NotN,
- NotN, NotN, NotN, NotN, NotN, NotN, NotN, NotN,
-// 0x20 (0x2D is '-', 0x2E is '.')
- NotN, NotN, NotN, NotN, NotN, NotN, NotN, NotN,
- NotN, NotN, NotN, NotN, NotN, NtBg, NtBg, NotN,
-// 0x30 (0x30..0x39 are '0'..'9', 0x3A is ':')
- NtBg, NtBg, NtBg, NtBg, NtBg, NtBg, NtBg, NtBg,
- NtBg, NtBg, Begi, NotN, NotN, NotN, NotN, NotN,
-// 0x40 (0x41..0x5A are 'A'..'Z')
- NotN, Begi, Begi, Begi, Begi, Begi, Begi, Begi,
- Begi, Begi, Begi, Begi, Begi, Begi, Begi, Begi,
-// 0x50 (0x5F is '_')
- Begi, Begi, Begi, Begi, Begi, Begi, Begi, Begi,
- Begi, Begi, Begi, NotN, NotN, NotN, NotN, Begi,
-// 0x60 (0x61..0x7A are 'a'..'z')
- NotN, Begi, Begi, Begi, Begi, Begi, Begi, Begi,
- Begi, Begi, Begi, Begi, Begi, Begi, Begi, Begi,
-// 0x70
- Begi, Begi, Begi, Begi, Begi, Begi, Begi, Begi,
- Begi, Begi, Begi, NotN, NotN, NotN, NotN, NotN
-};
-
-static inline NameChar fastDetermineNameChar(QChar ch)
-{
- ushort uc = ch.unicode();
- if (!(uc & ~0x7f)) // uc < 128
- return (NameChar)nameCharTable[uc];
-
- QChar::Category cat = ch.category();
- // ### some these categories might be slightly wrong
- if ((cat >= QChar::Letter_Uppercase && cat <= QChar::Letter_Other)
- || cat == QChar::Number_Letter)
- return NameBeginning;
- if ((cat >= QChar::Number_DecimalDigit && cat <= QChar::Number_Other)
- || (cat >= QChar::Mark_NonSpacing && cat <= QChar::Mark_Enclosing))
- return NameNotBeginning;
- return NotName;
-}
-
-static NameChar determineNameChar(QChar ch)
-{
- return fastDetermineNameChar(ch);
-}
-
-/*!
- Constructs a simple XML reader.
-
-*/
-QXmlSimpleReader::QXmlSimpleReader()
- : d_ptr(new QXmlSimpleReaderPrivate(this))
-{
-}
-
-/*!
- Destroys the simple XML reader.
-*/
-QXmlSimpleReader::~QXmlSimpleReader()
-{
-}
-
-/*!
- \reimp
-*/
-bool QXmlSimpleReader::feature(const QString& name, bool *ok) const
-{
- const QXmlSimpleReaderPrivate *d = d_func();
-
- if (ok)
- *ok = true;
- if (name == QLatin1String("http://xml.org/sax/features/namespaces")) {
- return d->useNamespaces;
- } else if (name == QLatin1String("http://xml.org/sax/features/namespace-prefixes")) {
- return d->useNamespacePrefixes;
- } else if (name == QLatin1String("http://trolltech.com/xml/features/report-whitespace-only-CharData") // For compat with Qt 4
- || name == QLatin1String("http://qt-project.org/xml/features/report-whitespace-only-CharData")) {
- return d->reportWhitespaceCharData;
- } else if (name == QLatin1String("http://trolltech.com/xml/features/report-start-end-entity") // For compat with Qt 4
- || name == QLatin1String("http://qt-project.org/xml/features/report-start-end-entity")) {
- return d->reportEntities;
- } else {
- qWarning("Unknown feature %s", name.toLatin1().data());
- if (ok)
- *ok = false;
- }
- return false;
-}
-
-/*!
- Turns on the feature \a name if \a enable is true; otherwise turns it off.
-
- The \a name parameter must be one of the following strings:
- \table
- \header \li Feature \li Default \li Notes
- \row \li \e http://xml.org/sax/features/namespaces
- \li true
- \li If enabled, namespaces are reported to the content handler.
- \row \li \e http://xml.org/sax/features/namespace-prefixes
- \li false
- \li If enabled, the original prefixed names
- and attributes used for namespace declarations are
- reported.
- \row \li \e http://qt-project.org/xml/features/report-whitespace-only-CharData
- \li true
- \li If enabled, CharData that consist of
- only whitespace characters are reported
- using QXmlContentHandler::characters(). If disabled, whitespace is silently
- discarded.
- \row \li \e http://qt-project.org/xml/features/report-start-end-entity
- \li false
- \li If enabled, the parser reports
- QXmlContentHandler::startEntity() and
- QXmlContentHandler::endEntity() events, so character data
- might be reported in chunks.
- If disabled, the parser does not report these events, but
- silently substitutes the entities, and reports the character
- data in one chunk.
- \endtable
-
- \sa feature(), hasFeature()
-*/
-void QXmlSimpleReader::setFeature(const QString& name, bool enable)
-{
- Q_D(QXmlSimpleReader);
- if (name == QLatin1String("http://xml.org/sax/features/namespaces")) {
- d->useNamespaces = enable;
- } else if (name == QLatin1String("http://xml.org/sax/features/namespace-prefixes")) {
- d->useNamespacePrefixes = enable;
- } else if (name == QLatin1String("http://trolltech.com/xml/features/report-whitespace-only-CharData") // For compat with Qt 4
- || name == QLatin1String("http://qt-project.org/xml/features/report-whitespace-only-CharData")) {
- d->reportWhitespaceCharData = enable;
- } else if (name == QLatin1String("http://trolltech.com/xml/features/report-start-end-entity") // For compat with Qt 4
- || name == QLatin1String("http://qt-project.org/xml/features/report-start-end-entity")) {
- d->reportEntities = enable;
- } else {
- qWarning("Unknown feature %s", name.toLatin1().data());
- }
-}
-
-/*! \reimp
-*/
-bool QXmlSimpleReader::hasFeature(const QString& name) const
-{
- if (name == QLatin1String("http://xml.org/sax/features/namespaces")
- || name == QLatin1String("http://xml.org/sax/features/namespace-prefixes")
- || name == QLatin1String("http://trolltech.com/xml/features/report-whitespace-only-CharData") // For compat with Qt 4
- || name == QLatin1String("http://qt-project.org/xml/features/report-whitespace-only-CharData")
- || name == QLatin1String("http://trolltech.com/xml/features/report-start-end-entity") // For compat with Qt 4
- || name == QLatin1String("http://qt-project.org/xml/features/report-start-end-entity")) {
- return true;
- } else {
- return false;
- }
-}
-
-/*! \reimp
-*/
-void* QXmlSimpleReader::property(const QString&, bool *ok) const
-{
- if (ok)
- *ok = false;
- return nullptr;
-}
-
-/*! \reimp
-*/
-void QXmlSimpleReader::setProperty(const QString&, void*)
-{
-}
-
-/*!
- \reimp
-*/
-bool QXmlSimpleReader::hasProperty(const QString&) const
-{
- return false;
-}
-
-/*!
- \reimp
-*/
-void QXmlSimpleReader::setEntityResolver(QXmlEntityResolver* handler)
-{
- Q_D(QXmlSimpleReader);
- d->entityRes = handler;
-}
-
-/*!
- \reimp
-*/
-QXmlEntityResolver* QXmlSimpleReader::entityResolver() const
-{
- const QXmlSimpleReaderPrivate *d = d_func();
- return d->entityRes;
-}
-
-/*!
- \reimp
-*/
-void QXmlSimpleReader::setDTDHandler(QXmlDTDHandler* handler)
-{
- Q_D(QXmlSimpleReader);
- d->dtdHnd = handler;
-}
-
-/*!
- \reimp
-*/
-QXmlDTDHandler* QXmlSimpleReader::DTDHandler() const
-{
- const QXmlSimpleReaderPrivate *d = d_func();
- return d->dtdHnd;
-}
-
-/*!
- \reimp
-*/
-void QXmlSimpleReader::setContentHandler(QXmlContentHandler* handler)
-{
- Q_D(QXmlSimpleReader);
- d->contentHnd = handler;
-}
-
-/*!
- \reimp
-*/
-QXmlContentHandler* QXmlSimpleReader::contentHandler() const
-{
- const QXmlSimpleReaderPrivate *d = d_func();
- return d->contentHnd;
-}
-
-/*!
- \reimp
-*/
-void QXmlSimpleReader::setErrorHandler(QXmlErrorHandler* handler)
-{
- Q_D(QXmlSimpleReader);
- d->errorHnd = handler;
-}
-
-/*!
- \reimp
-*/
-QXmlErrorHandler* QXmlSimpleReader::errorHandler() const
-{
- const QXmlSimpleReaderPrivate *d = d_func();
- return d->errorHnd;
-}
-
-/*!
- \reimp
-*/
-void QXmlSimpleReader::setLexicalHandler(QXmlLexicalHandler* handler)
-{
- Q_D(QXmlSimpleReader);
- d->lexicalHnd = handler;
-}
-
-/*!
- \reimp
-*/
-QXmlLexicalHandler* QXmlSimpleReader::lexicalHandler() const
-{
- const QXmlSimpleReaderPrivate *d = d_func();
- return d->lexicalHnd;
-}
-
-/*!
- \reimp
-*/
-void QXmlSimpleReader::setDeclHandler(QXmlDeclHandler* handler)
-{
- Q_D(QXmlSimpleReader);
- d->declHnd = handler;
-}
-
-/*!
- \reimp
-*/
-QXmlDeclHandler* QXmlSimpleReader::declHandler() const
-{
- const QXmlSimpleReaderPrivate *d = d_func();
- return d->declHnd;
-}
-
-
-
-/*!
- \reimp
-*/
-bool QXmlSimpleReader::parse(const QXmlInputSource& input)
-{
- return parse(&input, false);
-}
-
-/*!
- Reads an XML document from \a input and parses it in one pass (non-incrementally).
- Returns \c true if the parsing was successful; otherwise returns \c false.
-*/
-bool QXmlSimpleReader::parse(const QXmlInputSource* input)
-{
- return parse(input, false);
-}
-
-/*!
- Reads an XML document from \a input and parses it. Returns \c true
- if the parsing is completed successfully; otherwise returns \c false,
- indicating that an error occurred.
-
- If \a incremental is false, this function will return false if the XML
- file is not read completely. The parsing cannot be continued in this
- case.
-
- If \a incremental is true, the parser does not return false if
- it reaches the end of the \a input before reaching the end
- of the XML file. Instead, it stores the state of the parser so that
- parsing can be continued later when more data is available.
- In such a case, you can use the function parseContinue() to
- continue with parsing. This class stores a pointer to the input
- source \a input and the parseContinue() function tries to read from
- that input source. Therefore, you should not delete the input
- source \a input until you no longer need to call parseContinue().
-
- If this function is called with \a incremental set to true
- while an incremental parse is in progress, a new parsing
- session will be started, and the previous session will be lost.
-
- \sa parseContinue(), QTcpSocket
-*/
-bool QXmlSimpleReader::parse(const QXmlInputSource *input, bool incremental)
-{
- Q_D(QXmlSimpleReader);
-
- d->literalEntitySizes.clear();
- d->referencesToOtherEntities.clear();
- d->expandedSizes.clear();
-
- if (incremental) {
- d->initIncrementalParsing();
- } else {
- delete d->parseStack;
- d->parseStack = nullptr;
- }
- d->init(input);
-
- // call the handler
- if (d->contentHnd) {
- d->contentHnd->setDocumentLocator(d->locator.data());
- if (!d->contentHnd->startDocument()) {
- d->reportParseError(d->contentHnd->errorString());
- clear(d->tags);
- return false;
- }
- }
- d->skipped_entity_in_content = false;
- return d->parseBeginOrContinue(0, incremental);
-}
-
-/*!
- Continues incremental parsing, taking input from the
- QXmlInputSource that was specified with the most recent
- call to parse(). To use this function, you \e must have called
- parse() with the incremental argument set to true.
-
- Returns \c false if a parsing error occurs; otherwise returns \c true,
- even if the end of the XML file has not been reached. You can
- continue parsing at a later stage by calling this function again
- when there is more data available to parse.
-
- Calling this function when there is no data available in the input
- source indicates to the reader that the end of the XML file has
- been reached. If the input supplied up to this point was
- not well-formed then a parsing error occurs, and false is returned.
- If the input supplied was well-formed, true is returned.
- It is important to end the input in this way because it allows you
- to reuse the reader to parse other XML files.
-
- Calling this function after the end of file has been reached, but
- without available data will cause false to be returned whether the
- previous input was well-formed or not.
-
- \sa parse(), QXmlInputSource::data(), QXmlInputSource::next()
-*/
-bool QXmlSimpleReader::parseContinue()
-{
- Q_D(QXmlSimpleReader);
- if (d->parseStack == nullptr || d->parseStack->isEmpty())
- return false;
- d->initData();
- int state = d->parseStack->pop().state;
- return d->parseBeginOrContinue(state, true);
-}
-
-/*
- Common part of parse() and parseContinue()
-*/
-bool QXmlSimpleReaderPrivate::parseBeginOrContinue(int state, bool incremental)
-{
- bool atEndOrig = atEnd();
-
- if (state==0) {
- if (!parseProlog()) {
- if (incremental && error.isNull()) {
- pushParseState(nullptr, 0);
- return true;
- } else {
- clear(tags);
- return false;
- }
- }
- state = 1;
- }
- if (state==1) {
- if (!parseElement()) {
- if (incremental && error.isNull()) {
- pushParseState(nullptr, 1);
- return true;
- } else {
- clear(tags);
- return false;
- }
- }
- state = 2;
- }
- // parse Misc*
- while (!atEnd()) {
- if (!parseMisc()) {
- if (incremental && error.isNull()) {
- pushParseState(nullptr, 2);
- return true;
- } else {
- clear(tags);
- return false;
- }
- }
- }
- if (!atEndOrig && incremental) {
- // we parsed something at all, so be prepared to come back later
- pushParseState(nullptr, 2);
- return true;
- }
- // is stack empty?
- if (!tags.empty() && !error.isNull()) {
- reportParseError(QLatin1String(XMLERR_UNEXPECTEDEOF));
- clear(tags);
- return false;
- }
- // call the handler
- if (contentHnd) {
- delete parseStack;
- parseStack = nullptr;
- if (!contentHnd->endDocument()) {
- reportParseError(contentHnd->errorString());
- return false;
- }
- }
- return true;
-}
-
-//
-// The following private parse functions have another semantics for the return
-// value: They return true iff parsing has finished successfully (i.e. the end
-// of the XML file must be reached!). If one of these functions return false,
-// there is only an error when d->error.isNULL() is also false.
-//
-
-/*
- For the incremental parsing, it is very important that the parse...()
- functions have a certain structure. Since it might be hard to understand how
- they work, here is a description of the layout of these functions:
-
- bool QXmlSimpleReader::parse...()
- {
-(1) const signed char Init = 0;
- ...
-
-(2) const signed char Inp... = 0;
- ...
-
-(3) static const signed char table[3][2] = {
- ...
- };
- signed char state;
- signed char input;
-
-(4) if (d->parseStack == nullptr || d->parseStack->isEmpty()) {
-(4a) ...
- } else {
-(4b) ...
- }
-
- for (; ;) {
-(5) switch (state) {
- ...
- }
-
-(6)
-(6a) if (atEnd()) {
- unexpectedEof(&QXmlSimpleReader::parseNmtoken, state);
- return false;
- }
-(6b) if (determineNameChar(c) != NotName) {
- ...
- }
-(7) state = table[state][input];
-
-(8) switch (state) {
- ...
- }
- }
- }
-
- Explanation:
- ad 1: constants for the states (used in the transition table)
- ad 2: constants for the input (used in the transition table)
- ad 3: the transition table for the state machine
- ad 4: test if we are in a parseContinue() step
- a) if no, do inititalizations
- b) if yes, restore the state and call parse functions recursively
- ad 5: Do some actions according to the state; from the logical execution
- order, this code belongs after 8 (see there for an explanation)
- ad 6: Check the character that is at the actual "cursor" position:
- a) If we reached the EOF, report either error or push the state (in the
- case of incremental parsing).
- b) Otherwise, set the input character constant for the transition
- table.
- ad 7: Get the new state according to the input that was read.
- ad 8: Do some actions according to the state. The last line in every case
- statement reads new data (i.e. it move the cursor). This can also be
- done by calling another parse...() function. If you need processing for
- this state after that, you have to put it into the switch statement 5.
- This ensures that you have a well defined re-entry point, when you ran
- out of data.
-*/
-
-/*
- Parses the prolog [22].
-*/
-
-bool QXmlSimpleReaderPrivate::parseProlog()
-{
- const signed char Init = 0;
- const signed char EatWS = 1; // eat white spaces
- const signed char Lt = 2; // '<' read
- const signed char Em = 3; // '!' read
- const signed char DocType = 4; // read doctype
- const signed char Comment = 5; // read comment
- const signed char CommentR = 6; // same as Comment, but already reported
- const signed char PInstr = 7; // read PI
- const signed char PInstrR = 8; // same as PInstr, but already reported
- const signed char Done = 9;
-
- const signed char InpWs = 0;
- const signed char InpLt = 1; // <
- const signed char InpQm = 2; // ?
- const signed char InpEm = 3; // !
- const signed char InpD = 4; // D
- const signed char InpDash = 5; // -
- const signed char InpUnknown = 6;
-
- static const signed char table[9][7] = {
- /* InpWs InpLt InpQm InpEm InpD InpDash InpUnknown */
- { EatWS, Lt, -1, -1, -1, -1, -1 }, // Init
- { -1, Lt, -1, -1, -1, -1, -1 }, // EatWS
- { -1, -1, PInstr,Em, Done, -1, Done }, // Lt
- { -1, -1, -1, -1, DocType, Comment, -1 }, // Em
- { EatWS, Lt, -1, -1, -1, -1, -1 }, // DocType
- { EatWS, Lt, -1, -1, -1, -1, -1 }, // Comment
- { EatWS, Lt, -1, -1, -1, -1, -1 }, // CommentR
- { EatWS, Lt, -1, -1, -1, -1, -1 }, // PInstr
- { EatWS, Lt, -1, -1, -1, -1, -1 } // PInstrR
- };
- signed char state;
- signed char input;
-
- if (parseStack == nullptr|| parseStack->isEmpty()) {
- xmldecl_possible = true;
- doctype_read = false;
- state = Init;
- } else {
- state = parseStack->pop().state;
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: parseProlog (cont) in state %d", state);
-#endif
- if (!parseStack->isEmpty()) {
- ParseFunction function = parseStack->top().function;
- if (function == &QXmlSimpleReaderPrivate::eat_ws) {
- parseStack->pop();
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: eat_ws (cont)");
-#endif
- }
- if (!(this->*function)()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseProlog, state);
- return false;
- }
- }
- }
-
- for (;;) {
- switch (state) {
- case DocType:
- if (doctype_read) {
- reportParseError(QLatin1String(XMLERR_MORETHANONEDOCTYPE));
- return false;
- } else {
- doctype_read = false;
- }
- break;
- case Comment:
- if (lexicalHnd) {
- if (!lexicalHnd->comment(string())) {
- reportParseError(lexicalHnd->errorString());
- return false;
- }
- }
- state = CommentR;
- break;
- case PInstr:
- // call the handler
- if (contentHnd) {
- if (xmldecl_possible && !xmlVersion.isEmpty()) {
- QString value(QLatin1String("version='"));
- value += xmlVersion;
- value += QLatin1Char('\'');
- if (!encoding.isEmpty()) {
- value += QLatin1String(" encoding='");
- value += encoding;
- value += QLatin1Char('\'');
- }
- if (standalone == QXmlSimpleReaderPrivate::Yes) {
- value += QLatin1String(" standalone='yes'");
- } else if (standalone == QXmlSimpleReaderPrivate::No) {
- value += QLatin1String(" standalone='no'");
- }
- if (!contentHnd->processingInstruction(QLatin1String("xml"), value)) {
- reportParseError(contentHnd->errorString());
- return false;
- }
- } else {
- if (!contentHnd->processingInstruction(name(), string())) {
- reportParseError(contentHnd->errorString());
- return false;
- }
- }
- }
- // XML declaration only on first position possible
- xmldecl_possible = false;
- state = PInstrR;
- break;
- case Done:
- return true;
- case -1:
- reportParseError(QLatin1String(XMLERR_ERRORPARSINGELEMENT));
- return false;
- }
-
- if (atEnd()) {
- unexpectedEof(&QXmlSimpleReaderPrivate::parseProlog, state);
- return false;
- }
- if (is_S(c)) {
- input = InpWs;
- } else if (c == QLatin1Char('<')) {
- input = InpLt;
- } else if (c == QLatin1Char('?')) {
- input = InpQm;
- } else if (c == QLatin1Char('!')) {
- input = InpEm;
- } else if (c == QLatin1Char('D')) {
- input = InpD;
- } else if (c == QLatin1Char('-')) {
- input = InpDash;
- } else {
- input = InpUnknown;
- }
- state = table[state][input];
-
- switch (state) {
- case EatWS:
- // XML declaration only on first position possible
- xmldecl_possible = false;
- if (!eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseProlog, state);
- return false;
- }
- break;
- case Lt:
- next();
- break;
- case Em:
- // XML declaration only on first position possible
- xmldecl_possible = false;
- next();
- break;
- case DocType:
- if (!parseDoctype()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseProlog, state);
- return false;
- }
- break;
- case Comment:
- case CommentR:
- if (!parseComment()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseProlog, state);
- return false;
- }
- break;
- case PInstr:
- case PInstrR:
- parsePI_xmldecl = xmldecl_possible;
- if (!parsePI()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseProlog, state);
- return false;
- }
- break;
- }
- }
- return false;
-}
-
-/*
- Parse an element [39].
-
- Precondition: the opening '<' is already read.
-*/
-bool QXmlSimpleReaderPrivate::parseElement()
-{
- const int Init = 0;
- const int ReadName = 1;
- const int Ws1 = 2;
- const int STagEnd = 3;
- const int STagEnd2 = 4;
- const int ETagBegin = 5;
- const int ETagBegin2 = 6;
- const int Ws2 = 7;
- const int EmptyTag = 8;
- const int Attrib = 9;
- const int AttribPro = 10; // like Attrib, but processAttribute was already called
- const int Ws3 = 11;
- const int Done = 12;
-
- const int InpWs = 0; // whitespace
- const int InpNameBe = 1; // NameBeginning
- const int InpGt = 2; // >
- const int InpSlash = 3; // /
- const int InpUnknown = 4;
-
- static const int table[12][5] = {
- /* InpWs InpNameBe InpGt InpSlash InpUnknown */
- { -1, ReadName, -1, -1, -1 }, // Init
- { Ws1, Attrib, STagEnd, EmptyTag, -1 }, // ReadName
- { -1, Attrib, STagEnd, EmptyTag, -1 }, // Ws1
- { STagEnd2, STagEnd2, STagEnd2, STagEnd2, STagEnd2 }, // STagEnd
- { -1, -1, -1, ETagBegin, -1 }, // STagEnd2
- { -1, ETagBegin2, -1, -1, -1 }, // ETagBegin
- { Ws2, -1, Done, -1, -1 }, // ETagBegin2
- { -1, -1, Done, -1, -1 }, // Ws2
- { -1, -1, Done, -1, -1 }, // EmptyTag
- { Ws3, Attrib, STagEnd, EmptyTag, -1 }, // Attrib
- { Ws3, Attrib, STagEnd, EmptyTag, -1 }, // AttribPro
- { -1, Attrib, STagEnd, EmptyTag, -1 } // Ws3
- };
- int state;
- int input;
-
- if (parseStack == nullptr|| parseStack->isEmpty()) {
- state = Init;
- } else {
- state = parseStack->pop().state;
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: parseElement (cont) in state %d", state);
-#endif
- if (!parseStack->isEmpty()) {
- ParseFunction function = parseStack->top().function;
- if (function == &QXmlSimpleReaderPrivate::eat_ws) {
- parseStack->pop();
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: eat_ws (cont)");
-#endif
- }
- if (!(this->*function)()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseElement, state);
- return false;
- }
- }
- }
-
- for (;;) {
- switch (state) {
- case ReadName:
- // store it on the stack
- tags.push(name());
- // empty the attributes
- attList.clear();
- if (useNamespaces)
- namespaceSupport.pushContext();
- break;
- case ETagBegin2:
- if (!processElementETagBegin2())
- return false;
- break;
- case Attrib:
- if (!processElementAttribute())
- return false;
- state = AttribPro;
- break;
- case Done:
- return true;
- case -1:
- reportParseError(QLatin1String(XMLERR_ERRORPARSINGELEMENT));
- return false;
- }
-
- if (atEnd()) {
- unexpectedEof(&QXmlSimpleReaderPrivate::parseElement, state);
- return false;
- }
- if (fastDetermineNameChar(c) == NameBeginning) {
- input = InpNameBe;
- } else if (c == QLatin1Char('>')) {
- input = InpGt;
- } else if (is_S(c)) {
- input = InpWs;
- } else if (c == QLatin1Char('/')) {
- input = InpSlash;
- } else {
- input = InpUnknown;
- }
- state = table[state][input];
-
- switch (state) {
- case ReadName:
- parseName_useRef = false;
- if (!parseName()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseElement, state);
- return false;
- }
- break;
- case Ws1:
- case Ws2:
- case Ws3:
- if (!eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseElement, state);
- return false;
- }
- break;
- case STagEnd:
- // call the handler
- if (contentHnd) {
- if (useNamespaces) {
- QString uri, lname;
- namespaceSupport.processName(tags.top(), false, uri, lname);
- if (!contentHnd->startElement(uri, lname, tags.top(), attList)) {
- reportParseError(contentHnd->errorString());
- return false;
- }
- } else {
- if (!contentHnd->startElement(QString(), QString(), tags.top(), attList)) {
- reportParseError(contentHnd->errorString());
- return false;
- }
- }
- }
- next();
- break;
- case STagEnd2:
- if (!parseContent()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseElement, state);
- return false;
- }
- break;
- case ETagBegin:
- next();
- break;
- case ETagBegin2:
- // get the name of the tag
- parseName_useRef = false;
- if (!parseName()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseElement, state);
- return false;
- }
- break;
- case EmptyTag:
- if (tags.empty()) {
- reportParseError(QLatin1String(XMLERR_TAGMISMATCH));
- return false;
- }
- if (!processElementEmptyTag())
- return false;
- next();
- break;
- case Attrib:
- case AttribPro:
- // get name and value of attribute
- if (!parseAttribute()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseElement, state);
- return false;
- }
- break;
- case Done:
- next();
- break;
- }
- }
- return false;
-}
-
-/*
- Helper to break down the size of the code in the case statement.
- Return false on error, otherwise true.
-*/
-bool QXmlSimpleReaderPrivate::processElementEmptyTag()
-{
- QString uri, lname;
- // pop the stack and call the handler
- if (contentHnd) {
- if (useNamespaces) {
- // report startElement first...
- namespaceSupport.processName(tags.top(), false, uri, lname);
- if (!contentHnd->startElement(uri, lname, tags.top(), attList)) {
- reportParseError(contentHnd->errorString());
- return false;
- }
- // ... followed by endElement...
- const bool endElementReturnedFalse = !contentHnd->endElement(uri, lname, tags.top());
- tags.pop();
- if (endElementReturnedFalse) {
- reportParseError(contentHnd->errorString());
- return false;
- }
- // ... followed by endPrefixMapping
- QStringList prefixesBefore, prefixesAfter;
- if (contentHnd) {
- prefixesBefore = namespaceSupport.prefixes();
- }
- namespaceSupport.popContext();
- // call the handler for prefix mapping
- prefixesAfter = namespaceSupport.prefixes();
- for (QStringList::Iterator it = prefixesBefore.begin(); it != prefixesBefore.end(); ++it) {
- if (!prefixesAfter.contains(*it)) {
- if (!contentHnd->endPrefixMapping(*it)) {
- reportParseError(contentHnd->errorString());
- return false;
- }
- }
- }
- } else {
- // report startElement first...
- if (!contentHnd->startElement(QString(), QString(), tags.top(), attList)) {
- reportParseError(contentHnd->errorString());
- return false;
- }
- // ... followed by endElement
- const bool endElementReturnedFalse = !contentHnd->endElement(QString(), QString(), tags.top());
- tags.pop();
- if (endElementReturnedFalse) {
- reportParseError(contentHnd->errorString());
- return false;
- }
- }
- } else {
- tags.pop();
- namespaceSupport.popContext();
- }
- return true;
-}
-/*
- Helper to break down the size of the code in the case statement.
- Return false on error, otherwise true.
-*/
-bool QXmlSimpleReaderPrivate::processElementETagBegin2()
-{
- const QString &name = QXmlSimpleReaderPrivate::name();
-
- // pop the stack and compare it with the name
- const bool nameIsTagsTop = tags.top() == name;
- tags.pop();
- if (!nameIsTagsTop) {
- reportParseError(QLatin1String(XMLERR_TAGMISMATCH));
- return false;
- }
- // call the handler
- if (contentHnd) {
- QString uri, lname;
-
- if (useNamespaces)
- namespaceSupport.processName(name, false, uri, lname);
- if (!contentHnd->endElement(uri, lname, name)) {
- reportParseError(contentHnd->errorString());
- return false;
- }
- }
- if (useNamespaces) {
- NamespaceMap prefixesBefore, prefixesAfter;
- if (contentHnd)
- prefixesBefore = namespaceSupport.d->ns;
-
- namespaceSupport.popContext();
- // call the handler for prefix mapping
- if (contentHnd) {
- prefixesAfter = namespaceSupport.d->ns;
- if (prefixesBefore.size() != prefixesAfter.size()) {
- for (NamespaceMap::const_iterator it = prefixesBefore.constBegin(); it != prefixesBefore.constEnd(); ++it) {
- if (!it.key().isEmpty() && !prefixesAfter.contains(it.key())) {
- if (!contentHnd->endPrefixMapping(it.key())) {
- reportParseError(contentHnd->errorString());
- return false;
- }
- }
- }
- }
- }
- }
- return true;
-}
-/*
- Helper to break down the size of the code in the case statement.
- Return false on error, otherwise true.
-*/
-bool QXmlSimpleReaderPrivate::processElementAttribute()
-{
- QString uri, lname, prefix;
- const QString &name = QXmlSimpleReaderPrivate::name();
- const QString &string = QXmlSimpleReaderPrivate::string();
-
- // add the attribute to the list
- if (useNamespaces) {
- // is it a namespace declaration?
- namespaceSupport.splitName(name, prefix, lname);
- if (prefix == QLatin1String("xmlns")) {
- // namespace declaration
- namespaceSupport.setPrefix(lname, string);
- if (useNamespacePrefixes) {
- // according to http://www.w3.org/2000/xmlns/, the "prefix"
- // xmlns maps to the namespace name
- // http://www.w3.org/2000/xmlns/
- attList.append(name, QLatin1String("http://www.w3.org/2000/xmlns/"), lname, string);
- }
- // call the handler for prefix mapping
- if (contentHnd) {
- if (!contentHnd->startPrefixMapping(lname, string)) {
- reportParseError(contentHnd->errorString());
- return false;
- }
- }
- } else {
- // no namespace delcaration
- namespaceSupport.processName(name, true, uri, lname);
- attList.append(name, uri, lname, string);
- }
- } else {
- // no namespace support
- attList.append(name, uri, lname, string);
- }
- return true;
-}
-
-/*
- Parse a content [43].
-
- A content is only used between tags. If a end tag is found the < is already
- read and the head stand on the '/' of the end tag '</name>'.
-*/
-bool QXmlSimpleReaderPrivate::parseContent()
-{
- const signed char Init = 0;
- const signed char ChD = 1; // CharData
- const signed char ChD1 = 2; // CharData help state
- const signed char ChD2 = 3; // CharData help state
- const signed char Ref = 4; // Reference
- const signed char Lt = 5; // '<' read
- const signed char PInstr = 6; // PI
- const signed char PInstrR = 7; // same as PInstr, but already reported
- const signed char Elem = 8; // Element
- const signed char Em = 9; // '!' read
- const signed char Com = 10; // Comment
- const signed char ComR = 11; // same as Com, but already reported
- const signed char CDS = 12; // CDSect
- const signed char CDS1 = 13; // read a CDSect
- const signed char CDS2 = 14; // read a CDSect (help state)
- const signed char CDS3 = 15; // read a CDSect (help state)
- const signed char Done = 16; // finished reading content
-
- const signed char InpLt = 0; // <
- const signed char InpGt = 1; // >
- const signed char InpSlash = 2; // /
- const signed char InpQMark = 3; // ?
- const signed char InpEMark = 4; // !
- const signed char InpAmp = 5; // &
- const signed char InpDash = 6; // -
- const signed char InpOpenB = 7; // [
- const signed char InpCloseB = 8; //]
- const signed char InpUnknown = 9;
-
- static const signed char mapCLT2FSMChar[] = {
- InpUnknown, // white space
- InpUnknown, // %
- InpAmp, // &
- InpGt, // >
- InpLt, // <
- InpSlash, // /
- InpQMark, // ?
- InpEMark, // !
- InpDash, // -
- InpCloseB, //]
- InpOpenB, // [
- InpUnknown, // =
- InpUnknown, // "
- InpUnknown, // '
- InpUnknown // unknown
- };
-
- static const signed char table[16][10] = {
- /* InpLt InpGt InpSlash InpQMark InpEMark InpAmp InpDash InpOpenB InpCloseB InpUnknown */
- { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD1, ChD }, // Init
- { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD1, ChD }, // ChD
- { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD2, ChD }, // ChD1
- { Lt, -1, ChD, ChD, ChD, Ref, ChD, ChD, ChD2, ChD }, // ChD2
- { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD, ChD }, // Ref (same as Init)
- { -1, -1, Done, PInstr, Em, -1, -1, -1, -1, Elem }, // Lt
- { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD, ChD }, // PInstr (same as Init)
- { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD, ChD }, // PInstrR
- { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD, ChD }, // Elem (same as Init)
- { -1, -1, -1, -1, -1, -1, Com, CDS, -1, -1 }, // Em
- { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD, ChD }, // Com (same as Init)
- { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD, ChD }, // ComR
- { CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS2, CDS1 }, // CDS
- { CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS2, CDS1 }, // CDS1
- { CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS3, CDS1 }, // CDS2
- { CDS1, Init, CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS3, CDS1 } // CDS3
- };
- signed char state;
- signed char input;
-
- if (parseStack == nullptr || parseStack->isEmpty()) {
- contentCharDataRead = false;
- state = Init;
- } else {
- state = parseStack->pop().state;
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: parseContent (cont) in state %d", state);
-#endif
- if (!parseStack->isEmpty()) {
- ParseFunction function = parseStack->top().function;
- if (function == &QXmlSimpleReaderPrivate::eat_ws) {
- parseStack->pop();
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: eat_ws (cont)");
-#endif
- }
- if (!(this->*function)()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseContent, state);
- return false;
- }
- }
- }
-
- for (;;) {
- switch (state) {
- case Ref:
- if (!contentCharDataRead)
- contentCharDataRead = parseReference_charDataRead;
- break;
- case PInstr:
- if (contentHnd) {
- if (!contentHnd->processingInstruction(name(),string())) {
- reportParseError(contentHnd->errorString());
- return false;
- }
- }
- state = PInstrR;
- break;
- case Com:
- if (lexicalHnd) {
- if (!lexicalHnd->comment(string())) {
- reportParseError(lexicalHnd->errorString());
- return false;
- }
- }
- state = ComR;
- break;
- case CDS:
- stringClear();
- break;
- case CDS2:
- if (!atEnd() && c != QLatin1Char(']'))
- stringAddC(QLatin1Char(']'));
- break;
- case CDS3:
- // test if this skipping was legal
- if (!atEnd()) {
- if (c == QLatin1Char('>')) {
- // the end of the CDSect
- if (lexicalHnd) {
- if (!lexicalHnd->startCDATA()) {
- reportParseError(lexicalHnd->errorString());
- return false;
- }
- }
- if (contentHnd) {
- if (!contentHnd->characters(string())) {
- reportParseError(contentHnd->errorString());
- return false;
- }
- }
- if (lexicalHnd) {
- if (!lexicalHnd->endCDATA()) {
- reportParseError(lexicalHnd->errorString());
- return false;
- }
- }
- } else if (c == QLatin1Char(']')) {
- // three or more ']'
- stringAddC(QLatin1Char(']'));
- } else {
- // after ']]' comes another character
- stringAddC(QLatin1Char(']'));
- stringAddC(QLatin1Char(']'));
- }
- }
- break;
- case Done:
- // call the handler for CharData
- if (contentHnd) {
- if (contentCharDataRead) {
- if (reportWhitespaceCharData || !string().simplified().isEmpty()) {
- if (!contentHnd->characters(string())) {
- reportParseError(contentHnd->errorString());
- return false;
- }
- }
- }
- }
- // Done
- return true;
- case -1:
- // Error
- reportParseError(QLatin1String(XMLERR_ERRORPARSINGCONTENT));
- return false;
- }
-
- // get input (use lookup-table instead of nested ifs for performance
- // reasons)
- if (atEnd()) {
- unexpectedEof(&QXmlSimpleReaderPrivate::parseContent, state);
- return false;
- }
- if (c.row()) {
- input = InpUnknown;
- } else {
- input = mapCLT2FSMChar[charLookupTable[c.cell()]];
- }
- state = table[state][input];
-
- switch (state) {
- case Init:
- // skip the ending '>' of a CDATASection
- next();
- break;
- case ChD:
- // on first call: clear string
- if (!contentCharDataRead) {
- contentCharDataRead = true;
- stringClear();
- }
- stringAddC();
- if (reportEntities) {
- if (!reportEndEntities())
- return false;
- }
- next();
- break;
- case ChD1:
- // on first call: clear string
- if (!contentCharDataRead) {
- contentCharDataRead = true;
- stringClear();
- }
- stringAddC();
- if (reportEntities) {
- if (!reportEndEntities())
- return false;
- }
- next();
- break;
- case ChD2:
- stringAddC();
- if (reportEntities) {
- if (!reportEndEntities())
- return false;
- }
- next();
- break;
- case Ref:
- if (!contentCharDataRead) {
- // reference may be CharData; so clear string to be safe
- stringClear();
- parseReference_context = InContent;
- if (!parseReference()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseContent, state);
- return false;
- }
- } else {
- if (reportEntities) {
- // report character data in chunks
- if (contentHnd) {
- if (reportWhitespaceCharData || !string().simplified().isEmpty()) {
- if (!contentHnd->characters(string())) {
- reportParseError(contentHnd->errorString());
- return false;
- }
- }
- }
- stringClear();
- }
- parseReference_context = InContent;
- if (!parseReference()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseContent, state);
- return false;
- }
- }
- break;
- case Lt:
- // call the handler for CharData
- if (contentHnd) {
- if (contentCharDataRead) {
- if (reportWhitespaceCharData || !string().simplified().isEmpty()) {
- if (!contentHnd->characters(string())) {
- reportParseError(contentHnd->errorString());
- return false;
- }
- }
- }
- }
- contentCharDataRead = false;
- next();
- break;
- case PInstr:
- case PInstrR:
- parsePI_xmldecl = false;
- if (!parsePI()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseContent, state);
- return false;
- }
- break;
- case Elem:
- if (!parseElement()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseContent, state);
- return false;
- }
- break;
- case Em:
- next();
- break;
- case Com:
- case ComR:
- if (!parseComment()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseContent, state);
- return false;
- }
- break;
- case CDS:
- parseString_s = QLatin1String("[CDATA[");
- if (!parseString()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseContent, state);
- return false;
- }
- break;
- case CDS1:
- stringAddC();
- next();
- break;
- case CDS2:
- // skip ']'
- next();
- break;
- case CDS3:
- // skip ']'...
- next();
- break;
- }
- }
- return false;
-}
-
-bool QXmlSimpleReaderPrivate::reportEndEntities()
-{
- int count = (int)xmlRefStack.count();
- while (count != 0 && xmlRefStack.top().isEmpty()) {
- if (contentHnd) {
- if (reportWhitespaceCharData || !string().simplified().isEmpty()) {
- if (!contentHnd->characters(string())) {
- reportParseError(contentHnd->errorString());
- return false;
- }
- }
- }
- stringClear();
- if (lexicalHnd) {
- if (!lexicalHnd->endEntity(xmlRefStack.top().name)) {
- reportParseError(lexicalHnd->errorString());
- return false;
- }
- }
- xmlRefStack.pop_back();
- count--;
- }
- return true;
-}
-
-/*
- Parse Misc [27].
-*/
-bool QXmlSimpleReaderPrivate::parseMisc()
-{
- const signed char Init = 0;
- const signed char Lt = 1; // '<' was read
- const signed char Comment = 2; // read comment
- const signed char eatWS = 3; // eat whitespaces
- const signed char PInstr = 4; // read PI
- const signed char Comment2 = 5; // read comment
-
- const signed char InpWs = 0; // S
- const signed char InpLt = 1; // <
- const signed char InpQm = 2; // ?
- const signed char InpEm = 3; // !
- const signed char InpUnknown = 4;
-
- static const signed char table[3][5] = {
- /* InpWs InpLt InpQm InpEm InpUnknown */
- { eatWS, Lt, -1, -1, -1 }, // Init
- { -1, -1, PInstr,Comment, -1 }, // Lt
- { -1, -1, -1, -1, Comment2 } // Comment
- };
- signed char state;
- signed char input;
-
- if (parseStack == nullptr || parseStack->isEmpty()) {
- state = Init;
- } else {
- state = parseStack->pop().state;
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: parseMisc (cont) in state %d", state);
-#endif
- if (!parseStack->isEmpty()) {
- ParseFunction function = parseStack->top().function;
- if (function == &QXmlSimpleReaderPrivate::eat_ws) {
- parseStack->pop();
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: eat_ws (cont)");
-#endif
- }
- if (!(this->*function)()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseMisc, state);
- return false;
- }
- }
- }
-
- for (;;) {
- switch (state) {
- case eatWS:
- return true;
- case PInstr:
- if (contentHnd) {
- if (!contentHnd->processingInstruction(name(),string())) {
- reportParseError(contentHnd->errorString());
- return false;
- }
- }
- return true;
- case Comment2:
- if (lexicalHnd) {
- if (!lexicalHnd->comment(string())) {
- reportParseError(lexicalHnd->errorString());
- return false;
- }
- }
- return true;
- case -1:
- // Error
- reportParseError(QLatin1String(XMLERR_UNEXPECTEDCHARACTER));
- return false;
- }
-
- if (atEnd()) {
- unexpectedEof(&QXmlSimpleReaderPrivate::parseMisc, state);
- return false;
- }
- if (is_S(c)) {
- input = InpWs;
- } else if (c == QLatin1Char('<')) {
- input = InpLt;
- } else if (c == QLatin1Char('?')) {
- input = InpQm;
- } else if (c == QLatin1Char('!')) {
- input = InpEm;
- } else {
- input = InpUnknown;
- }
- state = table[state][input];
-
- switch (state) {
- case eatWS:
- if (!eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseMisc, state);
- return false;
- }
- break;
- case Lt:
- next();
- break;
- case PInstr:
- parsePI_xmldecl = false;
- if (!parsePI()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseMisc, state);
- return false;
- }
- break;
- case Comment:
- next();
- break;
- case Comment2:
- if (!parseComment()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseMisc, state);
- return false;
- }
- break;
- }
- }
- return false;
-}
-
-/*
- Parse a processing instruction [16].
-
- If xmldec is true, it tries to parse a PI or a XML declaration [23].
-
- Precondition: the beginning '<' of the PI is already read and the head stand
- on the '?' of '<?'.
-
- If this funktion was successful, the head-position is on the first
- character after the PI.
-*/
-bool QXmlSimpleReaderPrivate::parsePI()
-{
- const signed char Init = 0;
- const signed char QmI = 1; // ? was read
- const signed char Name = 2; // read Name
- const signed char XMLDecl = 3; // read XMLDecl
- const signed char Ws1 = 4; // eat ws after "xml" of XMLDecl
- const signed char PInstr = 5; // read PI
- const signed char Ws2 = 6; // eat ws after Name of PI
- const signed char Version = 7; // read versionInfo
- const signed char Ws3 = 8; // eat ws after versionInfo
- const signed char EorSD = 9; // read EDecl or SDDecl
- const signed char Ws4 = 10; // eat ws after EDecl or SDDecl
- const signed char SD = 11; // read SDDecl
- const signed char Ws5 = 12; // eat ws after SDDecl
- const signed char ADone = 13; // almost done
- const signed char Char = 14; // Char was read
- const signed char Qm = 15; // Qm was read
- const signed char Done = 16; // finished reading content
-
- const signed char InpWs = 0; // whitespace
- const signed char InpNameBe = 1; // NameBeginning
- const signed char InpGt = 2; // >
- const signed char InpQm = 3; // ?
- const signed char InpUnknown = 4;
-
- static const signed char table[16][5] = {
- /* InpWs, InpNameBe InpGt InpQm InpUnknown */
- { -1, -1, -1, QmI, -1 }, // Init
- { -1, Name, -1, -1, -1 }, // QmI
- { -1, -1, -1, -1, -1 }, // Name (this state is left not through input)
- { Ws1, -1, -1, -1, -1 }, // XMLDecl
- { -1, Version, -1, -1, -1 }, // Ws1
- { Ws2, -1, -1, Qm, -1 }, // PInstr
- { Char, Char, Char, Qm, Char }, // Ws2
- { Ws3, -1, -1, ADone, -1 }, // Version
- { -1, EorSD, -1, ADone, -1 }, // Ws3
- { Ws4, -1, -1, ADone, -1 }, // EorSD
- { -1, SD, -1, ADone, -1 }, // Ws4
- { Ws5, -1, -1, ADone, -1 }, // SD
- { -1, -1, -1, ADone, -1 }, // Ws5
- { -1, -1, Done, -1, -1 }, // ADone
- { Char, Char, Char, Qm, Char }, // Char
- { Char, Char, Done, Qm, Char }, // Qm
- };
- signed char state;
- signed char input;
-
- if (parseStack == nullptr || parseStack->isEmpty()) {
- state = Init;
- } else {
- state = parseStack->pop().state;
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: parsePI (cont) in state %d", state);
-#endif
- if (!parseStack->isEmpty()) {
- ParseFunction function = parseStack->top().function;
- if (function == &QXmlSimpleReaderPrivate::eat_ws) {
- parseStack->pop();
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: eat_ws (cont)");
-#endif
- }
- if (!(this->*function)()) {
- parseFailed(&QXmlSimpleReaderPrivate::parsePI, state);
- return false;
- }
- }
- }
-
- for (;;) {
- switch (state) {
- case Name:
- // test what name was read and determine the next state
- // (not very beautiful, I admit)
- if (name().toLower() == QLatin1String("xml")) {
- if (parsePI_xmldecl && name() == QLatin1String("xml")) {
- state = XMLDecl;
- } else {
- reportParseError(QLatin1String(XMLERR_INVALIDNAMEFORPI));
- return false;
- }
- } else {
- state = PInstr;
- stringClear();
- }
- break;
- case Version:
- // get version (syntax like an attribute)
- if (name() != QLatin1String("version")) {
- reportParseError(QLatin1String(XMLERR_VERSIONEXPECTED));
- return false;
- }
- xmlVersion = string();
- break;
- case EorSD:
- // get the EDecl or SDDecl (syntax like an attribute)
- if (name() == QLatin1String("standalone")) {
- if (string()== QLatin1String("yes")) {
- standalone = QXmlSimpleReaderPrivate::Yes;
- } else if (string() == QLatin1String("no")) {
- standalone = QXmlSimpleReaderPrivate::No;
- } else {
- reportParseError(QLatin1String(XMLERR_WRONGVALUEFORSDECL));
- return false;
- }
- } else if (name() == QLatin1String("encoding")) {
- encoding = string();
- } else {
- reportParseError(QLatin1String(XMLERR_EDECLORSDDECLEXPECTED));
- return false;
- }
- break;
- case SD:
- if (name() != QLatin1String("standalone")) {
- reportParseError(QLatin1String(XMLERR_SDDECLEXPECTED));
- return false;
- }
- if (string() == QLatin1String("yes")) {
- standalone = QXmlSimpleReaderPrivate::Yes;
- } else if (string() == QLatin1String("no")) {
- standalone = QXmlSimpleReaderPrivate::No;
- } else {
- reportParseError(QLatin1String(XMLERR_WRONGVALUEFORSDECL));
- return false;
- }
- break;
- case Qm:
- // test if the skipping was legal
- if (!atEnd() && c != QLatin1Char('>'))
- stringAddC(QLatin1Char('?'));
- break;
- case Done:
- return true;
- case -1:
- // Error
- reportParseError(QLatin1String(XMLERR_UNEXPECTEDCHARACTER));
- return false;
- }
-
- if (atEnd()) {
- unexpectedEof(&QXmlSimpleReaderPrivate::parsePI, state);
- return false;
- }
- if (is_S(c)) {
- input = InpWs;
- } else if (determineNameChar(c) == NameBeginning) {
- input = InpNameBe;
- } else if (c == QLatin1Char('>')) {
- input = InpGt;
- } else if (c == QLatin1Char('?')) {
- input = InpQm;
- } else {
- input = InpUnknown;
- }
- state = table[state][input];
-
- switch (state) {
- case QmI:
- next();
- break;
- case Name:
- parseName_useRef = false;
- if (!parseName()) {
- parseFailed(&QXmlSimpleReaderPrivate::parsePI, state);
- return false;
- }
- break;
- case Ws1:
- case Ws2:
- case Ws3:
- case Ws4:
- case Ws5:
- if (!eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parsePI, state);
- return false;
- }
- break;
- case Version:
- if (!parseAttribute()) {
- parseFailed(&QXmlSimpleReaderPrivate::parsePI, state);
- return false;
- }
- break;
- case EorSD:
- if (!parseAttribute()) {
- parseFailed(&QXmlSimpleReaderPrivate::parsePI, state);
- return false;
- }
- break;
- case SD:
- // get the SDDecl (syntax like an attribute)
- if (standalone != QXmlSimpleReaderPrivate::Unknown) {
- // already parsed the standalone declaration
- reportParseError(QLatin1String(XMLERR_UNEXPECTEDCHARACTER));
- return false;
- }
- if (!parseAttribute()) {
- parseFailed(&QXmlSimpleReaderPrivate::parsePI, state);
- return false;
- }
- break;
- case ADone:
- next();
- break;
- case Char:
- stringAddC();
- next();
- break;
- case Qm:
- // skip the '?'
- next();
- break;
- case Done:
- next();
- break;
- }
- }
- return false;
-}
-
-/*
- Parse a document type definition (doctypedecl [28]).
-
- Precondition: the beginning '<!' of the doctype is already read the head
- stands on the 'D' of '<!DOCTYPE'.
-
- If this function was successful, the head-position is on the first
- character after the document type definition.
-*/
-bool QXmlSimpleReaderPrivate::parseDoctype()
-{
- const signed char Init = 0;
- const signed char Doctype = 1; // read the doctype
- const signed char Ws1 = 2; // eat_ws
- const signed char Doctype2 = 3; // read the doctype, part 2
- const signed char Ws2 = 4; // eat_ws
- const signed char Sys = 5; // read SYSTEM or PUBLIC
- const signed char Ws3 = 6; // eat_ws
- const signed char MP = 7; // markupdecl or PEReference
- const signed char MPR = 8; // same as MP, but already reported
- const signed char PER = 9; // PERReference
- const signed char Mup = 10; // markupdecl
- const signed char Ws4 = 11; // eat_ws
- const signed char MPE = 12; // end of markupdecl or PEReference
- const signed char Done = 13;
-
- const signed char InpWs = 0;
- const signed char InpD = 1; // 'D'
- const signed char InpS = 2; // 'S' or 'P'
- const signed char InpOB = 3; // [
- const signed char InpCB = 4; //]
- const signed char InpPer = 5; // %
- const signed char InpGt = 6; // >
- const signed char InpUnknown = 7;
-
- static const signed char table[13][8] = {
- /* InpWs, InpD InpS InpOB InpCB InpPer InpGt InpUnknown */
- { -1, Doctype, -1, -1, -1, -1, -1, -1 }, // Init
- { Ws1, -1, -1, -1, -1, -1, -1, -1 }, // Doctype
- { -1, Doctype2, Doctype2, -1, -1, -1, -1, Doctype2 }, // Ws1
- { Ws2, -1, Sys, MP, -1, -1, Done, -1 }, // Doctype2
- { -1, -1, Sys, MP, -1, -1, Done, -1 }, // Ws2
- { Ws3, -1, -1, MP, -1, -1, Done, -1 }, // Sys
- { -1, -1, -1, MP, -1, -1, Done, -1 }, // Ws3
- { -1, -1, -1, -1, MPE, PER, -1, Mup }, // MP
- { -1, -1, -1, -1, MPE, PER, -1, Mup }, // MPR
- { Ws4, -1, -1, -1, MPE, PER, -1, Mup }, // PER
- { Ws4, -1, -1, -1, MPE, PER, -1, Mup }, // Mup
- { -1, -1, -1, -1, MPE, PER, -1, Mup }, // Ws4
- { -1, -1, -1, -1, -1, -1, Done, -1 } // MPE
- };
- signed char state;
- signed char input;
-
- if (parseStack == nullptr || parseStack->isEmpty()) {
- startDTDwasReported = false;
- systemId.clear();
- publicId.clear();
- state = Init;
- } else {
- state = parseStack->pop().state;
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: parseDoctype (cont) in state %d", state);
-#endif
- if (!parseStack->isEmpty()) {
- ParseFunction function = parseStack->top().function;
- if (function == &QXmlSimpleReaderPrivate::eat_ws) {
- parseStack->pop();
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: eat_ws (cont)");
-#endif
- }
- if (!(this->*function)()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseDoctype, state);
- return false;
- }
- }
- }
-
- for (;;) {
- switch (state) {
- case Doctype2:
- doctype = name();
- break;
- case MP:
- if (!startDTDwasReported && lexicalHnd ) {
- startDTDwasReported = true;
- if (!lexicalHnd->startDTD(doctype, publicId, systemId)) {
- reportParseError(lexicalHnd->errorString());
- return false;
- }
- }
- state = MPR;
- break;
- case Done:
- return true;
- case -1:
- // Error
- reportParseError(QLatin1String(XMLERR_ERRORPARSINGDOCTYPE));
- return false;
- }
-
- if (atEnd()) {
- unexpectedEof(&QXmlSimpleReaderPrivate::parseDoctype, state);
- return false;
- }
- if (is_S(c)) {
- input = InpWs;
- } else if (c == QLatin1Char('D')) {
- input = InpD;
- } else if (c == QLatin1Char('S')) {
- input = InpS;
- } else if (c == QLatin1Char('P')) {
- input = InpS;
- } else if (c == QLatin1Char('[')) {
- input = InpOB;
- } else if (c == QLatin1Char(']')) {
- input = InpCB;
- } else if (c == QLatin1Char('%')) {
- input = InpPer;
- } else if (c == QLatin1Char('>')) {
- input = InpGt;
- } else {
- input = InpUnknown;
- }
- state = table[state][input];
-
- switch (state) {
- case Doctype:
- parseString_s = QLatin1String("DOCTYPE");
- if (!parseString()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseDoctype, state);
- return false;
- }
- break;
- case Ws1:
- case Ws2:
- case Ws3:
- case Ws4:
- if (!eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseDoctype, state);
- return false;
- }
- break;
- case Doctype2:
- parseName_useRef = false;
- if (!parseName()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseDoctype, state);
- return false;
- }
- break;
- case Sys:
- parseExternalID_allowPublicID = false;
- if (!parseExternalID()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseDoctype, state);
- return false;
- }
- thisPublicId = publicId;
- thisSystemId = systemId;
- break;
- case MP:
- case MPR:
- if (!next_eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseDoctype, state);
- return false;
- }
- break;
- case PER:
- parsePEReference_context = InDTD;
- if (!parsePEReference()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseDoctype, state);
- return false;
- }
- break;
- case Mup:
- if (dtdRecursionLimit > 0 && parameterEntities.size() > dtdRecursionLimit) {
- reportParseError(QString::fromLatin1(
- "DTD parsing exceeded recursion limit of %1.").arg(dtdRecursionLimit));
- return false;
- }
- if (!parseMarkupdecl()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseDoctype, state);
- return false;
- }
- break;
- case MPE:
- if (!next_eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseDoctype, state);
- return false;
- }
- break;
- case Done:
- if (lexicalHnd) {
- if (!startDTDwasReported) {
- startDTDwasReported = true;
- if (!lexicalHnd->startDTD(doctype, publicId, systemId)) {
- reportParseError(lexicalHnd->errorString());
- return false;
- }
- }
- if (!lexicalHnd->endDTD()) {
- reportParseError(lexicalHnd->errorString());
- return false;
- }
- }
- next();
- break;
- }
- }
- return false;
-}
-
-/*
- Parse a ExternalID [75].
-
- If allowPublicID is true parse ExternalID [75] or PublicID [83].
-*/
-bool QXmlSimpleReaderPrivate::parseExternalID()
-{
- const signed char Init = 0;
- const signed char Sys = 1; // parse 'SYSTEM'
- const signed char SysWS = 2; // parse the whitespace after 'SYSTEM'
- const signed char SysSQ = 3; // parse SystemLiteral with '
- const signed char SysSQ2 = 4; // parse SystemLiteral with '
- const signed char SysDQ = 5; // parse SystemLiteral with "
- const signed char SysDQ2 = 6; // parse SystemLiteral with "
- const signed char Pub = 7; // parse 'PUBLIC'
- const signed char PubWS = 8; // parse the whitespace after 'PUBLIC'
- const signed char PubSQ = 9; // parse PubidLiteral with '
- const signed char PubSQ2 = 10; // parse PubidLiteral with '
- const signed char PubDQ = 11; // parse PubidLiteral with "
- const signed char PubDQ2 = 12; // parse PubidLiteral with "
- const signed char PubE = 13; // finished parsing the PubidLiteral
- const signed char PubWS2 = 14; // parse the whitespace after the PubidLiteral
- const signed char PDone = 15; // done if allowPublicID is true
- const signed char Done = 16;
-
- const signed char InpSQ = 0; // '
- const signed char InpDQ = 1; // "
- const signed char InpS = 2; // S
- const signed char InpP = 3; // P
- const signed char InpWs = 4; // white space
- const signed char InpUnknown = 5;
-
- static const signed char table[15][6] = {
- /* InpSQ InpDQ InpS InpP InpWs InpUnknown */
- { -1, -1, Sys, Pub, -1, -1 }, // Init
- { -1, -1, -1, -1, SysWS, -1 }, // Sys
- { SysSQ, SysDQ, -1, -1, -1, -1 }, // SysWS
- { Done, SysSQ2, SysSQ2, SysSQ2, SysSQ2, SysSQ2 }, // SysSQ
- { Done, SysSQ2, SysSQ2, SysSQ2, SysSQ2, SysSQ2 }, // SysSQ2
- { SysDQ2, Done, SysDQ2, SysDQ2, SysDQ2, SysDQ2 }, // SysDQ
- { SysDQ2, Done, SysDQ2, SysDQ2, SysDQ2, SysDQ2 }, // SysDQ2
- { -1, -1, -1, -1, PubWS, -1 }, // Pub
- { PubSQ, PubDQ, -1, -1, -1, -1 }, // PubWS
- { PubE, -1, PubSQ2, PubSQ2, PubSQ2, PubSQ2 }, // PubSQ
- { PubE, -1, PubSQ2, PubSQ2, PubSQ2, PubSQ2 }, // PubSQ2
- { -1, PubE, PubDQ2, PubDQ2, PubDQ2, PubDQ2 }, // PubDQ
- { -1, PubE, PubDQ2, PubDQ2, PubDQ2, PubDQ2 }, // PubDQ2
- { PDone, PDone, PDone, PDone, PubWS2, PDone }, // PubE
- { SysSQ, SysDQ, PDone, PDone, PDone, PDone } // PubWS2
- };
- signed char state;
- signed char input;
-
- if (parseStack == nullptr || parseStack->isEmpty()) {
- systemId.clear();
- publicId.clear();
- state = Init;
- } else {
- state = parseStack->pop().state;
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: parseExternalID (cont) in state %d", state);
-#endif
- if (!parseStack->isEmpty()) {
- ParseFunction function = parseStack->top().function;
- if (function == &QXmlSimpleReaderPrivate::eat_ws) {
- parseStack->pop();
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: eat_ws (cont)");
-#endif
- }
- if (!(this->*function)()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseExternalID, state);
- return false;
- }
- }
- }
-
- for (;;) {
- switch (state) {
- case PDone:
- if (parseExternalID_allowPublicID) {
- publicId = string();
- return true;
- } else {
- reportParseError(QLatin1String(XMLERR_UNEXPECTEDCHARACTER));
- return false;
- }
- case Done:
- return true;
- case -1:
- // Error
- reportParseError(QLatin1String(XMLERR_UNEXPECTEDCHARACTER));
- return false;
- }
-
- if (atEnd()) {
- unexpectedEof(&QXmlSimpleReaderPrivate::parseExternalID, state);
- return false;
- }
- if (is_S(c)) {
- input = InpWs;
- } else if (c == QLatin1Char('\'')) {
- input = InpSQ;
- } else if (c == QLatin1Char('"')) {
- input = InpDQ;
- } else if (c == QLatin1Char('S')) {
- input = InpS;
- } else if (c == QLatin1Char('P')) {
- input = InpP;
- } else {
- input = InpUnknown;
- }
- state = table[state][input];
-
- switch (state) {
- case Sys:
- parseString_s = QLatin1String("SYSTEM");
- if (!parseString()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseExternalID, state);
- return false;
- }
- break;
- case SysWS:
- if (!eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseExternalID, state);
- return false;
- }
- break;
- case SysSQ:
- case SysDQ:
- stringClear();
- next();
- break;
- case SysSQ2:
- case SysDQ2:
- stringAddC();
- next();
- break;
- case Pub:
- parseString_s = QLatin1String("PUBLIC");
- if (!parseString()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseExternalID, state);
- return false;
- }
- break;
- case PubWS:
- if (!eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseExternalID, state);
- return false;
- }
- break;
- case PubSQ:
- case PubDQ:
- stringClear();
- next();
- break;
- case PubSQ2:
- case PubDQ2:
- stringAddC();
- next();
- break;
- case PubE:
- next();
- break;
- case PubWS2:
- publicId = string();
- if (!eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseExternalID, state);
- return false;
- }
- break;
- case Done:
- systemId = string();
- next();
- break;
- }
- }
- return false;
-}
-
-/*
- Parse a markupdecl [29].
-*/
-bool QXmlSimpleReaderPrivate::parseMarkupdecl()
-{
- const signed char Init = 0;
- const signed char Lt = 1; // < was read
- const signed char Em = 2; // ! was read
- const signed char CE = 3; // E was read
- const signed char Qm = 4; // ? was read
- const signed char Dash = 5; // - was read
- const signed char CA = 6; // A was read
- const signed char CEL = 7; // EL was read
- const signed char CEN = 8; // EN was read
- const signed char CN = 9; // N was read
- const signed char Done = 10;
-
- const signed char InpLt = 0; // <
- const signed char InpQm = 1; // ?
- const signed char InpEm = 2; // !
- const signed char InpDash = 3; // -
- const signed char InpA = 4; // A
- const signed char InpE = 5; // E
- const signed char InpL = 6; // L
- const signed char InpN = 7; // N
- const signed char InpUnknown = 8;
-
- static const signed char table[4][9] = {
- /* InpLt InpQm InpEm InpDash InpA InpE InpL InpN InpUnknown */
- { Lt, -1, -1, -1, -1, -1, -1, -1, -1 }, // Init
- { -1, Qm, Em, -1, -1, -1, -1, -1, -1 }, // Lt
- { -1, -1, -1, Dash, CA, CE, -1, CN, -1 }, // Em
- { -1, -1, -1, -1, -1, -1, CEL, CEN, -1 } // CE
- };
- signed char state;
- signed char input;
-
- if (parseStack == nullptr || parseStack->isEmpty()) {
- state = Init;
- } else {
- state = parseStack->pop().state;
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: parseMarkupdecl (cont) in state %d", state);
-#endif
- if (!parseStack->isEmpty()) {
- ParseFunction function = parseStack->top().function;
- if (function == &QXmlSimpleReaderPrivate::eat_ws) {
- parseStack->pop();
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: eat_ws (cont)");
-#endif
- }
- if (!(this->*function)()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseMarkupdecl, state);
- return false;
- }
- }
- }
-
- for (;;) {
- switch (state) {
- case Qm:
- if (contentHnd) {
- if (!contentHnd->processingInstruction(name(),string())) {
- reportParseError(contentHnd->errorString());
- return false;
- }
- }
- return true;
- case Dash:
- if (lexicalHnd) {
- if (!lexicalHnd->comment(string())) {
- reportParseError(lexicalHnd->errorString());
- return false;
- }
- }
- return true;
- case CA:
- return true;
- case CEL:
- return true;
- case CEN:
- return true;
- case CN:
- return true;
- case Done:
- return true;
- case -1:
- // Error
- reportParseError(QLatin1String(XMLERR_LETTEREXPECTED));
- return false;
- }
-
- if (atEnd()) {
- unexpectedEof(&QXmlSimpleReaderPrivate::parseMarkupdecl, state);
- return false;
- }
- if (c == QLatin1Char('<')) {
- input = InpLt;
- } else if (c == QLatin1Char('?')) {
- input = InpQm;
- } else if (c == QLatin1Char('!')) {
- input = InpEm;
- } else if (c == QLatin1Char('-')) {
- input = InpDash;
- } else if (c == QLatin1Char('A')) {
- input = InpA;
- } else if (c == QLatin1Char('E')) {
- input = InpE;
- } else if (c == QLatin1Char('L')) {
- input = InpL;
- } else if (c == QLatin1Char('N')) {
- input = InpN;
- } else {
- input = InpUnknown;
- }
- state = table[state][input];
-
- switch (state) {
- case Lt:
- next();
- break;
- case Em:
- next();
- break;
- case CE:
- next();
- break;
- case Qm:
- parsePI_xmldecl = false;
- if (!parsePI()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseMarkupdecl, state);
- return false;
- }
- break;
- case Dash:
- if (!parseComment()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseMarkupdecl, state);
- return false;
- }
- break;
- case CA:
- if (!parseAttlistDecl()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseMarkupdecl, state);
- return false;
- }
- break;
- case CEL:
- if (!parseElementDecl()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseMarkupdecl, state);
- return false;
- }
- break;
- case CEN:
- if (!parseEntityDecl()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseMarkupdecl, state);
- return false;
- }
- break;
- case CN:
- if (!parseNotationDecl()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseMarkupdecl, state);
- return false;
- }
- break;
- }
- }
- return false;
-}
-
-/*
- Parse a PEReference [69]
-*/
-bool QXmlSimpleReaderPrivate::parsePEReference()
-{
- const signed char Init = 0;
- const signed char Next = 1;
- const signed char Name = 2;
- const signed char NameR = 3; // same as Name, but already reported
- const signed char Done = 4;
-
- const signed char InpSemi = 0; // ;
- const signed char InpPer = 1; // %
- const signed char InpUnknown = 2;
-
- static const signed char table[4][3] = {
- /* InpSemi InpPer InpUnknown */
- { -1, Next, -1 }, // Init
- { -1, -1, Name }, // Next
- { Done, -1, -1 }, // Name
- { Done, -1, -1 } // NameR
- };
- signed char state;
- signed char input;
-
- if (parseStack == nullptr || parseStack->isEmpty()) {
- state = Init;
- } else {
- state = parseStack->pop().state;
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: parsePEReference (cont) in state %d", state);
-#endif
- if (!parseStack->isEmpty()) {
- ParseFunction function = parseStack->top().function;
- if (function == &QXmlSimpleReaderPrivate::eat_ws) {
- parseStack->pop();
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: eat_ws (cont)");
-#endif
- }
- if (!(this->*function)()) {
- parseFailed(&QXmlSimpleReaderPrivate::parsePEReference, state);
- return false;
- }
- }
- }
-
- for (;;) {
- switch (state) {
- case Name:
- {
- bool skipIt = true;
- QString xmlRefString;
-
- QMap<QString,QString>::Iterator it;
- it = parameterEntities.find(ref());
- if (it != parameterEntities.end()) {
- skipIt = false;
- xmlRefString = *it;
- } else if (entityRes) {
- QMap<QString,QXmlSimpleReaderPrivate::ExternParameterEntity>::Iterator it2;
- it2 = externParameterEntities.find(ref());
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- QXmlInputSource *ret = nullptr;
-QT_WARNING_POP
- if (it2 != externParameterEntities.end()) {
- if (!entityRes->resolveEntity((*it2).publicId, (*it2).systemId, ret)) {
- delete ret;
- reportParseError(entityRes->errorString());
- return false;
- }
- if (ret) {
- QString buffer = ret->data();
- while (!buffer.isEmpty()) {
- xmlRefString += buffer;
- ret->fetchData();
- buffer = ret->data();
- }
- delete ret;
- if (!stripTextDecl(xmlRefString)) {
- reportParseError(QLatin1String(XMLERR_ERRORINTEXTDECL));
- return false;
- }
- skipIt = false;
- }
- }
- }
-
- if (skipIt) {
- if (contentHnd) {
- if (!contentHnd->skippedEntity(QLatin1Char('%') + ref())) {
- reportParseError(contentHnd->errorString());
- return false;
- }
- }
- } else {
- if (parsePEReference_context == InEntityValue) {
- // Included in literal
- if (!insertXmlRef(xmlRefString, ref(), true))
- return false;
- } else if (parsePEReference_context == InDTD) {
- // Included as PE
- if (!insertXmlRef(QLatin1Char(' ') + xmlRefString + QLatin1Char(' '), ref(), false))
- return false;
- }
- }
- }
- state = NameR;
- break;
- case Done:
- return true;
- case -1:
- // Error
- reportParseError(QLatin1String(XMLERR_LETTEREXPECTED));
- return false;
- }
-
- if (atEnd()) {
- unexpectedEof(&QXmlSimpleReaderPrivate::parsePEReference, state);
- return false;
- }
- if (c == QLatin1Char(';')) {
- input = InpSemi;
- } else if (c == QLatin1Char('%')) {
- input = InpPer;
- } else {
- input = InpUnknown;
- }
- state = table[state][input];
-
- switch (state) {
- case Next:
- next();
- break;
- case Name:
- case NameR:
- parseName_useRef = true;
- if (!parseName()) {
- parseFailed(&QXmlSimpleReaderPrivate::parsePEReference, state);
- return false;
- }
- break;
- case Done:
- next();
- break;
- }
- }
- return false;
-}
-
-/*
- Parse a AttlistDecl [52].
-
- Precondition: the beginning '<!' is already read and the head
- stands on the 'A' of '<!ATTLIST'
-*/
-bool QXmlSimpleReaderPrivate::parseAttlistDecl()
-{
- const signed char Init = 0;
- const signed char Attlist = 1; // parse the string "ATTLIST"
- const signed char Ws = 2; // whitespace read
- const signed char Name = 3; // parse name
- const signed char Ws1 = 4; // whitespace read
- const signed char Attdef = 5; // parse the AttDef
- const signed char Ws2 = 6; // whitespace read
- const signed char Atttype = 7; // parse the AttType
- const signed char Ws3 = 8; // whitespace read
- const signed char DDecH = 9; // DefaultDecl with #
- const signed char DefReq = 10; // parse the string "REQUIRED"
- const signed char DefImp = 11; // parse the string "IMPLIED"
- const signed char DefFix = 12; // parse the string "FIXED"
- const signed char Attval = 13; // parse the AttValue
- const signed char Ws4 = 14; // whitespace read
- const signed char Done = 15;
-
- const signed char InpWs = 0; // white space
- const signed char InpGt = 1; // >
- const signed char InpHash = 2; // #
- const signed char InpA = 3; // A
- const signed char InpI = 4; // I
- const signed char InpF = 5; // F
- const signed char InpR = 6; // R
- const signed char InpUnknown = 7;
-
- static const signed char table[15][8] = {
- /* InpWs InpGt InpHash InpA InpI InpF InpR InpUnknown */
- { -1, -1, -1, Attlist, -1, -1, -1, -1 }, // Init
- { Ws, -1, -1, -1, -1, -1, -1, -1 }, // Attlist
- { -1, -1, -1, Name, Name, Name, Name, Name }, // Ws
- { Ws1, Done, Attdef, Attdef, Attdef, Attdef, Attdef, Attdef }, // Name
- { -1, Done, Attdef, Attdef, Attdef, Attdef, Attdef, Attdef }, // Ws1
- { Ws2, -1, -1, -1, -1, -1, -1, -1 }, // Attdef
- { -1, Atttype, Atttype, Atttype, Atttype, Atttype, Atttype, Atttype }, // Ws2
- { Ws3, -1, -1, -1, -1, -1, -1, -1 }, // Attype
- { -1, Attval, DDecH, Attval, Attval, Attval, Attval, Attval }, // Ws3
- { -1, -1, -1, -1, DefImp, DefFix, DefReq, -1 }, // DDecH
- { Ws4, Ws4, -1, -1, -1, -1, -1, -1 }, // DefReq
- { Ws4, Ws4, -1, -1, -1, -1, -1, -1 }, // DefImp
- { Ws3, -1, -1, -1, -1, -1, -1, -1 }, // DefFix
- { Ws4, Ws4, -1, -1, -1, -1, -1, -1 }, // Attval
- { -1, Done, Attdef, Attdef, Attdef, Attdef, Attdef, Attdef } // Ws4
- };
- signed char state;
- signed char input;
-
- if (parseStack == nullptr || parseStack->isEmpty()) {
- state = Init;
- } else {
- state = parseStack->pop().state;
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: parseAttlistDecl (cont) in state %d", state);
-#endif
- if (!parseStack->isEmpty()) {
- ParseFunction function = parseStack->top().function;
- if (function == &QXmlSimpleReaderPrivate::eat_ws) {
- parseStack->pop();
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: eat_ws (cont)");
-#endif
- }
- if (!(this->*function)()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttlistDecl, state);
- return false;
- }
- }
- }
-
- for (;;) {
- switch (state) {
- case Name:
- attDeclEName = name();
- break;
- case Attdef:
- attDeclAName = name();
- break;
- case Done:
- return true;
- case -1:
- // Error
- reportParseError(QLatin1String(XMLERR_LETTEREXPECTED));
- return false;
- }
-
- if (atEnd()) {
- unexpectedEof(&QXmlSimpleReaderPrivate::parseAttlistDecl, state);
- return false;
- }
- if (is_S(c)) {
- input = InpWs;
- } else if (c == QLatin1Char('>')) {
- input = InpGt;
- } else if (c == QLatin1Char('#')) {
- input = InpHash;
- } else if (c == QLatin1Char('A')) {
- input = InpA;
- } else if (c == QLatin1Char('I')) {
- input = InpI;
- } else if (c == QLatin1Char('F')) {
- input = InpF;
- } else if (c == QLatin1Char('R')) {
- input = InpR;
- } else {
- input = InpUnknown;
- }
- state = table[state][input];
-
- switch (state) {
- case Attlist:
- parseString_s = QLatin1String("ATTLIST");
- if (!parseString()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttlistDecl, state);
- return false;
- }
- break;
- case Ws:
- case Ws1:
- case Ws2:
- case Ws3:
- if (!eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttlistDecl, state);
- return false;
- }
- break;
- case Name:
- parseName_useRef = false;
- if (!parseName()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttlistDecl, state);
- return false;
- }
- break;
- case Attdef:
- parseName_useRef = false;
- if (!parseName()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttlistDecl, state);
- return false;
- }
- break;
- case Atttype:
- if (!parseAttType()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttlistDecl, state);
- return false;
- }
- break;
- case DDecH:
- next();
- break;
- case DefReq:
- parseString_s = QLatin1String("REQUIRED");
- if (!parseString()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttlistDecl, state);
- return false;
- }
- break;
- case DefImp:
- parseString_s = QLatin1String("IMPLIED");
- if (!parseString()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttlistDecl, state);
- return false;
- }
- break;
- case DefFix:
- parseString_s = QLatin1String("FIXED");
- if (!parseString()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttlistDecl, state);
- return false;
- }
- break;
- case Attval:
- if (!parseAttValue()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttlistDecl, state);
- return false;
- }
- break;
- case Ws4:
- if (declHnd) {
- // ### not all values are computed yet...
- if (!declHnd->attributeDecl(attDeclEName, attDeclAName, QLatin1String(""), QLatin1String(""), QLatin1String(""))) {
- reportParseError(declHnd->errorString());
- return false;
- }
- }
- if (!eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttlistDecl, state);
- return false;
- }
- break;
- case Done:
- next();
- break;
- }
- }
- return false;
-}
-
-/*
- Parse a AttType [54]
-*/
-bool QXmlSimpleReaderPrivate::parseAttType()
-{
- const signed char Init = 0;
- const signed char ST = 1; // StringType
- const signed char TTI = 2; // TokenizedType starting with 'I'
- const signed char TTI2 = 3; // TokenizedType helpstate
- const signed char TTI3 = 4; // TokenizedType helpstate
- const signed char TTE = 5; // TokenizedType starting with 'E'
- const signed char TTEY = 6; // TokenizedType starting with 'ENTITY'
- const signed char TTEI = 7; // TokenizedType starting with 'ENTITI'
- const signed char N = 8; // N read (TokenizedType or Notation)
- const signed char TTNM = 9; // TokenizedType starting with 'NM'
- const signed char TTNM2 = 10; // TokenizedType helpstate
- const signed char NO = 11; // Notation
- const signed char NO2 = 12; // Notation helpstate
- const signed char NO3 = 13; // Notation helpstate
- const signed char NOName = 14; // Notation, read name
- const signed char NO4 = 15; // Notation helpstate
- const signed char EN = 16; // Enumeration
- const signed char ENNmt = 17; // Enumeration, read Nmtoken
- const signed char EN2 = 18; // Enumeration helpstate
- const signed char ADone = 19; // almost done (make next and accept)
- const signed char Done = 20;
-
- const signed char InpWs = 0; // whitespace
- const signed char InpOp = 1; // (
- const signed char InpCp = 2; //)
- const signed char InpPipe = 3; // |
- const signed char InpC = 4; // C
- const signed char InpE = 5; // E
- const signed char InpI = 6; // I
- const signed char InpM = 7; // M
- const signed char InpN = 8; // N
- const signed char InpO = 9; // O
- const signed char InpR = 10; // R
- const signed char InpS = 11; // S
- const signed char InpY = 12; // Y
- const signed char InpUnknown = 13;
-
- static const signed char table[19][14] = {
- /* InpWs InpOp InpCp InpPipe InpC InpE InpI InpM InpN InpO InpR InpS InpY InpUnknown */
- { -1, EN, -1, -1, ST, TTE, TTI, -1, N, -1, -1, -1, -1, -1 }, // Init
- { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done }, // ST
- { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, TTI2, Done, Done, Done }, // TTI
- { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, TTI3, Done, Done }, // TTI2
- { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done }, // TTI3
- { -1, -1, -1, -1, -1, -1, TTEI, -1, -1, -1, -1, -1, TTEY, -1 }, // TTE
- { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done }, // TTEY
- { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done }, // TTEI
- { -1, -1, -1, -1, -1, -1, -1, TTNM, -1, NO, -1, -1, -1, -1 }, // N
- { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, TTNM2, Done, Done }, // TTNM
- { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done }, // TTNM2
- { NO2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // NO
- { -1, NO3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // NO2
- { NOName, NOName, NOName, NOName, NOName, NOName, NOName, NOName, NOName, NOName, NOName, NOName, NOName, NOName }, // NO3
- { NO4, -1, ADone, NO3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // NOName
- { -1, -1, ADone, NO3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // NO4
- { -1, -1, ENNmt, -1, ENNmt, ENNmt, ENNmt, ENNmt, ENNmt, ENNmt, ENNmt, ENNmt, ENNmt, ENNmt }, // EN
- { EN2, -1, ADone, EN, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // ENNmt
- { -1, -1, ADone, EN, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } // EN2
- };
- signed char state;
- signed char input;
-
- if (parseStack == nullptr || parseStack->isEmpty()) {
- state = Init;
- } else {
- state = parseStack->pop().state;
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: parseAttType (cont) in state %d", state);
-#endif
- if (!parseStack->isEmpty()) {
- ParseFunction function = parseStack->top().function;
- if (function == &QXmlSimpleReaderPrivate::eat_ws) {
- parseStack->pop();
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: eat_ws (cont)");
-#endif
- }
- if (!(this->*function)()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttType, state);
- return false;
- }
- }
- }
-
- for (;;) {
- switch (state) {
- case ADone:
- return true;
- case Done:
- return true;
- case -1:
- // Error
- reportParseError(QLatin1String(XMLERR_LETTEREXPECTED));
- return false;
- }
-
- if (atEnd()) {
- unexpectedEof(&QXmlSimpleReaderPrivate::parseAttType, state);
- return false;
- }
- if (is_S(c)) {
- input = InpWs;
- } else if (c == QLatin1Char('(')) {
- input = InpOp;
- } else if (c == QLatin1Char(')')) {
- input = InpCp;
- } else if (c == QLatin1Char('|')) {
- input = InpPipe;
- } else if (c == QLatin1Char('C')) {
- input = InpC;
- } else if (c == QLatin1Char('E')) {
- input = InpE;
- } else if (c == QLatin1Char('I')) {
- input = InpI;
- } else if (c == QLatin1Char('M')) {
- input = InpM;
- } else if (c == QLatin1Char('N')) {
- input = InpN;
- } else if (c == QLatin1Char('O')) {
- input = InpO;
- } else if (c == QLatin1Char('R')) {
- input = InpR;
- } else if (c == QLatin1Char('S')) {
- input = InpS;
- } else if (c == QLatin1Char('Y')) {
- input = InpY;
- } else {
- input = InpUnknown;
- }
- state = table[state][input];
-
- switch (state) {
- case ST:
- parseString_s = QLatin1String("CDATA");
- if (!parseString()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttType, state);
- return false;
- }
- break;
- case TTI:
- parseString_s = QLatin1String("ID");
- if (!parseString()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttType, state);
- return false;
- }
- break;
- case TTI2:
- parseString_s = QLatin1String("REF");
- if (!parseString()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttType, state);
- return false;
- }
- break;
- case TTI3:
- next(); // S
- break;
- case TTE:
- parseString_s = QLatin1String("ENTIT");
- if (!parseString()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttType, state);
- return false;
- }
- break;
- case TTEY:
- next(); // Y
- break;
- case TTEI:
- parseString_s = QLatin1String("IES");
- if (!parseString()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttType, state);
- return false;
- }
- break;
- case N:
- next(); // N
- break;
- case TTNM:
- parseString_s = QLatin1String("MTOKEN");
- if (!parseString()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttType, state);
- return false;
- }
- break;
- case TTNM2:
- next(); // S
- break;
- case NO:
- parseString_s = QLatin1String("OTATION");
- if (!parseString()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttType, state);
- return false;
- }
- break;
- case NO2:
- if (!eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttType, state);
- return false;
- }
- break;
- case NO3:
- if (!next_eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttType, state);
- return false;
- }
- break;
- case NOName:
- parseName_useRef = false;
- if (!parseName()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttType, state);
- return false;
- }
- break;
- case NO4:
- if (!eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttType, state);
- return false;
- }
- break;
- case EN:
- if (!next_eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttType, state);
- return false;
- }
- break;
- case ENNmt:
- if (!parseNmtoken()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttType, state);
- return false;
- }
- break;
- case EN2:
- if (!eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttType, state);
- return false;
- }
- break;
- case ADone:
- next();
- break;
- }
- }
- return false;
-}
-
-/*
- Parse a AttValue [10]
-
- Precondition: the head stands on the beginning " or '
-
- If this function was successful, the head stands on the first
- character after the closing " or ' and the value of the attribute
- is in string().
-*/
-bool QXmlSimpleReaderPrivate::parseAttValue()
-{
- const signed char Init = 0;
- const signed char Dq = 1; // double quotes were read
- const signed char DqRef = 2; // read references in double quotes
- const signed char DqC = 3; // signed character read in double quotes
- const signed char Sq = 4; // single quotes were read
- const signed char SqRef = 5; // read references in single quotes
- const signed char SqC = 6; // signed character read in single quotes
- const signed char Done = 7;
-
- const signed char InpDq = 0; // "
- const signed char InpSq = 1; // '
- const signed char InpAmp = 2; // &
- const signed char InpLt = 3; // <
- const signed char InpUnknown = 4;
-
- static const signed char table[7][5] = {
- /* InpDq InpSq InpAmp InpLt InpUnknown */
- { Dq, Sq, -1, -1, -1 }, // Init
- { Done, DqC, DqRef, -1, DqC }, // Dq
- { Done, DqC, DqRef, -1, DqC }, // DqRef
- { Done, DqC, DqRef, -1, DqC }, // DqC
- { SqC, Done, SqRef, -1, SqC }, // Sq
- { SqC, Done, SqRef, -1, SqC }, // SqRef
- { SqC, Done, SqRef, -1, SqC } // SqRef
- };
- signed char state;
- signed char input;
-
- if (parseStack == nullptr || parseStack->isEmpty()) {
- state = Init;
- } else {
- state = parseStack->pop().state;
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: parseAttValue (cont) in state %d", state);
-#endif
- if (!parseStack->isEmpty()) {
- ParseFunction function = parseStack->top().function;
- if (function == &QXmlSimpleReaderPrivate::eat_ws) {
- parseStack->pop();
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: eat_ws (cont)");
-#endif
- }
- if (!(this->*function)()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttValue, state);
- return false;
- }
- }
- }
-
- for (;;) {
- switch (state) {
- case Done:
- return true;
- case -1:
- // Error
- reportParseError(QLatin1String(XMLERR_UNEXPECTEDCHARACTER));
- return false;
- }
-
- if (atEnd()) {
- unexpectedEof(&QXmlSimpleReaderPrivate::parseAttValue, state);
- return false;
- }
- if (c == QLatin1Char('"')) {
- input = InpDq;
- } else if (c == QLatin1Char('\'')) {
- input = InpSq;
- } else if (c == QLatin1Char('&')) {
- input = InpAmp;
- } else if (c == QLatin1Char('<')) {
- input = InpLt;
- } else {
- input = InpUnknown;
- }
- state = table[state][input];
-
- switch (state) {
- case Dq:
- case Sq:
- stringClear();
- next();
- break;
- case DqRef:
- case SqRef:
- parseReference_context = InAttributeValue;
- if (!parseReference()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttValue, state);
- return false;
- }
- break;
- case DqC:
- case SqC:
- stringAddC();
- next();
- break;
- case Done:
- next();
- break;
- }
- }
- return false;
-}
-
-/*
- Parse a elementdecl [45].
-
- Precondition: the beginning '<!E' is already read and the head
- stands on the 'L' of '<!ELEMENT'
-*/
-bool QXmlSimpleReaderPrivate::parseElementDecl()
-{
- const signed char Init = 0;
- const signed char Elem = 1; // parse the beginning string
- const signed char Ws1 = 2; // whitespace required
- const signed char Nam = 3; // parse Name
- const signed char Ws2 = 4; // whitespace required
- const signed char Empty = 5; // read EMPTY
- const signed char Any = 6; // read ANY
- const signed char Cont = 7; // read contentspec (except ANY or EMPTY)
- const signed char Mix = 8; // read Mixed
- const signed char Mix2 = 9; //
- const signed char Mix3 = 10; //
- const signed char MixN1 = 11; //
- const signed char MixN2 = 12; //
- const signed char MixN3 = 13; //
- const signed char MixN4 = 14; //
- const signed char Cp = 15; // parse cp
- const signed char Cp2 = 16; //
- const signed char WsD = 17; // eat whitespace before Done
- const signed char Done = 18;
-
- const signed char InpWs = 0;
- const signed char InpGt = 1; // >
- const signed char InpPipe = 2; // |
- const signed char InpOp = 3; // (
- const signed char InpCp = 4; //)
- const signed char InpHash = 5; // #
- const signed char InpQm = 6; // ?
- const signed char InpAst = 7; // *
- const signed char InpPlus = 8; // +
- const signed char InpA = 9; // A
- const signed char InpE = 10; // E
- const signed char InpL = 11; // L
- const signed char InpUnknown = 12;
-
- static const signed char table[18][13] = {
- /* InpWs InpGt InpPipe InpOp InpCp InpHash InpQm InpAst InpPlus InpA InpE InpL InpUnknown */
- { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, Elem, -1 }, // Init
- { Ws1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // Elem
- { -1, -1, -1, -1, -1, -1, -1, -1, -1, Nam, Nam, Nam, Nam }, // Ws1
- { Ws2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // Nam
- { -1, -1, -1, Cont, -1, -1, -1, -1, -1, Any, Empty, -1, -1 }, // Ws2
- { WsD, Done, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // Empty
- { WsD, Done, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // Any
- { -1, -1, -1, Cp, Cp, Mix, -1, -1, -1, Cp, Cp, Cp, Cp }, // Cont
- { Mix2, -1, MixN1, -1, Mix3, -1, -1, -1, -1, -1, -1, -1, -1 }, // Mix
- { -1, -1, MixN1, -1, Mix3, -1, -1, -1, -1, -1, -1, -1, -1 }, // Mix2
- { WsD, Done, -1, -1, -1, -1, -1, WsD, -1, -1, -1, -1, -1 }, // Mix3
- { -1, -1, -1, -1, -1, -1, -1, -1, -1, MixN2, MixN2, MixN2, MixN2 }, // MixN1
- { MixN3, -1, MixN1, -1, MixN4, -1, -1, -1, -1, -1, -1, -1, -1 }, // MixN2
- { -1, -1, MixN1, -1, MixN4, -1, -1, -1, -1, -1, -1, -1, -1 }, // MixN3
- { -1, -1, -1, -1, -1, -1, -1, WsD, -1, -1, -1, -1, -1 }, // MixN4
- { WsD, Done, -1, -1, -1, -1, Cp2, Cp2, Cp2, -1, -1, -1, -1 }, // Cp
- { WsD, Done, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // Cp2
- { -1, Done, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } // WsD
- };
- signed char state;
- signed char input;
-
- if (parseStack == nullptr || parseStack->isEmpty()) {
- state = Init;
- } else {
- state = parseStack->pop().state;
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: parseElementDecl (cont) in state %d", state);
-#endif
- if (!parseStack->isEmpty()) {
- ParseFunction function = parseStack->top().function;
- if (function == &QXmlSimpleReaderPrivate::eat_ws) {
- parseStack->pop();
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: eat_ws (cont)");
-#endif
- }
- if (!(this->*function)()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseElementDecl, state);
- return false;
- }
- }
- }
-
- for (;;) {
- switch (state) {
- case Done:
- return true;
- case -1:
- reportParseError(QLatin1String(XMLERR_UNEXPECTEDCHARACTER));
- return false;
- }
-
- if (atEnd()) {
- unexpectedEof(&QXmlSimpleReaderPrivate::parseElementDecl, state);
- return false;
- }
- if (is_S(c)) {
- input = InpWs;
- } else if (c == QLatin1Char('>')) {
- input = InpGt;
- } else if (c == QLatin1Char('|')) {
- input = InpPipe;
- } else if (c == QLatin1Char('(')) {
- input = InpOp;
- } else if (c == QLatin1Char(')')) {
- input = InpCp;
- } else if (c == QLatin1Char('#')) {
- input = InpHash;
- } else if (c == QLatin1Char('?')) {
- input = InpQm;
- } else if (c == QLatin1Char('*')) {
- input = InpAst;
- } else if (c == QLatin1Char('+')) {
- input = InpPlus;
- } else if (c == QLatin1Char('A')) {
- input = InpA;
- } else if (c == QLatin1Char('E')) {
- input = InpE;
- } else if (c == QLatin1Char('L')) {
- input = InpL;
- } else {
- input = InpUnknown;
- }
- state = table[state][input];
-
- switch (state) {
- case Elem:
- parseString_s = QLatin1String("LEMENT");
- if (!parseString()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseElementDecl, state);
- return false;
- }
- break;
- case Ws1:
- if (!eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseElementDecl, state);
- return false;
- }
- break;
- case Nam:
- parseName_useRef = false;
- if (!parseName()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseElementDecl, state);
- return false;
- }
- break;
- case Ws2:
- if (!eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseElementDecl, state);
- return false;
- }
- break;
- case Empty:
- parseString_s = QLatin1String("EMPTY");
- if (!parseString()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseElementDecl, state);
- return false;
- }
- break;
- case Any:
- parseString_s = QLatin1String("ANY");
- if (!parseString()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseElementDecl, state);
- return false;
- }
- break;
- case Cont:
- if (!next_eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseElementDecl, state);
- return false;
- }
- break;
- case Mix:
- parseString_s = QLatin1String("#PCDATA");
- if (!parseString()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseElementDecl, state);
- return false;
- }
- break;
- case Mix2:
- if (!eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseElementDecl, state);
- return false;
- }
- break;
- case Mix3:
- next();
- break;
- case MixN1:
- if (!next_eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseElementDecl, state);
- return false;
- }
- break;
- case MixN2:
- parseName_useRef = false;
- if (!parseName()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseElementDecl, state);
- return false;
- }
- break;
- case MixN3:
- if (!eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseElementDecl, state);
- return false;
- }
- break;
- case MixN4:
- next();
- break;
- case Cp:
- if (!parseChoiceSeq()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseElementDecl, state);
- return false;
- }
- break;
- case Cp2:
- next();
- break;
- case WsD:
- if (!next_eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseElementDecl, state);
- return false;
- }
- break;
- case Done:
- next();
- break;
- }
- }
- return false;
-}
-
-/*
- Parse a NotationDecl [82].
-
- Precondition: the beginning '<!' is already read and the head
- stands on the 'N' of '<!NOTATION'
-*/
-bool QXmlSimpleReaderPrivate::parseNotationDecl()
-{
- const signed char Init = 0;
- const signed char Not = 1; // read NOTATION
- const signed char Ws1 = 2; // eat whitespaces
- const signed char Nam = 3; // read Name
- const signed char Ws2 = 4; // eat whitespaces
- const signed char ExtID = 5; // parse ExternalID
- const signed char ExtIDR = 6; // same as ExtID, but already reported
- const signed char Ws3 = 7; // eat whitespaces
- const signed char Done = 8;
-
- const signed char InpWs = 0;
- const signed char InpGt = 1; // >
- const signed char InpN = 2; // N
- const signed char InpUnknown = 3;
-
- static const signed char table[8][4] = {
- /* InpWs InpGt InpN InpUnknown */
- { -1, -1, Not, -1 }, // Init
- { Ws1, -1, -1, -1 }, // Not
- { -1, -1, Nam, Nam }, // Ws1
- { Ws2, Done, -1, -1 }, // Nam
- { -1, Done, ExtID, ExtID }, // Ws2
- { Ws3, Done, -1, -1 }, // ExtID
- { Ws3, Done, -1, -1 }, // ExtIDR
- { -1, Done, -1, -1 } // Ws3
- };
- signed char state;
- signed char input;
-
- if (parseStack == nullptr || parseStack->isEmpty()) {
- state = Init;
- } else {
- state = parseStack->pop().state;
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: parseNotationDecl (cont) in state %d", state);
-#endif
- if (!parseStack->isEmpty()) {
- ParseFunction function = parseStack->top().function;
- if (function == &QXmlSimpleReaderPrivate::eat_ws) {
- parseStack->pop();
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: eat_ws (cont)");
-#endif
- }
- if (!(this->*function)()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseNotationDecl, state);
- return false;
- }
- }
- }
-
- for (;;) {
- switch (state) {
- case ExtID:
- // call the handler
- if (dtdHnd) {
- if (!dtdHnd->notationDecl(name(), publicId, systemId)) {
- reportParseError(dtdHnd->errorString());
- return false;
- }
- }
- state = ExtIDR;
- break;
- case Done:
- return true;
- case -1:
- // Error
- reportParseError(QLatin1String(XMLERR_UNEXPECTEDCHARACTER));
- return false;
- }
-
- if (atEnd()) {
- unexpectedEof(&QXmlSimpleReaderPrivate::parseNotationDecl, state);
- return false;
- }
- if (is_S(c)) {
- input = InpWs;
- } else if (c == QLatin1Char('>')) {
- input = InpGt;
- } else if (c == QLatin1Char('N')) {
- input = InpN;
- } else {
- input = InpUnknown;
- }
- state = table[state][input];
-
- switch (state) {
- case Not:
- parseString_s = QLatin1String("NOTATION");
- if (!parseString()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseNotationDecl, state);
- return false;
- }
- break;
- case Ws1:
- if (!eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseNotationDecl, state);
- return false;
- }
- break;
- case Nam:
- parseName_useRef = false;
- if (!parseName()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseNotationDecl, state);
- return false;
- }
- break;
- case Ws2:
- if (!eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseNotationDecl, state);
- return false;
- }
- break;
- case ExtID:
- case ExtIDR:
- parseExternalID_allowPublicID = true;
- if (!parseExternalID()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseNotationDecl, state);
- return false;
- }
- break;
- case Ws3:
- if (!eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseNotationDecl, state);
- return false;
- }
- break;
- case Done:
- next();
- break;
- }
- }
- return false;
-}
-
-/*
- Parse choice [49] or seq [50].
-
- Precondition: the beginning '('S? is already read and the head
- stands on the first non-whitespace character after it.
-*/
-bool QXmlSimpleReaderPrivate::parseChoiceSeq()
-{
- const signed char Init = 0;
- const signed char Ws1 = 1; // eat whitespace
- const signed char CoS = 2; // choice or set
- const signed char Ws2 = 3; // eat whitespace
- const signed char More = 4; // more cp to read
- const signed char Name = 5; // read name
- const signed char Done = 6; //
-
- const signed char InpWs = 0; // S
- const signed char InpOp = 1; // (
- const signed char InpCp = 2; //)
- const signed char InpQm = 3; // ?
- const signed char InpAst = 4; // *
- const signed char InpPlus = 5; // +
- const signed char InpPipe = 6; // |
- const signed char InpComm = 7; // ,
- const signed char InpUnknown = 8;
-
- static const signed char table[6][9] = {
- /* InpWs InpOp InpCp InpQm InpAst InpPlus InpPipe InpComm InpUnknown */
- { -1, Ws1, -1, -1, -1, -1, -1, -1, Name }, // Init
- { -1, CoS, -1, -1, -1, -1, -1, -1, CoS }, // Ws1
- { Ws2, -1, Done, Ws2, Ws2, Ws2, More, More, -1 }, // CS
- { -1, -1, Done, -1, -1, -1, More, More, -1 }, // Ws2
- { -1, Ws1, -1, -1, -1, -1, -1, -1, Name }, // More (same as Init)
- { Ws2, -1, Done, Ws2, Ws2, Ws2, More, More, -1 } // Name (same as CS)
- };
- signed char state;
- signed char input;
-
- if (parseStack == nullptr || parseStack->isEmpty()) {
- state = Init;
- } else {
- state = parseStack->pop().state;
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: parseChoiceSeq (cont) in state %d", state);
-#endif
- if (!parseStack->isEmpty()) {
- ParseFunction function = parseStack->top().function;
- if (function == &QXmlSimpleReaderPrivate::eat_ws) {
- parseStack->pop();
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: eat_ws (cont)");
-#endif
- }
- if (!(this->*function)()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseChoiceSeq, state);
- return false;
- }
- }
- }
-
- for (;;) {
- switch (state) {
- case Done:
- return true;
- case -1:
- // Error
- reportParseError(QLatin1String(XMLERR_UNEXPECTEDCHARACTER));
- return false;
- }
-
- if (atEnd()) {
- unexpectedEof(&QXmlSimpleReaderPrivate::parseChoiceSeq, state);
- return false;
- }
- if (is_S(c)) {
- input = InpWs;
- } else if (c == QLatin1Char('(')) {
- input = InpOp;
- } else if (c == QLatin1Char(')')) {
- input = InpCp;
- } else if (c == QLatin1Char('?')) {
- input = InpQm;
- } else if (c == QLatin1Char('*')) {
- input = InpAst;
- } else if (c == QLatin1Char('+')) {
- input = InpPlus;
- } else if (c == QLatin1Char('|')) {
- input = InpPipe;
- } else if (c == QLatin1Char(',')) {
- input = InpComm;
- } else {
- input = InpUnknown;
- }
- state = table[state][input];
-
- switch (state) {
- case Ws1:
- if (!next_eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseChoiceSeq, state);
- return false;
- }
- break;
- case CoS:
- if (!parseChoiceSeq()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseChoiceSeq, state);
- return false;
- }
- break;
- case Ws2:
- if (!next_eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseChoiceSeq, state);
- return false;
- }
- break;
- case More:
- if (!next_eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseChoiceSeq, state);
- return false;
- }
- break;
- case Name:
- parseName_useRef = false;
- if (!parseName()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseChoiceSeq, state);
- return false;
- }
- break;
- case Done:
- next();
- break;
- }
- }
- return false;
-}
-
-bool QXmlSimpleReaderPrivate::isExpandedEntityValueTooLarge(QString *errorMessage)
-{
- QString entityNameBuffer;
-
- // For every entity, check how many times all entity names were referenced in its value.
- for (QMap<QString,QString>::const_iterator toSearchIt = entities.constBegin();
- toSearchIt != entities.constEnd();
- ++toSearchIt) {
- const QString &toSearch = toSearchIt.key();
-
- // Don't check the same entities twice.
- if (!literalEntitySizes.contains(toSearch)) {
- // The amount of characters that weren't entity names, but literals, like 'X'.
- QString leftOvers = entities.value(toSearch);
- // How many times was entityName referenced by toSearch?
- for (QMap<QString,QString>::const_iterator referencedIt = entities.constBegin();
- referencedIt != entities.constEnd();
- ++referencedIt) {
- const QString &entityName = referencedIt.key();
-
- for (int i = 0; i < leftOvers.size() && i != -1; ) {
- entityNameBuffer = QLatin1Char('&') + entityName + QLatin1Char(';');
-
- i = leftOvers.indexOf(entityNameBuffer, i);
- if (i != -1) {
- leftOvers.remove(i, entityName.size() + 2);
- // The entityName we're currently trying to find was matched in this string; increase our count.
- ++referencesToOtherEntities[toSearch][entityName];
- }
- }
- }
- literalEntitySizes[toSearch] = leftOvers.size();
- }
- }
-
- for (QHash<QString, QHash<QString, int> >::const_iterator entityIt = referencesToOtherEntities.constBegin();
- entityIt != referencesToOtherEntities.constEnd();
- ++entityIt) {
- const QString &entity = entityIt.key();
-
- QHash<QString, int>::iterator expandedIt = expandedSizes.find(entity);
- if (expandedIt == expandedSizes.end()) {
- expandedIt = expandedSizes.insert(entity, literalEntitySizes.value(entity));
- for (QHash<QString, int>::const_iterator referenceIt = entityIt->constBegin();
- referenceIt != entityIt->constEnd();
- ++referenceIt) {
- const QString &referenceTo = referenceIt.key();
- const int references = referencesToOtherEntities.value(entity).value(referenceTo);
- // The total size of an entity's value is the expanded size of all of its referenced entities, plus its literal size.
- *expandedIt += expandedSizes.value(referenceTo) * references + literalEntitySizes.value(referenceTo) * references;
- }
-
- if (*expandedIt > entityCharacterLimit) {
- if (errorMessage) {
- *errorMessage = QString::fromLatin1("The XML entity \"%1\" expands to a string that is too large to process (%2 characters > %3).")
- .arg(entity, QString::number(*expandedIt), QString::number(entityCharacterLimit));
- }
- return true;
- }
- }
- }
- return false;
-}
-
-/*
- Parse a EntityDecl [70].
-
- Precondition: the beginning '<!E' is already read and the head
- stand on the 'N' of '<!ENTITY'
-*/
-bool QXmlSimpleReaderPrivate::parseEntityDecl()
-{
- const signed char Init = 0;
- const signed char Ent = 1; // parse "ENTITY"
- const signed char Ws1 = 2; // white space read
- const signed char Name = 3; // parse name
- const signed char Ws2 = 4; // white space read
- const signed char EValue = 5; // parse entity value
- const signed char EValueR = 6; // same as EValue, but already reported
- const signed char ExtID = 7; // parse ExternalID
- const signed char Ws3 = 8; // white space read
- const signed char Ndata = 9; // parse "NDATA"
- const signed char Ws4 = 10; // white space read
- const signed char NNam = 11; // parse name
- const signed char NNamR = 12; // same as NNam, but already reported
- const signed char PEDec = 13; // parse PEDecl
- const signed char Ws6 = 14; // white space read
- const signed char PENam = 15; // parse name
- const signed char Ws7 = 16; // white space read
- const signed char PEVal = 17; // parse entity value
- const signed char PEValR = 18; // same as PEVal, but already reported
- const signed char PEEID = 19; // parse ExternalID
- const signed char PEEIDR = 20; // same as PEEID, but already reported
- const signed char WsE = 21; // white space read
- const signed char Done = 22;
- const signed char EDDone = 23; // done, but also report an external, unparsed entity decl
-
- const signed char InpWs = 0; // white space
- const signed char InpPer = 1; // %
- const signed char InpQuot = 2; // " or '
- const signed char InpGt = 3; // >
- const signed char InpN = 4; // N
- const signed char InpUnknown = 5;
-
- static const signed char table[22][6] = {
- /* InpWs InpPer InpQuot InpGt InpN InpUnknown */
- { -1, -1, -1, -1, Ent, -1 }, // Init
- { Ws1, -1, -1, -1, -1, -1 }, // Ent
- { -1, PEDec, -1, -1, Name, Name }, // Ws1
- { Ws2, -1, -1, -1, -1, -1 }, // Name
- { -1, -1, EValue, -1, -1, ExtID }, // Ws2
- { WsE, -1, -1, Done, -1, -1 }, // EValue
- { WsE, -1, -1, Done, -1, -1 }, // EValueR
- { Ws3, -1, -1, EDDone,-1, -1 }, // ExtID
- { -1, -1, -1, EDDone,Ndata, -1 }, // Ws3
- { Ws4, -1, -1, -1, -1, -1 }, // Ndata
- { -1, -1, -1, -1, NNam, NNam }, // Ws4
- { WsE, -1, -1, Done, -1, -1 }, // NNam
- { WsE, -1, -1, Done, -1, -1 }, // NNamR
- { Ws6, -1, -1, -1, -1, -1 }, // PEDec
- { -1, -1, -1, -1, PENam, PENam }, // Ws6
- { Ws7, -1, -1, -1, -1, -1 }, // PENam
- { -1, -1, PEVal, -1, -1, PEEID }, // Ws7
- { WsE, -1, -1, Done, -1, -1 }, // PEVal
- { WsE, -1, -1, Done, -1, -1 }, // PEValR
- { WsE, -1, -1, Done, -1, -1 }, // PEEID
- { WsE, -1, -1, Done, -1, -1 }, // PEEIDR
- { -1, -1, -1, Done, -1, -1 } // WsE
- };
- signed char state;
- signed char input;
-
- if (parseStack == nullptr || parseStack->isEmpty()) {
- state = Init;
- } else {
- state = parseStack->pop().state;
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: parseEntityDecl (cont) in state %d", state);
-#endif
- if (!parseStack->isEmpty()) {
- ParseFunction function = parseStack->top().function;
- if (function == &QXmlSimpleReaderPrivate::eat_ws) {
- parseStack->pop();
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: eat_ws (cont)");
-#endif
- }
- if (!(this->*function)()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseEntityDecl, state);
- return false;
- }
- }
- }
-
- for (;;) {
- switch (state) {
- case EValue:
- if ( !entityExist(name())) {
- QString errorMessage;
- if (isExpandedEntityValueTooLarge(&errorMessage)) {
- reportParseError(errorMessage);
- return false;
- }
-
- entities.insert(name(), string());
- if (declHnd) {
- if (!declHnd->internalEntityDecl(name(), string())) {
- reportParseError(declHnd->errorString());
- return false;
- }
- }
- }
- state = EValueR;
- break;
- case NNam:
- if ( !entityExist(name())) {
- externEntities.insert(name(), QXmlSimpleReaderPrivate::ExternEntity(publicId, systemId, ref()));
- if (dtdHnd) {
- if (!dtdHnd->unparsedEntityDecl(name(), publicId, systemId, ref())) {
- reportParseError(declHnd->errorString());
- return false;
- }
- }
- }
- state = NNamR;
- break;
- case PEVal:
- if ( !entityExist(name())) {
- parameterEntities.insert(name(), string());
- if (declHnd) {
- if (!declHnd->internalEntityDecl(QLatin1Char('%') + name(), string())) {
- reportParseError(declHnd->errorString());
- return false;
- }
- }
- }
- state = PEValR;
- break;
- case PEEID:
- if ( !entityExist(name())) {
- externParameterEntities.insert(name(), QXmlSimpleReaderPrivate::ExternParameterEntity(publicId, systemId));
- if (declHnd) {
- if (!declHnd->externalEntityDecl(QLatin1Char('%') + name(), publicId, systemId)) {
- reportParseError(declHnd->errorString());
- return false;
- }
- }
- }
- state = PEEIDR;
- break;
- case EDDone:
- if ( !entityExist(name())) {
- externEntities.insert(name(), QXmlSimpleReaderPrivate::ExternEntity(publicId, systemId, QString()));
- if (declHnd) {
- if (!declHnd->externalEntityDecl(name(), publicId, systemId)) {
- reportParseError(declHnd->errorString());
- return false;
- }
- }
- }
- return true;
- case Done:
- return true;
- case -1:
- // Error
- reportParseError(QLatin1String(XMLERR_LETTEREXPECTED));
- return false;
- }
-
- if (atEnd()) {
- unexpectedEof(&QXmlSimpleReaderPrivate::parseEntityDecl, state);
- return false;
- }
- if (is_S(c)) {
- input = InpWs;
- } else if (c == QLatin1Char('%')) {
- input = InpPer;
- } else if (c == QLatin1Char('"') || c == QLatin1Char('\'')) {
- input = InpQuot;
- } else if (c == QLatin1Char('>')) {
- input = InpGt;
- } else if (c == QLatin1Char('N')) {
- input = InpN;
- } else {
- input = InpUnknown;
- }
- state = table[state][input];
-
- switch (state) {
- case Ent:
- parseString_s = QLatin1String("NTITY");
- if (!parseString()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseEntityDecl, state);
- return false;
- }
- break;
- case Ws1:
- if (!eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseEntityDecl, state);
- return false;
- }
- break;
- case Name:
- parseName_useRef = false;
- if (!parseName()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseEntityDecl, state);
- return false;
- }
- break;
- case Ws2:
- if (!eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseEntityDecl, state);
- return false;
- }
- break;
- case EValue:
- case EValueR:
- if (!parseEntityValue()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseEntityDecl, state);
- return false;
- }
- break;
- case ExtID:
- parseExternalID_allowPublicID = false;
- if (!parseExternalID()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseEntityDecl, state);
- return false;
- }
- break;
- case Ws3:
- if (!eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseEntityDecl, state);
- return false;
- }
- break;
- case Ndata:
- parseString_s = QLatin1String("NDATA");
- if (!parseString()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseEntityDecl, state);
- return false;
- }
- break;
- case Ws4:
- if (!eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseEntityDecl, state);
- return false;
- }
- break;
- case NNam:
- case NNamR:
- parseName_useRef = true;
- if (!parseName()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseEntityDecl, state);
- return false;
- }
- break;
- case PEDec:
- next();
- break;
- case Ws6:
- if (!eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseEntityDecl, state);
- return false;
- }
- break;
- case PENam:
- parseName_useRef = false;
- if (!parseName()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseEntityDecl, state);
- return false;
- }
- break;
- case Ws7:
- if (!eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseEntityDecl, state);
- return false;
- }
- break;
- case PEVal:
- case PEValR:
- if (!parseEntityValue()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseEntityDecl, state);
- return false;
- }
- break;
- case PEEID:
- case PEEIDR:
- parseExternalID_allowPublicID = false;
- if (!parseExternalID()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseEntityDecl, state);
- return false;
- }
- break;
- case WsE:
- if (!eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseEntityDecl, state);
- return false;
- }
- break;
- case EDDone:
- next();
- break;
- case Done:
- next();
- break;
- }
- }
- return false;
-}
-
-/*
- Parse a EntityValue [9]
-*/
-bool QXmlSimpleReaderPrivate::parseEntityValue()
-{
- const signed char Init = 0;
- const signed char Dq = 1; // EntityValue is double quoted
- const signed char DqC = 2; // signed character
- const signed char DqPER = 3; // PERefence
- const signed char DqRef = 4; // Reference
- const signed char Sq = 5; // EntityValue is double quoted
- const signed char SqC = 6; // signed character
- const signed char SqPER = 7; // PERefence
- const signed char SqRef = 8; // Reference
- const signed char Done = 9;
-
- const signed char InpDq = 0; // "
- const signed char InpSq = 1; // '
- const signed char InpAmp = 2; // &
- const signed char InpPer = 3; // %
- const signed char InpUnknown = 4;
-
- static const signed char table[9][5] = {
- /* InpDq InpSq InpAmp InpPer InpUnknown */
- { Dq, Sq, -1, -1, -1 }, // Init
- { Done, DqC, DqRef, DqPER, DqC }, // Dq
- { Done, DqC, DqRef, DqPER, DqC }, // DqC
- { Done, DqC, DqRef, DqPER, DqC }, // DqPER
- { Done, DqC, DqRef, DqPER, DqC }, // DqRef
- { SqC, Done, SqRef, SqPER, SqC }, // Sq
- { SqC, Done, SqRef, SqPER, SqC }, // SqC
- { SqC, Done, SqRef, SqPER, SqC }, // SqPER
- { SqC, Done, SqRef, SqPER, SqC } // SqRef
- };
- signed char state;
- signed char input;
-
- if (parseStack == nullptr || parseStack->isEmpty()) {
- state = Init;
- } else {
- state = parseStack->pop().state;
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: parseEntityValue (cont) in state %d", state);
-#endif
- if (!parseStack->isEmpty()) {
- ParseFunction function = parseStack->top().function;
- if (function == &QXmlSimpleReaderPrivate::eat_ws) {
- parseStack->pop();
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: eat_ws (cont)");
-#endif
- }
- if (!(this->*function)()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseEntityValue, state);
- return false;
- }
- }
- }
-
- for (;;) {
- switch (state) {
- case Done:
- return true;
- case -1:
- // Error
- reportParseError(QLatin1String(XMLERR_LETTEREXPECTED));
- return false;
- }
-
- if (atEnd()) {
- unexpectedEof(&QXmlSimpleReaderPrivate::parseEntityValue, state);
- return false;
- }
- if (c == QLatin1Char('"')) {
- input = InpDq;
- } else if (c == QLatin1Char('\'')) {
- input = InpSq;
- } else if (c == QLatin1Char('&')) {
- input = InpAmp;
- } else if (c == QLatin1Char('%')) {
- input = InpPer;
- } else {
- input = InpUnknown;
- }
- state = table[state][input];
-
- switch (state) {
- case Dq:
- case Sq:
- stringClear();
- next();
- break;
- case DqC:
- case SqC:
- stringAddC();
- next();
- break;
- case DqPER:
- case SqPER:
- parsePEReference_context = InEntityValue;
- if (!parsePEReference()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseEntityValue, state);
- return false;
- }
- break;
- case DqRef:
- case SqRef:
- parseReference_context = InEntityValue;
- if (!parseReference()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseEntityValue, state);
- return false;
- }
- break;
- case Done:
- next();
- break;
- }
- }
- return false;
-}
-
-/*
- Parse a comment [15].
-
- Precondition: the beginning '<!' of the comment is already read and the head
- stands on the first '-' of '<!--'.
-
- If this funktion was successful, the head-position is on the first
- character after the comment.
-*/
-bool QXmlSimpleReaderPrivate::parseComment()
-{
- const signed char Init = 0;
- const signed char Dash1 = 1; // the first dash was read
- const signed char Dash2 = 2; // the second dash was read
- const signed char Com = 3; // read comment
- const signed char Com2 = 4; // read comment (help state)
- const signed char ComE = 5; // finished reading comment
- const signed char Done = 6;
-
- const signed char InpDash = 0; // -
- const signed char InpGt = 1; // >
- const signed char InpUnknown = 2;
-
- static const signed char table[6][3] = {
- /* InpDash InpGt InpUnknown */
- { Dash1, -1, -1 }, // Init
- { Dash2, -1, -1 }, // Dash1
- { Com2, Com, Com }, // Dash2
- { Com2, Com, Com }, // Com
- { ComE, Com, Com }, // Com2
- { -1, Done, -1 } // ComE
- };
- signed char state;
- signed char input;
-
- if (parseStack == nullptr || parseStack->isEmpty()) {
- state = Init;
- } else {
- state = parseStack->pop().state;
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: parseComment (cont) in state %d", state);
-#endif
- if (!parseStack->isEmpty()) {
- ParseFunction function = parseStack->top().function;
- if (function == &QXmlSimpleReaderPrivate::eat_ws) {
- parseStack->pop();
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: eat_ws (cont)");
-#endif
- }
- if (!(this->*function)()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseComment, state);
- return false;
- }
- }
- }
-
- for (;;) {
- switch (state) {
- case Dash2:
- stringClear();
- break;
- case Com2:
- // if next character is not a dash than don't skip it
- if (!atEnd() && c != QLatin1Char('-'))
- stringAddC(QLatin1Char('-'));
- break;
- case Done:
- return true;
- case -1:
- // Error
- reportParseError(QLatin1String(XMLERR_ERRORPARSINGCOMMENT));
- return false;
- }
-
- if (atEnd()) {
- unexpectedEof(&QXmlSimpleReaderPrivate::parseComment, state);
- return false;
- }
- if (c == QLatin1Char('-')) {
- input = InpDash;
- } else if (c == QLatin1Char('>')) {
- input = InpGt;
- } else {
- input = InpUnknown;
- }
- state = table[state][input];
-
- switch (state) {
- case Dash1:
- next();
- break;
- case Dash2:
- next();
- break;
- case Com:
- stringAddC();
- next();
- break;
- case Com2:
- next();
- break;
- case ComE:
- next();
- break;
- case Done:
- next();
- break;
- }
- }
- return false;
-}
-
-/*
- Parse an Attribute [41].
-
- Precondition: the head stands on the first character of the name
- of the attribute (i.e. all whitespaces are already parsed).
-
- The head stand on the next character after the end quotes. The
- variable name contains the name of the attribute and the variable
- string contains the value of the attribute.
-*/
-bool QXmlSimpleReaderPrivate::parseAttribute()
-{
- const int Init = 0;
- const int PName = 1; // parse name
- const int Ws = 2; // eat ws
- const int Eq = 3; // the '=' was read
- const int Quotes = 4; // " or ' were read
-
- const int InpNameBe = 0;
- const int InpEq = 1; // =
- const int InpDq = 2; // "
- const int InpSq = 3; // '
- const int InpUnknown = 4;
-
- static const int table[4][5] = {
- /* InpNameBe InpEq InpDq InpSq InpUnknown */
- { PName, -1, -1, -1, -1 }, // Init
- { -1, Eq, -1, -1, Ws }, // PName
- { -1, Eq, -1, -1, -1 }, // Ws
- { -1, -1, Quotes, Quotes, -1 } // Eq
- };
- int state;
- int input;
-
- if (parseStack == nullptr || parseStack->isEmpty()) {
- state = Init;
- } else {
- state = parseStack->pop().state;
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: parseAttribute (cont) in state %d", state);
-#endif
- if (!parseStack->isEmpty()) {
- ParseFunction function = parseStack->top().function;
- if (function == &QXmlSimpleReaderPrivate::eat_ws) {
- parseStack->pop();
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: eat_ws (cont)");
-#endif
- }
- if (!(this->*function)()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttribute, state);
- return false;
- }
- }
- }
-
- for (;;) {
- switch (state) {
- case Quotes:
- // Done
- return true;
- case -1:
- // Error
- reportParseError(QLatin1String(XMLERR_UNEXPECTEDCHARACTER));
- return false;
- }
-
- if (atEnd()) {
- unexpectedEof(&QXmlSimpleReaderPrivate::parseAttribute, state);
- return false;
- }
- if (determineNameChar(c) == NameBeginning) {
- input = InpNameBe;
- } else if (c == QLatin1Char('=')) {
- input = InpEq;
- } else if (c == QLatin1Char('"')) {
- input = InpDq;
- } else if (c == QLatin1Char('\'')) {
- input = InpSq;
- } else {
- input = InpUnknown;
- }
- state = table[state][input];
-
- switch (state) {
- case PName:
- parseName_useRef = false;
- if (!parseName()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttribute, state);
- return false;
- }
- break;
- case Ws:
- if (!eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttribute, state);
- return false;
- }
- break;
- case Eq:
- if (!next_eat_ws()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttribute, state);
- return false;
- }
- break;
- case Quotes:
- if (!parseAttValue()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseAttribute, state);
- return false;
- }
- break;
- }
- }
- return false;
-}
-
-/*
- Parse a Name [5] and store the name in name or ref (if useRef is true).
-*/
-bool QXmlSimpleReaderPrivate::parseName()
-{
- const int Init = 0;
- const int Name1 = 1; // parse first character of the name
- const int Name = 2; // parse name
- const int Done = 3;
-
- static const int table[3][3] = {
- /* InpNameBe InpNameCh InpUnknown */
- { Name1, -1, -1 }, // Init
- { Name, Name, Done }, // Name1
- { Name, Name, Done } // Name
- };
- int state;
-
- if (parseStack == nullptr || parseStack->isEmpty()) {
- state = Init;
- } else {
- state = parseStack->pop().state;
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: parseName (cont) in state %d", state);
-#endif
- if (!parseStack->isEmpty()) {
- ParseFunction function = parseStack->top().function;
- if (function == &QXmlSimpleReaderPrivate::eat_ws) {
- parseStack->pop();
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: eat_ws (cont)");
-#endif
- }
- if (!(this->*function)()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseName, state);
- return false;
- }
- }
- }
-
- for (;;) {
- switch (state) {
- case Done:
- return true;
- case -1:
- // Error
- reportParseError(QLatin1String(XMLERR_LETTEREXPECTED));
- return false;
- }
-
- if (atEnd()) {
- unexpectedEof(&QXmlSimpleReaderPrivate::parseName, state);
- return false;
- }
-
- // we can safely do the (int) cast thanks to the Q_ASSERTs earlier in this function
- state = table[state][(int)fastDetermineNameChar(c)];
-
- switch (state) {
- case Name1:
- if (parseName_useRef) {
- refClear();
- refAddC();
- } else {
- nameClear();
- nameAddC();
- }
- next();
- break;
- case Name:
- if (parseName_useRef) {
- refAddC();
- } else {
- nameAddC();
- }
- next();
- break;
- }
- }
- return false;
-}
-
-/*
- Parse a Nmtoken [7] and store the name in name.
-*/
-bool QXmlSimpleReaderPrivate::parseNmtoken()
-{
- const signed char Init = 0;
- const signed char NameF = 1;
- const signed char Name = 2;
- const signed char Done = 3;
-
- const signed char InpNameCh = 0; // NameChar without InpNameBe
- const signed char InpUnknown = 1;
-
- static const signed char table[3][2] = {
- /* InpNameCh InpUnknown */
- { NameF, -1 }, // Init
- { Name, Done }, // NameF
- { Name, Done } // Name
- };
- signed char state;
- signed char input;
-
- if (parseStack == nullptr || parseStack->isEmpty()) {
- state = Init;
- } else {
- state = parseStack->pop().state;
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: parseNmtoken (cont) in state %d", state);
-#endif
- if (!parseStack->isEmpty()) {
- ParseFunction function = parseStack->top().function;
- if (function == &QXmlSimpleReaderPrivate::eat_ws) {
- parseStack->pop();
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: eat_ws (cont)");
-#endif
- }
- if (!(this->*function)()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseNmtoken, state);
- return false;
- }
- }
- }
-
- for (;;) {
- switch (state) {
- case Done:
- return true;
- case -1:
- // Error
- reportParseError(QLatin1String(XMLERR_LETTEREXPECTED));
- return false;
- }
-
- if (atEnd()) {
- unexpectedEof(&QXmlSimpleReaderPrivate::parseNmtoken, state);
- return false;
- }
- if (determineNameChar(c) == NotName) {
- input = InpUnknown;
- } else {
- input = InpNameCh;
- }
- state = table[state][input];
-
- switch (state) {
- case NameF:
- nameClear();
- nameAddC();
- next();
- break;
- case Name:
- nameAddC();
- next();
- break;
- }
- }
- return false;
-}
-
-/*
- Parse a Reference [67].
-
- parseReference_charDataRead is set to true if the reference must not be
- parsed. The character(s) which the reference mapped to are appended to
- string. The head stands on the first character after the reference.
-
- parseReference_charDataRead is set to false if the reference must be parsed.
- The charachter(s) which the reference mapped to are inserted at the reference
- position. The head stands on the first character of the replacement).
-*/
-bool QXmlSimpleReaderPrivate::parseReference()
-{
- // temporary variables (only used in very local context, so they don't
- // interfere with incremental parsing)
- uint tmp;
- bool ok;
-
- const signed char Init = 0;
- const signed char SRef = 1; // start of a reference
- const signed char ChRef = 2; // parse CharRef
- const signed char ChDec = 3; // parse CharRef decimal
- const signed char ChHexS = 4; // start CharRef hexadecimal
- const signed char ChHex = 5; // parse CharRef hexadecimal
- const signed char Name = 6; // parse name
- const signed char DoneD = 7; // done CharRef decimal
- const signed char DoneH = 8; // done CharRef hexadecimal
- const signed char DoneN = 9; // done EntityRef
-
- const signed char InpAmp = 0; // &
- const signed char InpSemi = 1; // ;
- const signed char InpHash = 2; // #
- const signed char InpX = 3; // x
- const signed char InpNum = 4; // 0-9
- const signed char InpHex = 5; // a-f A-F
- const signed char InpUnknown = 6;
-
- static const signed char table[8][7] = {
- /* InpAmp InpSemi InpHash InpX InpNum InpHex InpUnknown */
- { SRef, -1, -1, -1, -1, -1, -1 }, // Init
- { -1, -1, ChRef, Name, Name, Name, Name }, // SRef
- { -1, -1, -1, ChHexS, ChDec, -1, -1 }, // ChRef
- { -1, DoneD, -1, -1, ChDec, -1, -1 }, // ChDec
- { -1, -1, -1, -1, ChHex, ChHex, -1 }, // ChHexS
- { -1, DoneH, -1, -1, ChHex, ChHex, -1 }, // ChHex
- { -1, DoneN, -1, -1, -1, -1, -1 } // Name
- };
- signed char state;
- signed char input;
-
- if (parseStack == nullptr || parseStack->isEmpty()) {
- parseReference_charDataRead = false;
- state = Init;
- } else {
- state = parseStack->pop().state;
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: parseReference (cont) in state %d", state);
-#endif
- if (!parseStack->isEmpty()) {
- ParseFunction function = parseStack->top().function;
- if (function == &QXmlSimpleReaderPrivate::eat_ws) {
- parseStack->pop();
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: eat_ws (cont)");
-#endif
- }
- if (!(this->*function)()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseReference, state);
- return false;
- }
- }
- }
-
- for (;;) {
- switch (state) {
- case DoneD:
- return true;
- case DoneH:
- return true;
- case DoneN:
- return true;
- case -1:
- // Error
- reportParseError(QLatin1String(XMLERR_ERRORPARSINGREFERENCE));
- return false;
- }
-
- if (atEnd()) {
- unexpectedEof(&QXmlSimpleReaderPrivate::parseReference, state);
- return false;
- }
- if (c.row()) {
- input = InpUnknown;
- } else if (c.cell() == '&') {
- input = InpAmp;
- } else if (c.cell() == ';') {
- input = InpSemi;
- } else if (c.cell() == '#') {
- input = InpHash;
- } else if (c.cell() == 'x') {
- input = InpX;
- } else if ('0' <= c.cell() && c.cell() <= '9') {
- input = InpNum;
- } else if ('a' <= c.cell() && c.cell() <= 'f') {
- input = InpHex;
- } else if ('A' <= c.cell() && c.cell() <= 'F') {
- input = InpHex;
- } else {
- input = InpUnknown;
- }
- state = table[state][input];
-
- switch (state) {
- case SRef:
- refClear();
- next();
- break;
- case ChRef:
- next();
- break;
- case ChDec:
- refAddC();
- next();
- break;
- case ChHexS:
- next();
- break;
- case ChHex:
- refAddC();
- next();
- break;
- case Name:
- // read the name into the ref
- parseName_useRef = true;
- if (!parseName()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseReference, state);
- return false;
- }
- break;
- case DoneD:
- tmp = ref().toUInt(&ok, 10);
- if (ok) {
- if (tmp > 0xffff) {
- stringAddC(QChar::highSurrogate(tmp));
- stringAddC(QChar::lowSurrogate(tmp));
- } else {
- stringAddC(QChar(tmp));
- }
- } else {
- reportParseError(QLatin1String(XMLERR_ERRORPARSINGREFERENCE));
- return false;
- }
- parseReference_charDataRead = true;
- next();
- break;
- case DoneH:
- tmp = ref().toUInt(&ok, 16);
- if (ok) {
- if (tmp > 0xffff) {
- stringAddC(QChar::highSurrogate(tmp));
- stringAddC(QChar::lowSurrogate(tmp));
- } else {
- stringAddC(QChar(tmp));
- }
- } else {
- reportParseError(QLatin1String(XMLERR_ERRORPARSINGREFERENCE));
- return false;
- }
- parseReference_charDataRead = true;
- next();
- break;
- case DoneN:
- if (!processReference())
- return false;
- next();
- break;
- }
- }
- return false;
-}
-
-/*
- Helper function for parseReference()
-*/
-bool QXmlSimpleReaderPrivate::processReference()
-{
- QString reference = ref();
- if (reference == QLatin1String("amp")) {
- if (parseReference_context == InEntityValue) {
- // Bypassed
- stringAddC(QLatin1Char('&')); stringAddC(QLatin1Char('a')); stringAddC(QLatin1Char('m')); stringAddC(QLatin1Char('p')); stringAddC(QLatin1Char(';'));
- } else {
- // Included or Included in literal
- stringAddC(QLatin1Char('&'));
- }
- parseReference_charDataRead = true;
- } else if (reference == QLatin1String("lt")) {
- if (parseReference_context == InEntityValue) {
- // Bypassed
- stringAddC(QLatin1Char('&')); stringAddC(QLatin1Char('l')); stringAddC(QLatin1Char('t')); stringAddC(QLatin1Char(';'));
- } else {
- // Included or Included in literal
- stringAddC(QLatin1Char('<'));
- }
- parseReference_charDataRead = true;
- } else if (reference == QLatin1String("gt")) {
- if (parseReference_context == InEntityValue) {
- // Bypassed
- stringAddC(QLatin1Char('&')); stringAddC(QLatin1Char('g')); stringAddC(QLatin1Char('t')); stringAddC(QLatin1Char(';'));
- } else {
- // Included or Included in literal
- stringAddC(QLatin1Char('>'));
- }
- parseReference_charDataRead = true;
- } else if (reference == QLatin1String("apos")) {
- if (parseReference_context == InEntityValue) {
- // Bypassed
- stringAddC(QLatin1Char('&')); stringAddC(QLatin1Char('a')); stringAddC(QLatin1Char('p')); stringAddC(QLatin1Char('o')); stringAddC(QLatin1Char('s')); stringAddC(QLatin1Char(';'));
- } else {
- // Included or Included in literal
- stringAddC(QLatin1Char('\''));
- }
- parseReference_charDataRead = true;
- } else if (reference == QLatin1String("quot")) {
- if (parseReference_context == InEntityValue) {
- // Bypassed
- stringAddC(QLatin1Char('&')); stringAddC(QLatin1Char('q')); stringAddC(QLatin1Char('u')); stringAddC(QLatin1Char('o')); stringAddC(QLatin1Char('t')); stringAddC(QLatin1Char(';'));
- } else {
- // Included or Included in literal
- stringAddC(QLatin1Char('"'));
- }
- parseReference_charDataRead = true;
- } else {
- QMap<QString,QString>::Iterator it;
- it = entities.find(reference);
- if (it != entities.end()) {
- // "Internal General"
- switch (parseReference_context) {
- case InContent:
- // Included
- if (!insertXmlRef(*it, reference, false))
- return false;
- parseReference_charDataRead = false;
- break;
- case InAttributeValue:
- // Included in literal
- if (!insertXmlRef(*it, reference, true))
- return false;
- parseReference_charDataRead = false;
- break;
- case InEntityValue:
- {
- // Bypassed
- stringAddC(QLatin1Char('&'));
- for (int i=0; i<(int)reference.length(); i++) {
- stringAddC(reference[i]);
- }
- stringAddC(QLatin1Char(';'));
- parseReference_charDataRead = true;
- }
- break;
- case InDTD:
- // Forbidden
- parseReference_charDataRead = false;
- reportParseError(QLatin1String(XMLERR_INTERNALGENERALENTITYINDTD));
- return false;
- }
- } else {
- QMap<QString,QXmlSimpleReaderPrivate::ExternEntity>::Iterator itExtern;
- itExtern = externEntities.find(reference);
- if (itExtern == externEntities.end()) {
- // entity not declared
- // ### check this case for conformance
- if (parseReference_context == InEntityValue) {
- // Bypassed
- stringAddC(QLatin1Char('&'));
- for (int i=0; i<(int)reference.length(); i++) {
- stringAddC(reference[i]);
- }
- stringAddC(QLatin1Char(';'));
- parseReference_charDataRead = true;
- } else {
- // if we have some char data read, report it now
- if (parseReference_context == InContent) {
- if (contentCharDataRead) {
- if (reportWhitespaceCharData || !string().simplified().isEmpty()) {
- if (contentHnd != nullptr && !contentHnd->characters(string())) {
- reportParseError(contentHnd->errorString());
- return false;
- }
- }
- stringClear();
- contentCharDataRead = false;
- }
- }
-
- if (contentHnd) {
- skipped_entity_in_content = parseReference_context == InContent;
- if (!contentHnd->skippedEntity(reference)) {
- skipped_entity_in_content = false;
- reportParseError(contentHnd->errorString());
- return false; // error
- }
- skipped_entity_in_content = false;
- }
- }
- } else if ((*itExtern).notation.isNull()) {
- // "External Parsed General"
- switch (parseReference_context) {
- case InContent:
- {
- // Included if validating
- bool skipIt = true;
- if (entityRes) {
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- QXmlInputSource *ret = nullptr;
-QT_WARNING_POP
- if (!entityRes->resolveEntity((*itExtern).publicId, (*itExtern).systemId, ret)) {
- delete ret;
- reportParseError(entityRes->errorString());
- return false;
- }
- if (ret) {
- QString xmlRefString;
- QString buffer = ret->data();
- while (!buffer.isEmpty()) {
- xmlRefString += buffer;
- ret->fetchData();
- buffer = ret->data();
- }
-
- delete ret;
- if (!stripTextDecl(xmlRefString)) {
- reportParseError(QLatin1String(XMLERR_ERRORINTEXTDECL));
- return false;
- }
- if (!insertXmlRef(xmlRefString, reference, false))
- return false;
- skipIt = false;
- }
- }
- if (skipIt && contentHnd) {
- skipped_entity_in_content = true;
- if (!contentHnd->skippedEntity(reference)) {
- skipped_entity_in_content = false;
- reportParseError(contentHnd->errorString());
- return false; // error
- }
- skipped_entity_in_content = false;
- }
- parseReference_charDataRead = false;
- } break;
- case InAttributeValue:
- // Forbidden
- parseReference_charDataRead = false;
- reportParseError(QLatin1String(XMLERR_EXTERNALGENERALENTITYINAV));
- return false;
- case InEntityValue:
- {
- // Bypassed
- stringAddC(QLatin1Char('&'));
- for (int i=0; i<(int)reference.length(); i++) {
- stringAddC(reference[i]);
- }
- stringAddC(QLatin1Char(';'));
- parseReference_charDataRead = true;
- }
- break;
- case InDTD:
- // Forbidden
- parseReference_charDataRead = false;
- reportParseError(QLatin1String(XMLERR_EXTERNALGENERALENTITYINDTD));
- return false;
- }
- } else {
- // "Unparsed"
- // ### notify for "Occurs as Attribute Value" missing (but this is no refence, anyway)
- // Forbidden
- parseReference_charDataRead = false;
- reportParseError(QLatin1String(XMLERR_UNPARSEDENTITYREFERENCE));
- return false; // error
- }
- }
- }
- return true; // no error
-}
-
-
-/*
- Parses over a simple string.
-
- After the string was successfully parsed, the head is on the first
- character after the string.
-*/
-bool QXmlSimpleReaderPrivate::parseString()
-{
- const signed char InpCharExpected = 0; // the character that was expected
- const signed char InpUnknown = 1;
-
- signed char state; // state in this function is the position in the string s
- signed char input;
-
- if (parseStack == nullptr || parseStack->isEmpty()) {
- Done = parseString_s.length();
- state = 0;
- } else {
- state = parseStack->pop().state;
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: parseString (cont) in state %d", state);
-#endif
- if (!parseStack->isEmpty()) {
- ParseFunction function = parseStack->top().function;
- if (function == &QXmlSimpleReaderPrivate::eat_ws) {
- parseStack->pop();
-#if defined(QT_QXML_DEBUG)
- qDebug("QXmlSimpleReader: eat_ws (cont)");
-#endif
- }
- if (!(this->*function)()) {
- parseFailed(&QXmlSimpleReaderPrivate::parseString, state);
- return false;
- }
- }
- }
-
- for (;;) {
- if (state == Done) {
- return true;
- }
-
- if (atEnd()) {
- unexpectedEof(&QXmlSimpleReaderPrivate::parseString, state);
- return false;
- }
- if (c == parseString_s[(int)state]) {
- input = InpCharExpected;
- } else {
- input = InpUnknown;
- }
- if (input == InpCharExpected) {
- state++;
- } else {
- // Error
- reportParseError(QLatin1String(XMLERR_UNEXPECTEDCHARACTER));
- return false;
- }
-
- next();
- }
- return false;
-}
-
-/*
- This private function inserts and reports an entity substitution. The
- substituted string is \a data and the name of the entity reference is \a
- name. If \a inLiteral is true, the entity is IncludedInLiteral (i.e., " and '
- must be quoted. Otherwise they are not quoted.
-
- This function returns \c false on error.
-*/
-bool QXmlSimpleReaderPrivate::insertXmlRef(const QString &data, const QString &name, bool inLiteral)
-{
- if (inLiteral) {
- QString tmp = data;
- xmlRefStack.push(XmlRef(name, tmp.replace(QLatin1Char('\"'),
- QLatin1String("&quot;")).replace(QLatin1Char('\''), QLatin1String("&apos;"))));
- } else {
- xmlRefStack.push(XmlRef(name, data));
- }
- int n = qMax(parameterEntities.count(), entities.count());
- if (xmlRefStack.count() > n+1) {
- // recursive entities
- reportParseError(QLatin1String(XMLERR_RECURSIVEENTITIES));
- return false;
- }
- if (reportEntities && lexicalHnd) {
- if (!lexicalHnd->startEntity(name)) {
- reportParseError(lexicalHnd->errorString());
- return false;
- }
- }
- return true;
-}
-
-/*
- This private function moves the cursor to the next character.
-*/
-void QXmlSimpleReaderPrivate::next()
-{
- int count = xmlRefStack.size();
- while (count != 0) {
- if (xmlRefStack.top().isEmpty()) {
- xmlRefStack.pop_back();
- count--;
- } else {
- c = xmlRefStack.top().next();
- return;
- }
- }
-
- // the following could be written nicer, but since it is a time-critical
- // function, rather optimize for speed
- ushort uc = c.unicode();
- c = inputSource->next();
- // If we are not incremental parsing, we just skip over EndOfData chars to give the
- // parser an uninterrupted stream of document chars.
- if (c == QXmlInputSource::EndOfData && parseStack == nullptr)
- c = inputSource->next();
- if (uc == '\n') {
- lineNr++;
- columnNr = -1;
- } else if (uc == '\r') {
- if (c != QLatin1Char('\n')) {
- lineNr++;
- columnNr = -1;
- }
- }
- ++columnNr;
-}
-
-/*
- This private function moves the cursor to the next non-whitespace character.
- This function does not move the cursor if the actual cursor position is a
- non-whitespace charcter.
-
- Returns \c false when you use incremental parsing and this function reaches EOF
- with reading only whitespace characters. In this case it also poplulates the
- parseStack with useful information. In all other cases, this function returns
- true.
-*/
-bool QXmlSimpleReaderPrivate::eat_ws()
-{
- while (!atEnd()) {
- if (!is_S(c)) {
- return true;
- }
- next();
- }
- if (parseStack != nullptr) {
- unexpectedEof(&QXmlSimpleReaderPrivate::eat_ws, 0);
- return false;
- }
- return true;
-}
-
-bool QXmlSimpleReaderPrivate::next_eat_ws()
-{
- next();
- return eat_ws();
-}
-
-
-/*
- This private function initializes the reader. \a i is the input source to
- read the data from.
-*/
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
-void QXmlSimpleReaderPrivate::init(const QXmlInputSource *i)
-{
- lineNr = 0;
- columnNr = -1;
- inputSource = const_cast<QXmlInputSource *>(i);
- initData();
-
- externParameterEntities.clear();
- parameterEntities.clear();
- externEntities.clear();
- entities.clear();
-
- clear(tags);
-
- doctype.clear();
- xmlVersion.clear();
- encoding.clear();
- standalone = QXmlSimpleReaderPrivate::Unknown;
- error.clear();
-}
-QT_WARNING_POP
-
-/*
- This private function initializes the XML data related variables. Especially,
- it reads the data from the input source.
-*/
-void QXmlSimpleReaderPrivate::initData()
-{
- c = QXmlInputSource::EndOfData;
- xmlRefStack.clear();
- next();
-}
-
-/*
- Returns \c true if a entity with the name \a e exists,
- otherwise returns \c false.
-*/
-bool QXmlSimpleReaderPrivate::entityExist(const QString& e) const
-{
- if ( parameterEntities.find(e) == parameterEntities.end() &&
- externParameterEntities.find(e) == externParameterEntities.end() &&
- externEntities.find(e) == externEntities.end() &&
- entities.find(e) == entities.end()) {
- return false;
- } else {
- return true;
- }
-}
-
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
-void QXmlSimpleReaderPrivate::reportParseError(const QString& error)
-{
- this->error = error;
- if (errorHnd) {
- if (this->error.isNull()) {
- const QXmlParseException ex(QLatin1String(XMLERR_OK), columnNr+1, lineNr+1,
- thisPublicId, thisSystemId);
- errorHnd->fatalError(ex);
- } else {
- const QXmlParseException ex(this->error, columnNr+1, lineNr+1,
- thisPublicId, thisSystemId);
- errorHnd->fatalError(ex);
- }
- }
-}
-QT_WARNING_POP
-
-/*
- This private function is called when a parsing function encounters an
- unexpected EOF. It decides what to do (depending on incremental parsing or
- not). \a where is a pointer to the function where the error occurred and \a
- state is the parsing state in this function.
-*/
-void QXmlSimpleReaderPrivate::unexpectedEof(ParseFunction where, int state)
-{
- if (parseStack == nullptr) {
- reportParseError(QLatin1String(XMLERR_UNEXPECTEDEOF));
- } else {
- if (c == QXmlInputSource::EndOfDocument) {
- reportParseError(QLatin1String(XMLERR_UNEXPECTEDEOF));
- } else {
- pushParseState(where, state);
- }
- }
-}
-
-/*
- This private function is called when a parse...() function returned false. It
- determines if there was an error or if incremental parsing simply went out of
- data and does the right thing for the case. \a where is a pointer to the
- function where the error occurred and \a state is the parsing state in this
- function.
-*/
-void QXmlSimpleReaderPrivate::parseFailed(ParseFunction where, int state)
-{
- if (parseStack != nullptr && error.isNull()) {
- pushParseState(where, state);
- }
-}
-
-/*
- This private function pushes the function pointer \a function and state \a
- state to the parse stack. This is used when you are doing an incremental
- parsing and reach the end of file too early.
-
- Only call this function when d->parseStack!=0.
-*/
-void QXmlSimpleReaderPrivate::pushParseState(ParseFunction function, int state)
-{
- QXmlSimpleReaderPrivate::ParseState ps;
- ps.function = function;
- ps.state = state;
- parseStack->push(ps);
-}
-
-inline static void updateValue(QString &value, const QChar *array, int &arrayPos, int &valueLen)
-{
- value.resize(valueLen + arrayPos);
- memcpy(value.data() + valueLen, array, arrayPos * sizeof(QChar));
- valueLen += arrayPos;
- arrayPos = 0;
-}
-
-// use buffers instead of QString::operator+= when single characters are read
-const QString& QXmlSimpleReaderPrivate::string()
-{
- updateValue(stringValue, stringArray, stringArrayPos, stringValueLen);
- return stringValue;
-}
-const QString& QXmlSimpleReaderPrivate::name()
-{
- updateValue(nameValue, nameArray, nameArrayPos, nameValueLen);
- return nameValue;
-}
-const QString& QXmlSimpleReaderPrivate::ref()
-{
- updateValue(refValue, refArray, refArrayPos, refValueLen);
- return refValue;
-}
-
-void QXmlSimpleReaderPrivate::stringAddC(QChar ch)
-{
- if (stringArrayPos == 256)
- updateValue(stringValue, stringArray, stringArrayPos, stringValueLen);
- stringArray[stringArrayPos++] = ch;
-}
-void QXmlSimpleReaderPrivate::nameAddC(QChar ch)
-{
- if (nameArrayPos == 256)
- updateValue(nameValue, nameArray, nameArrayPos, nameValueLen);
- nameArray[nameArrayPos++] = ch;
-}
-void QXmlSimpleReaderPrivate::refAddC(QChar ch)
-{
- if (refArrayPos == 256)
- updateValue(refValue, refArray, refArrayPos, refValueLen);
- refArray[refArrayPos++] = ch;
-}
-QT_END_NAMESPACE
-
-#endif // QT_DEPRECATED_SINCE(5, 15)
diff --git a/src/xml/sax/qxml.h b/src/xml/sax/qxml.h
deleted file mode 100644
index 6e19be193f..0000000000
--- a/src/xml/sax/qxml.h
+++ /dev/null
@@ -1,469 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtXml module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QXML_H
-#define QXML_H
-
-#if 0
-// This is needed because of QTBUG-80347
-#pragma qt_class(QXmlNamespaceSupport)
-#pragma qt_class(QXmlAttributes)
-#pragma qt_class(QXmlInputSource)
-#pragma qt_class(QXmlParseException)
-#pragma qt_class(QXmlReader)
-#pragma qt_class(QXmlSimpleReader)
-#pragma qt_class(QXmlLocator)
-#pragma qt_class(QXmlContentHandler)
-#pragma qt_class(QXmlErrorHandler)
-#pragma qt_class(QXmlDTDHandler)
-#pragma qt_class(QXmlEntityResolver)
-#pragma qt_class(QXmlLexicalHandler)
-#pragma qt_class(QXmlDeclHandler)
-#pragma qt_class(QXmlDefaultHandler)
-#endif
-
-#include <QtCore/qglobal.h>
-
-#include <QtXml/qtxmlglobal.h>
-#include <QtCore/qtextstream.h>
-#include <QtCore/qfile.h>
-#include <QtCore/qstring.h>
-#include <QtCore/qstringlist.h>
-#include <QtCore/qlist.h>
-#include <QtCore/qscopedpointer.h>
-
-#if QT_DEPRECATED_SINCE(5, 15)
-
-QT_BEGIN_NAMESPACE
-
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
-
-class QXmlNamespaceSupport;
-class QXmlAttributes;
-class QXmlContentHandler;
-class QXmlDefaultHandler;
-class QXmlDTDHandler;
-class QXmlEntityResolver;
-class QXmlErrorHandler;
-class QXmlLexicalHandler;
-class QXmlDeclHandler;
-class QXmlInputSource;
-class QXmlLocator;
-class QXmlNamespaceSupport;
-class QXmlParseException;
-
-class QXmlReader;
-class QXmlSimpleReader;
-
-class QXmlSimpleReaderPrivate;
-class QXmlNamespaceSupportPrivate;
-class QXmlAttributesPrivate;
-class QXmlInputSourcePrivate;
-class QXmlParseExceptionPrivate;
-class QXmlLocatorPrivate;
-class QXmlDefaultHandlerPrivate;
-
-//
-// SAX Namespace Support
-//
-
-class QT_DEPRECATED_VERSION(5, 15) Q_XML_EXPORT QXmlNamespaceSupport
-{
-public:
- QXmlNamespaceSupport();
- ~QXmlNamespaceSupport();
-
- void setPrefix(const QString&, const QString&);
-
- QString prefix(const QString&) const;
- QString uri(const QString&) const;
- void splitName(const QString&, QString&, QString&) const;
- void processName(const QString&, bool, QString&, QString&) const;
- QStringList prefixes() const;
- QStringList prefixes(const QString&) const;
-
- void pushContext();
- void popContext();
- void reset();
-
-private:
- QXmlNamespaceSupportPrivate *d;
-
- friend class QXmlSimpleReaderPrivate;
- Q_DISABLE_COPY(QXmlNamespaceSupport)
-};
-
-
-//
-// SAX Attributes
-//
-
-// Although deprecated warnings are disabled, the intel icc 18 compiler
-// still complains during the instantiation of the templated qSwap() call below
-// (with the parameter QXmlAttributes::AttributeList) when QXmlAttributes is
-// deprecated. This makes the build fail when warnings are treated as errors.
-// To workaround this, deprecated only the constructor.
-class Q_XML_EXPORT QXmlAttributes
-{
-public:
- QT_DEPRECATED_VERSION(5, 15) QXmlAttributes();
- QXmlAttributes(const QXmlAttributes &) = default;
- QXmlAttributes(QXmlAttributes &&) noexcept = default;
- QXmlAttributes &operator=(const QXmlAttributes &) = default;
- QXmlAttributes &operator=(QXmlAttributes &&) noexcept = default;
-
- ~QXmlAttributes();
-
- void swap(QXmlAttributes &other) noexcept
- {
- qSwap(attList, other.attList);
- qSwap(d, other.d);
- }
-
- int index(const QString& qName) const;
- int index(QLatin1String qName) const;
- int index(const QString& uri, const QString& localPart) const;
- int length() const;
- int count() const;
- QString localName(int index) const;
- QString qName(int index) const;
- QString uri(int index) const;
- QString type(int index) const;
- QString type(const QString& qName) const;
- QString type(const QString& uri, const QString& localName) const;
- QString value(int index) const;
- QString value(const QString& qName) const;
- QString value(QLatin1String qName) const;
- QString value(const QString& uri, const QString& localName) const;
-
- void clear();
- void append(const QString &qName, const QString &uri, const QString &localPart, const QString &value);
-
-private:
- struct Attribute {
- QString qname, uri, localname, value;
- };
- friend class QTypeInfo<Attribute>;
- typedef QList<Attribute> AttributeList;
- AttributeList attList;
-
- QXmlAttributesPrivate *d;
-};
-
-Q_DECLARE_TYPEINFO(QXmlAttributes::Attribute, Q_MOVABLE_TYPE);
-Q_DECLARE_SHARED(QXmlAttributes)
-
-//
-// SAX Input Source
-//
-
-class QT_DEPRECATED_VERSION(5, 15) Q_XML_EXPORT QXmlInputSource
-{
-public:
- QXmlInputSource();
- explicit QXmlInputSource(QIODevice *dev);
- virtual ~QXmlInputSource();
-
- virtual void setData(const QString& dat);
- virtual void setData(const QByteArray& dat);
- virtual void fetchData();
- virtual QString data() const;
- virtual QChar next();
- virtual void reset();
-
- static const char16_t EndOfData;
- static const char16_t EndOfDocument;
-
-protected:
- virtual QString fromRawData(const QByteArray &data, bool beginning = false);
-
-private:
- void init();
- QXmlInputSourcePrivate *d;
-};
-
-//
-// SAX Exception Classes
-//
-
-class QT_DEPRECATED_VERSION(5, 15) Q_XML_EXPORT QXmlParseException
-{
-public:
- explicit QXmlParseException(const QString &name = QString(), int c = -1, int l = -1,
- const QString &p = QString(), const QString &s = QString());
- QXmlParseException(const QXmlParseException &other);
- ~QXmlParseException();
-
- int columnNumber() const;
- int lineNumber() const;
- QString publicId() const;
- QString systemId() const;
- QString message() const;
-
-private:
- QScopedPointer<QXmlParseExceptionPrivate> d;
-};
-
-
-//
-// XML Reader
-//
-
-class QT_DEPRECATED_VERSION_X(5, 15, "Use QXmlStreamReader") Q_XML_EXPORT QXmlReader
-{
-public:
- virtual ~QXmlReader() {}
- virtual bool feature(const QString& name, bool *ok = nullptr) const = 0;
- virtual void setFeature(const QString& name, bool value) = 0;
- virtual bool hasFeature(const QString& name) const = 0;
- virtual void* property(const QString& name, bool *ok = nullptr) const = 0;
- virtual void setProperty(const QString& name, void* value) = 0;
- virtual bool hasProperty(const QString& name) const = 0;
- virtual void setEntityResolver(QXmlEntityResolver* handler) = 0;
- virtual QXmlEntityResolver* entityResolver() const = 0;
- virtual void setDTDHandler(QXmlDTDHandler* handler) = 0;
- virtual QXmlDTDHandler* DTDHandler() const = 0;
- virtual void setContentHandler(QXmlContentHandler* handler) = 0;
- virtual QXmlContentHandler* contentHandler() const = 0;
- virtual void setErrorHandler(QXmlErrorHandler* handler) = 0;
- virtual QXmlErrorHandler* errorHandler() const = 0;
- virtual void setLexicalHandler(QXmlLexicalHandler* handler) = 0;
- virtual QXmlLexicalHandler* lexicalHandler() const = 0;
- virtual void setDeclHandler(QXmlDeclHandler* handler) = 0;
- virtual QXmlDeclHandler* declHandler() const = 0;
- virtual bool parse(const QXmlInputSource& input) = 0;
- virtual bool parse(const QXmlInputSource* input) = 0;
-};
-
-class QT_DEPRECATED_VERSION_X(5, 15, "Use QXmlStreamReader") Q_XML_EXPORT QXmlSimpleReader
- : public QXmlReader
-{
-public:
- QXmlSimpleReader();
- virtual ~QXmlSimpleReader();
-
- bool feature(const QString& name, bool *ok = nullptr) const override;
- void setFeature(const QString& name, bool value) override;
- bool hasFeature(const QString& name) const override;
-
- void* property(const QString& name, bool *ok = nullptr) const override;
- void setProperty(const QString& name, void* value) override;
- bool hasProperty(const QString& name) const override;
-
- void setEntityResolver(QXmlEntityResolver* handler) override;
- QXmlEntityResolver* entityResolver() const override;
- void setDTDHandler(QXmlDTDHandler* handler) override;
- QXmlDTDHandler* DTDHandler() const override;
- void setContentHandler(QXmlContentHandler* handler) override;
- QXmlContentHandler* contentHandler() const override;
- void setErrorHandler(QXmlErrorHandler* handler) override;
- QXmlErrorHandler* errorHandler() const override;
- void setLexicalHandler(QXmlLexicalHandler* handler) override;
- QXmlLexicalHandler* lexicalHandler() const override;
- void setDeclHandler(QXmlDeclHandler* handler) override;
- QXmlDeclHandler* declHandler() const override;
-
- bool parse(const QXmlInputSource& input) override;
- bool parse(const QXmlInputSource* input) override;
- virtual bool parse(const QXmlInputSource* input, bool incremental);
- virtual bool parseContinue();
-
-private:
- Q_DISABLE_COPY(QXmlSimpleReader)
- Q_DECLARE_PRIVATE(QXmlSimpleReader)
- QScopedPointer<QXmlSimpleReaderPrivate> d_ptr;
-
- friend class QXmlSimpleReaderLocator;
- friend class QDomHandler;
-};
-
-//
-// SAX Locator
-//
-
-class QT_DEPRECATED_VERSION(5, 15) Q_XML_EXPORT QXmlLocator
-{
-public:
- QXmlLocator();
- virtual ~QXmlLocator();
-
- virtual int columnNumber() const = 0;
- virtual int lineNumber() const = 0;
-// QString getPublicId() const
-// QString getSystemId() const
-};
-
-//
-// SAX handler classes
-//
-
-class QT_DEPRECATED_VERSION(5, 15) Q_XML_EXPORT QXmlContentHandler
-{
-public:
- virtual ~QXmlContentHandler() {}
- virtual void setDocumentLocator(QXmlLocator* locator) = 0;
- virtual bool startDocument() = 0;
- virtual bool endDocument() = 0;
- virtual bool startPrefixMapping(const QString& prefix, const QString& uri) = 0;
- virtual bool endPrefixMapping(const QString& prefix) = 0;
- virtual bool startElement(const QString& namespaceURI, const QString& localName, const QString& qName, const QXmlAttributes& atts) = 0;
- virtual bool endElement(const QString& namespaceURI, const QString& localName, const QString& qName) = 0;
- virtual bool characters(const QString& ch) = 0;
- virtual bool ignorableWhitespace(const QString& ch) = 0;
- virtual bool processingInstruction(const QString& target, const QString& data) = 0;
- virtual bool skippedEntity(const QString& name) = 0;
- virtual QString errorString() const = 0;
-};
-
-class QT_DEPRECATED_VERSION(5, 15) Q_XML_EXPORT QXmlErrorHandler
-{
-public:
- virtual ~QXmlErrorHandler() {}
- virtual bool warning(const QXmlParseException& exception) = 0;
- virtual bool error(const QXmlParseException& exception) = 0;
- virtual bool fatalError(const QXmlParseException& exception) = 0;
- virtual QString errorString() const = 0;
-};
-
-class QT_DEPRECATED_VERSION(5, 15) Q_XML_EXPORT QXmlDTDHandler
-{
-public:
- virtual ~QXmlDTDHandler() {}
- virtual bool notationDecl(const QString& name, const QString& publicId, const QString& systemId) = 0;
- virtual bool unparsedEntityDecl(const QString& name, const QString& publicId, const QString& systemId, const QString& notationName) = 0;
- virtual QString errorString() const = 0;
-};
-
-class QT_DEPRECATED_VERSION(5, 15) Q_XML_EXPORT QXmlEntityResolver
-{
-public:
- virtual ~QXmlEntityResolver() {}
- virtual bool resolveEntity(const QString& publicId, const QString& systemId, QXmlInputSource*& ret) = 0;
- virtual QString errorString() const = 0;
-};
-
-class QT_DEPRECATED_VERSION(5, 15) Q_XML_EXPORT QXmlLexicalHandler
-{
-public:
- virtual ~QXmlLexicalHandler() {}
- virtual bool startDTD(const QString& name, const QString& publicId, const QString& systemId) = 0;
- virtual bool endDTD() = 0;
- virtual bool startEntity(const QString& name) = 0;
- virtual bool endEntity(const QString& name) = 0;
- virtual bool startCDATA() = 0;
- virtual bool endCDATA() = 0;
- virtual bool comment(const QString& ch) = 0;
- virtual QString errorString() const = 0;
-};
-
-class QT_DEPRECATED_VERSION(5, 15) Q_XML_EXPORT QXmlDeclHandler
-{
-public:
- virtual ~QXmlDeclHandler() {}
- virtual bool attributeDecl(const QString& eName, const QString& aName, const QString& type, const QString& valueDefault, const QString& value) = 0;
- virtual bool internalEntityDecl(const QString& name, const QString& value) = 0;
- virtual bool externalEntityDecl(const QString& name, const QString& publicId, const QString& systemId) = 0;
- virtual QString errorString() const = 0;
- // ### Conform to SAX by adding elementDecl
-};
-
-class QT_DEPRECATED_VERSION(5, 15) Q_XML_EXPORT QXmlDefaultHandler : public QXmlContentHandler,
- public QXmlErrorHandler,
- public QXmlDTDHandler,
- public QXmlEntityResolver,
- public QXmlLexicalHandler,
- public QXmlDeclHandler
-{
-public:
- QXmlDefaultHandler();
- virtual ~QXmlDefaultHandler();
-
- void setDocumentLocator(QXmlLocator* locator) override;
- bool startDocument() override;
- bool endDocument() override;
- bool startPrefixMapping(const QString& prefix, const QString& uri) override;
- bool endPrefixMapping(const QString& prefix) override;
- bool startElement(const QString& namespaceURI, const QString& localName, const QString& qName, const QXmlAttributes& atts) override;
- bool endElement(const QString& namespaceURI, const QString& localName, const QString& qName) override;
- bool characters(const QString& ch) override;
- bool ignorableWhitespace(const QString& ch) override;
- bool processingInstruction(const QString& target, const QString& data) override;
- bool skippedEntity(const QString& name) override;
-
- bool warning(const QXmlParseException& exception) override;
- bool error(const QXmlParseException& exception) override;
- bool fatalError(const QXmlParseException& exception) override;
-
- bool notationDecl(const QString& name, const QString& publicId, const QString& systemId) override;
- bool unparsedEntityDecl(const QString& name, const QString& publicId, const QString& systemId, const QString& notationName) override;
-
- bool resolveEntity(const QString& publicId, const QString& systemId, QXmlInputSource*& ret) override;
-
- bool startDTD(const QString& name, const QString& publicId, const QString& systemId) override;
- bool endDTD() override;
- bool startEntity(const QString& name) override;
- bool endEntity(const QString& name) override;
- bool startCDATA() override;
- bool endCDATA() override;
- bool comment(const QString& ch) override;
-
- bool attributeDecl(const QString& eName, const QString& aName, const QString& type, const QString& valueDefault, const QString& value) override;
- bool internalEntityDecl(const QString& name, const QString& value) override;
- bool externalEntityDecl(const QString& name, const QString& publicId, const QString& systemId) override;
-
- QString errorString() const override;
-
-private:
- QXmlDefaultHandlerPrivate *d;
- Q_DISABLE_COPY(QXmlDefaultHandler)
-};
-
-// inlines
-
-inline int QXmlAttributes::count() const
-{ return length(); }
-
-QT_WARNING_POP
-
-QT_END_NAMESPACE
-
-#endif // QT_DEPRECATED_SINCE(5, 15)
-
-#endif // QXML_H
diff --git a/src/xml/sax/qxml_p.h b/src/xml/sax/qxml_p.h
deleted file mode 100644
index 4f5568f214..0000000000
--- a/src/xml/sax/qxml_p.h
+++ /dev/null
@@ -1,328 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtXml module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QXML_P_H
-#define QXML_P_H
-
-#include <qstack.h>
-#include <qmap.h>
-#include <qhash.h>
-#include <qxml.h>
-
-#include <stack>
-
-#if QT_DEPRECATED_SINCE(5, 15)
-
-QT_BEGIN_NAMESPACE
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists for the convenience of
-// qxml.cpp and qdom.cpp. This header file may change from version to version without
-// notice, or even be removed.
-//
-// We mean it.
-//
-
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
-
-class QXmlSimpleReaderPrivate
-{
-public:
- ~QXmlSimpleReaderPrivate();
-private:
- // functions
- QXmlSimpleReaderPrivate(QXmlSimpleReader *reader);
- void initIncrementalParsing();
-
- // used to determine if elements are correctly nested
- std::stack<QString, QStringList> tags;
-
- // used by parseReference() and parsePEReference()
- enum EntityRecognitionContext { InContent, InAttributeValue, InEntityValue, InDTD };
-
- // used for entity declarations
- struct ExternParameterEntity
- {
- ExternParameterEntity() {}
- ExternParameterEntity(const QString &p, const QString &s)
- : publicId(p), systemId(s) {}
- QString publicId;
- QString systemId;
-
- Q_DUMMY_COMPARISON_OPERATOR(ExternParameterEntity)
- };
- friend class QTypeInfo<ExternParameterEntity>;
-
- struct ExternEntity
- {
- ExternEntity() {}
- ExternEntity(const QString &p, const QString &s, const QString &n)
- : publicId(p), systemId(s), notation(n) {}
- QString publicId;
- QString systemId;
- QString notation;
- Q_DUMMY_COMPARISON_OPERATOR(ExternEntity)
- };
- friend class QTypeInfo<ExternEntity>;
-
- QMap<QString,ExternParameterEntity> externParameterEntities;
- QMap<QString,QString> parameterEntities;
- QMap<QString,ExternEntity> externEntities;
- QMap<QString,QString> entities;
-
- // used for parsing of entity references
- struct XmlRef {
- XmlRef()
- : index(0) {}
- XmlRef(const QString &_name, const QString &_value)
- : name(_name), value(_value), index(0) {}
- bool isEmpty() const { return index == value.length(); }
- QChar next() { return value.at(index++); }
- QString name;
- QString value;
- int index;
- };
- friend class QTypeInfo<XmlRef>;
- QStack<XmlRef> xmlRefStack;
-
- // used for standalone declaration
- enum Standalone { Yes, No, Unknown };
-
- QString doctype; // only used for the doctype
- QString xmlVersion; // only used to store the version information
- QString encoding; // only used to store the encoding
- Standalone standalone; // used to store the value of the standalone declaration
-
- QString publicId; // used by parseExternalID() to store the public ID
- QString systemId; // used by parseExternalID() to store the system ID
-
- // Since publicId/systemId is used as temporary variables by parseExternalID(), it
- // might overwrite the PUBLIC/SYSTEM for the document we're parsing. In effect, we would
- // possibly send off an QXmlParseException that has the PUBLIC/SYSTEM of a entity declaration
- // instead of those of the current document.
- // Hence we have these two variables for storing the document's data.
- QString thisPublicId;
- QString thisSystemId;
-
- QString attDeclEName; // use by parseAttlistDecl()
- QString attDeclAName; // use by parseAttlistDecl()
-
- // flags for some features support
- bool useNamespaces;
- bool useNamespacePrefixes;
- bool reportWhitespaceCharData;
- bool reportEntities;
-
- // used to build the attribute list
- QXmlAttributes attList;
-
- // used in QXmlSimpleReader::parseContent() to decide whether character
- // data was read
- bool contentCharDataRead;
- // Hack for letting QDom know where the skipped entity occurred
- bool skipped_entity_in_content;
-
- // helper classes
- QScopedPointer<QXmlLocator> locator;
- QXmlNamespaceSupport namespaceSupport;
-
- // error string
- QString error;
-
- // arguments for parse functions (this is needed to allow incremental
- // parsing)
- bool parsePI_xmldecl;
- bool parseName_useRef;
- bool parseReference_charDataRead;
- EntityRecognitionContext parseReference_context;
- bool parseExternalID_allowPublicID;
- EntityRecognitionContext parsePEReference_context;
- QString parseString_s;
-
- // for incremental parsing
- struct ParseState {
- typedef bool (QXmlSimpleReaderPrivate::*ParseFunction)();
- ParseFunction function;
- int state;
- };
- friend class QTypeInfo<ParseState>;
- QStack<ParseState> *parseStack;
-
- // used in parseProlog()
- bool xmldecl_possible;
- bool doctype_read;
-
- // used in parseDoctype()
- bool startDTDwasReported;
-
- // used in parseString()
- signed char Done;
-
-
- // variables
- QXmlContentHandler *contentHnd;
- QXmlErrorHandler *errorHnd;
- QXmlDTDHandler *dtdHnd;
- QXmlEntityResolver *entityRes;
- QXmlLexicalHandler *lexicalHnd;
- QXmlDeclHandler *declHnd;
-
- QXmlInputSource *inputSource;
-
- QChar c; // the character at reading position
- int lineNr; // number of line
- int columnNr; // position in line
-
- QChar nameArray[256]; // only used for names
- QString nameValue; // only used for names
- int nameArrayPos;
- int nameValueLen;
- QChar refArray[256]; // only used for references
- QString refValue; // only used for references
- int refArrayPos;
- int refValueLen;
- QChar stringArray[256]; // used for any other strings that are parsed
- QString stringValue; // used for any other strings that are parsed
- int stringArrayPos;
- int stringValueLen;
- QString emptyStr;
-
- QHash<QString, int> literalEntitySizes;
- // The entity at (QMap<QString,) referenced the entities at (QMap<QString,) (int>) times.
- QHash<QString, QHash<QString, int> > referencesToOtherEntities;
- QHash<QString, int> expandedSizes;
- // The limit to the amount of times the DTD parsing functions can be called
- // for the DTD currently being parsed.
- static const int dtdRecursionLimit = 2;
- // The maximum amount of characters an entity value may contain, after expansion.
- static const int entityCharacterLimit = 4096;
-
- const QString &string();
- void stringClear();
- void stringAddC(QChar);
- inline void stringAddC() { stringAddC(c); }
- const QString &name();
- void nameClear();
- void nameAddC(QChar);
- inline void nameAddC() { nameAddC(c); }
- const QString &ref();
- void refClear();
- void refAddC(QChar);
- inline void refAddC() { refAddC(c); }
-
- // private functions
- bool eat_ws();
- bool next_eat_ws();
-
- void QT_FASTCALL next();
- bool atEnd();
-
- void init(const QXmlInputSource* i);
- void initData();
-
- bool entityExist(const QString&) const;
-
- bool parseBeginOrContinue(int state, bool incremental);
-
- bool parseProlog();
- bool parseElement();
- bool processElementEmptyTag();
- bool processElementETagBegin2();
- bool processElementAttribute();
- bool parseMisc();
- bool parseContent();
-
- bool parsePI();
- bool parseDoctype();
- bool parseComment();
-
- bool parseName();
- bool parseNmtoken();
- bool parseAttribute();
- bool parseReference();
- bool processReference();
-
- bool parseExternalID();
- bool parsePEReference();
- bool parseMarkupdecl();
- bool parseAttlistDecl();
- bool parseAttType();
- bool parseAttValue();
- bool parseElementDecl();
- bool parseNotationDecl();
- bool parseChoiceSeq();
- bool parseEntityDecl();
- bool parseEntityValue();
-
- bool parseString();
-
- bool insertXmlRef(const QString&, const QString&, bool);
-
- bool reportEndEntities();
- void reportParseError(const QString& error);
-
- typedef bool (QXmlSimpleReaderPrivate::*ParseFunction) ();
- void unexpectedEof(ParseFunction where, int state);
- void parseFailed(ParseFunction where, int state);
- void pushParseState(ParseFunction function, int state);
-
- bool isExpandedEntityValueTooLarge(QString *errorMessage);
-
- Q_DECLARE_PUBLIC(QXmlSimpleReader)
- QXmlSimpleReader *q_ptr;
-
- friend class QXmlSimpleReaderLocator;
- friend class QDomHandler;
-};
-Q_DECLARE_TYPEINFO(QXmlSimpleReaderPrivate::ParseState, Q_PRIMITIVE_TYPE);
-Q_DECLARE_TYPEINFO(QXmlSimpleReaderPrivate::XmlRef, Q_MOVABLE_TYPE);
-Q_DECLARE_TYPEINFO(QXmlSimpleReaderPrivate::ExternParameterEntity, Q_MOVABLE_TYPE);
-Q_DECLARE_TYPEINFO(QXmlSimpleReaderPrivate::ExternEntity, Q_MOVABLE_TYPE);
-
-QT_WARNING_POP
-
-QT_END_NAMESPACE
-
-#endif // QT_DEPRECATED_SINCE(5, 15)
-
-#endif // QXML_P_H
diff --git a/src/xml/sax/sax.pri b/src/xml/sax/sax.pri
deleted file mode 100644
index 5793996898..0000000000
--- a/src/xml/sax/sax.pri
+++ /dev/null
@@ -1,3 +0,0 @@
-SOURCES += $$PWD/qxml.cpp
-HEADERS += $$PWD/qxml_p.h \
- $$PWD/qxml.h
diff --git a/src/xml/xml.pro b/src/xml/xml.pro
index 31d742d6ea..5474d477e4 100644
--- a/src/xml/xml.pro
+++ b/src/xml/xml.pro
@@ -12,6 +12,5 @@ HEADERS += qtxmlglobal.h
PRECOMPILED_HEADER =
include(dom/dom.pri)
-include(sax/sax.pri)
load(qt_module)