diff --git a/src/plugins/remotelinux/linuxdeviceconfiguration.cpp b/src/plugins/remotelinux/linuxdeviceconfiguration.cpp index f79caddefd9eb6d02bbfd0f86f3dc1141486fa4d..fe95fcd143422e4743c528b0d234d3b07fa5e179 100644 --- a/src/plugins/remotelinux/linuxdeviceconfiguration.cpp +++ b/src/plugins/remotelinux/linuxdeviceconfiguration.cpp @@ -94,6 +94,7 @@ LinuxDeviceConfiguration::~LinuxDeviceConfiguration() delete d; } +// TODO: For pre-2.6 versions. Remove in 2.8. LinuxDeviceConfiguration::Ptr LinuxDeviceConfiguration::create(const QSettings &settings) { return Ptr(new LinuxDeviceConfiguration(settings)); @@ -109,7 +110,12 @@ LinuxDeviceConfiguration::Ptr LinuxDeviceConfiguration::create(const QString &na const SshConnectionParameters &sshParams, const QVariantHash &attributes, Origin origin) { return Ptr(new LinuxDeviceConfiguration(name, osType, deviceType, freePorts, sshParams, - attributes, origin)); + attributes, origin)); +} + +LinuxDeviceConfiguration::LinuxDeviceConfiguration() + : d(new LinuxDeviceConfigurationPrivate(SshConnectionParameters(SshConnectionParameters::NoProxy))) +{ } LinuxDeviceConfiguration::LinuxDeviceConfiguration(const QString &name, const QString &osType, @@ -125,6 +131,7 @@ LinuxDeviceConfiguration::LinuxDeviceConfiguration(const QString &name, const QS d->attributes = attributes; } +// TODO: For pre-2.6 versions. Remove in 2.8. LinuxDeviceConfiguration::LinuxDeviceConfiguration(const QSettings &settings) : d(new LinuxDeviceConfigurationPrivate(SshConnectionParameters::NoProxy)) { @@ -181,21 +188,56 @@ QString LinuxDeviceConfiguration::defaultPublicKeyFilePath() return defaultPrivateKeyFilePath() + QLatin1String(".pub"); } -void LinuxDeviceConfiguration::save(QSettings &settings) const +LinuxDeviceConfiguration::Ptr LinuxDeviceConfiguration::create() +{ + return Ptr(new LinuxDeviceConfiguration); +} + +void LinuxDeviceConfiguration::fromMap(const QVariantMap &map) { - settings.setValue(NameKey, d->displayName); - settings.setValue(OsTypeKey, d->osType); - settings.setValue(TypeKey, d->deviceType); - settings.setValue(HostKey, d->sshParameters.host); - settings.setValue(SshPortKey, d->sshParameters.port); - settings.setValue(PortsSpecKey, d->freePorts.toString()); - settings.setValue(UserNameKey, d->sshParameters.userName); - settings.setValue(AuthKey, d->sshParameters.authenticationType); - settings.setValue(PasswordKey, d->sshParameters.password); - settings.setValue(KeyFileKey, d->sshParameters.privateKeyFile); - settings.setValue(TimeoutKey, d->sshParameters.timeout); - settings.setValue(InternalIdKey, d->internalId); - settings.setValue(AttributesKey, d->attributes); + d->origin = ManuallyAdded; + d->displayName = map.value(NameKey).toString(); + d->osType = map.value(OsTypeKey).toString(); + d->deviceType = static_cast<DeviceType>(map.value(TypeKey, DefaultDeviceType).toInt()); + d->internalId = map.value(InternalIdKey, InvalidId).toULongLong(); + const QVariantMap attrMap = map.value(AttributesKey).toMap(); + for (QVariantMap::ConstIterator it = attrMap.constBegin(); it != attrMap.constEnd(); ++it) + d->attributes.insert(it.key(), it.value()); + + d->freePorts = PortList::fromString(map.value(PortsSpecKey, + QLatin1String("10000-10100")).toString()); + d->sshParameters.host = map.value(HostKey).toString(); + d->sshParameters.port = map.value(SshPortKey, 22).toInt(); + d->sshParameters.userName = map.value(UserNameKey).toString(); + d->sshParameters.authenticationType + = static_cast<AuthType>(map.value(AuthKey, DefaultAuthType).toInt()); + d->sshParameters.password = map.value(PasswordKey).toString(); + d->sshParameters.privateKeyFile = map.value(KeyFileKey, defaultPrivateKeyFilePath()).toString(); + d->sshParameters.timeout = map.value(TimeoutKey, DefaultTimeout).toInt(); +} + +QVariantMap LinuxDeviceConfiguration::toMap() const +{ + QVariantMap map; + map.insert(NameKey, d->displayName); + map.insert(OsTypeKey, d->osType); + map.insert(TypeKey, d->deviceType); + map.insert(HostKey, d->sshParameters.host); + map.insert(SshPortKey, d->sshParameters.port); + map.insert(PortsSpecKey, d->freePorts.toString()); + map.insert(UserNameKey, d->sshParameters.userName); + map.insert(AuthKey, d->sshParameters.authenticationType); + map.insert(PasswordKey, d->sshParameters.password); + map.insert(KeyFileKey, d->sshParameters.privateKeyFile); + map.insert(TimeoutKey, d->sshParameters.timeout); + map.insert(InternalIdKey, d->internalId); + QVariantMap attrMap; + for (QVariantHash::ConstIterator it = d->attributes.constBegin(); + it != d->attributes.constEnd(); ++it) { + attrMap.insert(it.key(), it.value()); + } + map.insert(AttributesKey, attrMap); + return map; } SshConnectionParameters LinuxDeviceConfiguration::sshParameters() const diff --git a/src/plugins/remotelinux/linuxdeviceconfiguration.h b/src/plugins/remotelinux/linuxdeviceconfiguration.h index f88cf004dab860c50f29f3bfca522f1a109c670a..70227cdf4dbc5c21dd9cd167fbd33d233f920020 100644 --- a/src/plugins/remotelinux/linuxdeviceconfiguration.h +++ b/src/plugins/remotelinux/linuxdeviceconfiguration.h @@ -38,6 +38,7 @@ #include <QString> #include <QStringList> #include <QVariantHash> +#include <QVariantMap> #include <QWizard> QT_BEGIN_NAMESPACE @@ -90,10 +91,12 @@ public: static const Id InvalidId; + static Ptr create(); static Ptr create(const QString &name, const QString &osType, DeviceType deviceType, const Utils::PortList &freePorts, const Utils::SshConnectionParameters &sshParams, const QVariantHash &attributes = QVariantHash(), Origin origin = ManuallyAdded); private: + LinuxDeviceConfiguration(); LinuxDeviceConfiguration(const QString &name, const QString &osType, DeviceType deviceType, const Utils::PortList &freePorts, const Utils::SshConnectionParameters &sshParams, const QVariantHash &attributes, Origin origin); @@ -109,7 +112,9 @@ private: void setDisplayName(const QString &name); void setInternalId(Id id); void setDefault(bool isDefault); - void save(QSettings &settings) const; + + void fromMap(const QVariantMap &map); + QVariantMap toMap() const; Internal::LinuxDeviceConfigurationPrivate *d; }; diff --git a/src/plugins/remotelinux/linuxdeviceconfigurations.cpp b/src/plugins/remotelinux/linuxdeviceconfigurations.cpp index ad4541ceb73adf5c7f00318f87a7efc5eaf146de..76bd32af8d5ae6831fdb83a41a06df31a0a0ad7e 100644 --- a/src/plugins/remotelinux/linuxdeviceconfigurations.cpp +++ b/src/plugins/remotelinux/linuxdeviceconfigurations.cpp @@ -34,13 +34,18 @@ #include "remotelinuxutils.h" #include <coreplugin/icore.h> +#include <extensionsystem/pluginmanager.h> +#include <utils/persistentsettings.h> #include <utils/qtcassert.h> +#include <QFileInfo> #include <QHash> #include <QList> +#include <QMainWindow> #include <QSettings> #include <QString> #include <QVariantHash> +#include <QVariantList> #include <algorithm> #include <limits> @@ -48,11 +53,13 @@ namespace RemoteLinux { namespace Internal { +const char FileFormatVersionKey[] = "DeviceManagerFileFormatVersion"; +const char DeviceManagerKey[] = "DeviceManager"; +const char DeviceListKey[] = "DeviceList"; +const char DefaultKeyFilePathKey[] = "DefaultKeyFile"; +const char DefaultDevicesKey[] = "DefaultDevices"; + namespace { -const QLatin1String SettingsGroup("MaemoDeviceConfigs"); -const QLatin1String ConfigListKey("ConfigList"); -const QLatin1String DefaultKeyFilePathKey("DefaultKeyFile"); -const char DefaultConfigsKey[] = "DefaultConfigs"; class DevConfNameMatcher { @@ -141,31 +148,94 @@ void LinuxDeviceConfigurations::copy(const LinuxDeviceConfigurations *source, } void LinuxDeviceConfigurations::save() +{ + Utils::PersistentSettingsWriter writer; + writer.saveValue(QLatin1String(FileFormatVersionKey), 1); + writer.saveValue(QLatin1String(DeviceManagerKey), toMap()); + writer.save(settingsFilePath(), QLatin1String("QtCreatorDevices"), Core::ICore::mainWindow()); +} + +void LinuxDeviceConfigurations::load() +{ + Utils::PersistentSettingsReader reader; + if (reader.load(settingsFilePath())) { + const QVariantMap data = reader.restoreValues(); + const int version = data.value(QLatin1String(FileFormatVersionKey), 0).toInt(); + if (version < 1) + return; + fromMap(data.value(QLatin1String(DeviceManagerKey)).toMap()); + } else { + loadPre2_6(); + } + ensureOneDefaultConfigurationPerOsType(); +} + +void LinuxDeviceConfigurations::loadPre2_6() { QSettings *settings = Core::ICore::settings(); - settings->beginGroup(SettingsGroup); - settings->setValue(DefaultKeyFilePathKey, d->defaultSshKeyFilePath); - QVariantHash defaultDevsHash; - for (QHash<QString, LinuxDeviceConfiguration::Id>::ConstIterator it = d->defaultConfigs.constBegin(); - it != d->defaultConfigs.constEnd(); ++it) { - defaultDevsHash.insert(it.key(), it.value()); + settings->beginGroup(QLatin1String("MaemoDeviceConfigs")); + d->defaultSshKeyFilePath = settings->value(QLatin1String(DefaultKeyFilePathKey), + LinuxDeviceConfiguration::defaultPrivateKeyFilePath()).toString(); + const QVariantHash defaultDevsHash = settings->value(QLatin1String("DefaultConfigs")).toHash(); + for (QVariantHash::ConstIterator it = defaultDevsHash.constBegin(); + it != defaultDevsHash.constEnd(); ++it) { + d->defaultConfigs.insert(it.key(), it.value().toULongLong()); } - settings->setValue(QLatin1String(DefaultConfigsKey), defaultDevsHash); - settings->beginWriteArray(ConfigListKey); - int skippedCount = 0; - for (int i = 0; i < d->devConfigs.count(); ++i) { - const LinuxDeviceConfiguration::ConstPtr &devConf = d->devConfigs.at(i); - if (devConf->isAutoDetected()) { - ++skippedCount; - } else { - settings->setArrayIndex(i-skippedCount); - devConf->save(*settings); - } + int count = settings->beginReadArray(QLatin1String("ConfigList")); + for (int i = 0; i < count; ++i) { + settings->setArrayIndex(i); + LinuxDeviceConfiguration::Ptr devConf = LinuxDeviceConfiguration::create(*settings); + if (devConf->internalId() == LinuxDeviceConfiguration::InvalidId) + devConf->setInternalId(unusedId()); + d->devConfigs << devConf; } settings->endArray(); settings->endGroup(); } +void LinuxDeviceConfigurations::fromMap(const QVariantMap &map) +{ + d->defaultSshKeyFilePath = map.value(QLatin1String(DefaultKeyFilePathKey), + LinuxDeviceConfiguration::defaultPrivateKeyFilePath()).toString(); + const QVariantMap defaultDevsMap = map.value(QLatin1String(DefaultDevicesKey)).toMap(); + for (QVariantMap::ConstIterator it = defaultDevsMap.constBegin(); + it != defaultDevsMap.constEnd(); ++it) { + d->defaultConfigs.insert(it.key(), it.value().toULongLong()); + } + const QVariantList deviceList = map.value(QLatin1String(DeviceListKey)).toList(); + foreach (const QVariant &v, deviceList) { + LinuxDeviceConfiguration::Ptr device = LinuxDeviceConfiguration::create(); + device->fromMap(v.toMap()); + d->devConfigs << device; + } +} + +QVariantMap LinuxDeviceConfigurations::toMap() const +{ + QVariantMap map; + map.insert(QLatin1String(DefaultKeyFilePathKey), d->defaultSshKeyFilePath); + QVariantMap defaultDeviceMap; + typedef QHash<QString, LinuxDeviceConfiguration::Id> TypeIdHash; + for (TypeIdHash::ConstIterator it = d->defaultConfigs.constBegin(); + it != d->defaultConfigs.constEnd(); ++it) { + defaultDeviceMap.insert(it.key(), it.value()); + } + map.insert(QLatin1String(DefaultDevicesKey), defaultDeviceMap); + QVariantList deviceList; + foreach (const LinuxDeviceConfiguration::ConstPtr &device, d->devConfigs) { + if (!device->isAutoDetected()) + deviceList << device->toMap(); + } + map.insert(QLatin1String(DeviceListKey), deviceList); + return map; +} + +QString LinuxDeviceConfigurations::settingsFilePath() +{ + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + return QFileInfo(pm->settings()->fileName()).absolutePath() + QLatin1String("/devices.xml"); +} + void LinuxDeviceConfigurations::addConfiguration(const LinuxDeviceConfiguration::Ptr &devConfig) { QTC_ASSERT(this != LinuxDeviceConfigurationsPrivate::instance @@ -253,7 +323,7 @@ void LinuxDeviceConfigurations::setDefaultDevice(int idx) const LinuxDeviceConfiguration::ConstPtr &devConf = d->devConfigs.at(idx); const LinuxDeviceConfiguration::ConstPtr &oldDefaultDevConf = defaultDeviceConfig(devConf->osType()); - if (defaultDeviceConfig(devConf->osType()) == devConf) + if (devConf == oldDefaultDevConf) return; d->defaultConfigs.insert(devConf->osType(), devConf->internalId()); emit defaultStatusChanged(idx); @@ -283,30 +353,6 @@ LinuxDeviceConfigurations::~LinuxDeviceConfigurations() delete d; } -void LinuxDeviceConfigurations::load() -{ - QSettings *settings = Core::ICore::settings(); - settings->beginGroup(SettingsGroup); - d->defaultSshKeyFilePath = settings->value(DefaultKeyFilePathKey, - LinuxDeviceConfiguration::defaultPrivateKeyFilePath()).toString(); - const QVariantHash defaultDevsHash = settings->value(QLatin1String(DefaultConfigsKey)).toHash(); - for (QVariantHash::ConstIterator it = defaultDevsHash.constBegin(); - it != defaultDevsHash.constEnd(); ++it) { - d->defaultConfigs.insert(it.key(), it.value().toULongLong()); - } - int count = settings->beginReadArray(ConfigListKey); - for (int i = 0; i < count; ++i) { - settings->setArrayIndex(i); - LinuxDeviceConfiguration::Ptr devConf = LinuxDeviceConfiguration::create(*settings); - if (devConf->internalId() == LinuxDeviceConfiguration::InvalidId) - devConf->setInternalId(unusedId()); - d->devConfigs << devConf; - } - settings->endArray(); - settings->endGroup(); - ensureOneDefaultConfigurationPerOsType(); -} - LinuxDeviceConfiguration::ConstPtr LinuxDeviceConfigurations::deviceAt(int idx) const { QTC_ASSERT(idx >= 0 && idx < deviceCount(), return LinuxDeviceConfiguration::ConstPtr()); diff --git a/src/plugins/remotelinux/linuxdeviceconfigurations.h b/src/plugins/remotelinux/linuxdeviceconfigurations.h index 41ccc3ca990d8f50e12fe640272253bc510152a7..1c6dcd22d7638a6e0205c5b129ba4fccc5bab436 100644 --- a/src/plugins/remotelinux/linuxdeviceconfigurations.h +++ b/src/plugins/remotelinux/linuxdeviceconfigurations.h @@ -87,6 +87,11 @@ private: void load(); void save(); + void loadPre2_6(); + void fromMap(const QVariantMap &map); + QVariantMap toMap() const; + static QString settingsFilePath(); + static LinuxDeviceConfigurations *cloneInstance(); static void replaceInstance(); static void removeClonedInstance();