Commit 140eaaab authored by Christian Kandeler's avatar Christian Kandeler

RemoteLinux: Make device configurations settings page generic.

The list of per-device actions now comes from a factory and can
be different for different OS types.
This is a step towards moving knowledge about devices from the
RemoteLinux plugin into specialized plugins.

Change-Id: Ia46e0199d8d8c1a3891c73a4936ac53fb1063313
Reviewed-on: http://codereview.qt.nokia.com/439Reviewed-by: default avatarTobias Hunger <tobias.hunger@nokia.com>
parent 2b31dbad
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Nokia Corporation (info@qt.nokia.com)
**
**
** GNU Lesser General Public License Usage
**
** 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.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
** If you have questions regarding the use of this file, please contact
** Nokia at info@qt.nokia.com.
**
**************************************************************************/
#include "deviceconfigurationfactory.h"
#include "maemoconfigtestdialog.h"
#include "maemodeviceconfigwizard.h"
#include "maemoremoteprocessesdialog.h"
namespace RemoteLinux {
namespace Internal {
namespace {
const char * const TestDeviceActionId = "TestDeviceAction";
const char * const RemoteProcessesActionId = "RemoteProcessesAction";
} // anonymous namespace;
DeviceConfigurationFactory::DeviceConfigurationFactory(QObject *parent)
: ILinuxDeviceConfigurationFactory(parent)
{
}
QString DeviceConfigurationFactory::displayName() const
{
return tr("Fremantle, Harmattan, MeeGo, GenericLinux");
}
ILinuxDeviceConfigurationWizard *DeviceConfigurationFactory::createWizard(QWidget *parent) const
{
return new MaemoDeviceConfigWizard(parent);
}
bool DeviceConfigurationFactory::supportsOsType(const QString &osType) const
{
return osType == LinuxDeviceConfiguration::Maemo5OsType
|| osType == LinuxDeviceConfiguration::HarmattanOsType
|| osType == LinuxDeviceConfiguration::MeeGoOsType
|| osType == LinuxDeviceConfiguration::GenericLinuxOsType;
}
QStringList DeviceConfigurationFactory::supportedDeviceActionIds() const
{
return QStringList() << QLatin1String(TestDeviceActionId)
<< QLatin1String(RemoteProcessesActionId);
}
QString DeviceConfigurationFactory::displayNameForId(const QString &actionId) const
{
Q_ASSERT(supportedDeviceActionIds().contains(actionId));
if (actionId == QLatin1String(TestDeviceActionId))
return tr("Test");
if (actionId == QLatin1String(RemoteProcessesActionId))
return tr("Remote processes");
return QString(); // Can't happen.
}
QDialog *DeviceConfigurationFactory::createDeviceAction(const QString &actionId,
const LinuxDeviceConfiguration::ConstPtr &deviceConfig, QWidget *parent) const
{
Q_ASSERT(supportedDeviceActionIds().contains(actionId));
if (actionId == QLatin1String(TestDeviceActionId))
return new MaemoConfigTestDialog(deviceConfig, parent);
if (actionId == QLatin1String(RemoteProcessesActionId))
return new MaemoRemoteProcessesDialog(deviceConfig, parent);
return 0; // Can't happen.
}
} // namespace Internal
} // namespace RemoteLinux
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Nokia Corporation (info@qt.nokia.com)
**
**
** GNU Lesser General Public License Usage
**
** 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.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
** If you have questions regarding the use of this file, please contact
** Nokia at info@qt.nokia.com.
**
**************************************************************************/
#ifndef DEVICECONFIGURATIONFACTORY_H
#define DEVICECONFIGURATIONFACTORY_H
#include "linuxdeviceconfiguration.h"
namespace RemoteLinux {
namespace Internal {
class DeviceConfigurationFactory : public ILinuxDeviceConfigurationFactory
{
Q_OBJECT
Q_DISABLE_COPY(DeviceConfigurationFactory)
public:
DeviceConfigurationFactory(QObject *parent = 0);
QString displayName() const;
ILinuxDeviceConfigurationWizard *createWizard(QWidget *parent) const;
bool supportsOsType(const QString &osType) const;
QStringList supportedDeviceActionIds() const;
QString displayNameForId(const QString &actionId) const;
QDialog *createDeviceAction(const QString &actionId,
const LinuxDeviceConfiguration::ConstPtr &deviceConfig, QWidget *parent) const;
};
} // namespace Internal
} // namespace RemoteLinux
#endif // DEVICECONFIGURATIONFACTORY_H
......@@ -203,20 +203,18 @@ LinuxDeviceConfiguration::Ptr LinuxDeviceConfiguration::create(const ConstPtr &o
}
LinuxDeviceConfiguration::Ptr LinuxDeviceConfiguration::createHardwareConfig(const QString &name,
const QString &osType, const QString &hostName,
const QString &privateKeyFilePath, Id &nextId)
const QString &osType, const QString &hostName, const QString &privateKeyFilePath)
{
Utils::SshConnectionParameters sshParams(Utils::SshConnectionParameters::NoProxy);
sshParams.authenticationType = Utils::SshConnectionParameters::AuthenticationByKey;
sshParams.host = hostName;
sshParams.userName = defaultUser(osType);
sshParams.privateKeyFile = privateKeyFilePath;
return Ptr(new LinuxDeviceConfiguration(name, osType, Physical, sshParams, nextId));
return Ptr(new LinuxDeviceConfiguration(name, osType, Physical, sshParams));
}
LinuxDeviceConfiguration::Ptr LinuxDeviceConfiguration::createGenericLinuxConfigUsingPassword(const QString &name,
const QString &hostName, const QString &userName, const QString &password,
Id &nextId)
const QString &hostName, const QString &userName, const QString &password)
{
Utils::SshConnectionParameters sshParams(Utils::SshConnectionParameters::NoProxy);
sshParams.authenticationType
......@@ -225,12 +223,11 @@ LinuxDeviceConfiguration::Ptr LinuxDeviceConfiguration::createGenericLinuxConfig
sshParams.userName = userName;
sshParams.password = password;
return Ptr(new LinuxDeviceConfiguration(name, LinuxDeviceConfiguration::GenericLinuxOsType, Physical,
sshParams, nextId));
sshParams));
}
LinuxDeviceConfiguration::Ptr LinuxDeviceConfiguration::createGenericLinuxConfigUsingKey(const QString &name,
const QString &hostName, const QString &userName, const QString &privateKeyFile,
Id &nextId)
const QString &hostName, const QString &userName, const QString &privateKeyFile)
{
Utils::SshConnectionParameters sshParams(Utils::SshConnectionParameters::NoProxy);
sshParams.authenticationType
......@@ -238,31 +235,29 @@ LinuxDeviceConfiguration::Ptr LinuxDeviceConfiguration::createGenericLinuxConfig
sshParams.host = hostName;
sshParams.userName = userName;
sshParams.privateKeyFile = privateKeyFile;
return Ptr(new LinuxDeviceConfiguration(name, LinuxDeviceConfiguration::GenericLinuxOsType, Physical,
sshParams, nextId));
return Ptr(new LinuxDeviceConfiguration(name, LinuxDeviceConfiguration::GenericLinuxOsType,
Physical, sshParams));
}
LinuxDeviceConfiguration::Ptr LinuxDeviceConfiguration::createEmulatorConfig(const QString &name,
const QString &osType, Id &nextId)
const QString &osType)
{
Utils::SshConnectionParameters sshParams(Utils::SshConnectionParameters::NoProxy);
sshParams.authenticationType = Utils::SshConnectionParameters::AuthenticationByPassword;
sshParams.host = defaultHost(Emulator, osType);
sshParams.userName = defaultUser(osType);
sshParams.password = defaultQemuPassword(osType);
return Ptr(new LinuxDeviceConfiguration(name, osType, Emulator, sshParams, nextId));
return Ptr(new LinuxDeviceConfiguration(name, osType, Emulator, sshParams));
}
LinuxDeviceConfiguration::LinuxDeviceConfiguration(const QString &name,
const QString &osType, DeviceType devType,
const Utils::SshConnectionParameters &sshParams, Id &nextId)
const QString &osType, DeviceType devType, const Utils::SshConnectionParameters &sshParams)
: m_sshParameters(sshParams),
m_name(name),
m_osType(osType),
m_type(devType),
m_portsSpec(defaultPortsSpec(m_type)),
m_isDefault(false),
m_internalId(nextId++)
m_isDefault(false)
{
m_sshParameters.port = defaultSshPort(m_type);
m_sshParameters.timeout = DefaultTimeout;
......
......@@ -39,8 +39,11 @@
#include <QtCore/QPair>
#include <QtCore/QSharedPointer>
#include <QtCore/QString>
#include <QtCore/QStringList>
#include <QtGui/QWizard>
QT_BEGIN_NAMESPACE
class QDialog;
class QSettings;
QT_END_NAMESPACE
......@@ -70,7 +73,9 @@ class REMOTELINUX_EXPORT LinuxDeviceConfiguration
{
friend class Internal::LinuxDeviceConfigurations;
public:
typedef QSharedPointer<LinuxDeviceConfiguration> Ptr;
typedef QSharedPointer<const LinuxDeviceConfiguration> ConstPtr;
typedef quint64 Id;
static const QString Maemo5OsType;
......@@ -83,11 +88,14 @@ public:
PortList freePorts() const;
Utils::SshConnectionParameters sshParameters() const { return m_sshParameters; }
QString name() const { return m_name; }
void setName(const QString &name) { m_name = name; }
QString osType() const { return m_osType; }
DeviceType type() const { return m_type; }
QString portsSpec() const { return m_portsSpec; }
Id internalId() const { return m_internalId; }
bool isDefault() const { return m_isDefault; }
QString displayName() const { return m_displayName; }
static QString portsRegExpr();
static QString defaultHost(DeviceType type, const QString &osType);
static QString defaultPrivateKeyFilePath();
......@@ -98,28 +106,23 @@ public:
static const Id InvalidId;
private:
typedef QSharedPointer<LinuxDeviceConfiguration> Ptr;
static Ptr createHardwareConfig(const QString &name, const QString &osType,
const QString &hostName, const QString &privateKeyFilePath);
static Ptr createGenericLinuxConfigUsingPassword(const QString &name, const QString &hostName,
const QString &userName, const QString &password);
static Ptr createGenericLinuxConfigUsingKey(const QString &name, const QString &hostName,
const QString &userName, const QString &privateKeyFilePath);
static Ptr createEmulatorConfig(const QString &name, const QString &osType);
private:
LinuxDeviceConfiguration(const QString &name, const QString &osType,
DeviceType type, const Utils::SshConnectionParameters &sshParams,
Id &nextId);
DeviceType type, const Utils::SshConnectionParameters &sshParams);
LinuxDeviceConfiguration(const QSettings &settings, Id &nextId);
LinuxDeviceConfiguration(const ConstPtr &other);
LinuxDeviceConfiguration(const LinuxDeviceConfiguration &);
LinuxDeviceConfiguration &operator=(const LinuxDeviceConfiguration &);
static Ptr createHardwareConfig(const QString &name, const QString &osType,
const QString &hostName, const QString &privateKeyFilePath, Id &nextId);
static Ptr createGenericLinuxConfigUsingPassword(const QString &name,
const QString &hostName, const QString &userName,
const QString &password, Id &nextId);
static Ptr createGenericLinuxConfigUsingKey(const QString &name,
const QString &hostName, const QString &userName,
const QString &privateKeyFilePath, Id &nextId);
static Ptr createEmulatorConfig(const QString &name, const QString &osType,
Id &nextId);
static Ptr create(const QSettings &settings, Id &nextId);
static Ptr create(const ConstPtr &other);
......@@ -132,10 +135,90 @@ private:
DeviceType m_type;
QString m_portsSpec;
bool m_isDefault;
QString m_displayName;
Id m_internalId;
};
/*!
\class RemoteLinux::ILinuxDeviceConfigurationWizard
\brief Provides an interface for wizards creating a LinuxDeviceConfiguration
A class implementing this interface is a wizard whose final result is
a LinuxDeviceConfiguration object. The wizard will be started when the user chooses the
"Add..." action from the "Linux devices" options page.
*/
class REMOTELINUX_EXPORT ILinuxDeviceConfigurationWizard : public QWizard
{
Q_OBJECT
Q_DISABLE_COPY(ILinuxDeviceConfigurationWizard)
public:
virtual LinuxDeviceConfiguration::Ptr deviceConfiguration()=0;
protected:
ILinuxDeviceConfigurationWizard(QWidget *parent) : QWizard(parent) {}
};
/*!
\class ProjectExplorer::ILinuxDeviceConfiguration factory.
\brief Provides an interface for classes providing services related to certain type of Linux devices.
The main service is a wizard providing the device configuration itself.
The factory objects have to be added to the global object pool via
\c ExtensionSystem::PluginManager::addObject().
\sa ExtensionSystem::PluginManager::addObject()
*/
class REMOTELINUX_EXPORT ILinuxDeviceConfigurationFactory : public QObject
{
Q_OBJECT
Q_DISABLE_COPY(ILinuxDeviceConfigurationFactory)
public:
/*!
A short, one-line description of what kind of device this factory supports.
*/
virtual QString displayName() const=0;
/*!
A wizard that can create the types of device configuration this factory supports.
*/
virtual ILinuxDeviceConfigurationWizard *createWizard(QWidget *parent = 0) const=0;
/*!
Returns true iff this factory supports the given device type.
*/
virtual bool supportsOsType(const QString &osType) const=0;
/*!
Returns a list of ids representing actions that can be run on device configurations
that this factory supports. These actions will be available in the "Linux Devices"
options page.
*/
virtual QStringList supportedDeviceActionIds() const=0;
/*!
A human-readable string for the given id. Will be displayed on a button which, when clicked,
will start the respective action.
*/
virtual QString displayNameForId(const QString &actionId) const=0;
/*!
Produces a dialog implementing the respective action. The dialog is supposed to be
modal, so implementers must make sure to make it interruptible as to not needlessly
block the UI.
*/
virtual QDialog *createDeviceAction(const QString &actionId,
const LinuxDeviceConfiguration::ConstPtr &deviceConfig, QWidget *parent = 0) const=0;
protected:
ILinuxDeviceConfigurationFactory(QObject *parent) : QObject(parent) {}
};
} // namespace RemoteLinux
#endif // LINUXDEVICECONFIGURATION_H
......@@ -118,41 +118,9 @@ void LinuxDeviceConfigurations::save()
settings->endGroup();
}
void LinuxDeviceConfigurations::addHardwareDeviceConfiguration(const QString &name,
const QString &osType, const QString &hostName, const QString &privateKeyFilePath)
{
const LinuxDeviceConfiguration::Ptr &devConf = LinuxDeviceConfiguration::createHardwareConfig(name,
osType, hostName, privateKeyFilePath, m_nextId);
addConfiguration(devConf);
}
void LinuxDeviceConfigurations::addGenericLinuxConfigurationUsingPassword(const QString &name,
const QString &hostName, const QString &userName, const QString &password)
{
const LinuxDeviceConfiguration::Ptr &devConf
= LinuxDeviceConfiguration::createGenericLinuxConfigUsingPassword(name,
hostName, userName, password, m_nextId);
addConfiguration(devConf);
}
void LinuxDeviceConfigurations::addGenericLinuxConfigurationUsingKey(const QString &name,
const QString &hostName, const QString &userName, const QString &privateKeyFilePath)
{
const LinuxDeviceConfiguration::Ptr &devConf = LinuxDeviceConfiguration::createGenericLinuxConfigUsingKey(name,
hostName, userName, privateKeyFilePath, m_nextId);
addConfiguration(devConf);
}
void LinuxDeviceConfigurations::addEmulatorDeviceConfiguration(const QString &name,
const QString &osType)
{
const LinuxDeviceConfiguration::Ptr &devConf
= LinuxDeviceConfiguration::createEmulatorConfig(name, osType, m_nextId);
addConfiguration(devConf);
}
void LinuxDeviceConfigurations::addConfiguration(const LinuxDeviceConfiguration::Ptr &devConfig)
{
devConfig->m_internalId = m_nextId++;
beginInsertRows(QModelIndex(), rowCount(), rowCount());
if (!defaultDeviceConfig(devConfig->osType()))
devConfig->m_isDefault = true;
......
......@@ -48,6 +48,7 @@ class LinuxDeviceConfigurations : public QAbstractListModel
{
Q_OBJECT
Q_DISABLE_COPY(LinuxDeviceConfigurations)
friend class MaemoDeviceConfigurationsSettingsWidget;
public:
static LinuxDeviceConfigurations *instance(QObject *parent = 0);
......@@ -64,15 +65,6 @@ public:
void setDefaultSshKeyFilePath(const QString &path) { m_defaultSshKeyFilePath = path; }
QString defaultSshKeyFilePath() const { return m_defaultSshKeyFilePath; }
void addHardwareDeviceConfiguration(const QString &name, const QString &osType,
const QString &hostName, const QString &privateKeyFilePath);
void addGenericLinuxConfigurationUsingPassword(const QString &name,
const QString &hostName, const QString &userName,
const QString &password);
void addGenericLinuxConfigurationUsingKey(const QString &name,
const QString &hostName, const QString &userName,
const QString &privateKeyFilePath);
void addEmulatorDeviceConfiguration(const QString &name, const QString &osType);
void removeConfiguration(int index);
void setConfigurationName(int i, const QString &name);
void setSshParameters(int i, const Utils::SshConnectionParameters &params);
......
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Nokia Corporation (info@qt.nokia.com)
**
**
** GNU Lesser General Public License Usage
**
** 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.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
** If you have questions regarding the use of this file, please contact
** Nokia at info@qt.nokia.com.
**
**************************************************************************/
#include "linuxdevicefactoryselectiondialog.h"
#include "ui_linuxdevicefactoryselectiondialog.h"
#include "linuxdeviceconfiguration.h"
#include <extensionsystem/pluginmanager.h>
#include <utils/qtcassert.h>
#include <QtGui/QPushButton>
namespace RemoteLinux {
namespace Internal {
LinuxDeviceFactorySelectionDialog::LinuxDeviceFactorySelectionDialog(QWidget *parent) :
QDialog(parent), ui(new Ui::LinuxDeviceFactorySelectionDialog)
{
ui->setupUi(this);
ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("Start Wizard"));
const QList<ILinuxDeviceConfigurationFactory *> &factories
= ExtensionSystem::PluginManager::instance()->getObjects<ILinuxDeviceConfigurationFactory>();
foreach (const ILinuxDeviceConfigurationFactory * const factory, factories) {
m_factories << factory;
ui->listWidget->addItem(factory->displayName());
}
connect(ui->listWidget, SIGNAL(itemSelectionChanged()), SLOT(handleItemSelectionChanged()));
handleItemSelectionChanged();
}
LinuxDeviceFactorySelectionDialog::~LinuxDeviceFactorySelectionDialog()
{
delete ui;
}
void LinuxDeviceFactorySelectionDialog::handleItemSelectionChanged()
{
ui->buttonBox->button(QDialogButtonBox::Ok)
->setEnabled(!ui->listWidget->selectedItems().isEmpty());
}
const ILinuxDeviceConfigurationFactory *LinuxDeviceFactorySelectionDialog::selectedFactory() const
{
return m_factories.at(ui->listWidget->row(ui->listWidget->selectedItems().first()));
}
} // namespace Internal
} // namespace RemoteLinux
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Nokia Corporation (info@qt.nokia.com)
**
**
** GNU Lesser General Public License Usage
**
** 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.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
** If you have questions regarding the use of this file, please contact
** Nokia at info@qt.nokia.com.
**
**************************************************************************/
#ifndef LINUXDEVICEFACTORYSELECTIONDIALOG_H
#define LINUXDEVICEFACTORYSELECTIONDIALOG_H
#include <QtCore/QList>
#include <QtGui/QDialog>
QT_BEGIN_NAMESPACE
namespace Ui {
class LinuxDeviceFactorySelectionDialog;
} // namespace Ui
QT_END_NAMESPACE