summaryrefslogtreecommitdiffstats
path: root/src/xml/dom
diff options
context:
space:
mode:
authorQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2019-11-25 01:00:25 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2019-11-25 11:30:04 +0100
commit58c69df4d38324644bc49ec5f42ee8343a454b2d (patch)
treede0a1ce603292dcaff134d4e1e8ab064295515a2 /src/xml/dom
parent03b1d2c44940322208c12c7bceee376b51d8e852 (diff)
parent59a705e3710b0ba93bb698e3223241cfac932948 (diff)
Merge remote-tracking branch 'origin/5.15' into dev
Conflicts: src/corelib/tools/qhash.h src/gui/kernel/qevent.h src/widgets/kernel/qshortcut.cpp src/widgets/kernel/qshortcut.h Change-Id: If61c206ee43ad1d97f5b07f58ac93c4583ce5620
Diffstat (limited to 'src/xml/dom')
-rw-r--r--src/xml/dom/qdom.cpp27
-rw-r--r--src/xml/dom/qdomhelpers.cpp238
-rw-r--r--src/xml/dom/qdomhelpers_p.h90
3 files changed, 273 insertions, 82 deletions
diff --git a/src/xml/dom/qdom.cpp b/src/xml/dom/qdom.cpp
index 7dbf864a7c..b3357d7835 100644
--- a/src/xml/dom/qdom.cpp
+++ b/src/xml/dom/qdom.cpp
@@ -2648,7 +2648,7 @@ QDomNodePrivate* QDomNamedNodeMapPrivate::item(int index) const
{
if (index >= length() || index < 0)
return nullptr;
- return *(map.constBegin() + index);
+ return *std::next(map.cbegin(), index);
}
int QDomNamedNodeMapPrivate::length() const
@@ -4312,20 +4312,20 @@ void QDomElement::setAttribute(const QString& name, const QString& value)
\fn void QDomElement::setAttribute(const QString& name, int value)
\overload
- The number is formatted according to the current locale.
+ The formatting always uses QLocale::C.
*/
/*!
\fn void QDomElement::setAttribute(const QString& name, uint value)
\overload
- The number is formatted according to the current locale.
+ The formatting always uses QLocale::C.
*/
/*!
\overload
- The number is formatted according to the current locale.
+ The formatting always uses QLocale::C.
*/
void QDomElement::setAttribute(const QString& name, qlonglong value)
{
@@ -4339,7 +4339,7 @@ void QDomElement::setAttribute(const QString& name, qlonglong value)
/*!
\overload
- The number is formatted according to the current locale.
+ The formatting always uses QLocale::C.
*/
void QDomElement::setAttribute(const QString& name, qulonglong value)
{
@@ -4353,7 +4353,7 @@ void QDomElement::setAttribute(const QString& name, qulonglong value)
/*!
\overload
- The number is formatted according to the current locale.
+ The formatting always uses QLocale::C.
*/
void QDomElement::setAttribute(const QString& name, float value)
{
@@ -4367,19 +4367,14 @@ void QDomElement::setAttribute(const QString& name, float value)
/*!
\overload
- The number is formatted according to the current locale.
+ The formatting always uses QLocale::C.
*/
void QDomElement::setAttribute(const QString& name, double value)
{
if (!impl)
return;
QString x;
- char buf[256];
- int count = qsnprintf(buf, sizeof(buf), "%.16g", value);
- if (count > 0)
- x = QString::fromLatin1(buf, count);
- else
- x.setNum(value); // Fallback
+ x.setNum(value);
IMPL->setAttribute(name, x);
}
@@ -5728,11 +5723,11 @@ bool QDomDocumentPrivate::setContent(QXmlInputSource *source, QXmlReader *reader
if (!reader->parse(source)) {
if (errorMsg)
- *errorMsg = hnd.errorMsg;
+ *errorMsg = std::get<0>(hnd.errorInfo());
if (errorLine)
- *errorLine = hnd.errorLine;
+ *errorLine = std::get<1>(hnd.errorInfo());
if (errorColumn)
- *errorColumn = hnd.errorColumn;
+ *errorColumn = std::get<2>(hnd.errorInfo());
return false;
}
diff --git a/src/xml/dom/qdomhelpers.cpp b/src/xml/dom/qdomhelpers.cpp
index 74d2c8c124..bda6f8ef87 100644
--- a/src/xml/dom/qdomhelpers.cpp
+++ b/src/xml/dom/qdomhelpers.cpp
@@ -51,14 +51,7 @@ QT_BEGIN_NAMESPACE
QDomHandler::QDomHandler(QDomDocumentPrivate *adoc, QXmlSimpleReader *areader,
bool namespaceProcessing)
- : errorLine(0),
- errorColumn(0),
- doc(adoc),
- node(adoc),
- cdata(false),
- nsProcessing(namespaceProcessing),
- locator(nullptr),
- reader(areader)
+ : cdata(false), reader(areader), domBuilder(adoc, &locator, namespaceProcessing)
{
}
@@ -66,13 +59,161 @@ 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();
+}
+
+/**************************************************************
+ *
+ * QXmlDocumentLocators
+ *
+ **************************************************************/
+
+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());
+}
+
+/**************************************************************
+ *
+ * QDomBuilder
+ *
+ **************************************************************/
+
+QDomBuilder::QDomBuilder(QDomDocumentPrivate *d, QXmlDocumentLocator *l, bool namespaceProcessing)
+ : errorLine(0),
+ errorColumn(0),
+ doc(d),
+ node(d),
+ locator(l),
+ nsProcessing(namespaceProcessing)
+{
+}
+
+QDomBuilder::~QDomBuilder() {}
+
+bool QDomBuilder::endDocument()
+{
// ### is this really necessary? (rms)
if (node != doc)
return false;
return true;
}
-bool QDomHandler::startDTD(const QString &name, const QString &publicId, const QString &systemId)
+bool QDomBuilder::startDTD(const QString &name, const QString &publicId, const QString &systemId)
{
doc->doctype()->name = name;
doc->doctype()->publicId = publicId;
@@ -80,7 +221,7 @@ bool QDomHandler::startDTD(const QString &name, const QString &publicId, const Q
return true;
}
-bool QDomHandler::startElement(const QString &nsURI, const QString &, const QString &qName,
+bool QDomBuilder::startElement(const QString &nsURI, const QString &qName,
const QXmlAttributes &atts)
{
// tag name
@@ -94,24 +235,24 @@ bool QDomHandler::startElement(const QString &nsURI, const QString &, const QStr
if (!n)
return false;
- n->setLocation(locator->lineNumber(), locator->columnNumber());
+ n->setLocation(locator->line(), locator->column());
node->appendChild(n);
node = n;
// attributes
for (int i = 0; i < atts.length(); i++) {
- if (nsProcessing) {
- ((QDomElementPrivate *)node)->setAttributeNS(atts.uri(i), atts.qName(i), atts.value(i));
- } else {
- ((QDomElementPrivate *)node)->setAttribute(atts.qName(i), atts.value(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;
}
-bool QDomHandler::endElement(const QString &, const QString &, const QString &)
+bool QDomBuilder::endElement()
{
if (!node || node == doc)
return false;
@@ -120,7 +261,7 @@ bool QDomHandler::endElement(const QString &, const QString &, const QString &)
return true;
}
-bool QDomHandler::characters(const QString &ch)
+bool QDomBuilder::characters(const QString &characters, bool cdata)
{
// No text as child of some document
if (node == doc)
@@ -128,91 +269,79 @@ bool QDomHandler::characters(const QString &ch)
QScopedPointer<QDomNodePrivate> n;
if (cdata) {
- n.reset(doc->createCDATASection(ch));
+ n.reset(doc->createCDATASection(characters));
} else if (!entityName.isEmpty()) {
QScopedPointer<QDomEntityPrivate> e(
new QDomEntityPrivate(doc, nullptr, entityName, QString(), QString(), QString()));
- e->value = ch;
+ e->value = characters;
e->ref.deref();
doc->doctype()->appendChild(e.data());
e.take();
n.reset(doc->createEntityReference(entityName));
} else {
- n.reset(doc->createTextNode(ch));
+ n.reset(doc->createTextNode(characters));
}
- n->setLocation(locator->lineNumber(), locator->columnNumber());
+ n->setLocation(locator->line(), locator->column());
node->appendChild(n.data());
n.take();
return true;
}
-bool QDomHandler::processingInstruction(const QString &target, const QString &data)
+bool QDomBuilder::processingInstruction(const QString &target, const QString &data)
{
QDomNodePrivate *n;
n = doc->createProcessingInstruction(target, data);
if (n) {
- n->setLocation(locator->lineNumber(), locator->columnNumber());
+ n->setLocation(locator->line(), locator->column());
node->appendChild(n);
return true;
} else
return false;
}
-bool QDomHandler::skippedEntity(const QString &name)
+bool QDomBuilder::skippedEntity(const QString &name)
{
- // we can only handle inserting entity references into content
- if (reader && !reader->d_ptr->skipped_entity_in_content)
- return true;
-
QDomNodePrivate *n = doc->createEntityReference(name);
- n->setLocation(locator->lineNumber(), locator->columnNumber());
+ n->setLocation(locator->line(), locator->column());
node->appendChild(n);
return true;
}
-bool QDomHandler::fatalError(const QXmlParseException &exception)
-{
- errorMsg = exception.message();
- errorLine = exception.lineNumber();
- errorColumn = exception.columnNumber();
- return QXmlDefaultHandler::fatalError(exception);
-}
-
-bool QDomHandler::startCDATA()
+void QDomBuilder::fatalError(const QString &message)
{
- cdata = true;
- return true;
+ errorMsg = message;
+ errorLine = static_cast<int>(locator->line());
+ errorColumn = static_cast<int>(locator->column());
}
-bool QDomHandler::endCDATA()
+QDomBuilder::ErrorInfo QDomBuilder::error() const
{
- cdata = false;
- return true;
+ return ErrorInfo(errorMsg, errorLine, errorColumn);
}
-bool QDomHandler::startEntity(const QString &name)
+bool QDomBuilder::startEntity(const QString &name)
{
entityName = name;
return true;
}
-bool QDomHandler::endEntity(const QString &)
+bool QDomBuilder::endEntity()
{
entityName.clear();
return true;
}
-bool QDomHandler::comment(const QString &ch)
+bool QDomBuilder::comment(const QString &characters)
{
QDomNodePrivate *n;
- n = doc->createComment(ch);
- n->setLocation(locator->lineNumber(), locator->columnNumber());
+ n = doc->createComment(characters);
+ n->setLocation(locator->line(), locator->column());
node->appendChild(n);
return true;
}
-bool QDomHandler::unparsedEntityDecl(const QString &name, const QString &publicId,
+bool QDomBuilder::unparsedEntityDecl(const QString &name, const QString &publicId,
const QString &systemId, const QString &notationName)
{
QDomEntityPrivate *e =
@@ -223,13 +352,13 @@ bool QDomHandler::unparsedEntityDecl(const QString &name, const QString &publicI
return true;
}
-bool QDomHandler::externalEntityDecl(const QString &name, const QString &publicId,
+bool QDomBuilder::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,
+bool QDomBuilder::notationDecl(const QString &name, const QString &publicId,
const QString &systemId)
{
QDomNotationPrivate *n = new QDomNotationPrivate(doc, nullptr, name, publicId, systemId);
@@ -239,9 +368,4 @@ bool QDomHandler::notationDecl(const QString &name, const QString &publicId,
return true;
}
-void QDomHandler::setDocumentLocator(QXmlLocator *locator)
-{
- this->locator = locator;
-}
-
QT_END_NAMESPACE
diff --git a/src/xml/dom/qdomhelpers_p.h b/src/xml/dom/qdomhelpers_p.h
index ee81f1f9ce..7647de65d2 100644
--- a/src/xml/dom/qdomhelpers_p.h
+++ b/src/xml/dom/qdomhelpers_p.h
@@ -60,6 +60,83 @@ class QDomNodePrivate;
/**************************************************************
*
+ * QXmlDocumentLocators
+ *
+ **************************************************************/
+
+/* TODO: QXmlDocumentLocator can be removed when the SAX-based
+ * implementation is removed. Right now it is needed for QDomBuilder
+ * to work with both QXmlStreamReader and QXmlInputSource (SAX)
+ * based implementations.
+ */
+class QXmlDocumentLocator
+{
+public:
+ virtual ~QXmlDocumentLocator() = default;
+ virtual int column() const = 0;
+ virtual int line() const = 0;
+};
+
+class QSAXDocumentLocator : public QXmlDocumentLocator
+{
+public:
+ ~QSAXDocumentLocator() override = default;
+
+ int column() const override;
+ int line() const override;
+
+ void setLocator(QXmlLocator *l);
+
+private:
+ QXmlLocator *locator = nullptr;
+};
+
+/**************************************************************
+ *
+ * QDomBuilder
+ *
+ **************************************************************/
+
+class QDomBuilder
+{
+public:
+ QDomBuilder(QDomDocumentPrivate *d, QXmlDocumentLocator *l, bool namespaceProcessing);
+ ~QDomBuilder();
+
+ bool endDocument();
+ bool startElement(const QString &nsURI, const QString &qName, const QXmlAttributes &atts);
+ bool endElement();
+ bool characters(const QString &characters, bool cdata = false);
+ bool processingInstruction(const QString &target, const QString &data);
+ bool skippedEntity(const QString &name);
+ bool startEntity(const QString &name);
+ bool endEntity();
+ bool startDTD(const QString &name, const QString &publicId, const QString &systemId);
+ bool comment(const QString &characters);
+ bool externalEntityDecl(const QString &name, const QString &publicId, const QString &systemId);
+ bool notationDecl(const QString &name, const QString &publicId, const QString &systemId);
+ bool unparsedEntityDecl(const QString &name, const QString &publicId, const QString &systemId,
+ const QString &notationName);
+
+ void fatalError(const QString &message);
+
+ using ErrorInfo = std::tuple<QString, int, int>;
+ ErrorInfo error() const;
+
+ QString errorMsg;
+ int errorLine;
+ int errorColumn;
+
+private:
+ QDomDocumentPrivate *doc;
+ QDomNodePrivate *node;
+ QXmlDocumentLocator *locator;
+ QString entityName;
+ bool nsProcessing;
+};
+
+/**************************************************************
+ *
* QDomHandler
*
**************************************************************/
@@ -68,7 +145,7 @@ class QDomHandler : public QXmlDefaultHandler
{
public:
QDomHandler(QDomDocumentPrivate *d, QXmlSimpleReader *reader, bool namespaceProcessing);
- ~QDomHandler();
+ ~QDomHandler() override;
// content handler
bool endDocument() override;
@@ -102,18 +179,13 @@ public:
void setDocumentLocator(QXmlLocator *locator) override;
- QString errorMsg;
- int errorLine;
- int errorColumn;
+ QDomBuilder::ErrorInfo errorInfo() const;
private:
- QDomDocumentPrivate *doc;
- QDomNodePrivate *node;
- QString entityName;
bool cdata;
- bool nsProcessing;
- QXmlLocator *locator;
QXmlSimpleReader *reader;
+ QSAXDocumentLocator locator;
+ QDomBuilder domBuilder;
};
QT_END_NAMESPACE