diff -r 000000000000 -r 1918ee327afb tools/porting/src/qtsimplexml.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/porting/src/qtsimplexml.cpp Mon Jan 11 14:00:40 2010 +0000 @@ -0,0 +1,278 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the qt3to4 porting application of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qtsimplexml.h" +#include + +QT_BEGIN_NAMESPACE + +QtSimpleXml::QtSimpleXml(const QString &name) +{ + valid = false; + n = name; + parent = 0; +} + +QtSimpleXml &QtSimpleXml::operator [](int index) +{ + if (index < 0) + return *this; + + if (index > children.size()) { + static QtSimpleXml NIL; + qWarning("QtSimpleXml::operator[], Out of range access: size is %i, index is %i", + children.size(), index); + return NIL; + } + + if (index == children.size()) { + QtSimpleXml *item = new QtSimpleXml(QLatin1String("item")); + item->parent = this; + children.insert(item->name(), item); + return *item; + } + + QMultiMap::Iterator it = children.begin(); + while (index--) ++it; + return *it.value(); +} + +QtSimpleXml &QtSimpleXml::operator [](const QString &key) +{ + if (!children.contains(key)) { + QtSimpleXml *item = new QtSimpleXml(key); + item->parent = this; + children.insert(item->name(), item); + return *item; + } + + return *children.find(key).value(); +} + +QtSimpleXml &QtSimpleXml::operator =(const QString &text) +{ + valid = true; + QtSimpleXml *p = parent; + while (p && !p->valid) { + p->valid = true; + p = p->parent; + } + + s = text; + return *this; +} + +QDomDocument QtSimpleXml::toDomDocument() const +{ + QDomDocument doc; + QString data = QLatin1String("version=\"1.0\" encoding=\"UTF-8\""); + doc.appendChild(doc.createProcessingInstruction(QLatin1String("xml"), data)); + + if (!valid) + return doc; + + if(!s.isEmpty()) + doc.appendChild(doc.createTextNode(s)); + + { + QMultiMap::ConstIterator it = children.constBegin(); + for (; it != children.end(); ++it) { + QtSimpleXml *item = it.value(); + if (item->valid) { + QDomNode node = item->toDomElement(&doc); + doc.appendChild(node); + } + } + } + + return doc; +} + +QDomElement QtSimpleXml::toDomElement(QDomDocument *doc) const +{ + QDomElement elem = doc->createElement(n); + QMap::ConstIterator ita = attr.constBegin(); + for (; ita != attr.constEnd(); ++ita) + elem.setAttribute(ita.key(), ita.value()); + + if(!s.isEmpty()) + elem.appendChild(doc->createTextNode(s)); + + { + QMultiMap::ConstIterator it = children.constBegin(); + for (; it != children.constEnd(); ++it) { + QtSimpleXml *item = it.value(); + if (item->valid) { + QDomNode node = item->toDomElement(doc); + elem.appendChild(node); + } + } + } + + return elem; +} + +QString QtSimpleXml::name() const +{ + return n; +} + +QString QtSimpleXml::text() const +{ + return s; +} + +int QtSimpleXml::numChildren() const +{ + return children.count(); +} + +bool QtSimpleXml::isValid() const +{ + return valid; +} + +void QtSimpleXml::setAttribute(const QString &key, const QString &value) +{ + attr.insert(key, QString(value)); +} + +QString QtSimpleXml::attribute(const QString &key) +{ + return attr[key]; +} + +bool QtSimpleXml::setContent(const QString &content) +{ + QDomDocument doc; + QString errorMsg; + int errorLine; + int errorColumn; + + if (!doc.setContent(content, false, &errorMsg, &errorLine, &errorColumn)) { + errorStr = errorMsg; + errorStr += QLatin1String(" at ") + QString::number(errorLine) + QLatin1String(":") + QString::number(errorColumn); + return false; + } + + parse(doc); + return true; +} + +bool QtSimpleXml::setContent(QIODevice *device) +{ + QDomDocument doc; + QString errorMsg; + int errorLine; + int errorColumn; + if (!doc.setContent(device, false, &errorMsg, &errorLine, &errorColumn)) { + errorStr = errorMsg; + errorStr += QLatin1String(" at ") + QString::number(errorLine) + QLatin1String(":") + QString::number(errorColumn); + return false; + } + + QDomNode child = doc.firstChild(); + while (!child.isNull() && !child.isElement()) + child = child.nextSibling(); + + while (!child.isNull()) { + QtSimpleXml *xmlNode = new QtSimpleXml; + xmlNode->parse(child); + xmlNode->parent=this; + children.insert(xmlNode->name(), xmlNode); + do { + child = child.nextSibling(); + } while (!child.isNull() && !child.isElement()); + } + + return true; +} + + +void QtSimpleXml::parse(QDomNode node) +{ + // puts("parse"); + if (node.isNull()) + return; + + valid = true; + n = node.nodeName(); + QDomElement element = node.toElement(); + + QDomNamedNodeMap attrs = element.attributes(); + for (int i = 0; i < (int) attrs.count(); ++i) { + QDomAttr attribute = attrs.item(i).toAttr(); + attr.insert(attribute.name(), attribute.value()); + } + + if (element.firstChild().isText()) { + // printf("Got text %s\n", element.text().stripWhiteSpace().latin1()); + s = element.text().trimmed(); + return; + } + + if (node.hasChildNodes()) { + + // Skip to first element child + QDomNode child = node.firstChild(); + while (!child.isNull() && !child.isElement()) + child = child.nextSibling(); + + while (!child.isNull()) { + QtSimpleXml *xmlNode = new QtSimpleXml; + xmlNode->parse(child); + children.insert(xmlNode->name(), xmlNode); + + node = node.nextSibling(); + + do { + child = child.nextSibling(); + } while (!child.isNull() && !child.isElement()); + } + } +} + +QString QtSimpleXml::errorString() const +{ + return errorStr; +} + +QT_END_NAMESPACE