diff options
Diffstat (limited to 'src/plugins/projectexplorer/persistentsettings.cpp')
-rw-r--r-- | src/plugins/projectexplorer/persistentsettings.cpp | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/src/plugins/projectexplorer/persistentsettings.cpp b/src/plugins/projectexplorer/persistentsettings.cpp new file mode 100644 index 0000000000..2ce7ed8cfe --- /dev/null +++ b/src/plugins/projectexplorer/persistentsettings.cpp @@ -0,0 +1,225 @@ +/*************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** +** Non-Open Source Usage +** +** Licensees may use this file in accordance with the Qt Beta Version +** License Agreement, Agreement version 2.2 provided with the Software or, +** alternatively, in accordance with the terms contained in a written +** agreement between you and Nokia. +** +** GNU General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU General +** Public License versions 2.0 or 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the packaging +** of this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** +** http://www.fsf.org/licensing/licenses/info/GPLv2.html and +** http://www.gnu.org/copyleft/gpl.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt GPL Exception version +** 1.2, included in the file GPL_EXCEPTION.txt in this package. +** +***************************************************************************/ +#include "persistentsettings.h" + +#include <QtCore/QDebug> +#include <QtCore/QFile> +#include <QtCore/QVariant> +#include <QtXml/QDomDocument> +#include <QtXml/QDomCDATASection> + + +using namespace ProjectExplorer; + +PersistentSettingsReader::PersistentSettingsReader() +{ + +} + +QVariant PersistentSettingsReader::restoreValue(const QString & variable) const +{ + const QString &name = m_prefix + variable; + if (m_valueMap.contains(name)) + return m_valueMap.value(name); + return QVariant(); +} + +bool PersistentSettingsReader::load(const QString & fileName) +{ + m_valueMap.clear(); + + QFile file(fileName); + if (!file.open(QIODevice::ReadOnly)) + return false; + + QDomDocument doc; + if (!doc.setContent(&file)) + return false; + + QDomElement root = doc.documentElement(); + if (root.nodeName() != QLatin1String("qtcreator")) + return false; + + QDomElement child = root.firstChildElement(); + for (; !child.isNull(); child = child.nextSiblingElement()) { + if (child.nodeName() == QLatin1String("data")) + readValues(child); + } + + file.close(); + return true; +} + +void PersistentSettingsReader::setPrefix(const QString &prefix) +{ + m_prefix = prefix; +} + +QString PersistentSettingsReader::prefix() const +{ + return m_prefix; +} + +QVariant PersistentSettingsReader::readValue(const QDomElement &valElement) const +{ + QString name = valElement.nodeName(); + QString type = valElement.attribute(QLatin1String("type")); + QVariant v; + + if (name == QLatin1String("value")) { + v.setValue(valElement.text()); + v.convert(QVariant::nameToType(type.toLatin1().data())); + } else if (name == QLatin1String("valuelist")) { + QDomElement child = valElement.firstChildElement(); + QList<QVariant> valList; + for (; !child.isNull(); child = child.nextSiblingElement()) { + valList << readValue(child); + } + v.setValue(valList); + } else if (name == QLatin1String("valuemap")) { + QDomElement child = valElement.firstChildElement(); + QMap<QString, QVariant> valMap; + for (; !child.isNull(); child = child.nextSiblingElement()) { + QString key = child.attribute(QLatin1String("key")); + valMap.insert(key, readValue(child)); + } + v.setValue(valMap); + } + + return v; +} + +void PersistentSettingsReader::readValues(const QDomElement &data) +{ + QString variable; + QVariant v; + + QDomElement child = data.firstChildElement(); + for (; !child.isNull(); child = child.nextSiblingElement()) { + if (child.nodeName() == QLatin1String("variable")) { + variable = child.text(); + } else { + v = readValue(child); + } + } + + m_valueMap.insert(variable, v); +} + +/// +/// PersistentSettingsWriter +/// + +PersistentSettingsWriter::PersistentSettingsWriter() +{ + +} + +void PersistentSettingsWriter::writeValue(QDomElement &ps, const QVariant &variant) +{ + if (variant.type() == QVariant::StringList || variant.type() == QVariant::List) { + QDomElement values = ps.ownerDocument().createElement("valuelist"); + values.setAttribute("type", QVariant::typeToName(QVariant::List)); + QList<QVariant> varList = variant.toList(); + foreach(QVariant var, varList) { + writeValue(values, var); + } + ps.appendChild(values); + } else if (variant.type() == QVariant::Map) { + QDomElement values = ps.ownerDocument().createElement("valuemap"); + values.setAttribute("type", QVariant::typeToName(QVariant::Map)); + + QMap<QString, QVariant> varMap = variant.toMap(); + QMap<QString, QVariant>::const_iterator i = varMap.constBegin(); + while (i != varMap.constEnd()) { + writeValue(values, i.value()); + values.lastChild().toElement(). + setAttribute(QLatin1String("key"), i.key()); + ++i; + } + + ps.appendChild(values); + } else { + QDomElement value = ps.ownerDocument().createElement("value"); + ps.appendChild(value); + QDomText valueText = ps.ownerDocument().createTextNode(variant.toString()); + value.appendChild(valueText); + value.setAttribute("type", variant.typeName()); + ps.appendChild(value); + } +} + +void PersistentSettingsWriter::saveValue(const QString & variable, const QVariant &value) +{ + m_valueMap[m_prefix + variable] = value; +} + +bool PersistentSettingsWriter::save(const QString & fileName, const QString & docType) +{ + QFile file(fileName); + if (!file.open(QIODevice::WriteOnly)) + return false; + + QDomDocument doc(docType); + + QDomElement root = doc.createElement("qtcreator"); + doc.appendChild(root); + + QMap<QString, QVariant>::const_iterator i = m_valueMap.constBegin(); + while (i != m_valueMap.constEnd()) { + QDomElement ps = doc.createElement("data"); + root.appendChild(ps); + + QDomElement variable = doc.createElement("variable"); + ps.appendChild(variable); + QDomText variableText = doc.createTextNode(i.key()); + variable.appendChild(variableText); + + writeValue(ps, i.value()); + ++i; + } + + file.write(doc.toByteArray()); + file.close(); + return true; +} + +void PersistentSettingsWriter::setPrefix(const QString &prefix) +{ + m_prefix = prefix; +} + +QString PersistentSettingsWriter::prefix() const +{ + return m_prefix; +} |