diff options
Diffstat (limited to 'src/xml/dom/qdomhelpers.cpp')
-rw-r--r-- | src/xml/dom/qdomhelpers.cpp | 238 |
1 files changed, 181 insertions, 57 deletions
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 ¬ationName) +{ + 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 ¬ationName) { 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 |