forked from qt-creator/qt-creator
Save toolchains in XML format
Also trigger saving via ICore::saveSettingsRequested.
This commit is contained in:
@@ -35,16 +35,25 @@
|
|||||||
|
|
||||||
#include "toolchain.h"
|
#include "toolchain.h"
|
||||||
|
|
||||||
|
#include <coreplugin/icore.h>
|
||||||
|
#include <projectexplorer/persistentsettings.h>
|
||||||
|
|
||||||
#include <extensionsystem/pluginmanager.h>
|
#include <extensionsystem/pluginmanager.h>
|
||||||
|
|
||||||
#include <QtCore/QCoreApplication>
|
#include <QtCore/QCoreApplication>
|
||||||
#include <QtCore/QSettings>
|
|
||||||
#include <QtCore/QDir>
|
#include <QtCore/QDir>
|
||||||
|
#include <QtCore/QSettings>
|
||||||
|
|
||||||
static const char *const ORGANIZATION_NAME = "Nokia";
|
static const char *const TOOLCHAIN_DATA_KEY = "ToolChain.";
|
||||||
static const char *const APPLICATION_NAME = "toolChains";
|
static const char *const TOOLCHAIN_COUNT_KEY = "ToolChain.Count";
|
||||||
static const char *const ARRAY_NAME = "ToolChain";
|
static const char *const TOOLCHAIN_FILE_VERSION_KEY = "Version";
|
||||||
static const char *const TOOLCHAIN_DATA_KEY = "Data";
|
|
||||||
|
static QString settingsFileName()
|
||||||
|
{
|
||||||
|
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
|
||||||
|
QFileInfo settingsLocation(pm->settings()->fileName());
|
||||||
|
return settingsLocation.absolutePath() + QLatin1String("/toolChains.xml");
|
||||||
|
}
|
||||||
|
|
||||||
namespace ProjectExplorer {
|
namespace ProjectExplorer {
|
||||||
|
|
||||||
@@ -80,12 +89,14 @@ ToolChainManager::ToolChainManager(QObject *parent) :
|
|||||||
{
|
{
|
||||||
Q_ASSERT(!m_instance);
|
Q_ASSERT(!m_instance);
|
||||||
m_instance = this;
|
m_instance = this;
|
||||||
|
connect(Core::ICore::instance(), SIGNAL(saveSettingsRequested()),
|
||||||
|
this, SLOT(saveToolChains()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ToolChainManager::restoreToolChains()
|
void ToolChainManager::restoreToolChains()
|
||||||
{
|
{
|
||||||
QList<ToolChainFactory *> factories =
|
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
|
||||||
ExtensionSystem::PluginManager::instance()->getObjects<ToolChainFactory>();
|
QList<ToolChainFactory *> factories = pm->getObjects<ToolChainFactory>();
|
||||||
// Autodetect ToolChains:
|
// Autodetect ToolChains:
|
||||||
foreach (ToolChainFactory *f, factories) {
|
foreach (ToolChainFactory *f, factories) {
|
||||||
QList<ToolChain *> tcs = f->autoDetect();
|
QList<ToolChain *> tcs = f->autoDetect();
|
||||||
@@ -94,19 +105,29 @@ void ToolChainManager::restoreToolChains()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Restore user generated ToolChains:
|
// Restore user generated ToolChains:
|
||||||
QSettings settings(QSettings::IniFormat, QSettings::UserScope,
|
PersistentSettingsReader reader;
|
||||||
ORGANIZATION_NAME, APPLICATION_NAME);
|
const QString fileName = settingsFileName();
|
||||||
int size = settings.beginReadArray(QLatin1String(ARRAY_NAME));
|
if (!reader.load(fileName))
|
||||||
if (size <= 0)
|
return;
|
||||||
|
QVariantMap data = reader.restoreValues();
|
||||||
|
|
||||||
|
// Check version:
|
||||||
|
int version = data.value(QLatin1String(TOOLCHAIN_FILE_VERSION_KEY), 0).toInt();
|
||||||
|
if (version < 1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (int i = 0; i < size; ++i) {
|
int count = data.value(QLatin1String(TOOLCHAIN_COUNT_KEY), 0).toInt();
|
||||||
settings.setArrayIndex(i);
|
for (int i = 0; i < count; ++i) {
|
||||||
const QVariantMap tmp = settings.value(QLatin1String(TOOLCHAIN_DATA_KEY)).toMap();
|
const QString key = QString::fromLatin1(TOOLCHAIN_DATA_KEY) + QString::number(i);
|
||||||
|
if (!data.contains(key))
|
||||||
|
break;
|
||||||
|
|
||||||
|
const QVariantMap tcMap = data.value(key).toMap();
|
||||||
|
|
||||||
bool restored = false;
|
bool restored = false;
|
||||||
foreach (ToolChainFactory *f, factories) {
|
foreach (ToolChainFactory *f, factories) {
|
||||||
if (f->canRestore(tmp)) {
|
if (f->canRestore(tcMap)) {
|
||||||
if (ToolChain *tc = f->restore(tmp)) {
|
if (ToolChain *tc = f->restore(tcMap)) {
|
||||||
registerToolChain(tc);
|
registerToolChain(tc);
|
||||||
restored = true;
|
restored = true;
|
||||||
break;
|
break;
|
||||||
@@ -115,30 +136,14 @@ void ToolChainManager::restoreToolChains()
|
|||||||
}
|
}
|
||||||
if (!restored)
|
if (!restored)
|
||||||
qWarning("Warning: Unable to restore manual toolchain '%s' stored in %s.",
|
qWarning("Warning: Unable to restore manual toolchain '%s' stored in %s.",
|
||||||
qPrintable(ToolChainFactory::idFromMap(tmp)),
|
qPrintable(ToolChainFactory::idFromMap(tcMap)),
|
||||||
qPrintable(QDir::toNativeSeparators(settings.fileName())));
|
qPrintable(QDir::toNativeSeparators(fileName)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ToolChainManager::~ToolChainManager()
|
ToolChainManager::~ToolChainManager()
|
||||||
{
|
{
|
||||||
QSettings settings(QSettings::IniFormat, QSettings::UserScope,
|
// Deregister toolchains
|
||||||
ORGANIZATION_NAME, APPLICATION_NAME);
|
|
||||||
settings.beginWriteArray(QLatin1String(ARRAY_NAME));
|
|
||||||
int count = 0;
|
|
||||||
foreach (ToolChain *tc, m_d->m_toolChains) {
|
|
||||||
if (!tc->isAutoDetected() && tc->isValid()) {
|
|
||||||
settings.setArrayIndex(count);
|
|
||||||
++count;
|
|
||||||
|
|
||||||
QVariantMap tmp = tc->toMap();
|
|
||||||
if (tmp.isEmpty())
|
|
||||||
continue;
|
|
||||||
settings.setValue(QLatin1String(TOOLCHAIN_DATA_KEY), tmp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
settings.endArray();
|
|
||||||
|
|
||||||
QList<ToolChain *> copy = m_d->m_toolChains;
|
QList<ToolChain *> copy = m_d->m_toolChains;
|
||||||
foreach (ToolChain *tc, copy)
|
foreach (ToolChain *tc, copy)
|
||||||
deregisterToolChain(tc);
|
deregisterToolChain(tc);
|
||||||
@@ -147,6 +152,25 @@ ToolChainManager::~ToolChainManager()
|
|||||||
m_instance = 0;
|
m_instance = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ToolChainManager::saveToolChains()
|
||||||
|
{
|
||||||
|
PersistentSettingsWriter writer;
|
||||||
|
writer.saveValue(QLatin1String(TOOLCHAIN_FILE_VERSION_KEY), 1);
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
foreach (ToolChain *tc, m_d->m_toolChains) {
|
||||||
|
if (!tc->isAutoDetected() && tc->isValid()) {
|
||||||
|
QVariantMap tmp = tc->toMap();
|
||||||
|
if (tmp.isEmpty())
|
||||||
|
continue;
|
||||||
|
writer.saveValue(QString::fromLatin1(TOOLCHAIN_DATA_KEY) + QString::number(count), tmp);
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
writer.saveValue(QLatin1String(TOOLCHAIN_COUNT_KEY), count);
|
||||||
|
writer.save(settingsFileName(), "QtCreatorToolChains");
|
||||||
|
}
|
||||||
|
|
||||||
QList<ToolChain *> ToolChainManager::toolChains() const
|
QList<ToolChain *> ToolChainManager::toolChains() const
|
||||||
{
|
{
|
||||||
return m_d->m_toolChains;
|
return m_d->m_toolChains;
|
||||||
|
|||||||
@@ -72,6 +72,8 @@ public slots:
|
|||||||
void registerToolChain(ProjectExplorer::ToolChain *tc);
|
void registerToolChain(ProjectExplorer::ToolChain *tc);
|
||||||
void deregisterToolChain(ProjectExplorer::ToolChain *tc);
|
void deregisterToolChain(ProjectExplorer::ToolChain *tc);
|
||||||
|
|
||||||
|
void saveToolChains();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void toolChainAdded(ProjectExplorer::ToolChain *);
|
void toolChainAdded(ProjectExplorer::ToolChain *);
|
||||||
// ToolChain is still valid when this call happens!
|
// ToolChain is still valid when this call happens!
|
||||||
@@ -80,7 +82,7 @@ signals:
|
|||||||
private:
|
private:
|
||||||
explicit ToolChainManager(QObject *parent = 0);
|
explicit ToolChainManager(QObject *parent = 0);
|
||||||
|
|
||||||
// Make sure the ToolChain Manager is only created after all
|
// Make sure the this is only called after all
|
||||||
// ToolChain Factories are registered!
|
// ToolChain Factories are registered!
|
||||||
void restoreToolChains();
|
void restoreToolChains();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user