aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gui/kconfigloader.cpp113
-rw-r--r--src/gui/kconfigloaderhandler_p.h19
2 files changed, 86 insertions, 46 deletions
diff --git a/src/gui/kconfigloader.cpp b/src/gui/kconfigloader.cpp
index 760b1500..181def6d 100644
--- a/src/gui/kconfigloader.cpp
+++ b/src/gui/kconfigloader.cpp
@@ -25,8 +25,6 @@
#include <QFont>
#include <QHash>
#include <QXmlContentHandler>
-#include <QXmlInputSource>
-#include <QXmlSimpleReader>
#include <QUrl>
#include <QDebug>
@@ -37,38 +35,77 @@ void ConfigLoaderPrivate::parse(KConfigLoader *loader, QIODevice *xml)
loader->clearItems();
if (xml) {
- QXmlInputSource source(xml);
- QXmlSimpleReader reader;
ConfigLoaderHandler handler(loader, this);
- reader.setContentHandler(&handler);
- reader.parse(&source, false);
+ handler.parse(xml);
}
}
ConfigLoaderHandler::ConfigLoaderHandler(KConfigLoader *config, ConfigLoaderPrivate *d)
- : QXmlDefaultHandler(),
- m_config(config),
+ : m_config(config),
d(d)
{
resetState();
}
-bool ConfigLoaderHandler::startElement(const QString &namespaceURI, const QString &localName,
- const QString &qName, const QXmlAttributes &attrs)
+bool ConfigLoaderHandler::parse(QIODevice *input)
+{
+ if (!input->open(QIODevice::ReadOnly)) {
+ qWarning() << "Impossible to open device";
+ return false;
+ }
+ QXmlStreamReader reader(input);
+
+ while (!reader.atEnd()) {
+ reader.readNext();
+ if (reader.hasError())
+ return false;
+
+ switch (reader.tokenType()) {
+ case QXmlStreamReader::StartElement:
+ if (!startElement(reader.namespaceUri(), reader.name(),
+ reader.qualifiedName(), reader.attributes())) {
+ return false;
+ }
+ break;
+ case QXmlStreamReader::EndElement:
+ if (!endElement(reader.namespaceUri(), reader.name(),
+ reader.qualifiedName())) {
+ return false;
+ }
+ break;
+ case QXmlStreamReader::Characters:
+ if (!reader.isWhitespace() && !reader.text().trimmed().isEmpty()) {
+ if (!characters(reader.text()))
+ return false;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (reader.isEndDocument())
+ return false;
+
+ return true;
+}
+
+bool ConfigLoaderHandler::startElement(const QStringRef &namespaceURI, const QStringRef &localName,
+ const QStringRef &qName, const QXmlStreamAttributes &attrs)
{
Q_UNUSED(namespaceURI)
Q_UNUSED(qName)
-// qDebug() << "ConfigLoaderHandler::startElement(" << localName << qName;
- int numAttrs = attrs.count();
- QString tag = localName.toLower();
+ // qDebug() << "ConfigLoaderHandler::startElement(" << localName << qName;
+ const int numAttrs = attrs.count();
+ const QString tag = localName.toString().toLower();
if (tag == QLatin1String("group")) {
QString group;
for (int i = 0; i < numAttrs; ++i) {
- QString name = attrs.localName(i).toLower();
- if (name == QLatin1String("name")) {
+ const QStringRef name = attrs.at(i).name();
+ if (name.compare(QLatin1String("name"), Qt::CaseInsensitive) == 0) {
//qDebug() << "set group to" << attrs.value(i);
- group = attrs.value(i);
+ group = attrs.at(i).value().toString();
}
}
if (group.isEmpty()) {
@@ -85,13 +122,13 @@ bool ConfigLoaderHandler::startElement(const QString &namespaceURI, const QStrin
}
} else if (tag == QLatin1String("entry")) {
for (int i = 0; i < numAttrs; ++i) {
- QString name = attrs.localName(i).toLower();
- if (name == QLatin1String("name")) {
- m_name = attrs.value(i).trimmed();
- } else if (name == QLatin1String("type")) {
- m_type = attrs.value(i).toLower();
- } else if (name == QLatin1String("key")) {
- m_key = attrs.value(i).trimmed();
+ const QStringRef name = attrs.at(i).name();
+ if (name.compare(QLatin1String("name"), Qt::CaseInsensitive) == 0) {
+ m_name = attrs.at(i).value().trimmed().toString();
+ } else if (name.compare(QLatin1String("type"), Qt::CaseInsensitive) == 0) {
+ m_type = attrs.at(i).value().toString().toLower();
+ } else if (name.compare(QLatin1String("key"), Qt::CaseInsensitive) == 0) {
+ m_key = attrs.at(i).value().trimmed().toString();
}
}
} else if (tag == QLatin1String("choice")) {
@@ -99,9 +136,9 @@ bool ConfigLoaderHandler::startElement(const QString &namespaceURI, const QStrin
m_choice.label.clear();
m_choice.whatsThis.clear();
for (int i = 0; i < numAttrs; ++i) {
- QString name = attrs.localName(i).toLower();
- if (name == QLatin1String("name")) {
- m_choice.name = attrs.value(i);
+ const QStringRef name = attrs.at(i).name();
+ if (name.compare(QLatin1String("name"), Qt::CaseInsensitive) == 0) {
+ m_choice.name = attrs.at(i).value().toString();
}
}
m_inChoice = true;
@@ -110,9 +147,9 @@ bool ConfigLoaderHandler::startElement(const QString &namespaceURI, const QStrin
return true;
}
-bool ConfigLoaderHandler::characters(const QString &ch)
+bool ConfigLoaderHandler::characters(const QStringRef &ch)
{
- m_cdata.append(ch);
+ m_cdata.append(ch.toString());
return true;
}
@@ -146,36 +183,36 @@ QString ConfigLoaderHandler::defaultValue() const
return m_default;
}
-bool ConfigLoaderHandler::endElement(const QString &namespaceURI,
- const QString &localName, const QString &qName)
+bool ConfigLoaderHandler::endElement(const QStringRef &namespaceURI,
+ const QStringRef &localName, const QStringRef &qName)
{
Q_UNUSED(namespaceURI)
Q_UNUSED(qName)
// qDebug() << "ConfigLoaderHandler::endElement(" << localName << qName;
- const QString tag = localName.toLower();
- if (tag == QLatin1String("entry")) {
+ const QStringRef tag = localName;
+ if (tag.compare(QLatin1String("entry"), Qt::CaseInsensitive) == 0) {
addItem();
resetState();
- } else if (tag == QLatin1String("label")) {
+ } else if (tag.compare(QLatin1String("label"), Qt::CaseInsensitive) == 0) {
if (m_inChoice) {
m_choice.label = m_cdata.trimmed();
} else {
m_label = m_cdata.trimmed();
}
- } else if (tag == QLatin1String("whatsthis")) {
+ } else if (tag.compare(QLatin1String("whatsthis"), Qt::CaseInsensitive) == 0) {
if (m_inChoice) {
m_choice.whatsThis = m_cdata.trimmed();
} else {
m_whatsThis = m_cdata.trimmed();
}
- } else if (tag == QLatin1String("default")) {
+ } else if (tag.compare(QLatin1String("default"), Qt::CaseInsensitive) == 0) {
m_default = m_cdata.trimmed();
- } else if (tag == QLatin1String("min")) {
+ } else if (tag.compare(QLatin1String("min"), Qt::CaseInsensitive) == 0) {
m_min = m_cdata.toInt(&m_haveMin);
- } else if (tag == QLatin1String("max")) {
+ } else if (tag.compare(QLatin1String("max"), Qt::CaseInsensitive) == 0) {
m_max = m_cdata.toInt(&m_haveMax);
- } else if (tag == QLatin1String("choice")) {
+ } else if (tag.compare(QLatin1String("choice"), Qt::CaseInsensitive) == 0) {
m_enumChoices.append(m_choice);
m_inChoice = false;
}
diff --git a/src/gui/kconfigloaderhandler_p.h b/src/gui/kconfigloaderhandler_p.h
index cae92495..fa313f5b 100644
--- a/src/gui/kconfigloaderhandler_p.h
+++ b/src/gui/kconfigloaderhandler_p.h
@@ -21,17 +21,20 @@
#ifndef KCONFIGLOADERHANDLER_P_H
#define KCONFIGLOADERHANDLER_P_H
-#include <QXmlDefaultHandler>
+#include <QXmlStreamAttributes>
-class ConfigLoaderHandler : public QXmlDefaultHandler
+class ConfigLoaderHandler
{
public:
ConfigLoaderHandler(KConfigLoader *config, ConfigLoaderPrivate *d);
- 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 parse(QIODevice *input);
+
+ bool startElement(const QStringRef &namespaceURI, const QStringRef &localName,
+ const QStringRef &qName, const QXmlStreamAttributes &atts);
+ bool endElement(const QStringRef &namespaceURI, const QStringRef &localName,
+ const QStringRef &qName);
+ bool characters(const QStringRef &ch);
QString name() const;
void setName(const QString &name);
@@ -41,7 +44,7 @@ public:
QString defaultValue() const;
private:
- virtual void addItem();
+ void addItem();
void resetState();
KConfigLoader *m_config;