From 047973c3558eb0b7e868486c78de04cf35dd1ccd Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 25 Jul 2012 16:23:26 +0200 Subject: [PATCH 01/15] remotelinux: use IDevice base class when appropriate Change-Id: I6f68f85d50500e4995ab51ee374f8ba5c31d334d Reviewed-by: Christian Kandeler --- .../remotelinux/remotelinuxprocesslist.cpp | 20 ++++++------------- .../remotelinux/remotelinuxprocesslist.h | 9 ++++----- .../remotelinuxusedportsgatherer.cpp | 6 +++--- .../remotelinuxusedportsgatherer.h | 5 +++-- .../remotelinux/startgdbserverdialog.cpp | 14 ++++++------- 5 files changed, 22 insertions(+), 32 deletions(-) diff --git a/src/plugins/remotelinux/remotelinuxprocesslist.cpp b/src/plugins/remotelinux/remotelinuxprocesslist.cpp index a7f8380ee8e..6fa21394e6b 100644 --- a/src/plugins/remotelinux/remotelinuxprocesslist.cpp +++ b/src/plugins/remotelinux/remotelinuxprocesslist.cpp @@ -26,16 +26,13 @@ ** ** **************************************************************************/ -#include "remotelinuxprocesslist.h" -#include "linuxdeviceconfiguration.h" +#include "remotelinuxprocesslist.h" #include #include -#include -#include - +using namespace ProjectExplorer; using namespace QSsh; namespace RemoteLinux { @@ -55,14 +52,14 @@ static QString visualizeNull(QString s) class AbstractRemoteLinuxProcessListPrivate { public: - AbstractRemoteLinuxProcessListPrivate(const LinuxDeviceConfiguration::ConstPtr &devConf) + AbstractRemoteLinuxProcessListPrivate(const IDevice::ConstPtr &devConf) : deviceConfiguration(devConf), state(Inactive) { } - const LinuxDeviceConfiguration::ConstPtr deviceConfiguration; + const IDevice::ConstPtr deviceConfiguration; SshRemoteProcessRunner process; QList remoteProcesses; QString errorMsg; @@ -73,17 +70,12 @@ public: using namespace Internal; -AbstractRemoteLinuxProcessList::AbstractRemoteLinuxProcessList(const LinuxDeviceConfiguration::ConstPtr &devConfig, +AbstractRemoteLinuxProcessList::AbstractRemoteLinuxProcessList(const IDevice::ConstPtr &devConfig, QObject *parent) : QAbstractTableModel(parent), d(new AbstractRemoteLinuxProcessListPrivate(devConfig)) { } -LinuxDeviceConfiguration::ConstPtr AbstractRemoteLinuxProcessList::deviceConfiguration() const -{ - return d->deviceConfiguration; -} - AbstractRemoteLinuxProcessList::~AbstractRemoteLinuxProcessList() { delete d; @@ -224,7 +216,7 @@ void AbstractRemoteLinuxProcessList::setFinished() } -GenericRemoteLinuxProcessList::GenericRemoteLinuxProcessList(const LinuxDeviceConfiguration::ConstPtr &devConfig, +GenericRemoteLinuxProcessList::GenericRemoteLinuxProcessList(const IDevice::ConstPtr &devConfig, QObject *parent) : AbstractRemoteLinuxProcessList(devConfig, parent) { diff --git a/src/plugins/remotelinux/remotelinuxprocesslist.h b/src/plugins/remotelinux/remotelinuxprocesslist.h index ac45532caa8..df7065373de 100644 --- a/src/plugins/remotelinux/remotelinuxprocesslist.h +++ b/src/plugins/remotelinux/remotelinuxprocesslist.h @@ -31,12 +31,13 @@ #include "remotelinux_export.h" +#include + #include #include #include namespace RemoteLinux { -class LinuxDeviceConfiguration; namespace Internal { class AbstractRemoteLinuxProcessListPrivate; @@ -70,11 +71,9 @@ signals: void processKilled(); protected: - AbstractRemoteLinuxProcessList(const QSharedPointer &devConfig, + AbstractRemoteLinuxProcessList(const ProjectExplorer::IDevice::ConstPtr &devConfig, QObject *parent = 0); - QSharedPointer deviceConfiguration() const; - private slots: void handleConnectionError(); void handleRemoteProcessFinished(int exitStatus); @@ -101,7 +100,7 @@ class REMOTELINUX_EXPORT GenericRemoteLinuxProcessList : public AbstractRemoteLi { Q_OBJECT public: - GenericRemoteLinuxProcessList(const QSharedPointer &devConfig, + GenericRemoteLinuxProcessList(const ProjectExplorer::IDevice::ConstPtr &devConfig, QObject *parent = 0); protected: diff --git a/src/plugins/remotelinux/remotelinuxusedportsgatherer.cpp b/src/plugins/remotelinux/remotelinuxusedportsgatherer.cpp index b62ff2e0da4..557cb3909c4 100644 --- a/src/plugins/remotelinux/remotelinuxusedportsgatherer.cpp +++ b/src/plugins/remotelinux/remotelinuxusedportsgatherer.cpp @@ -26,9 +26,8 @@ ** ** **************************************************************************/ -#include "remotelinuxusedportsgatherer.h" -#include "linuxdeviceconfiguration.h" +#include "remotelinuxusedportsgatherer.h" #include #include @@ -38,6 +37,7 @@ #include +using namespace ProjectExplorer; using namespace QSsh; using namespace Utils; @@ -72,7 +72,7 @@ RemoteLinuxUsedPortsGatherer::~RemoteLinuxUsedPortsGatherer() delete d; } -void RemoteLinuxUsedPortsGatherer::start(const LinuxDeviceConfiguration::ConstPtr &devConf) +void RemoteLinuxUsedPortsGatherer::start(const IDevice::ConstPtr &devConf) { QTC_ASSERT(!d->connection, return); d->portsToCheck = devConf->freePorts(); diff --git a/src/plugins/remotelinux/remotelinuxusedportsgatherer.h b/src/plugins/remotelinux/remotelinuxusedportsgatherer.h index c2b260dfe8c..a19e3143755 100644 --- a/src/plugins/remotelinux/remotelinuxusedportsgatherer.h +++ b/src/plugins/remotelinux/remotelinuxusedportsgatherer.h @@ -31,6 +31,8 @@ #include "remotelinux_export.h" +#include + #include #include #include @@ -40,7 +42,6 @@ QT_FORWARD_DECLARE_CLASS(QString) namespace Utils { class PortList; } namespace RemoteLinux { -class LinuxDeviceConfiguration; namespace Internal { class RemoteLinuxUsedPortsGathererPrivate; @@ -53,7 +54,7 @@ class REMOTELINUX_EXPORT RemoteLinuxUsedPortsGatherer : public QObject public: explicit RemoteLinuxUsedPortsGatherer(QObject *parent = 0); ~RemoteLinuxUsedPortsGatherer(); - void start(const QSharedPointer &devConf); + void start(const ProjectExplorer::IDevice::ConstPtr &devConf); void stop(); int getNextFreePort(Utils::PortList *freePorts) const; // returns -1 if no more are left QList usedPorts() const; diff --git a/src/plugins/remotelinux/startgdbserverdialog.cpp b/src/plugins/remotelinux/startgdbserverdialog.cpp index 135b480a20d..00ce4a53132 100644 --- a/src/plugins/remotelinux/startgdbserverdialog.cpp +++ b/src/plugins/remotelinux/startgdbserverdialog.cpp @@ -31,7 +31,6 @@ #include "startgdbserverdialog.h" #include "remotelinuxprocesslist.h" -#include "linuxdeviceconfiguration.h" #include "remotelinuxusedportsgatherer.h" #include @@ -84,11 +83,10 @@ class StartGdbServerDialogPrivate public: StartGdbServerDialogPrivate(StartGdbServerDialog *q); - LinuxDeviceConfiguration::ConstPtr currentDevice() const + IDevice::ConstPtr currentDevice() const { Profile *profile = profileChooser->currentProfile(); - IDevice::ConstPtr device = DeviceProfileInformation::device(profile); - return device.dynamicCast(); + return DeviceProfileInformation::device(profile); } StartGdbServerDialog *q; @@ -203,7 +201,7 @@ StartGdbServerDialog::~StartGdbServerDialog() void StartGdbServerDialog::attachToDevice() { - LinuxDeviceConfiguration::ConstPtr device = d->currentDevice(); + IDevice::ConstPtr device = d->currentDevice(); // TODO: display error on non-matching device. if (!device) return; @@ -248,7 +246,7 @@ void StartGdbServerDialog::attachToProcess() return; d->attachProcessButton->setEnabled(false); - LinuxDeviceConfiguration::ConstPtr device = d->currentDevice(); + IDevice::ConstPtr device = d->currentDevice(); if (!device) return; PortList ports = device->freePorts(); @@ -352,7 +350,7 @@ void StartGdbServerDialog::handleProcessErrorOutput() void StartGdbServerDialog::reportOpenPort(int port) { logMessage(tr("Port %1 is now accessible.").arg(port)); - LinuxDeviceConfiguration::ConstPtr device = d->currentDevice(); + IDevice::ConstPtr device = d->currentDevice(); QString channel = QString("%1:%2").arg(device->sshParameters().host).arg(port); logMessage(tr("Server started on %1").arg(channel)); @@ -375,7 +373,7 @@ void StartGdbServerDialog::handleProcessClosed(int status) void StartGdbServerDialog::startGdbServerOnPort(int port, int pid) { - LinuxDeviceConfiguration::ConstPtr device = d->currentDevice(); + IDevice::ConstPtr device = d->currentDevice(); connect(&d->runner, SIGNAL(connectionError()), SLOT(handleConnectionError())); connect(&d->runner, SIGNAL(processStarted()), SLOT(handleProcessStarted())); connect(&d->runner, SIGNAL(readyReadStandardOutput()), SLOT(handleProcessOutputAvailable())); From ba6bd10312ce95534e9b59b8984756a8e1f8ce92 Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 25 Jul 2012 17:10:20 +0200 Subject: [PATCH 02/15] device handling: move LinuxDeviceConfiguration::MachineType to IDevice Change-Id: I1619f8ca7751acfe3379b6486949b65c1f9b42fd Reviewed-by: Christian Kandeler --- src/plugins/android/androiddevice.cpp | 4 ++- .../devicesupport/desktopdevice.cpp | 4 ++- .../projectexplorer/devicesupport/idevice.cpp | 17 +++++++++-- .../projectexplorer/devicesupport/idevice.h | 5 +++- .../qt-s60/symbianidevice.cpp | 1 + .../remotelinux/linuxdeviceconfiguration.cpp | 29 ++----------------- .../remotelinux/linuxdeviceconfiguration.h | 12 ++------ 7 files changed, 31 insertions(+), 41 deletions(-) diff --git a/src/plugins/android/androiddevice.cpp b/src/plugins/android/androiddevice.cpp index e43ed876d6e..0cec0a30e02 100644 --- a/src/plugins/android/androiddevice.cpp +++ b/src/plugins/android/androiddevice.cpp @@ -37,7 +37,9 @@ namespace Android { namespace Internal { AndroidDevice::AndroidDevice(): - ProjectExplorer::IDevice(Core::Id(Constants::ANDROID_DEVICE_TYPE), IDevice::AutoDetected, + ProjectExplorer::IDevice(Core::Id(Constants::ANDROID_DEVICE_TYPE), + IDevice::AutoDetected, + IDevice::Hardware, Core::Id(Constants::ANDROID_DEVICE_ID)) { setDisplayName(QCoreApplication::translate("ProjectExplorer::AndroidDevice", "Run on Android")); diff --git a/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp b/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp index b3422ca6679..e6c2f76a9f7 100644 --- a/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp +++ b/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp @@ -71,7 +71,9 @@ IDevice::Ptr DesktopDevice::clone() const return Ptr(new DesktopDevice(*this)); } -DesktopDevice::DesktopDevice() : IDevice(Core::Id(Constants::DESKTOP_DEVICE_TYPE), IDevice::AutoDetected, +DesktopDevice::DesktopDevice() : IDevice(Core::Id(Constants::DESKTOP_DEVICE_TYPE), + IDevice::AutoDetected, + IDevice::Hardware, Core::Id(Constants::DESKTOP_DEVICE_ID)) { setDisplayName(QCoreApplication::translate("ProjectExplorer::DesktopDevice", "Run locally")); diff --git a/src/plugins/projectexplorer/devicesupport/idevice.cpp b/src/plugins/projectexplorer/devicesupport/idevice.cpp index 476cb8f883c..13675b3dd08 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.cpp +++ b/src/plugins/projectexplorer/devicesupport/idevice.cpp @@ -150,6 +150,7 @@ const char DisplayNameKey[] = "Name"; const char TypeKey[] = "OsType"; const char IdKey[] = "InternalId"; const char OriginKey[] = "Origin"; +const char MachineTypeKey[] = "Type"; // Connection const char HostKey[] = "Host"; @@ -163,6 +164,7 @@ const char TimeoutKey[] = "Timeout"; typedef QSsh::SshConnectionParameters::AuthenticationType AuthType; const AuthType DefaultAuthType = QSsh::SshConnectionParameters::AuthenticationByKey; +const IDevice::MachineType DefaultMachineType = IDevice::Hardware; const int DefaultTimeout = 10; @@ -172,7 +174,8 @@ class IDevicePrivate public: IDevicePrivate() : origin(IDevice::AutoDetected), - deviceState(IDevice::DeviceStateUnknown) + deviceState(IDevice::DeviceStateUnknown), + machineType(IDevice::Hardware) { } QString displayName; @@ -180,6 +183,7 @@ public: IDevice::Origin origin; Core::Id id; IDevice::DeviceState deviceState; + IDevice::MachineType machineType; QSsh::SshConnectionParameters sshParameters; Utils::PortList freePorts; @@ -189,10 +193,12 @@ public: IDevice::IDevice() : d(new Internal::IDevicePrivate) { } -IDevice::IDevice(Core::Id type, Origin origin, Core::Id id) : d(new Internal::IDevicePrivate) +IDevice::IDevice(Core::Id type, Origin origin, MachineType machineType, Core::Id id) + : d(new Internal::IDevicePrivate) { d->type = type; d->origin = origin; + d->machineType = machineType; QTC_CHECK(origin == ManuallyAdded || id.isValid()); d->id = id.isValid() ? id : newId(); } @@ -288,6 +294,7 @@ void IDevice::fromMap(const QVariantMap &map) d->freePorts = Utils::PortList::fromString(map.value(PortsSpecKey, QLatin1String("10000-10100")).toString()); + d->machineType = static_cast(map.value(MachineTypeKey, DefaultMachineType).toInt()); } QVariantMap IDevice::toMap() const @@ -298,6 +305,7 @@ QVariantMap IDevice::toMap() const map.insert(QLatin1String(IdKey), d->id.name()); map.insert(QLatin1String(OriginKey), d->origin); + map.insert(MachineTypeKey, d->machineType); map.insert(HostKey, d->sshParameters.host); map.insert(SshPortKey, d->sshParameters.port); map.insert(UserNameKey, d->sshParameters.userName); @@ -353,6 +361,11 @@ Utils::PortList IDevice::freePorts() const return d->freePorts; } +IDevice::MachineType IDevice::machineType() const +{ + return d->machineType; +} + QString IDevice::defaultPrivateKeyFilePath() { return QDesktopServices::storageLocation(QDesktopServices::HomeLocation) diff --git a/src/plugins/projectexplorer/devicesupport/idevice.h b/src/plugins/projectexplorer/devicesupport/idevice.h index 456dd8641fc..427bbffb0bc 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.h +++ b/src/plugins/projectexplorer/devicesupport/idevice.h @@ -57,6 +57,7 @@ public: typedef QSharedPointer ConstPtr; enum Origin { ManuallyAdded, AutoDetected }; + enum MachineType { Hardware, Emulator }; virtual ~IDevice(); @@ -108,9 +109,11 @@ public: Utils::PortList freePorts() const; void setFreePorts(const Utils::PortList &freePorts); + MachineType machineType() const; + protected: IDevice(); - IDevice(Core::Id type, Origin origin, Core::Id id = Core::Id()); + IDevice(Core::Id type, Origin origin, MachineType machineType, Core::Id id = Core::Id()); IDevice(const IDevice &other); Ptr sharedFromThis(); diff --git a/src/plugins/qt4projectmanager/qt-s60/symbianidevice.cpp b/src/plugins/qt4projectmanager/qt-s60/symbianidevice.cpp index a7209bbc339..faf0682ad1a 100644 --- a/src/plugins/qt4projectmanager/qt-s60/symbianidevice.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/symbianidevice.cpp @@ -51,6 +51,7 @@ namespace Qt4ProjectManager { SymbianIDevice::SymbianIDevice() : ProjectExplorer::IDevice(Internal::SymbianIDeviceFactory::deviceType(), ProjectExplorer::IDevice::AutoDetected, + ProjectExplorer::IDevice::Hardware, Core::Id("Symbian Device")), m_port(QLatin1String(DEFAULT_CODA_TCP_PORT)), m_communicationChannel(CommunicationCodaSerialConnection) diff --git a/src/plugins/remotelinux/linuxdeviceconfiguration.cpp b/src/plugins/remotelinux/linuxdeviceconfiguration.cpp index 11cae54d24d..3a567df716d 100644 --- a/src/plugins/remotelinux/linuxdeviceconfiguration.cpp +++ b/src/plugins/remotelinux/linuxdeviceconfiguration.cpp @@ -45,9 +45,6 @@ namespace RemoteLinux { -const QLatin1String MachineTypeKey("Type"); -const LinuxDeviceConfiguration::MachineType DefaultMachineType = LinuxDeviceConfiguration::Hardware; - LinuxDeviceConfiguration::Ptr LinuxDeviceConfiguration::create(const QString &name, Core::Id type, MachineType machineType, Origin origin, Core::Id id) { @@ -102,18 +99,16 @@ void LinuxDeviceConfiguration::executeAction(Core::Id actionId, QWidget *parent) d->exec(); } -LinuxDeviceConfiguration::LinuxDeviceConfiguration(const QString &name, Core::Id type, - MachineType machineType, Origin origin, Core::Id id) - : IDevice(type, origin, id) +LinuxDeviceConfiguration::LinuxDeviceConfiguration(const QString &name, Core::Id type, MachineType machineType, + Origin origin, Core::Id id) + : IDevice(type, origin, machineType, id) { setDisplayName(name); - m_machineType = machineType; } LinuxDeviceConfiguration::LinuxDeviceConfiguration(const LinuxDeviceConfiguration &other) : IDevice(other) { - m_machineType = other.machineType(); } LinuxDeviceConfiguration::Ptr LinuxDeviceConfiguration::create() @@ -121,27 +116,9 @@ LinuxDeviceConfiguration::Ptr LinuxDeviceConfiguration::create() return Ptr(new LinuxDeviceConfiguration); } -void LinuxDeviceConfiguration::fromMap(const QVariantMap &map) -{ - IDevice::fromMap(map); - m_machineType = static_cast(map.value(MachineTypeKey, DefaultMachineType).toInt()); -} - -QVariantMap LinuxDeviceConfiguration::toMap() const -{ - QVariantMap map = IDevice::toMap(); - map.insert(MachineTypeKey, m_machineType); - return map; -} - ProjectExplorer::IDevice::Ptr LinuxDeviceConfiguration::clone() const { return Ptr(new LinuxDeviceConfiguration(*this)); } -LinuxDeviceConfiguration::MachineType LinuxDeviceConfiguration::machineType() const -{ - return m_machineType; -} - } // namespace RemoteLinux diff --git a/src/plugins/remotelinux/linuxdeviceconfiguration.h b/src/plugins/remotelinux/linuxdeviceconfiguration.h index b1e02a394e5..3f54da66540 100644 --- a/src/plugins/remotelinux/linuxdeviceconfiguration.h +++ b/src/plugins/remotelinux/linuxdeviceconfiguration.h @@ -51,10 +51,6 @@ public: typedef QSharedPointer Ptr; typedef QSharedPointer ConstPtr; - enum MachineType { Hardware, Emulator }; - - MachineType machineType() const; - static Ptr create(); static Ptr create(const QString &name, Core::Id type, MachineType machineType, Origin origin = ManuallyAdded, Core::Id id = Core::Id()); @@ -64,20 +60,16 @@ public: QList actionIds() const; QString displayNameForActionId(Core::Id actionId) const; void executeAction(Core::Id actionId, QWidget *parent) const; - void fromMap(const QVariantMap &map); ProjectExplorer::IDevice::Ptr clone() const; protected: LinuxDeviceConfiguration() {} - LinuxDeviceConfiguration(const QString &name, Core::Id type, MachineType machineType, - Origin origin, Core::Id id); + LinuxDeviceConfiguration(const QString &name, Core::Id type, + MachineType machineType, Origin origin, Core::Id id); LinuxDeviceConfiguration(const LinuxDeviceConfiguration &other); - QVariantMap toMap() const; - private: LinuxDeviceConfiguration &operator=(const LinuxDeviceConfiguration &); - LinuxDeviceConfiguration::MachineType m_machineType; }; } // namespace RemoteLinux From 1bbcfd17a9a78107e5f09d1287ae19459f31ab8f Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 25 Jul 2012 17:19:44 +0200 Subject: [PATCH 03/15] madde: use IDevice base class for MaemoRemoteMounter Change-Id: I01a0a735b129ce2aafda556a09002ed7a098c88a Reviewed-by: Christian Kandeler --- src/plugins/madde/maemoremotemounter.cpp | 5 +++-- src/plugins/madde/maemoremotemounter.h | 12 ++++-------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/plugins/madde/maemoremotemounter.cpp b/src/plugins/madde/maemoremotemounter.cpp index 407f4035049..695a27e98f6 100644 --- a/src/plugins/madde/maemoremotemounter.cpp +++ b/src/plugins/madde/maemoremotemounter.cpp @@ -45,9 +45,10 @@ #include +using namespace ProjectExplorer; +using namespace QSsh; using namespace Qt4ProjectManager; using namespace RemoteLinux; -using namespace QSsh; using namespace Utils; namespace Madde { @@ -67,7 +68,7 @@ MaemoRemoteMounter::~MaemoRemoteMounter() } void MaemoRemoteMounter::setConnection(SshConnection *connection, - const LinuxDeviceConfiguration::ConstPtr &devConf) + const IDevice::ConstPtr &devConf) { QTC_ASSERT(m_state == Inactive, return); diff --git a/src/plugins/madde/maemoremotemounter.h b/src/plugins/madde/maemoremotemounter.h index 5ae395f8786..42423afcefb 100644 --- a/src/plugins/madde/maemoremotemounter.h +++ b/src/plugins/madde/maemoremotemounter.h @@ -33,6 +33,7 @@ #include "maemomountspecification.h" +#include #include #include @@ -44,18 +45,13 @@ QT_FORWARD_DECLARE_CLASS(QTimer) namespace QSsh { -class SftpChannel; class SshConnection; class SshRemoteProcess; } namespace Utils { class PortList; } namespace Qt4ProjectManager { class Qt4BuildConfiguration; } - -namespace RemoteLinux { -class LinuxDeviceConfiguration; -class RemoteLinuxUsedPortsGatherer; -} +namespace RemoteLinux { class RemoteLinuxUsedPortsGatherer; } namespace Madde { namespace Internal { @@ -69,7 +65,7 @@ public: // Must already be connected. void setConnection(QSsh::SshConnection *connection, - const QSharedPointer &devConf); + const ProjectExplorer::IDevice::ConstPtr &devConf); void setBuildConfiguration(const Qt4ProjectManager::Qt4BuildConfiguration *bc); void addMountSpecification(const MaemoMountSpecification &mountSpec, @@ -124,7 +120,7 @@ private: }; QSsh::SshConnection *m_connection; - QSharedPointer m_devConf; + ProjectExplorer::IDevice::ConstPtr m_devConf; QList m_mountSpecs; QSharedPointer m_mountProcess; QSharedPointer m_unmountProcess; From 0fcd30cc6191925ea3cba2baad6533a946c9ccd2 Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 25 Jul 2012 17:36:35 +0200 Subject: [PATCH 04/15] madde: prefer using Profile instead of qt4BuildConfiguration etc Change-Id: I6fe64f7a4a5713c09ea02460a958758d0938fc19 Reviewed-by: Christian Kandeler --- src/plugins/madde/maemodeploybymountsteps.cpp | 3 +-- src/plugins/madde/maemodeploymentmounter.cpp | 11 ++++----- src/plugins/madde/maemodeploymentmounter.h | 6 ++--- src/plugins/madde/maemoremotemounter.cpp | 10 +++----- src/plugins/madde/maemoremotemounter.h | 6 ++--- src/plugins/madde/maemosshrunner.cpp | 8 ++++--- .../abstractremotelinuxdeployservice.cpp | 24 +++++++++++++------ .../abstractremotelinuxdeployservice.h | 8 +++---- 8 files changed, 40 insertions(+), 36 deletions(-) diff --git a/src/plugins/madde/maemodeploybymountsteps.cpp b/src/plugins/madde/maemodeploybymountsteps.cpp index 132b5be02f0..116a949ac0f 100644 --- a/src/plugins/madde/maemodeploybymountsteps.cpp +++ b/src/plugins/madde/maemodeploybymountsteps.cpp @@ -199,8 +199,7 @@ void AbstractMaemoDeployByMountService::doDeploy() } m_state = Mounting; - m_mounter->setupMounts(connection(), deviceConfiguration(), mountSpecifications(), - qt4BuildConfiguration()); + m_mounter->setupMounts(connection(), deviceConfiguration(), mountSpecifications(), profile()); } void AbstractMaemoDeployByMountService::stopDeployment() diff --git a/src/plugins/madde/maemodeploymentmounter.cpp b/src/plugins/madde/maemodeploymentmounter.cpp index f85bb7d576d..5830284e1e7 100644 --- a/src/plugins/madde/maemodeploymentmounter.cpp +++ b/src/plugins/madde/maemodeploymentmounter.cpp @@ -34,14 +34,13 @@ #include "maemoremotemounter.h" #include -#include #include #include #include #include #include -using namespace Qt4ProjectManager; +using namespace ProjectExplorer; using namespace RemoteLinux; using namespace QSsh; @@ -73,7 +72,7 @@ MaemoDeploymentMounter::~MaemoDeploymentMounter() {} void MaemoDeploymentMounter::setupMounts(SshConnection *connection, const LinuxDeviceConfiguration::ConstPtr &devConf, const QList &mountSpecs, - const Qt4BuildConfiguration *bc) + const Profile *profile) { QTC_ASSERT(m_state == Inactive, return); @@ -81,7 +80,7 @@ void MaemoDeploymentMounter::setupMounts(SshConnection *connection, m_connection = connection; m_devConf = devConf; m_mounter->setConnection(m_connection, m_devConf); - m_buildConfig = bc; + m_profile = profile; connect(m_connection, SIGNAL(error(QSsh::SshError)), SLOT(handleConnectionError())); setState(UnmountingOldDirs); unmount(); @@ -102,7 +101,7 @@ void MaemoDeploymentMounter::setupMounter() setState(UnmountingCurrentDirs); m_mounter->resetMountSpecifications(); - m_mounter->setBuildConfiguration(m_buildConfig); + m_mounter->setProfile(m_profile); foreach (const MaemoMountSpecification &mountSpec, m_mountSpecs) m_mounter->addMountSpecification(mountSpec, true); unmount(); @@ -173,7 +172,7 @@ void MaemoDeploymentMounter::handlePortListReady() return; setState(Mounting); - m_freePorts = MaemoGlobal::freePorts(m_devConf, QtSupport::QtProfileInformation::qtVersion(m_buildConfig->target()->profile())); + m_freePorts = MaemoGlobal::freePorts(m_devConf, QtSupport::QtProfileInformation::qtVersion(m_profile)); m_mounter->mount(&m_freePorts, m_portsGatherer); } diff --git a/src/plugins/madde/maemodeploymentmounter.h b/src/plugins/madde/maemodeploymentmounter.h index 974abb64fd5..469fc9dfb7b 100644 --- a/src/plugins/madde/maemodeploymentmounter.h +++ b/src/plugins/madde/maemodeploymentmounter.h @@ -40,7 +40,7 @@ #include namespace QSsh { class SshConnection; } -namespace Qt4ProjectManager { class Qt4BuildConfiguration; } +namespace ProjectExplorer { class Profile; } namespace RemoteLinux { class LinuxDeviceConfiguration; @@ -62,7 +62,7 @@ public: void setupMounts(QSsh::SshConnection *connection, const QSharedPointer &devConf, const QList &mountSpecs, - const Qt4ProjectManager::Qt4BuildConfiguration *bc); + const ProjectExplorer::Profile *profile); void tearDownMounts(); signals: @@ -97,7 +97,7 @@ private: RemoteLinux::RemoteLinuxUsedPortsGatherer * const m_portsGatherer; Utils::PortList m_freePorts; QList m_mountSpecs; - const Qt4ProjectManager::Qt4BuildConfiguration *m_buildConfig; + const ProjectExplorer::Profile *m_profile; }; } // namespace Internal diff --git a/src/plugins/madde/maemoremotemounter.cpp b/src/plugins/madde/maemoremotemounter.cpp index 695a27e98f6..8ed3ac55f59 100644 --- a/src/plugins/madde/maemoremotemounter.cpp +++ b/src/plugins/madde/maemoremotemounter.cpp @@ -37,9 +37,6 @@ #include #include #include -#include -#include -#include #include #include @@ -47,7 +44,6 @@ using namespace ProjectExplorer; using namespace QSsh; -using namespace Qt4ProjectManager; using namespace RemoteLinux; using namespace Utils; @@ -76,13 +72,13 @@ void MaemoRemoteMounter::setConnection(SshConnection *connection, m_devConf = devConf; } -void MaemoRemoteMounter::setBuildConfiguration(const Qt4BuildConfiguration *bc) +void MaemoRemoteMounter::setProfile(const Profile *profile) { QTC_ASSERT(m_state == Inactive, return); - Core::Id typeId = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(bc->target()->profile()); + Core::Id typeId = DeviceTypeProfileInformation::deviceTypeId(profile); m_remoteMountsAllowed = MaddeDevice::allowsRemoteMounts(typeId); - m_maddeRoot = ProjectExplorer::SysRootProfileInformation::sysRoot(bc->target()->profile()); + m_maddeRoot = SysRootProfileInformation::sysRoot(profile); } void MaemoRemoteMounter::addMountSpecification(const MaemoMountSpecification &mountSpec, diff --git a/src/plugins/madde/maemoremotemounter.h b/src/plugins/madde/maemoremotemounter.h index 42423afcefb..6ade8dbe34d 100644 --- a/src/plugins/madde/maemoremotemounter.h +++ b/src/plugins/madde/maemoremotemounter.h @@ -49,9 +49,9 @@ class SshConnection; class SshRemoteProcess; } -namespace Utils { class PortList; } -namespace Qt4ProjectManager { class Qt4BuildConfiguration; } +namespace ProjectExplorer { class Profile; } namespace RemoteLinux { class RemoteLinuxUsedPortsGatherer; } +namespace Utils { class PortList; } namespace Madde { namespace Internal { @@ -67,7 +67,7 @@ public: void setConnection(QSsh::SshConnection *connection, const ProjectExplorer::IDevice::ConstPtr &devConf); - void setBuildConfiguration(const Qt4ProjectManager::Qt4BuildConfiguration *bc); + void setProfile(const ProjectExplorer::Profile *profile); void addMountSpecification(const MaemoMountSpecification &mountSpec, bool mountAsRoot); bool hasValidMountSpecifications() const; diff --git a/src/plugins/madde/maemosshrunner.cpp b/src/plugins/madde/maemosshrunner.cpp index e6c0acf4350..d177d601703 100644 --- a/src/plugins/madde/maemosshrunner.cpp +++ b/src/plugins/madde/maemosshrunner.cpp @@ -40,6 +40,7 @@ #include #include +using namespace ProjectExplorer; using namespace Qt4ProjectManager; using namespace RemoteLinux; using namespace QSsh; @@ -53,9 +54,10 @@ MaemoSshRunner::MaemoSshRunner(QObject *parent, MaemoRunConfiguration *runConfig m_mountSpecs(runConfig->remoteMounts()->mountSpecs()), m_mountState(InactiveMountState) { - const Qt4BuildConfiguration * const bc = runConfig->activeQt4BuildConfiguration(); - m_qtId = bc ? QtSupport::QtProfileInformation::qtVersionId(bc->target()->profile()) : -1; - m_mounter->setBuildConfiguration(bc); + const BuildConfiguration * const bc = runConfig->target()->activeBuildConfiguration(); + Profile *profile = bc ? bc->target()->profile() : 0; + m_qtId = QtSupport::QtProfileInformation::qtVersionId(profile); + m_mounter->setProfile(profile); connect(m_mounter, SIGNAL(mounted()), this, SLOT(handleMounted())); connect(m_mounter, SIGNAL(unmounted()), this, SLOT(handleUnmounted())); connect(m_mounter, SIGNAL(error(QString)), this, diff --git a/src/plugins/remotelinux/abstractremotelinuxdeployservice.cpp b/src/plugins/remotelinux/abstractremotelinuxdeployservice.cpp index 2b6f2c8b6c8..ccc988dbd62 100644 --- a/src/plugins/remotelinux/abstractremotelinuxdeployservice.cpp +++ b/src/plugins/remotelinux/abstractremotelinuxdeployservice.cpp @@ -84,10 +84,11 @@ class AbstractRemoteLinuxDeployServicePrivate { public: AbstractRemoteLinuxDeployServicePrivate() - : connection(0), state(Inactive), stopRequested(false) {} + : profile(0), connection(0), state(Inactive), stopRequested(false) {} LinuxDeviceConfiguration::ConstPtr deviceConfiguration; QPointer buildConfiguration; + ProjectExplorer::Profile *profile; SshConnection *connection; State state; bool stopRequested; @@ -113,6 +114,11 @@ const Qt4BuildConfiguration *AbstractRemoteLinuxDeployService::qt4BuildConfigura return d->buildConfiguration; } +const ProjectExplorer::Profile *AbstractRemoteLinuxDeployService::profile() const +{ + return d->profile; +} + LinuxDeviceConfiguration::ConstPtr AbstractRemoteLinuxDeployService::deviceConfiguration() const { return d->deviceConfiguration; @@ -128,10 +134,10 @@ void AbstractRemoteLinuxDeployService::saveDeploymentTimeStamp(const DeployableF if (!d->buildConfiguration) return; const QtSupport::BaseQtVersion *const qtVersion - = QtSupport::QtProfileInformation::qtVersion(d->buildConfiguration->target()->profile()); + = QtSupport::QtProfileInformation::qtVersion(d->profile); QString systemRoot; - if (ProjectExplorer::SysRootProfileInformation::hasSysRoot(d->buildConfiguration->target()->profile())) - systemRoot = ProjectExplorer::SysRootProfileInformation::sysRoot(d->buildConfiguration->target()->profile()).toString(); + if (ProjectExplorer::SysRootProfileInformation::hasSysRoot(d->profile)) + systemRoot = ProjectExplorer::SysRootProfileInformation::sysRoot(d->profile).toString(); if (!qtVersion || !qtVersion->isValid()) return; d->lastDeployed.insert(DeployParameters(deployableFile, @@ -145,12 +151,12 @@ bool AbstractRemoteLinuxDeployService::hasChangedSinceLastDeployment(const Deplo if (!d->buildConfiguration) return true; const QtSupport::BaseQtVersion *const qtVersion - = QtSupport::QtProfileInformation::qtVersion(d->buildConfiguration->target()->profile()); + = QtSupport::QtProfileInformation::qtVersion(d->profile); if (!qtVersion || !qtVersion->isValid()) return true; QString systemRoot; - if (ProjectExplorer::SysRootProfileInformation::hasSysRoot(d->buildConfiguration->target()->profile())) - systemRoot = ProjectExplorer::SysRootProfileInformation::sysRoot(d->buildConfiguration->target()->profile()).toString(); + if (ProjectExplorer::SysRootProfileInformation::hasSysRoot(d->profile)) + systemRoot = ProjectExplorer::SysRootProfileInformation::sysRoot(d->profile).toString(); const QDateTime &lastDeployed = d->lastDeployed.value(DeployParameters(deployableFile, deviceConfiguration()->sshParameters().host, systemRoot)); return !lastDeployed.isValid() @@ -165,6 +171,10 @@ void AbstractRemoteLinuxDeployService::setDeviceConfiguration(const LinuxDeviceC void AbstractRemoteLinuxDeployService::setBuildConfiguration(Qt4BuildConfiguration *bc) { d->buildConfiguration = bc; + if (bc && bc->target()) + d->profile = bc->target()->profile(); + else + d->profile = 0; } void AbstractRemoteLinuxDeployService::start() diff --git a/src/plugins/remotelinux/abstractremotelinuxdeployservice.h b/src/plugins/remotelinux/abstractremotelinuxdeployservice.h index cba3a87f5e5..b54a34b2e62 100644 --- a/src/plugins/remotelinux/abstractremotelinuxdeployservice.h +++ b/src/plugins/remotelinux/abstractremotelinuxdeployservice.h @@ -35,13 +35,10 @@ #include #include #include -QT_FORWARD_DECLARE_CLASS(QString) namespace QSsh { class SshConnection; } - -namespace Qt4ProjectManager { -class Qt4BuildConfiguration; -} +namespace Qt4ProjectManager { class Qt4BuildConfiguration; } +namespace ProjectExplorer { class Profile; } namespace RemoteLinux { class DeployableFile; @@ -79,6 +76,7 @@ signals: protected: const Qt4ProjectManager::Qt4BuildConfiguration *qt4BuildConfiguration() const; + const ProjectExplorer::Profile *profile() const; QSharedPointer deviceConfiguration() const; QSsh::SshConnection *connection() const; From b906360a341800b84b5c8e0e2442698de10beb9e Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 25 Jul 2012 17:41:01 +0200 Subject: [PATCH 05/15] madde/qnx/remotelinux: adjust after profile changes More Profile use, less dependency on QtSupport, Derive qtVersionId from profile instead of qt build configuration. Replace qt4BuildConfiguration with buildConfiguration. Use IDevice base class in AbstractRemoteLinuxApplicationRunner and in other places. Simplify remote linux runconfiguration Change-Id: I6414d3d8146d16c360b3a0465c57a052ea71f899 Reviewed-by: Christian Kandeler --- .../android/androidrunconfiguration.cpp | 19 +--- src/plugins/android/androidrunconfiguration.h | 14 --- src/plugins/madde/maddedevicetester.cpp | 2 +- src/plugins/madde/maddedevicetester.h | 7 +- .../maddeuploadandinstallpackagesteps.cpp | 10 +- src/plugins/madde/maemodeploybymountsteps.cpp | 11 +-- src/plugins/madde/maemodeploymentmounter.cpp | 10 +- src/plugins/madde/maemodeploymentmounter.h | 14 +-- src/plugins/madde/maemodeviceconfigwizard.cpp | 32 +++---- src/plugins/madde/maemoglobal.cpp | 24 +++-- src/plugins/madde/maemoglobal.h | 6 +- .../madde/maemopublishingwizardfactories.cpp | 2 - src/plugins/madde/maemoqemumanager.cpp | 9 +- src/plugins/madde/maemoqemuruntimeparser.cpp | 2 - src/plugins/madde/maemoremotecopyfacility.cpp | 6 +- src/plugins/madde/maemoremotecopyfacility.h | 11 +-- src/plugins/madde/maemorunconfiguration.cpp | 18 ++-- src/plugins/madde/maemosshrunner.cpp | 10 +- src/plugins/madde/maemosshrunner.h | 2 +- src/plugins/madde/rpmmanager.cpp | 1 - .../integration/designdocumentcontroller.cpp | 19 ++-- src/plugins/qmlprofiler/qmlprofilertool.cpp | 1 - .../qnx/blackberryapplicationrunner.cpp | 13 ++- src/plugins/qnx/blackberryconnect.cpp | 10 +- .../qnx/blackberrydeviceconfiguration.cpp | 17 ++-- .../blackberrydeviceconfigurationwidget.cpp | 9 +- ...ackberrydeviceconfigurationwizardpages.cpp | 8 +- ...blackberrydeviceconfigurationwizardpages.h | 2 +- .../qnx/blackberryrunconfiguration.cpp | 5 - src/plugins/qnx/qnxdeviceconfiguration.cpp | 2 +- .../qnx/qnxdeviceconfigurationwizard.cpp | 5 +- src/plugins/qnx/qnxruncontrolfactory.cpp | 93 +++++++++---------- src/plugins/qnx/qnxruncontrolfactory.h | 8 +- .../qt4projectmanager/externaleditors.cpp | 1 - .../abstractremotelinuxdeployservice.cpp | 36 ++++--- .../abstractremotelinuxdeployservice.h | 17 ++-- .../abstractremotelinuxdeploystep.cpp | 11 +-- src/plugins/remotelinux/deploymentinfo.cpp | 1 - ...genericlinuxdeviceconfigurationfactory.cpp | 4 +- .../genericlinuxdeviceconfigurationwidget.cpp | 53 +++++------ .../genericlinuxdeviceconfigurationwidget.h | 4 +- .../genericlinuxdeviceconfigurationwizard.cpp | 4 +- ...riclinuxdeviceconfigurationwizardpages.cpp | 2 +- .../remotelinux/linuxdevicetestdialog.cpp | 2 +- .../remotelinux/linuxdevicetestdialog.h | 4 +- src/plugins/remotelinux/linuxdevicetester.cpp | 6 +- src/plugins/remotelinux/linuxdevicetester.h | 16 ++-- .../remotelinux/publickeydeploymentdialog.cpp | 7 +- .../remotelinux/publickeydeploymentdialog.h | 13 +-- .../remotelinuxapplicationrunner.cpp | 14 +-- .../remotelinuxapplicationrunner.h | 7 +- .../remotelinux/remotelinuxdebugsupport.cpp | 9 +- .../remotelinuxdeployconfiguration.cpp | 2 +- .../remotelinuxdeployconfiguration.h | 9 +- .../remotelinuxenvironmentreader.cpp | 22 ++--- .../remotelinuxenvironmentreader.h | 20 ++-- .../remotelinuxpackageinstaller.cpp | 9 +- .../remotelinux/remotelinuxpackageinstaller.h | 8 +- .../remotelinuxrunconfiguration.cpp | 10 +- .../remotelinux/remotelinuxrunconfiguration.h | 5 - .../remotelinuxrunconfigurationwidget.cpp | 4 - .../remotelinuxruncontrolfactory.cpp | 4 +- ...pespecificdeviceconfigurationlistmodel.cpp | 30 +++--- ...typespecificdeviceconfigurationlistmodel.h | 19 ++-- 64 files changed, 300 insertions(+), 455 deletions(-) diff --git a/src/plugins/android/androidrunconfiguration.cpp b/src/plugins/android/androidrunconfiguration.cpp index ac944fae72f..d7ea4edd37e 100644 --- a/src/plugins/android/androidrunconfiguration.cpp +++ b/src/plugins/android/androidrunconfiguration.cpp @@ -38,19 +38,14 @@ #include #include #include -#include -#include #include - -using namespace Qt4ProjectManager; +using namespace ProjectExplorer; namespace Android { namespace Internal { -using namespace ProjectExplorer; - AndroidRunConfiguration::AndroidRunConfiguration(Target *parent, Core::Id id, const QString &path) : RunConfiguration(parent, id) , m_proFilePath(path) @@ -58,8 +53,7 @@ AndroidRunConfiguration::AndroidRunConfiguration(Target *parent, Core::Id id, co init(); } -AndroidRunConfiguration::AndroidRunConfiguration(ProjectExplorer::Target *parent, - AndroidRunConfiguration *source) +AndroidRunConfiguration::AndroidRunConfiguration(Target *parent, AndroidRunConfiguration *source) : RunConfiguration(parent, source) , m_proFilePath(source->m_proFilePath) { @@ -71,15 +65,6 @@ void AndroidRunConfiguration::init() setDefaultDisplayName(defaultDisplayName()); } -AndroidRunConfiguration::~AndroidRunConfiguration() -{ -} - -Qt4BuildConfiguration *AndroidRunConfiguration::activeQt4BuildConfiguration() const -{ - return static_cast(activeBuildConfiguration()); -} - QWidget *AndroidRunConfiguration::createConfigurationWidget() { return 0;// no special running configurations diff --git a/src/plugins/android/androidrunconfiguration.h b/src/plugins/android/androidrunconfiguration.h index 3d091bd73e4..e2487915c7e 100644 --- a/src/plugins/android/androidrunconfiguration.h +++ b/src/plugins/android/androidrunconfiguration.h @@ -34,19 +34,8 @@ #include "androidconstants.h" #include "androidconfigurations.h" -#include - #include -QT_FORWARD_DECLARE_CLASS(QWidget) - -namespace Qt4ProjectManager { - -class Qt4BuildConfiguration; -class Qt4Project; -class Qt4ProFileNode; -} - namespace Android { namespace Internal { @@ -69,11 +58,9 @@ public: enum DebuggingType { DebugCppOnly, DebugQmlOnly, DebugCppAndQml }; AndroidRunConfiguration(ProjectExplorer::Target *parent, Core::Id id, const QString &path); - virtual ~AndroidRunConfiguration(); QWidget *createConfigurationWidget(); Utils::OutputFormatter *createOutputFormatter() const; - Qt4ProjectManager::Qt4BuildConfiguration *activeQt4BuildConfiguration() const; AndroidDeployStep *deployStep() const; @@ -95,7 +82,6 @@ private: void init(); QString m_proFilePath; - }; } // namespace Internal diff --git a/src/plugins/madde/maddedevicetester.cpp b/src/plugins/madde/maddedevicetester.cpp index 6e42e4b70f5..007e9a484b6 100644 --- a/src/plugins/madde/maddedevicetester.cpp +++ b/src/plugins/madde/maddedevicetester.cpp @@ -59,7 +59,7 @@ MaddeDeviceTester::~MaddeDeviceTester() { } -void MaddeDeviceTester::testDevice(const LinuxDeviceConfiguration::ConstPtr &deviceConfiguration) +void MaddeDeviceTester::testDevice(const ProjectExplorer::IDevice::ConstPtr &deviceConfiguration) { QTC_ASSERT(m_state == Inactive, return); diff --git a/src/plugins/madde/maddedevicetester.h b/src/plugins/madde/maddedevicetester.h index 428501e87e8..6abd05be947 100644 --- a/src/plugins/madde/maddedevicetester.h +++ b/src/plugins/madde/maddedevicetester.h @@ -32,8 +32,6 @@ #include -#include - namespace QSsh { class SshRemoteProcessRunner; } @@ -44,11 +42,12 @@ namespace Internal { class MaddeDeviceTester : public RemoteLinux::AbstractLinuxDeviceTester { Q_OBJECT + public: explicit MaddeDeviceTester(QObject *parent = 0); ~MaddeDeviceTester(); - void testDevice(const QSharedPointer &deviceConfiguration); + void testDevice(const ProjectExplorer::IDevice::ConstPtr &deviceConfiguration); void stopTest(); private slots: @@ -70,7 +69,7 @@ private: State m_state; TestResult m_result; QSsh::SshRemoteProcessRunner *m_processRunner; - QSharedPointer m_deviceConfiguration; + ProjectExplorer::IDevice::ConstPtr m_deviceConfiguration; }; } // namespace Internal diff --git a/src/plugins/madde/maddeuploadandinstallpackagesteps.cpp b/src/plugins/madde/maddeuploadandinstallpackagesteps.cpp index 394a1f0ddd6..0c475058f47 100644 --- a/src/plugins/madde/maddeuploadandinstallpackagesteps.cpp +++ b/src/plugins/madde/maddeuploadandinstallpackagesteps.cpp @@ -33,16 +33,15 @@ #include "maemopackagecreationstep.h" #include "maemopackageinstaller.h" #include "maemoqemumanager.h" -#include "qt4maemodeployconfiguration.h" #include -#include #include #include #include -#include +#include #include +using namespace ProjectExplorer; using namespace RemoteLinux; namespace Madde { @@ -60,7 +59,7 @@ protected: void doDeviceSetup() { - if (deviceConfiguration()->machineType() == LinuxDeviceConfiguration::Hardware) { + if (deviceConfiguration()->machineType() == IDevice::Hardware) { handleDeviceSetupDone(true); return; } @@ -71,8 +70,7 @@ protected: } MaemoQemuRuntime rt; - const int qtId = qt4BuildConfiguration() - ? QtSupport::QtProfileInformation::qtVersionId(qt4BuildConfiguration()->target()->profile()) : -1; + const int qtId = QtSupport::QtProfileInformation::qtVersionId(profile()); if (MaemoQemuManager::instance().runtimeForQtVersion(qtId, &rt)) { MaemoQemuManager::instance().startRuntime(); emit errorMessage(tr("Cannot deploy: Qemu was not running. " diff --git a/src/plugins/madde/maemodeploybymountsteps.cpp b/src/plugins/madde/maemodeploybymountsteps.cpp index 116a949ac0f..d31c2bcb65b 100644 --- a/src/plugins/madde/maemodeploybymountsteps.cpp +++ b/src/plugins/madde/maemodeploybymountsteps.cpp @@ -156,7 +156,7 @@ void AbstractMaemoDeployByMountService::doDeviceSetup() { QTC_ASSERT(m_state == Inactive, return); - if (deviceConfiguration()->machineType() == LinuxDeviceConfiguration::Hardware) { + if (deviceConfiguration()->machineType() == IDevice::Hardware) { handleDeviceSetupDone(true); return; } @@ -167,8 +167,7 @@ void AbstractMaemoDeployByMountService::doDeviceSetup() } MaemoQemuRuntime rt; - const int qtId = qt4BuildConfiguration() - ? QtSupport::QtProfileInformation::qtVersionId(qt4BuildConfiguration()->target()->profile()) : -1; + const int qtId = QtSupport::QtProfileInformation::qtVersionId(profile()); if (MaemoQemuManager::instance().runtimeForQtVersion(qtId, &rt)) { MaemoQemuManager::instance().startRuntime(); emit errorMessage(tr("Cannot deploy: Qemu was not running. " @@ -192,14 +191,14 @@ void AbstractMaemoDeployByMountService::doDeploy() { QTC_ASSERT(m_state == Inactive, return); - if (!qt4BuildConfiguration()) { + if (!buildConfiguration()) { emit errorMessage(tr("Missing build configuration.")); setFinished(); return; } m_state = Mounting; - m_mounter->setupMounts(connection(), deviceConfiguration(), mountSpecifications(), profile()); + m_mounter->setupMounts(connection(), mountSpecifications(), profile()); } void AbstractMaemoDeployByMountService::stopDeployment() @@ -279,7 +278,7 @@ QString AbstractMaemoDeployByMountService::deployMountPoint() const { return MaemoGlobal::homeDirOnDevice(deviceConfiguration()->sshParameters().userName) + QLatin1String("/deployMountPoint_") - + qt4BuildConfiguration()->target()->project()->displayName(); + + buildConfiguration()->target()->project()->displayName(); } diff --git a/src/plugins/madde/maemodeploymentmounter.cpp b/src/plugins/madde/maemodeploymentmounter.cpp index 5830284e1e7..4c482b5a499 100644 --- a/src/plugins/madde/maemodeploymentmounter.cpp +++ b/src/plugins/madde/maemodeploymentmounter.cpp @@ -34,8 +34,7 @@ #include "maemoremotemounter.h" #include -#include -#include +#include #include #include #include @@ -70,7 +69,6 @@ MaemoDeploymentMounter::MaemoDeploymentMounter(QObject *parent) MaemoDeploymentMounter::~MaemoDeploymentMounter() {} void MaemoDeploymentMounter::setupMounts(SshConnection *connection, - const LinuxDeviceConfiguration::ConstPtr &devConf, const QList &mountSpecs, const Profile *profile) { @@ -78,9 +76,9 @@ void MaemoDeploymentMounter::setupMounts(SshConnection *connection, m_mountSpecs = mountSpecs; m_connection = connection; - m_devConf = devConf; - m_mounter->setConnection(m_connection, m_devConf); m_profile = profile; + m_devConf = DeviceProfileInformation::device(profile); + m_mounter->setConnection(m_connection, m_devConf); connect(m_connection, SIGNAL(error(QSsh::SshError)), SLOT(handleConnectionError())); setState(UnmountingOldDirs); unmount(); @@ -172,7 +170,7 @@ void MaemoDeploymentMounter::handlePortListReady() return; setState(Mounting); - m_freePorts = MaemoGlobal::freePorts(m_devConf, QtSupport::QtProfileInformation::qtVersion(m_profile)); + m_freePorts = MaemoGlobal::freePorts(m_profile); m_mounter->mount(&m_freePorts, m_portsGatherer); } diff --git a/src/plugins/madde/maemodeploymentmounter.h b/src/plugins/madde/maemodeploymentmounter.h index 469fc9dfb7b..efcff359ecc 100644 --- a/src/plugins/madde/maemodeploymentmounter.h +++ b/src/plugins/madde/maemodeploymentmounter.h @@ -33,19 +33,14 @@ #include "maemomountspecification.h" +#include #include -#include -#include #include -namespace QSsh { class SshConnection; } namespace ProjectExplorer { class Profile; } - -namespace RemoteLinux { -class LinuxDeviceConfiguration; -class RemoteLinuxUsedPortsGatherer; -} +namespace QSsh { class SshConnection; } +namespace RemoteLinux { class RemoteLinuxUsedPortsGatherer; } namespace Madde { namespace Internal { @@ -60,7 +55,6 @@ public: // Connection must be in connected state. void setupMounts(QSsh::SshConnection *connection, - const QSharedPointer &devConf, const QList &mountSpecs, const ProjectExplorer::Profile *profile); void tearDownMounts(); @@ -92,7 +86,7 @@ private: State m_state; QSsh::SshConnection *m_connection; - QSharedPointer m_devConf; + ProjectExplorer::IDevice::ConstPtr m_devConf; MaemoRemoteMounter * const m_mounter; RemoteLinux::RemoteLinuxUsedPortsGatherer * const m_portsGatherer; Utils::PortList m_freePorts; diff --git a/src/plugins/madde/maemodeviceconfigwizard.cpp b/src/plugins/madde/maemodeviceconfigwizard.cpp index 857ce5bf446..09310a7508b 100644 --- a/src/plugins/madde/maemodeviceconfigwizard.cpp +++ b/src/plugins/madde/maemodeviceconfigwizard.cpp @@ -68,9 +68,9 @@ QString defaultUser(Core::Id deviceType) return QLatin1String("developer"); } -QString defaultHost(LinuxDeviceConfiguration::MachineType type) +QString defaultHost(IDevice::MachineType type) { - return QLatin1String(type == LinuxDeviceConfiguration::Hardware ? "192.168.2.15" : "localhost"); + return QLatin1String(type == IDevice::Hardware ? "192.168.2.15" : "localhost"); } struct WizardData @@ -79,7 +79,7 @@ struct WizardData QString hostName; Core::Id deviceType; SshConnectionParameters::AuthenticationType authType; - LinuxDeviceConfiguration::MachineType machineType; + IDevice::MachineType machineType; QString privateKeyFilePath; QString publicKeyFilePath; QString userName; @@ -138,8 +138,8 @@ public: QString hostName() const { - return machineType() == LinuxDeviceConfiguration::Emulator - ? defaultHost(LinuxDeviceConfiguration::Emulator) + return machineType() == IDevice::Emulator + ? defaultHost(IDevice::Emulator) : m_ui->hostNameLineEdit->text().trimmed(); } @@ -148,22 +148,20 @@ public: return m_deviceType; } - LinuxDeviceConfiguration::MachineType machineType() const + IDevice::MachineType machineType() const { - return m_ui->hwButton->isChecked() - ? LinuxDeviceConfiguration::Hardware : LinuxDeviceConfiguration::Emulator; + return m_ui->hwButton->isChecked() ? IDevice::Hardware : IDevice::Emulator; } int sshPort() const { - return machineType() == LinuxDeviceConfiguration::Emulator - ? 6666 : m_ui->sshPortSpinBox->value(); + return machineType() == IDevice::Emulator ? 6666 : m_ui->sshPortSpinBox->value(); } private slots: void handleMachineTypeChanged() { - const bool enable = machineType() == LinuxDeviceConfiguration::Hardware; + const bool enable = machineType() == IDevice::Hardware; m_ui->hostNameLabel->setEnabled(enable); m_ui->hostNameLineEdit->setEnabled(enable); m_ui->sshPortLabel->setEnabled(enable); @@ -206,7 +204,7 @@ public: virtual void initializePage() { m_ui->keyWasNotSetUpButton->setChecked(true); - m_ui->privateKeyFilePathChooser->setPath(LinuxDeviceConfiguration::defaultPrivateKeyFilePath()); + m_ui->privateKeyFilePathChooser->setPath(IDevice::defaultPrivateKeyFilePath()); handleSelectionChanged(); } @@ -262,8 +260,8 @@ public: virtual void initializePage() { m_ui->dontReuseButton->setChecked(true); - m_ui->privateKeyFilePathChooser->setPath(LinuxDeviceConfiguration::defaultPrivateKeyFilePath()); - m_ui->publicKeyFilePathChooser->setPath(LinuxDeviceConfiguration::defaultPublicKeyFilePath()); + m_ui->privateKeyFilePathChooser->setPath(IDevice::defaultPrivateKeyFilePath()); + m_ui->publicKeyFilePathChooser->setPath(IDevice::defaultPublicKeyFilePath()); handleSelectionChanged(); } @@ -504,7 +502,7 @@ public: private: QString infoText() const { - if (m_wizardData.machineType == LinuxDeviceConfiguration::Emulator) + if (m_wizardData.machineType == IDevice::Emulator) return tr("The new device configuration will now be created."); return GenericLinuxDeviceConfigurationWizardFinalPage::infoText(); } @@ -563,7 +561,7 @@ IDevice::Ptr MaemoDeviceConfigWizard::device() sshParams.userName = defaultUser(d->wizardData.deviceType); sshParams.host = d->wizardData.hostName; sshParams.port = d->wizardData.sshPort; - if (d->wizardData.machineType == LinuxDeviceConfiguration::Emulator) { + if (d->wizardData.machineType == IDevice::Emulator) { sshParams.authenticationType = QSsh::SshConnectionParameters::AuthenticationByPassword; sshParams.password = d->wizardData.deviceType == Core::Id(MeeGoOsType) ? QLatin1String("meego") : QString(); @@ -597,7 +595,7 @@ int MaemoDeviceConfigWizard::nextId() const d->wizardData.machineType = d->startPage.machineType(); d->wizardData.hostName = d->startPage.hostName(); d->wizardData.sshPort = d->startPage.sshPort(); - if (d->wizardData.machineType == LinuxDeviceConfiguration::Emulator) + if (d->wizardData.machineType == IDevice::Emulator) return FinalPageId; return PreviousKeySetupCheckPageId; case PreviousKeySetupCheckPageId: diff --git a/src/plugins/madde/maemoglobal.cpp b/src/plugins/madde/maemoglobal.cpp index 74037f79fdb..9b9be32d716 100644 --- a/src/plugins/madde/maemoglobal.cpp +++ b/src/plugins/madde/maemoglobal.cpp @@ -32,11 +32,12 @@ #include "maemoconstants.h" #include "maemoqemumanager.h" +#include #include #include #include #include -#include +#include #include #include @@ -46,6 +47,7 @@ #include #include +using namespace ProjectExplorer; using namespace Qt4ProjectManager; using namespace Qt4ProjectManager::Constants; using namespace RemoteLinux; @@ -56,9 +58,9 @@ namespace { static const QLatin1String binQmake("/bin/qmake" EXEC_SUFFIX); } // namespace -bool MaemoGlobal::hasMaemoDevice(const ProjectExplorer::Profile *p) +bool MaemoGlobal::hasMaemoDevice(const Profile *p) { - ProjectExplorer::IDevice::ConstPtr dev = ProjectExplorer::DeviceProfileInformation::device(p); + IDevice::ConstPtr dev = DeviceProfileInformation::device(p); if (dev.isNull()) return false; @@ -67,9 +69,9 @@ bool MaemoGlobal::hasMaemoDevice(const ProjectExplorer::Profile *p) || type == Core::Id(MeeGoOsType); } -bool MaemoGlobal::supportsMaemoDevice(const ProjectExplorer::Profile *p) +bool MaemoGlobal::supportsMaemoDevice(const Profile *p) { - const Core::Id type = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(p); + const Core::Id type = DeviceTypeProfileInformation::deviceTypeId(p); return type == Core::Id(Maemo5OsType) || type == Core::Id(HarmattanOsType) || type == Core::Id(MeeGoOsType); } @@ -124,9 +126,9 @@ QString MaemoGlobal::devrootshPath() return QLatin1String("/usr/lib/mad-developer/devrootsh"); } -int MaemoGlobal::applicationIconSize(const ProjectExplorer::Target *target) +int MaemoGlobal::applicationIconSize(const Target *target) { - Core::Id deviceType = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(target->profile()); + Core::Id deviceType = DeviceTypeProfileInformation::deviceTypeId(target->profile()); return deviceType == Core::Id(HarmattanOsType) ? 80 : 64; } @@ -151,12 +153,14 @@ QString MaemoGlobal::remoteSourceProfilesCommand() return QString::fromAscii(remoteCall); } -Utils::PortList MaemoGlobal::freePorts(const LinuxDeviceConfiguration::ConstPtr &devConf, - const QtSupport::BaseQtVersion *qtVersion) +Utils::PortList MaemoGlobal::freePorts(const Profile *profile) { + IDevice::ConstPtr devConf = DeviceProfileInformation::device(profile); + QtSupport::BaseQtVersion *qtVersion = QtSupport::QtProfileInformation::qtVersion(profile); + if (!devConf || !qtVersion) return Utils::PortList(); - if (devConf->machineType() == LinuxDeviceConfiguration::Emulator) { + if (devConf->machineType() == IDevice::Emulator) { MaemoQemuRuntime rt; const int id = qtVersion->uniqueId(); if (MaemoQemuManager::instance().runtimeForQtVersion(id, &rt)) diff --git a/src/plugins/madde/maemoglobal.h b/src/plugins/madde/maemoglobal.h index a6d3833be9f..08fe4d8a812 100644 --- a/src/plugins/madde/maemoglobal.h +++ b/src/plugins/madde/maemoglobal.h @@ -41,11 +41,8 @@ QT_BEGIN_NAMESPACE class QProcess; -class QString; QT_END_NAMESPACE -namespace QtSupport { class BaseQtVersion; } -namespace RemoteLinux { class LinuxDeviceConfiguration; } namespace ProjectExplorer { class Profile; class Target; @@ -96,8 +93,7 @@ public: static int applicationIconSize(const ProjectExplorer::Target *target); static QString remoteSudo(Core::Id deviceType, const QString &uname); static QString remoteSourceProfilesCommand(); - static Utils::PortList freePorts(const QSharedPointer &devConf, - const QtSupport::BaseQtVersion *qtVersion); + static Utils::PortList freePorts(const ProjectExplorer::Profile *profile); static void addMaddeEnvironment(Utils::Environment &env, const QString &qmakePath); static void transformMaddeCall(QString &command, QStringList &args, const QString &qmakePath); diff --git a/src/plugins/madde/maemopublishingwizardfactories.cpp b/src/plugins/madde/maemopublishingwizardfactories.cpp index d27928dfd2b..7ba97a73c11 100644 --- a/src/plugins/madde/maemopublishingwizardfactories.cpp +++ b/src/plugins/madde/maemopublishingwizardfactories.cpp @@ -34,10 +34,8 @@ #include "maemopublishingwizardfremantlefree.h" #include -#include #include #include -#include #include #include #include diff --git a/src/plugins/madde/maemoqemumanager.cpp b/src/plugins/madde/maemoqemumanager.cpp index 465c52d9c9a..36300472bf5 100644 --- a/src/plugins/madde/maemoqemumanager.cpp +++ b/src/plugins/madde/maemoqemumanager.cpp @@ -50,8 +50,6 @@ #include #include #include -#include -#include #include #include @@ -68,7 +66,6 @@ #include using namespace ProjectExplorer; -using namespace Qt4ProjectManager; using namespace RemoteLinux; namespace Madde { @@ -516,10 +513,8 @@ bool MaemoQemuManager::targetUsesMatchingRuntimeConfig(Target *target, if (qtVersion) *qtVersion = version; - const LinuxDeviceConfiguration::ConstPtr &config - = ProjectExplorer::DeviceProfileInformation::device(target->profile()) - .dynamicCast(); - return !config.isNull() && config->machineType() == LinuxDeviceConfiguration::Emulator; + const IDevice::ConstPtr config = DeviceProfileInformation::device(target->profile()); + return !config.isNull() && config->machineType() == IDevice::Emulator; } void MaemoQemuManager::notify(const QList uniqueIds) diff --git a/src/plugins/madde/maemoqemuruntimeparser.cpp b/src/plugins/madde/maemoqemuruntimeparser.cpp index 1500a84c811..f1191255ad9 100644 --- a/src/plugins/madde/maemoqemuruntimeparser.cpp +++ b/src/plugins/madde/maemoqemuruntimeparser.cpp @@ -40,8 +40,6 @@ #include #include -using namespace RemoteLinux; - namespace Madde { namespace Internal { diff --git a/src/plugins/madde/maemoremotecopyfacility.cpp b/src/plugins/madde/maemoremotecopyfacility.cpp index f7cc13c6c0c..60c402bc9b3 100644 --- a/src/plugins/madde/maemoremotecopyfacility.cpp +++ b/src/plugins/madde/maemoremotecopyfacility.cpp @@ -31,14 +31,14 @@ #include "maemoglobal.h" -#include #include #include #include -using namespace RemoteLinux; +using namespace ProjectExplorer; using namespace QSsh; +using namespace RemoteLinux; namespace Madde { namespace Internal { @@ -51,7 +51,7 @@ MaemoRemoteCopyFacility::MaemoRemoteCopyFacility(QObject *parent) : MaemoRemoteCopyFacility::~MaemoRemoteCopyFacility() {} void MaemoRemoteCopyFacility::copyFiles(SshConnection *connection, - const LinuxDeviceConfiguration::ConstPtr &devConf, + const IDevice::ConstPtr &devConf, const QList &deployables, const QString &mountPoint) { Q_ASSERT(connection->state() == SshConnection::Connected); diff --git a/src/plugins/madde/maemoremotecopyfacility.h b/src/plugins/madde/maemoremotecopyfacility.h index 824e696ee7e..d9532cf9dc4 100644 --- a/src/plugins/madde/maemoremotecopyfacility.h +++ b/src/plugins/madde/maemoremotecopyfacility.h @@ -32,21 +32,16 @@ #define MAEMOREMOTECOPYFACILITY_H #include +#include #include -#include #include -#include namespace QSsh { class SshConnection; class SshRemoteProcessRunner; } -namespace RemoteLinux { -class LinuxDeviceConfiguration; -} - namespace Madde { namespace Internal { @@ -58,7 +53,7 @@ public: ~MaemoRemoteCopyFacility(); void copyFiles(QSsh::SshConnection *connection, - const QSharedPointer &devConf, + const ProjectExplorer::IDevice::ConstPtr &devConf, const QList &deployables, const QString &mountPoint); void cancel(); @@ -81,7 +76,7 @@ private: QSsh::SshRemoteProcessRunner *m_copyRunner; QSsh::SshRemoteProcessRunner *m_killProcess; - QSharedPointer m_devConf; + ProjectExplorer::IDevice::ConstPtr m_devConf; QList m_deployables; QString m_mountPoint; bool m_isCopying; // TODO: Redundant due to being in sync with m_copyRunner? diff --git a/src/plugins/madde/maemorunconfiguration.cpp b/src/plugins/madde/maemorunconfiguration.cpp index 9650638e7a9..6bfbd257486 100644 --- a/src/plugins/madde/maemorunconfiguration.cpp +++ b/src/plugins/madde/maemorunconfiguration.cpp @@ -33,14 +33,13 @@ #include "maemoglobal.h" #include "maemoremotemountsmodel.h" #include "maemorunconfigurationwidget.h" -#include "qt4maemodeployconfiguration.h" #include +#include +#include #include #include #include -#include -#include #include #include @@ -48,7 +47,6 @@ #include using namespace ProjectExplorer; -using namespace Qt4ProjectManager; using namespace RemoteLinux; namespace Madde { @@ -121,9 +119,7 @@ QString MaemoRunConfiguration::environmentPreparationCommand() const QString MaemoRunConfiguration::commandPrefix() const { - LinuxDeviceConfiguration::ConstPtr dev = - ProjectExplorer::DeviceProfileInformation::device(target()->profile()) - .dynamicCast(); + IDevice::ConstPtr dev = DeviceProfileInformation::device(target()->profile()); if (!dev) return QString(); @@ -136,9 +132,7 @@ QString MaemoRunConfiguration::commandPrefix() const Utils::PortList MaemoRunConfiguration::freePorts() const { - QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target()->profile()); - return MaemoGlobal::freePorts(ProjectExplorer::DeviceProfileInformation::device(target()->profile()) - .staticCast(), version); + return MaemoGlobal::freePorts(target()->profile()); } QString MaemoRunConfiguration::localDirToMountForRemoteGdb() const @@ -162,7 +156,7 @@ QString MaemoRunConfiguration::localDirToMountForRemoteGdb() const QString MaemoRunConfiguration::remoteProjectSourcesMountPoint() const { - return MaemoGlobal::homeDirOnDevice(ProjectExplorer::DeviceProfileInformation::device(target()->profile())->sshParameters().userName) + return MaemoGlobal::homeDirOnDevice(DeviceProfileInformation::device(target()->profile())->sshParameters().userName) + QLatin1String("/gdbSourcesDir_") + QFileInfo(localExecutableFilePath()).fileName(); } @@ -170,7 +164,7 @@ QString MaemoRunConfiguration::remoteProjectSourcesMountPoint() const bool MaemoRunConfiguration::hasEnoughFreePorts(RunMode mode) const { const int freePortCount = freePorts().count(); - Core::Id typeId = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(target()->profile()); + Core::Id typeId = DeviceTypeProfileInformation::deviceTypeId(target()->profile()); const bool remoteMountsAllowed = MaddeDevice::allowsRemoteMounts(typeId); const int mountDirCount = remoteMountsAllowed ? remoteMounts()->validMountSpecificationCount() : 0; diff --git a/src/plugins/madde/maemosshrunner.cpp b/src/plugins/madde/maemosshrunner.cpp index d177d601703..6520cb4cdfc 100644 --- a/src/plugins/madde/maemosshrunner.cpp +++ b/src/plugins/madde/maemosshrunner.cpp @@ -33,17 +33,15 @@ #include "maemoremotemountsmodel.h" #include "maemorunconfiguration.h" +#include #include -#include #include -#include #include #include using namespace ProjectExplorer; -using namespace Qt4ProjectManager; -using namespace RemoteLinux; using namespace QSsh; +using namespace RemoteLinux; namespace Madde { namespace Internal { @@ -68,14 +66,12 @@ MaemoSshRunner::MaemoSshRunner(QObject *parent, MaemoRunConfiguration *runConfig SIGNAL(mountDebugOutput(QString))); } -MaemoSshRunner::~MaemoSshRunner() {} - bool MaemoSshRunner::canRun(QString &whyNot) const { if (!AbstractRemoteLinuxApplicationRunner::canRun(whyNot)) return false; - if (devConfig()->machineType() == LinuxDeviceConfiguration::Emulator + if (devConfig()->machineType() == IDevice::Emulator && !MaemoQemuManager::instance().qemuIsRunning()) { MaemoQemuRuntime rt; if (MaemoQemuManager::instance().runtimeForQtVersion(m_qtId, &rt)) { diff --git a/src/plugins/madde/maemosshrunner.h b/src/plugins/madde/maemosshrunner.h index 9079a12365a..6e9bd37d225 100644 --- a/src/plugins/madde/maemosshrunner.h +++ b/src/plugins/madde/maemosshrunner.h @@ -42,9 +42,9 @@ class MaemoRunConfiguration; class MaemoSshRunner : public RemoteLinux::AbstractRemoteLinuxApplicationRunner { Q_OBJECT + public: MaemoSshRunner(QObject *parent, MaemoRunConfiguration *runConfig); - ~MaemoSshRunner(); signals: void mountDebugOutput(const QString &output); diff --git a/src/plugins/madde/rpmmanager.cpp b/src/plugins/madde/rpmmanager.cpp index 17a6dc52d5e..628a4d75040 100644 --- a/src/plugins/madde/rpmmanager.cpp +++ b/src/plugins/madde/rpmmanager.cpp @@ -38,7 +38,6 @@ #include #include #include -#include #include #include #include diff --git a/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp b/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp index ce2f4a7c745..b03f15c469e 100644 --- a/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp @@ -35,10 +35,6 @@ #include "subcomponentmanager.h" #include "model/viewlogger.h" -#include -#include -#include - #include #include #include @@ -62,8 +58,15 @@ #include #include -#include +#include +#include +#include +#include +#include +#include +#include #include +#include #include #include @@ -87,12 +90,6 @@ #include #include -#include -#include -#include -#include -#include - enum { debug = false }; diff --git a/src/plugins/qmlprofiler/qmlprofilertool.cpp b/src/plugins/qmlprofiler/qmlprofilertool.cpp index 3cc971d640b..3c39080e292 100644 --- a/src/plugins/qmlprofiler/qmlprofilertool.cpp +++ b/src/plugins/qmlprofiler/qmlprofilertool.cpp @@ -69,7 +69,6 @@ #include #include -#include #include #include #include diff --git a/src/plugins/qnx/blackberryapplicationrunner.cpp b/src/plugins/qnx/blackberryapplicationrunner.cpp index 8e6af8928e7..969488eb05d 100644 --- a/src/plugins/qnx/blackberryapplicationrunner.cpp +++ b/src/plugins/qnx/blackberryapplicationrunner.cpp @@ -79,6 +79,7 @@ bool parseRunningState(const QString &line) } } +using namespace ProjectExplorer; using namespace Qnx; using namespace Qnx::Internal; @@ -97,18 +98,16 @@ BlackBerryApplicationRunner::BlackBerryApplicationRunner(bool debugMode, BlackBe { QTC_ASSERT(runConfiguration, return); - Qt4ProjectManager::Qt4BuildConfiguration *qt4BuildConfig = runConfiguration->activeQt4BuildConfiguration(); - m_environment = qt4BuildConfig->environment(); + Target *target = runConfiguration->target(); + BuildConfiguration *buildConfig = target->activeBuildConfiguration(); + m_environment = buildConfig->environment(); m_deployCmd = m_environment.searchInPath(QLatin1String(DEPLOY_CMD)); m_deviceHost = runConfiguration->deployConfiguration()->deviceHost(); m_password = runConfiguration->deployConfiguration()->password(); + m_barPackage = runConfiguration->barPackage(); - BlackBerryRunConfiguration *blackberryRunConfiguration = qobject_cast(runConfiguration); - if (blackberryRunConfiguration) - m_barPackage = blackberryRunConfiguration->barPackage(); - - BlackBerryDeviceConfiguration::ConstPtr device = BlackBerryDeviceConfiguration::device(runConfiguration->target()->profile()); + BlackBerryDeviceConfiguration::ConstPtr device = BlackBerryDeviceConfiguration::device(target->profile()); m_sshParams = device->sshParameters(); // The BlackBerry device always uses key authentication m_sshParams.authenticationType = QSsh::SshConnectionParameters::AuthenticationByKey; diff --git a/src/plugins/qnx/blackberryconnect.cpp b/src/plugins/qnx/blackberryconnect.cpp index 8e424836aee..dcc13107efc 100644 --- a/src/plugins/qnx/blackberryconnect.cpp +++ b/src/plugins/qnx/blackberryconnect.cpp @@ -35,7 +35,7 @@ #include "blackberryrunconfiguration.h" #include "blackberrydeployconfiguration.h" -#include +#include #include #include #include @@ -43,6 +43,7 @@ #include #include +using namespace ProjectExplorer; using namespace Qnx; using namespace Qnx::Internal; @@ -90,8 +91,9 @@ BlackBerryConnect::BlackBerryConnect(BlackBerryRunConfiguration *runConfig) m_process = new QProcess(this); Utils::Environment env; - if (runConfig->activeQt4BuildConfiguration()) - env = runConfig->activeQt4BuildConfiguration()->environment(); + Target *target = runConfig->target(); + if (target->activeBuildConfiguration()) + env = target->activeBuildConfiguration()->environment(); m_process->setEnvironment(env.toStringList()); m_connectCmd = env.searchInPath(QLatin1String(CONNECT_CMD)); @@ -101,7 +103,7 @@ BlackBerryConnect::BlackBerryConnect(BlackBerryRunConfiguration *runConfig) m_deviceHost = deployConfig->deviceHost(); m_password = deployConfig->password(); - BlackBerryDeviceConfiguration::ConstPtr device = BlackBerryDeviceConfiguration::device(runConfig->target()->profile()); + BlackBerryDeviceConfiguration::ConstPtr device = BlackBerryDeviceConfiguration::device(target->profile()); m_publicKeyFile = device->sshParameters().privateKeyFile + QLatin1String(".pub"); connect(m_process, SIGNAL(readyReadStandardOutput()), this, SLOT(readStandardOutput())); diff --git a/src/plugins/qnx/blackberrydeviceconfiguration.cpp b/src/plugins/qnx/blackberrydeviceconfiguration.cpp index d1c85e934fd..2cfeb108640 100644 --- a/src/plugins/qnx/blackberrydeviceconfiguration.cpp +++ b/src/plugins/qnx/blackberrydeviceconfiguration.cpp @@ -40,6 +40,7 @@ using namespace Qnx; using namespace Qnx::Internal; +using namespace ProjectExplorer; BlackBerryDeviceConfiguration::BlackBerryDeviceConfiguration() : RemoteLinux::LinuxDeviceConfiguration() @@ -47,8 +48,8 @@ BlackBerryDeviceConfiguration::BlackBerryDeviceConfiguration() } BlackBerryDeviceConfiguration::BlackBerryDeviceConfiguration(const QString &name, Core::Id type, - RemoteLinux::LinuxDeviceConfiguration::MachineType machineType, - ProjectExplorer::IDevice::Origin origin, Core::Id id) + IDevice::MachineType machineType, + IDevice::Origin origin, Core::Id id) : RemoteLinux::LinuxDeviceConfiguration(name, type, machineType, origin, id) { } @@ -65,8 +66,8 @@ BlackBerryDeviceConfiguration::Ptr BlackBerryDeviceConfiguration::create() } BlackBerryDeviceConfiguration::Ptr BlackBerryDeviceConfiguration::create(const QString &name, Core::Id type, - RemoteLinux::LinuxDeviceConfiguration::MachineType machineType, - ProjectExplorer::IDevice::Origin origin, Core::Id id) + IDevice::MachineType machineType, + IDevice::Origin origin, Core::Id id) { return Ptr(new BlackBerryDeviceConfiguration(name, type, machineType, origin, id)); } @@ -87,14 +88,14 @@ void BlackBerryDeviceConfiguration::fromMap(const QVariantMap &map) m_debugToken = map.value(QLatin1String(Constants::QNX_DEBUG_TOKEN_KEY)).toString(); } -ProjectExplorer::IDevice::Ptr BlackBerryDeviceConfiguration::clone() const +IDevice::Ptr BlackBerryDeviceConfiguration::clone() const { return Ptr(new BlackBerryDeviceConfiguration(*this)); } -BlackBerryDeviceConfiguration::ConstPtr BlackBerryDeviceConfiguration::device(const ProjectExplorer::Profile *p) +BlackBerryDeviceConfiguration::ConstPtr BlackBerryDeviceConfiguration::device(const Profile *p) { - ProjectExplorer::IDevice::ConstPtr dev = ProjectExplorer::DeviceProfileInformation::device(p); + IDevice::ConstPtr dev = DeviceProfileInformation::device(p); return dev.dynamicCast(); } @@ -103,7 +104,7 @@ QString BlackBerryDeviceConfiguration::displayType() const return tr("BlackBerry"); } -ProjectExplorer::IDeviceWidget *BlackBerryDeviceConfiguration::createWidget() +IDeviceWidget *BlackBerryDeviceConfiguration::createWidget() { return new BlackBerryDeviceConfigurationWidget(sharedFromThis() .staticCast()); diff --git a/src/plugins/qnx/blackberrydeviceconfigurationwidget.cpp b/src/plugins/qnx/blackberrydeviceconfigurationwidget.cpp index fbe6cfb5ccf..c4d94d90237 100644 --- a/src/plugins/qnx/blackberrydeviceconfigurationwidget.cpp +++ b/src/plugins/qnx/blackberrydeviceconfigurationwidget.cpp @@ -35,15 +35,14 @@ #include "ui_blackberrydeviceconfigurationwidget.h" #include "qnxconstants.h" -#include - #include #include +using namespace ProjectExplorer; using namespace Qnx::Internal; -BlackBerryDeviceConfigurationWidget::BlackBerryDeviceConfigurationWidget(const ProjectExplorer::IDevice::Ptr &device, QWidget *parent) : - ProjectExplorer::IDeviceWidget(device, parent), +BlackBerryDeviceConfigurationWidget::BlackBerryDeviceConfigurationWidget(const IDevice::Ptr &device, QWidget *parent) : + IDeviceWidget(device, parent), ui(new Ui::BlackBerryDeviceConfigurationWidget) { ui->setupUi(this); @@ -112,7 +111,7 @@ void BlackBerryDeviceConfigurationWidget::initGui() ui->showPasswordCheckBox->setChecked(false); ui->debugToken->setPath(deviceConfiguration()->debugToken()); - if (deviceConfiguration()->machineType() == RemoteLinux::LinuxDeviceConfiguration::Emulator) { + if (deviceConfiguration()->machineType() == IDevice::Emulator) { ui->debugToken->setEnabled(false); ui->debugTokenLabel->setEnabled(false); } diff --git a/src/plugins/qnx/blackberrydeviceconfigurationwizardpages.cpp b/src/plugins/qnx/blackberrydeviceconfigurationwizardpages.cpp index b6face4d421..c8c44e5b4cc 100644 --- a/src/plugins/qnx/blackberrydeviceconfigurationwizardpages.cpp +++ b/src/plugins/qnx/blackberrydeviceconfigurationwizardpages.cpp @@ -41,6 +41,7 @@ #include #include +using namespace ProjectExplorer; using namespace Qnx; using namespace Qnx::Internal; @@ -110,12 +111,9 @@ QString BlackBerryDeviceConfigurationWizardSetupPage::debugToken() const return m_ui->debugToken->fileName().toString(); } -RemoteLinux::LinuxDeviceConfiguration::MachineType BlackBerryDeviceConfigurationWizardSetupPage::machineType() const +IDevice::MachineType BlackBerryDeviceConfigurationWizardSetupPage::machineType() const { - if (m_ui->physicalDevice->isChecked()) - return RemoteLinux::LinuxDeviceConfiguration::Hardware; - else - return RemoteLinux::LinuxDeviceConfiguration::Emulator; + return m_ui->physicalDevice->isChecked() ? IDevice::Hardware : IDevice::Emulator; } diff --git a/src/plugins/qnx/blackberrydeviceconfigurationwizardpages.h b/src/plugins/qnx/blackberrydeviceconfigurationwizardpages.h index e159761eff1..5c5b5c756f6 100644 --- a/src/plugins/qnx/blackberrydeviceconfigurationwizardpages.h +++ b/src/plugins/qnx/blackberrydeviceconfigurationwizardpages.h @@ -63,7 +63,7 @@ public: QString hostName() const; QString password() const; QString debugToken() const; - RemoteLinux::LinuxDeviceConfiguration::MachineType machineType() const; + ProjectExplorer::IDevice::MachineType machineType() const; private: Ui::BlackBerryDeviceConfigurationWizardSetupPage *m_ui; diff --git a/src/plugins/qnx/blackberryrunconfiguration.cpp b/src/plugins/qnx/blackberryrunconfiguration.cpp index 8ff054639ea..45cc0fbb39e 100644 --- a/src/plugins/qnx/blackberryrunconfiguration.cpp +++ b/src/plugins/qnx/blackberryrunconfiguration.cpp @@ -142,11 +142,6 @@ BlackBerryDeployConfiguration *BlackBerryRunConfiguration::deployConfiguration() return qobject_cast(target()->activeDeployConfiguration()); } -Qt4ProjectManager::Qt4BuildConfiguration *BlackBerryRunConfiguration::activeQt4BuildConfiguration() const -{ - return static_cast(activeBuildConfiguration()); -} - QString BlackBerryRunConfiguration::key() const { return barPackage() + QLatin1Char('_') + BlackBerryDeviceConfiguration::device(target()->profile())->sshParameters().host; diff --git a/src/plugins/qnx/qnxdeviceconfiguration.cpp b/src/plugins/qnx/qnxdeviceconfiguration.cpp index 8eacdb89e9c..7fdccdd9cf7 100644 --- a/src/plugins/qnx/qnxdeviceconfiguration.cpp +++ b/src/plugins/qnx/qnxdeviceconfiguration.cpp @@ -57,7 +57,7 @@ QnxDeviceConfiguration::Ptr QnxDeviceConfiguration::create() return Ptr(new QnxDeviceConfiguration); } -QnxDeviceConfiguration::Ptr QnxDeviceConfiguration::create(const QString &name, Core::Id type, RemoteLinux::LinuxDeviceConfiguration::MachineType machineType, ProjectExplorer::IDevice::Origin origin, Core::Id id) +QnxDeviceConfiguration::Ptr QnxDeviceConfiguration::create(const QString &name, Core::Id type, MachineType machineType, Origin origin, Core::Id id) { return Ptr(new QnxDeviceConfiguration(name, type, machineType, origin, id)); } diff --git a/src/plugins/qnx/qnxdeviceconfigurationwizard.cpp b/src/plugins/qnx/qnxdeviceconfigurationwizard.cpp index 46b815c4282..741f6476531 100644 --- a/src/plugins/qnx/qnxdeviceconfigurationwizard.cpp +++ b/src/plugins/qnx/qnxdeviceconfigurationwizard.cpp @@ -44,6 +44,7 @@ #include #include +using namespace ProjectExplorer; using namespace Qnx; using namespace Qnx::Internal; @@ -60,7 +61,7 @@ QnxDeviceConfigurationWizard::QnxDeviceConfigurationWizard(QWidget *parent) : m_finalPage->setCommitPage(true); } -ProjectExplorer::IDevice::Ptr QnxDeviceConfigurationWizard::device() +IDevice::Ptr QnxDeviceConfigurationWizard::device() { QSsh::SshConnectionParameters sshParams; sshParams.proxyType = QSsh::SshConnectionParameters::NoProxy; @@ -76,7 +77,7 @@ ProjectExplorer::IDevice::Ptr QnxDeviceConfigurationWizard::device() } QnxDeviceConfiguration::Ptr devConf = QnxDeviceConfiguration::create(m_setupPage->configurationName(), - Core::Id(Constants::QNX_QNX_OS_TYPE), RemoteLinux::LinuxDeviceConfiguration::Hardware); + Core::Id(Constants::QNX_QNX_OS_TYPE), IDevice::Hardware); devConf->setSshParameters(sshParams); devConf->setFreePorts(Utils::PortList::fromString(QLatin1String("10000-10100"))); diff --git a/src/plugins/qnx/qnxruncontrolfactory.cpp b/src/plugins/qnx/qnxruncontrolfactory.cpp index 2d95b48609f..24ba8119e58 100644 --- a/src/plugins/qnx/qnxruncontrolfactory.cpp +++ b/src/plugins/qnx/qnxruncontrolfactory.cpp @@ -45,27 +45,58 @@ #include #include #include +#include #include #include -#include #include #include +using namespace Debugger; +using namespace ProjectExplorer; using namespace Qnx; using namespace Qnx::Internal; +DebuggerStartParameters createStartParameters(const QnxRunConfiguration *runConfig) +{ + DebuggerStartParameters params; + Target *target = runConfig->target(); + Profile *profile = target->profile(); + + const IDevice::ConstPtr devConf = DeviceProfileInformation::device(profile); + if (devConf.isNull()) + return params; + + params.startMode = AttachToRemoteServer; + params.debuggerCommand = DebuggerProfileInformation::debuggerCommand(profile).toString(); + params.sysRoot = SysRootProfileInformation::sysRoot(profile).toString(); + + if (ToolChain *tc = ToolChainProfileInformation::toolChain(profile)) + params.toolChainAbi = tc->targetAbi(); + + params.symbolFileName = runConfig->localExecutableFilePath(); + params.remoteExecutable = runConfig->remoteExecutableFilePath(); + params.remoteChannel = devConf->sshParameters().host + QLatin1String(":-1"); + params.displayName = runConfig->displayName(); + params.remoteSetupNeeded = true; + params.closeMode = DetachAtClose; + + QnxQtVersion *qtVersion = + dynamic_cast(QtSupport::QtProfileInformation::qtVersion(profile)); + if (qtVersion) + params.solibSearchPath = QnxUtils::searchPaths(qtVersion); + + return params; +} + + QnxRunControlFactory::QnxRunControlFactory(QObject *parent) : IRunControlFactory(parent) { } -QnxRunControlFactory::~QnxRunControlFactory() +bool QnxRunControlFactory::canRun(RunConfiguration *runConfiguration, RunMode mode) const { -} - -bool QnxRunControlFactory::canRun(ProjectExplorer::RunConfiguration *runConfiguration, ProjectExplorer::RunMode mode) const -{ - if (mode != ProjectExplorer::NormalRunMode && mode != ProjectExplorer::DebugRunMode) + if (mode != NormalRunMode && mode != DebugRunMode) return false; if (!runConfiguration->isEnabled() @@ -75,8 +106,8 @@ bool QnxRunControlFactory::canRun(ProjectExplorer::RunConfiguration *runConfigur const QnxRunConfiguration * const rc = qobject_cast(runConfiguration); - if (mode == ProjectExplorer::DebugRunMode) { - const QnxDeviceConfiguration::ConstPtr dev = ProjectExplorer::DeviceProfileInformation::device(runConfiguration->target()->profile()) + if (mode == DebugRunMode) { + const QnxDeviceConfiguration::ConstPtr dev = DeviceProfileInformation::device(runConfiguration->target()->profile()) .dynamicCast(); if (dev.isNull()) return false; @@ -85,17 +116,17 @@ bool QnxRunControlFactory::canRun(ProjectExplorer::RunConfiguration *runConfigur return true; } -ProjectExplorer::RunControl *QnxRunControlFactory::create(ProjectExplorer::RunConfiguration *runConfig, ProjectExplorer::RunMode mode) +RunControl *QnxRunControlFactory::create(RunConfiguration *runConfig, RunMode mode) { Q_ASSERT(canRun(runConfig, mode)); QnxRunConfiguration *rc = qobject_cast(runConfig); Q_ASSERT(rc); - if (mode == ProjectExplorer::NormalRunMode) + if (mode == NormalRunMode) return new QnxRunControl(rc); - const Debugger::DebuggerStartParameters params = startParameters(rc); - Debugger::DebuggerRunControl * const runControl = Debugger::DebuggerPlugin::createDebugger(params, rc); + const DebuggerStartParameters params = createStartParameters(rc); + DebuggerRunControl * const runControl = DebuggerPlugin::createDebugger(params, rc); if (!runControl) return 0; @@ -110,42 +141,8 @@ QString QnxRunControlFactory::displayName() const return tr("Run on remote QNX device"); } -ProjectExplorer::RunConfigWidget *QnxRunControlFactory::createConfigurationWidget(ProjectExplorer::RunConfiguration *config) +RunConfigWidget *QnxRunControlFactory::createConfigurationWidget(RunConfiguration *config) { Q_UNUSED(config) return 0; } - -Debugger::DebuggerStartParameters QnxRunControlFactory::startParameters( - const QnxRunConfiguration *runConfig) -{ - Debugger::DebuggerStartParameters params; - ProjectExplorer::Target *target = runConfig->target(); - ProjectExplorer::Profile *profile = target->profile(); - - const QnxDeviceConfiguration::ConstPtr devConf = ProjectExplorer::DeviceProfileInformation::device(runConfig->target()->profile()) - .dynamicCast(); - if (devConf.isNull()) - return params; - - params.startMode = Debugger::AttachToRemoteServer; - params.debuggerCommand = Debugger::DebuggerProfileInformation::debuggerCommand(profile).toString(); - params.sysRoot = ProjectExplorer::SysRootProfileInformation::sysRoot(profile).toString(); - - if (ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(profile)) - params.toolChainAbi = tc->targetAbi(); - - params.symbolFileName = runConfig->localExecutableFilePath(); - params.remoteExecutable = runConfig->remoteExecutableFilePath(); - params.remoteChannel = devConf->sshParameters().host + QLatin1String(":-1"); - params.displayName = runConfig->displayName(); - params.remoteSetupNeeded = true; - params.closeMode = Debugger::DetachAtClose; - - QnxQtVersion *qtVersion = - dynamic_cast(QtSupport::QtProfileInformation::qtVersion(profile)); - if (qtVersion) - params.solibSearchPath = QnxUtils::searchPaths(qtVersion); - - return params; -} diff --git a/src/plugins/qnx/qnxruncontrolfactory.h b/src/plugins/qnx/qnxruncontrolfactory.h index 7c63b70f365..fcdd0706212 100644 --- a/src/plugins/qnx/qnxruncontrolfactory.h +++ b/src/plugins/qnx/qnxruncontrolfactory.h @@ -34,20 +34,17 @@ #ifndef QNX_INTERNAL_QNXRUNCONTROLFACTORY_H #define QNX_INTERNAL_QNXRUNCONTROLFACTORY_H -#include #include namespace Qnx { namespace Internal { -class QnxRunConfiguration; - class QnxRunControlFactory : public ProjectExplorer::IRunControlFactory { Q_OBJECT + public: explicit QnxRunControlFactory(QObject *parent = 0); - ~QnxRunControlFactory(); QString displayName() const; ProjectExplorer::RunConfigWidget *createConfigurationWidget(ProjectExplorer::RunConfiguration *runConfiguration); @@ -56,9 +53,6 @@ public: ProjectExplorer::RunMode mode) const; ProjectExplorer::RunControl *create(ProjectExplorer::RunConfiguration *runConfiguration, ProjectExplorer::RunMode mode); - -private: - static Debugger::DebuggerStartParameters startParameters( const QnxRunConfiguration *runConfig); }; } // namespace Internal diff --git a/src/plugins/qt4projectmanager/externaleditors.cpp b/src/plugins/qt4projectmanager/externaleditors.cpp index 4b8b0c0006b..41548be4265 100644 --- a/src/plugins/qt4projectmanager/externaleditors.cpp +++ b/src/plugins/qt4projectmanager/externaleditors.cpp @@ -31,7 +31,6 @@ #include "externaleditors.h" #include "qt4project.h" #include "qt4projectmanagerconstants.h" -#include "qt4buildconfiguration.h" #include #include diff --git a/src/plugins/remotelinux/abstractremotelinuxdeployservice.cpp b/src/plugins/remotelinux/abstractremotelinuxdeployservice.cpp index ccc988dbd62..ec96ebdcc43 100644 --- a/src/plugins/remotelinux/abstractremotelinuxdeployservice.cpp +++ b/src/plugins/remotelinux/abstractremotelinuxdeployservice.cpp @@ -32,8 +32,8 @@ #include "deployablefile.h" #include "linuxdeviceconfiguration.h" +#include #include -#include #include #include #include @@ -44,7 +44,7 @@ #include #include -using namespace Qt4ProjectManager; +using namespace ProjectExplorer; using namespace QSsh; namespace RemoteLinux { @@ -86,9 +86,9 @@ public: AbstractRemoteLinuxDeployServicePrivate() : profile(0), connection(0), state(Inactive), stopRequested(false) {} - LinuxDeviceConfiguration::ConstPtr deviceConfiguration; - QPointer buildConfiguration; - ProjectExplorer::Profile *profile; + IDevice::ConstPtr deviceConfiguration; + QPointer buildConfiguration; + Profile *profile; SshConnection *connection; State state; bool stopRequested; @@ -109,17 +109,17 @@ AbstractRemoteLinuxDeployService::~AbstractRemoteLinuxDeployService() delete d; } -const Qt4BuildConfiguration *AbstractRemoteLinuxDeployService::qt4BuildConfiguration() const +const BuildConfiguration *AbstractRemoteLinuxDeployService::buildConfiguration() const { return d->buildConfiguration; } -const ProjectExplorer::Profile *AbstractRemoteLinuxDeployService::profile() const +const Profile *AbstractRemoteLinuxDeployService::profile() const { return d->profile; } -LinuxDeviceConfiguration::ConstPtr AbstractRemoteLinuxDeployService::deviceConfiguration() const +IDevice::ConstPtr AbstractRemoteLinuxDeployService::deviceConfiguration() const { return d->deviceConfiguration; } @@ -136,8 +136,8 @@ void AbstractRemoteLinuxDeployService::saveDeploymentTimeStamp(const DeployableF const QtSupport::BaseQtVersion *const qtVersion = QtSupport::QtProfileInformation::qtVersion(d->profile); QString systemRoot; - if (ProjectExplorer::SysRootProfileInformation::hasSysRoot(d->profile)) - systemRoot = ProjectExplorer::SysRootProfileInformation::sysRoot(d->profile).toString(); + if (SysRootProfileInformation::hasSysRoot(d->profile)) + systemRoot = SysRootProfileInformation::sysRoot(d->profile).toString(); if (!qtVersion || !qtVersion->isValid()) return; d->lastDeployed.insert(DeployParameters(deployableFile, @@ -155,26 +155,22 @@ bool AbstractRemoteLinuxDeployService::hasChangedSinceLastDeployment(const Deplo if (!qtVersion || !qtVersion->isValid()) return true; QString systemRoot; - if (ProjectExplorer::SysRootProfileInformation::hasSysRoot(d->profile)) - systemRoot = ProjectExplorer::SysRootProfileInformation::sysRoot(d->profile).toString(); + if (SysRootProfileInformation::hasSysRoot(d->profile)) + systemRoot = SysRootProfileInformation::sysRoot(d->profile).toString(); const QDateTime &lastDeployed = d->lastDeployed.value(DeployParameters(deployableFile, deviceConfiguration()->sshParameters().host, systemRoot)); return !lastDeployed.isValid() || QFileInfo(deployableFile.localFilePath).lastModified() > lastDeployed; } -void AbstractRemoteLinuxDeployService::setDeviceConfiguration(const LinuxDeviceConfiguration::ConstPtr &deviceConfiguration) -{ - d->deviceConfiguration = deviceConfiguration; -} - -void AbstractRemoteLinuxDeployService::setBuildConfiguration(Qt4BuildConfiguration *bc) +void AbstractRemoteLinuxDeployService::setBuildConfiguration(BuildConfiguration *bc) { d->buildConfiguration = bc; if (bc && bc->target()) d->profile = bc->target()->profile(); else d->profile = 0; + d->deviceConfiguration = DeviceProfileInformation::device(d->profile); } void AbstractRemoteLinuxDeployService::start() @@ -282,7 +278,7 @@ void AbstractRemoteLinuxDeployService::handleDeviceSetupDone(bool success) } d->state = Connecting; - d->connection = SshConnectionManager::instance().acquireConnection(d->deviceConfiguration->sshParameters()); + d->connection = SshConnectionManager::instance().acquireConnection(deviceConfiguration()->sshParameters()); connect(d->connection, SIGNAL(error(QSsh::SshError)), SLOT(handleConnectionFailure())); if (d->connection->state() == SshConnection::Connected) { @@ -324,7 +320,7 @@ void AbstractRemoteLinuxDeployService::handleConnectionFailure() break; case Connecting: { QString errorMsg = tr("Could not connect to host: %1").arg(d->connection->errorString()); - if (deviceConfiguration()->machineType() == LinuxDeviceConfiguration::Emulator) + if (deviceConfiguration()->machineType() == IDevice::Emulator) errorMsg += tr("\nDid the emulator fail to start?"); else errorMsg += tr("\nIs the device connected and set up for network access?"); diff --git a/src/plugins/remotelinux/abstractremotelinuxdeployservice.h b/src/plugins/remotelinux/abstractremotelinuxdeployservice.h index b54a34b2e62..0060db5df71 100644 --- a/src/plugins/remotelinux/abstractremotelinuxdeployservice.h +++ b/src/plugins/remotelinux/abstractremotelinuxdeployservice.h @@ -32,18 +32,22 @@ #include "remotelinux_export.h" +#include + #include #include #include namespace QSsh { class SshConnection; } -namespace Qt4ProjectManager { class Qt4BuildConfiguration; } -namespace ProjectExplorer { class Profile; } + +namespace ProjectExplorer { +class BuildConfiguration; +class Profile; +} namespace RemoteLinux { class DeployableFile; class DeploymentInfo; -class LinuxDeviceConfiguration; namespace Internal { class AbstractRemoteLinuxDeployServicePrivate; @@ -57,8 +61,7 @@ public: explicit AbstractRemoteLinuxDeployService(QObject *parent = 0); ~AbstractRemoteLinuxDeployService(); - void setDeviceConfiguration(const QSharedPointer &deviceConfiguration); - void setBuildConfiguration(Qt4ProjectManager::Qt4BuildConfiguration *bc); + void setBuildConfiguration(ProjectExplorer::BuildConfiguration *bc); void start(); void stop(); @@ -75,9 +78,9 @@ signals: void stdErrData(const QString &data); protected: - const Qt4ProjectManager::Qt4BuildConfiguration *qt4BuildConfiguration() const; + const ProjectExplorer::BuildConfiguration *buildConfiguration() const; const ProjectExplorer::Profile *profile() const; - QSharedPointer deviceConfiguration() const; + ProjectExplorer::IDevice::ConstPtr deviceConfiguration() const; QSsh::SshConnection *connection() const; void saveDeploymentTimeStamp(const DeployableFile &deployableFile); diff --git a/src/plugins/remotelinux/abstractremotelinuxdeploystep.cpp b/src/plugins/remotelinux/abstractremotelinuxdeploystep.cpp index 9198f1f692a..d9b3742ec4e 100644 --- a/src/plugins/remotelinux/abstractremotelinuxdeploystep.cpp +++ b/src/plugins/remotelinux/abstractremotelinuxdeploystep.cpp @@ -27,17 +27,16 @@ ** ** **************************************************************************/ + #include "abstractremotelinuxdeploystep.h" #include "abstractremotelinuxdeployservice.h" -#include "linuxdeviceconfiguration.h" #include "remotelinuxdeployconfiguration.h" #include #include #include #include -#include using namespace ProjectExplorer; @@ -85,9 +84,7 @@ QVariantMap AbstractRemoteLinuxDeployStep::toMap() const bool AbstractRemoteLinuxDeployStep::init() { QString error; - deployService()->setDeviceConfiguration(ProjectExplorer::DeviceProfileInformation::device(target()->profile()) - .dynamicCast()); - deployService()->setBuildConfiguration(qobject_cast(target()->activeBuildConfiguration())); + deployService()->setBuildConfiguration(target()->activeBuildConfiguration()); const bool canDeploy = initInternal(&error); if (!canDeploy) emit addOutput(tr("Cannot deploy: %1").arg(error), ErrorMessageOutput); @@ -138,7 +135,7 @@ void AbstractRemoteLinuxDeployStep::handleErrorMessage(const QString &message) { emit addOutput(message, ErrorMessageOutput); emit addTask(Task(Task::Error, message, Utils::FileName(), -1, - Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))); + Core::Id(Constants::TASK_CATEGORY_BUILDSYSTEM))); d->hasError = true; } @@ -146,7 +143,7 @@ void AbstractRemoteLinuxDeployStep::handleWarningMessage(const QString &message) { emit addOutput(message, ErrorMessageOutput); emit addTask(Task(Task::Warning, message, Utils::FileName(), -1, - Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))); + Core::Id(Constants::TASK_CATEGORY_BUILDSYSTEM))); } void AbstractRemoteLinuxDeployStep::handleFinished() diff --git a/src/plugins/remotelinux/deploymentinfo.cpp b/src/plugins/remotelinux/deploymentinfo.cpp index 50dcfbc2aed..7c69ef89fa3 100644 --- a/src/plugins/remotelinux/deploymentinfo.cpp +++ b/src/plugins/remotelinux/deploymentinfo.cpp @@ -35,7 +35,6 @@ #include #include -#include #include #include diff --git a/src/plugins/remotelinux/genericlinuxdeviceconfigurationfactory.cpp b/src/plugins/remotelinux/genericlinuxdeviceconfigurationfactory.cpp index 958bd4cb3c6..5f040de8575 100644 --- a/src/plugins/remotelinux/genericlinuxdeviceconfigurationfactory.cpp +++ b/src/plugins/remotelinux/genericlinuxdeviceconfigurationfactory.cpp @@ -71,8 +71,8 @@ bool GenericLinuxDeviceConfigurationFactory::canRestore(const QVariantMap &map) IDevice::Ptr GenericLinuxDeviceConfigurationFactory::restore(const QVariantMap &map) const { - QTC_ASSERT(canRestore(map), return LinuxDeviceConfiguration::Ptr()); - const LinuxDeviceConfiguration::Ptr device = LinuxDeviceConfiguration::create(); + QTC_ASSERT(canRestore(map), return IDevice::Ptr()); + const IDevice::Ptr device = LinuxDeviceConfiguration::create(); device->fromMap(map); return device; } diff --git a/src/plugins/remotelinux/genericlinuxdeviceconfigurationwidget.cpp b/src/plugins/remotelinux/genericlinuxdeviceconfigurationwidget.cpp index d64d5c9dc9c..b2d87407c2b 100644 --- a/src/plugins/remotelinux/genericlinuxdeviceconfigurationwidget.cpp +++ b/src/plugins/remotelinux/genericlinuxdeviceconfigurationwidget.cpp @@ -36,14 +36,14 @@ #include +using namespace ProjectExplorer; using namespace RemoteLinux; using namespace QSsh; using namespace Utils; GenericLinuxDeviceConfigurationWidget::GenericLinuxDeviceConfigurationWidget( - const LinuxDeviceConfiguration::Ptr &deviceConfig, - QWidget *parent) : - ProjectExplorer::IDeviceWidget(deviceConfig, parent), + const IDevice::Ptr &deviceConfig, QWidget *parent) : + IDeviceWidget(deviceConfig, parent), m_ui(new Ui::GenericLinuxDeviceConfigurationWidget) { m_ui->setupUi(this); @@ -72,12 +72,12 @@ GenericLinuxDeviceConfigurationWidget::~GenericLinuxDeviceConfigurationWidget() void GenericLinuxDeviceConfigurationWidget::authenticationTypeChanged() { - SshConnectionParameters sshParams = deviceConfiguration()->sshParameters(); + SshConnectionParameters sshParams = device()->sshParameters(); const bool usePassword = m_ui->passwordButton->isChecked(); sshParams.authenticationType = usePassword ? SshConnectionParameters::AuthenticationByPassword : SshConnectionParameters::AuthenticationByKey; - deviceConfiguration()->setSshParameters(sshParams); + device()->setSshParameters(sshParams); m_ui->pwdLineEdit->setEnabled(usePassword); m_ui->passwordLabel->setEnabled(usePassword); m_ui->keyFileLineEdit->setEnabled(!usePassword); @@ -86,49 +86,49 @@ void GenericLinuxDeviceConfigurationWidget::authenticationTypeChanged() void GenericLinuxDeviceConfigurationWidget::hostNameEditingFinished() { - SshConnectionParameters sshParams = deviceConfiguration()->sshParameters(); + SshConnectionParameters sshParams = device()->sshParameters(); sshParams.host = m_ui->hostLineEdit->text().trimmed(); - deviceConfiguration()->setSshParameters(sshParams); + device()->setSshParameters(sshParams); } void GenericLinuxDeviceConfigurationWidget::sshPortEditingFinished() { - SshConnectionParameters sshParams = deviceConfiguration()->sshParameters(); + SshConnectionParameters sshParams = device()->sshParameters(); sshParams.port = m_ui->sshPortSpinBox->value(); - deviceConfiguration()->setSshParameters(sshParams); + device()->setSshParameters(sshParams); } void GenericLinuxDeviceConfigurationWidget::timeoutEditingFinished() { - SshConnectionParameters sshParams = deviceConfiguration()->sshParameters(); + SshConnectionParameters sshParams = device()->sshParameters(); sshParams.timeout = m_ui->timeoutSpinBox->value(); - deviceConfiguration()->setSshParameters(sshParams); + device()->setSshParameters(sshParams); } void GenericLinuxDeviceConfigurationWidget::userNameEditingFinished() { - SshConnectionParameters sshParams = deviceConfiguration()->sshParameters(); + SshConnectionParameters sshParams = device()->sshParameters(); sshParams.userName = m_ui->userLineEdit->text(); - deviceConfiguration()->setSshParameters(sshParams); + device()->setSshParameters(sshParams); } void GenericLinuxDeviceConfigurationWidget::passwordEditingFinished() { - SshConnectionParameters sshParams = deviceConfiguration()->sshParameters(); + SshConnectionParameters sshParams = device()->sshParameters(); sshParams.password = m_ui->pwdLineEdit->text(); - deviceConfiguration()->setSshParameters(sshParams); + device()->setSshParameters(sshParams); } void GenericLinuxDeviceConfigurationWidget::keyFileEditingFinished() { - SshConnectionParameters sshParams = deviceConfiguration()->sshParameters(); + SshConnectionParameters sshParams = device()->sshParameters(); sshParams.privateKeyFile = m_ui->keyFileLineEdit->path(); - deviceConfiguration()->setSshParameters(sshParams); + device()->setSshParameters(sshParams); } void GenericLinuxDeviceConfigurationWidget::handleFreePortsChanged() { - deviceConfiguration()->setFreePorts(PortList::fromString(m_ui->portsLineEdit->text())); + device()->setFreePorts(PortList::fromString(m_ui->portsLineEdit->text())); updatePortsWarningLabel(); } @@ -153,12 +153,12 @@ void GenericLinuxDeviceConfigurationWidget::createNewKey() void GenericLinuxDeviceConfigurationWidget::updatePortsWarningLabel() { - m_ui->portsWarningLabel->setVisible(!deviceConfiguration()->freePorts().hasMore()); + m_ui->portsWarningLabel->setVisible(!device()->freePorts().hasMore()); } void GenericLinuxDeviceConfigurationWidget::initGui() { - if (deviceConfiguration()->machineType() == LinuxDeviceConfiguration::Hardware) + if (device()->machineType() == IDevice::Hardware) m_ui->machineTypeValueLabel->setText(tr("Physical Device")); else m_ui->machineTypeValueLabel->setText(tr("Emulator")); @@ -171,19 +171,19 @@ void GenericLinuxDeviceConfigurationWidget::initGui() = new QRegExpValidator(QRegExp(PortList::regularExpression()), this); m_ui->portsLineEdit->setValidator(portsValidator); - const SshConnectionParameters &sshParams = deviceConfiguration()->sshParameters(); + const SshConnectionParameters &sshParams = device()->sshParameters(); if (sshParams.authenticationType == SshConnectionParameters::AuthenticationByPassword) m_ui->passwordButton->setChecked(true); else m_ui->keyButton->setChecked(true); m_ui->timeoutSpinBox->setValue(sshParams.timeout); - m_ui->hostLineEdit->setEnabled(!deviceConfiguration()->isAutoDetected()); - m_ui->sshPortSpinBox->setEnabled(!deviceConfiguration()->isAutoDetected()); + m_ui->hostLineEdit->setEnabled(!device()->isAutoDetected()); + m_ui->sshPortSpinBox->setEnabled(!device()->isAutoDetected()); m_ui->hostLineEdit->setText(sshParams.host); m_ui->sshPortSpinBox->setValue(sshParams.port); - m_ui->portsLineEdit->setText(deviceConfiguration()->freePorts().toString()); + m_ui->portsLineEdit->setText(device()->freePorts().toString()); m_ui->timeoutSpinBox->setValue(sshParams.timeout); m_ui->userLineEdit->setText(sshParams.userName); m_ui->pwdLineEdit->setText(sshParams.password); @@ -191,8 +191,3 @@ void GenericLinuxDeviceConfigurationWidget::initGui() m_ui->showPasswordCheckBox->setChecked(false); updatePortsWarningLabel(); } - -LinuxDeviceConfiguration::Ptr GenericLinuxDeviceConfigurationWidget::deviceConfiguration() const -{ - return device().staticCast(); -} diff --git a/src/plugins/remotelinux/genericlinuxdeviceconfigurationwidget.h b/src/plugins/remotelinux/genericlinuxdeviceconfigurationwidget.h index c9395eeaa7a..0b996fb1e92 100644 --- a/src/plugins/remotelinux/genericlinuxdeviceconfigurationwidget.h +++ b/src/plugins/remotelinux/genericlinuxdeviceconfigurationwidget.h @@ -32,7 +32,6 @@ #include -#include "linuxdeviceconfiguration.h" #include "remotelinux_export.h" namespace RemoteLinux { @@ -48,7 +47,7 @@ class REMOTELINUX_EXPORT GenericLinuxDeviceConfigurationWidget public: explicit GenericLinuxDeviceConfigurationWidget( - const LinuxDeviceConfiguration::Ptr &deviceConfig, QWidget *parent = 0); + const ProjectExplorer::IDevice::Ptr &deviceConfig, QWidget *parent = 0); ~GenericLinuxDeviceConfigurationWidget(); private slots: @@ -67,7 +66,6 @@ private slots: private: void updatePortsWarningLabel(); void initGui(); - LinuxDeviceConfiguration::Ptr deviceConfiguration() const; Ui::GenericLinuxDeviceConfigurationWidget *m_ui; }; diff --git a/src/plugins/remotelinux/genericlinuxdeviceconfigurationwizard.cpp b/src/plugins/remotelinux/genericlinuxdeviceconfigurationwizard.cpp index fe7e15c35e3..f47a548ab9b 100644 --- a/src/plugins/remotelinux/genericlinuxdeviceconfigurationwizard.cpp +++ b/src/plugins/remotelinux/genericlinuxdeviceconfigurationwizard.cpp @@ -84,8 +84,8 @@ IDevice::Ptr GenericLinuxDeviceConfigurationWizard::device() sshParams.password = d->setupPage.password(); else sshParams.privateKeyFile = d->setupPage.privateKeyFilePath(); - LinuxDeviceConfiguration::Ptr devConf = LinuxDeviceConfiguration::create(d->setupPage.configurationName(), - Core::Id(Constants::GenericLinuxOsType), LinuxDeviceConfiguration::Hardware); + IDevice::Ptr devConf = LinuxDeviceConfiguration::create(d->setupPage.configurationName(), + Core::Id(Constants::GenericLinuxOsType), IDevice::Hardware); devConf->setFreePorts(Utils::PortList::fromString(QLatin1String("10000-10100"))); devConf->setSshParameters(sshParams); LinuxDeviceTestDialog dlg(devConf, new GenericLinuxDeviceTester(this), this); diff --git a/src/plugins/remotelinux/genericlinuxdeviceconfigurationwizardpages.cpp b/src/plugins/remotelinux/genericlinuxdeviceconfigurationwizardpages.cpp index acf7e4296fa..d48d0a2b3ea 100644 --- a/src/plugins/remotelinux/genericlinuxdeviceconfigurationwizardpages.cpp +++ b/src/plugins/remotelinux/genericlinuxdeviceconfigurationwizardpages.cpp @@ -77,7 +77,7 @@ void GenericLinuxDeviceConfigurationWizardSetupPage::initializePage() d->ui.userNameLineEdit->setText(defaultUserName()); d->ui.passwordButton->setChecked(true); d->ui.passwordLineEdit->setText(defaultPassWord()); - d->ui.privateKeyPathChooser->setPath(LinuxDeviceConfiguration::defaultPrivateKeyFilePath()); + d->ui.privateKeyPathChooser->setPath(ProjectExplorer::IDevice::defaultPrivateKeyFilePath()); handleAuthTypeChanged(); } diff --git a/src/plugins/remotelinux/linuxdevicetestdialog.cpp b/src/plugins/remotelinux/linuxdevicetestdialog.cpp index bc3e981d74d..88097da8218 100644 --- a/src/plugins/remotelinux/linuxdevicetestdialog.cpp +++ b/src/plugins/remotelinux/linuxdevicetestdialog.cpp @@ -54,7 +54,7 @@ public: using namespace Internal; -LinuxDeviceTestDialog::LinuxDeviceTestDialog(const QSharedPointer &deviceConfiguration, +LinuxDeviceTestDialog::LinuxDeviceTestDialog(const ProjectExplorer::IDevice::ConstPtr &deviceConfiguration, AbstractLinuxDeviceTester *deviceTester, QWidget *parent) : QDialog(parent), d(new LinuxDeviceTestDialogPrivate(deviceTester)) { diff --git a/src/plugins/remotelinux/linuxdevicetestdialog.h b/src/plugins/remotelinux/linuxdevicetestdialog.h index 73a947c656b..aefa0fc2d39 100644 --- a/src/plugins/remotelinux/linuxdevicetestdialog.h +++ b/src/plugins/remotelinux/linuxdevicetestdialog.h @@ -43,10 +43,10 @@ class LinuxDeviceTestDialogPrivate; class REMOTELINUX_EXPORT LinuxDeviceTestDialog : public QDialog { Q_OBJECT -public: +public: // Note: The dialog takes ownership of deviceTester - explicit LinuxDeviceTestDialog(const QSharedPointer &deviceConfiguration, + LinuxDeviceTestDialog(const ProjectExplorer::IDevice::ConstPtr &deviceConfiguration, AbstractLinuxDeviceTester * deviceTester, QWidget *parent = 0); ~LinuxDeviceTestDialog(); diff --git a/src/plugins/remotelinux/linuxdevicetester.cpp b/src/plugins/remotelinux/linuxdevicetester.cpp index 43ca2e0a3d6..8dea034a659 100644 --- a/src/plugins/remotelinux/linuxdevicetester.cpp +++ b/src/plugins/remotelinux/linuxdevicetester.cpp @@ -29,13 +29,13 @@ **************************************************************************/ #include "linuxdevicetester.h" -#include "linuxdeviceconfiguration.h" #include "remotelinuxusedportsgatherer.h" #include #include #include +using namespace ProjectExplorer; using namespace QSsh; namespace RemoteLinux { @@ -51,7 +51,7 @@ class GenericLinuxDeviceTesterPrivate public: GenericLinuxDeviceTesterPrivate() : connection(0), state(Inactive) {} - LinuxDeviceConfiguration::ConstPtr deviceConfiguration; + IDevice::ConstPtr deviceConfiguration; SshConnection *connection; SshRemoteProcess::Ptr process; RemoteLinuxUsedPortsGatherer portsGatherer; @@ -77,7 +77,7 @@ GenericLinuxDeviceTester::~GenericLinuxDeviceTester() delete d; } -void GenericLinuxDeviceTester::testDevice(const LinuxDeviceConfiguration::ConstPtr &deviceConfiguration) +void GenericLinuxDeviceTester::testDevice(const IDevice::ConstPtr &deviceConfiguration) { QTC_ASSERT(d->state == Inactive, return); diff --git a/src/plugins/remotelinux/linuxdevicetester.h b/src/plugins/remotelinux/linuxdevicetester.h index be686539bf6..b7a9b1fc2c6 100644 --- a/src/plugins/remotelinux/linuxdevicetester.h +++ b/src/plugins/remotelinux/linuxdevicetester.h @@ -27,36 +27,33 @@ ** ** **************************************************************************/ + #ifndef LINUXDEVICETESTER_H #define LINUXDEVICETESTER_H #include "remotelinux_export.h" -#include -#include - -QT_FORWARD_DECLARE_CLASS(QString) +#include namespace QSsh { class SshConnection; } namespace RemoteLinux { -class LinuxDeviceConfiguration; class RemoteLinuxUsedPortsGatherer; namespace Internal { class GenericLinuxDeviceTesterPrivate; -} // namespace Internal +} class REMOTELINUX_EXPORT AbstractLinuxDeviceTester : public QObject { Q_OBJECT - Q_DISABLE_COPY(AbstractLinuxDeviceTester) + public: enum TestResult { TestSuccess, TestFailure }; - virtual void testDevice(const QSharedPointer &deviceConfiguration) = 0; + virtual void testDevice(const ProjectExplorer::IDevice::ConstPtr &deviceConfiguration) = 0; virtual void stopTest() = 0; signals: @@ -72,11 +69,12 @@ protected: class REMOTELINUX_EXPORT GenericLinuxDeviceTester : public AbstractLinuxDeviceTester { Q_OBJECT + public: explicit GenericLinuxDeviceTester(QObject *parent = 0); ~GenericLinuxDeviceTester(); - void testDevice(const QSharedPointer &deviceConfiguration); + void testDevice(const ProjectExplorer::IDevice::ConstPtr &deviceConfiguration); void stopTest(); RemoteLinuxUsedPortsGatherer *usedPortsGatherer() const; diff --git a/src/plugins/remotelinux/publickeydeploymentdialog.cpp b/src/plugins/remotelinux/publickeydeploymentdialog.cpp index 26ab6af0ecd..cf7bf919c87 100644 --- a/src/plugins/remotelinux/publickeydeploymentdialog.cpp +++ b/src/plugins/remotelinux/publickeydeploymentdialog.cpp @@ -28,7 +28,6 @@ **************************************************************************/ #include "publickeydeploymentdialog.h" -#include "linuxdeviceconfiguration.h" #include "sshkeydeployer.h" #include @@ -37,6 +36,8 @@ #include #include +using namespace ProjectExplorer; + namespace RemoteLinux { namespace Internal { class PublicKeyDeploymentDialogPrivate @@ -49,7 +50,7 @@ public: using namespace Internal; -PublicKeyDeploymentDialog *PublicKeyDeploymentDialog::createDialog(const LinuxDeviceConfiguration::ConstPtr &deviceConfig, +PublicKeyDeploymentDialog *PublicKeyDeploymentDialog::createDialog(const IDevice::ConstPtr &deviceConfig, QWidget *parent) { const QString &dir = QFileInfo(deviceConfig->sshParameters().privateKeyFile).path(); @@ -62,7 +63,7 @@ PublicKeyDeploymentDialog *PublicKeyDeploymentDialog::createDialog(const LinuxDe return new PublicKeyDeploymentDialog(deviceConfig, publicKeyFileName, parent); } -PublicKeyDeploymentDialog::PublicKeyDeploymentDialog(const LinuxDeviceConfiguration::ConstPtr &deviceConfig, +PublicKeyDeploymentDialog::PublicKeyDeploymentDialog(const IDevice::ConstPtr &deviceConfig, const QString &publicKeyFileName, QWidget *parent) : QProgressDialog(parent), d(new PublicKeyDeploymentDialogPrivate) { diff --git a/src/plugins/remotelinux/publickeydeploymentdialog.h b/src/plugins/remotelinux/publickeydeploymentdialog.h index c632c8c4860..db03cded9bd 100644 --- a/src/plugins/remotelinux/publickeydeploymentdialog.h +++ b/src/plugins/remotelinux/publickeydeploymentdialog.h @@ -31,16 +31,11 @@ #include "remotelinux_export.h" -#include +#include + #include -QT_BEGIN_NAMESPACE -class QString; -QT_END_NAMESPACE - namespace RemoteLinux { -class LinuxDeviceConfiguration; - namespace Internal { class PublicKeyDeploymentDialogPrivate; } // namespace Internal @@ -50,7 +45,7 @@ class REMOTELINUX_EXPORT PublicKeyDeploymentDialog : public QProgressDialog Q_OBJECT public: // Asks for public key and returns null if the file dialog is canceled. - static PublicKeyDeploymentDialog *createDialog(const QSharedPointer &deviceConfig, + static PublicKeyDeploymentDialog *createDialog(const ProjectExplorer::IDevice::ConstPtr &deviceConfig, QWidget *parent = 0); ~PublicKeyDeploymentDialog(); @@ -61,7 +56,7 @@ private slots: void handleCanceled(); private: - explicit PublicKeyDeploymentDialog(const QSharedPointer &deviceConfig, + explicit PublicKeyDeploymentDialog(const ProjectExplorer::IDevice::ConstPtr &deviceConfig, const QString &publicKeyFileName, QWidget *parent = 0); void handleDeploymentFinished(const QString &errorMsg); diff --git a/src/plugins/remotelinux/remotelinuxapplicationrunner.cpp b/src/plugins/remotelinux/remotelinuxapplicationrunner.cpp index 12d3b3984b2..b05f9bf8d8a 100644 --- a/src/plugins/remotelinux/remotelinuxapplicationrunner.cpp +++ b/src/plugins/remotelinux/remotelinuxapplicationrunner.cpp @@ -44,7 +44,7 @@ #include -using namespace Qt4ProjectManager; +using namespace ProjectExplorer; using namespace QSsh; using namespace Utils; @@ -64,8 +64,7 @@ class AbstractRemoteLinuxApplicationRunnerPrivate { public: AbstractRemoteLinuxApplicationRunnerPrivate(const RemoteLinuxRunConfiguration *runConfig) - : devConfig(ProjectExplorer::DeviceProfileInformation::device(runConfig->target()->profile()) - .dynamicCast()), + : devConfig(DeviceProfileInformation::device(runConfig->target()->profile())), remoteExecutable(runConfig->remoteExecutableFilePath()), appArguments(runConfig->arguments()), commandPrefix(runConfig->commandPrefix()), @@ -76,7 +75,7 @@ public: { } RemoteLinuxUsedPortsGatherer portsGatherer; - LinuxDeviceConfiguration::ConstPtr devConfig; + IDevice::ConstPtr devConfig; const QString remoteExecutable; const QString appArguments; const QString commandPrefix; @@ -115,7 +114,7 @@ SshConnection *AbstractRemoteLinuxApplicationRunner::connection() const return d->connection; } -LinuxDeviceConfiguration::ConstPtr AbstractRemoteLinuxApplicationRunner::devConfig() const +IDevice::ConstPtr AbstractRemoteLinuxApplicationRunner::devConfig() const { return d->devConfig; } @@ -383,11 +382,6 @@ bool AbstractRemoteLinuxApplicationRunner::canRun(QString &whyNot) const return true; } -void AbstractRemoteLinuxApplicationRunner::setDeviceConfiguration(const LinuxDeviceConfiguration::ConstPtr &deviceConfig) -{ - d->devConfig = deviceConfig; -} - void AbstractRemoteLinuxApplicationRunner::handleDeviceSetupDone(bool success) { QTC_ASSERT(d->state == SettingUpDevice, return); diff --git a/src/plugins/remotelinux/remotelinuxapplicationrunner.h b/src/plugins/remotelinux/remotelinuxapplicationrunner.h index de17fff9cee..a9e8e6c951e 100644 --- a/src/plugins/remotelinux/remotelinuxapplicationrunner.h +++ b/src/plugins/remotelinux/remotelinuxapplicationrunner.h @@ -31,6 +31,8 @@ #include "remotelinux_export.h" +#include + #include #include @@ -38,7 +40,6 @@ namespace QSsh { class SshConnection; } namespace Utils { class PortList; } namespace RemoteLinux { -class LinuxDeviceConfiguration; class RemoteLinuxRunConfiguration; class RemoteLinuxUsedPortsGatherer; @@ -60,7 +61,7 @@ public: void startExecution(const QByteArray &remoteCall); - QSharedPointer devConfig() const; + ProjectExplorer::IDevice::ConstPtr devConfig() const; QSsh::SshConnection *connection() const; RemoteLinuxUsedPortsGatherer *usedPortsGatherer() const; Utils::PortList *freePorts(); @@ -83,8 +84,6 @@ protected: // Override to to additional checks. virtual bool canRun(QString &whyNot) const; - void setDeviceConfiguration(const QSharedPointer &deviceConfig); - void handleDeviceSetupDone(bool success); void handleInitialCleanupDone(bool success); void handleInitializationsDone(bool success); diff --git a/src/plugins/remotelinux/remotelinuxdebugsupport.cpp b/src/plugins/remotelinux/remotelinuxdebugsupport.cpp index ead5c41193e..9920a413b6a 100644 --- a/src/plugins/remotelinux/remotelinuxdebugsupport.cpp +++ b/src/plugins/remotelinux/remotelinuxdebugsupport.cpp @@ -26,9 +26,9 @@ ** ** **************************************************************************/ + #include "remotelinuxdebugsupport.h" -#include "linuxdeviceconfiguration.h" #include "remotelinuxapplicationrunner.h" #include "remotelinuxrunconfiguration.h" #include "remotelinuxusedportsgatherer.h" @@ -37,12 +37,11 @@ #include #include #include +#include #include #include #include #include -#include -#include #include #include @@ -97,9 +96,7 @@ DebuggerStartParameters AbstractRemoteLinuxDebugSupport::startParameters(const R DebuggerStartParameters params; Target *target = runConfig->target(); Profile *profile = target->profile(); - const LinuxDeviceConfiguration::ConstPtr devConf - = DeviceProfileInformation::device(profile) - .dynamicCast(); + const IDevice::ConstPtr devConf = DeviceProfileInformation::device(profile); params.sysRoot = SysRootProfileInformation::sysRoot(profile).toString(); params.debuggerCommand = DebuggerProfileInformation::debuggerCommand(profile).toString(); diff --git a/src/plugins/remotelinux/remotelinuxdeployconfiguration.cpp b/src/plugins/remotelinux/remotelinuxdeployconfiguration.cpp index 1d60c1cd743..7de56a9c2a5 100644 --- a/src/plugins/remotelinux/remotelinuxdeployconfiguration.cpp +++ b/src/plugins/remotelinux/remotelinuxdeployconfiguration.cpp @@ -33,8 +33,8 @@ #include "remotelinuxdeployconfigurationwidget.h" #include "typespecificdeviceconfigurationlistmodel.h" -#include #include +#include #include #include diff --git a/src/plugins/remotelinux/remotelinuxdeployconfiguration.h b/src/plugins/remotelinux/remotelinuxdeployconfiguration.h index b95519fce18..4ba7e42be9f 100644 --- a/src/plugins/remotelinux/remotelinuxdeployconfiguration.h +++ b/src/plugins/remotelinux/remotelinuxdeployconfiguration.h @@ -31,23 +31,18 @@ #ifndef REMOTELINUXDEPLOYCONFIGURATION_H #define REMOTELINUXDEPLOYCONFIGURATION_H -#include "linuxdeviceconfiguration.h" - #include "remotelinux_export.h" -#include #include #include #include +#include namespace RemoteLinux { class AbstractEmbeddedLinuxTarget; class DeploymentInfo; -namespace Internal { -class RemoteLinuxDeployConfigurationFactory; -class TypeSpecificDeviceConfigurationListModel; -} // namespace Internal +namespace Internal { class RemoteLinuxDeployConfigurationFactory; } class REMOTELINUX_EXPORT RemoteLinuxDeployConfiguration : public ProjectExplorer::DeployConfiguration diff --git a/src/plugins/remotelinux/remotelinuxenvironmentreader.cpp b/src/plugins/remotelinux/remotelinuxenvironmentreader.cpp index 2138bee9374..63810a50e90 100644 --- a/src/plugins/remotelinux/remotelinuxenvironmentreader.cpp +++ b/src/plugins/remotelinux/remotelinuxenvironmentreader.cpp @@ -29,34 +29,32 @@ #include "remotelinuxenvironmentreader.h" #include "linuxdeviceconfiguration.h" -#include "remotelinuxrunconfiguration.h" #include +#include #include +#include #include +using namespace ProjectExplorer; + namespace RemoteLinux { namespace Internal { -RemoteLinuxEnvironmentReader::RemoteLinuxEnvironmentReader(RemoteLinuxRunConfiguration *config, - QObject *parent) +RemoteLinuxEnvironmentReader::RemoteLinuxEnvironmentReader(RunConfiguration *config, QObject *parent) : QObject(parent) , m_stop(false) - , m_devConfig(ProjectExplorer::DeviceProfileInformation::device(config->target()->profile())) - , m_runConfig(config) + , m_profile(config->target()->profile()) , m_remoteProcessRunner(0) { connect(config->target(), SIGNAL(profileChanged()), this, SLOT(handleCurrentDeviceConfigChanged())); } -RemoteLinuxEnvironmentReader::~RemoteLinuxEnvironmentReader() -{ -} - void RemoteLinuxEnvironmentReader::start(const QString &environmentSetupCommand) { - if (!m_devConfig) + IDevice::ConstPtr devConfig = DeviceProfileInformation::device(m_profile); + if (!devConfig) return; m_stop = false; if (!m_remoteProcessRunner) @@ -65,7 +63,7 @@ void RemoteLinuxEnvironmentReader::start(const QString &environmentSetupCommand) connect(m_remoteProcessRunner, SIGNAL(processClosed(int)), SLOT(remoteProcessFinished(int))); const QByteArray remoteCall = QString(environmentSetupCommand + QLatin1String("; env")).toUtf8(); - m_remoteProcessRunner->run(remoteCall, m_devConfig->sshParameters()); + m_remoteProcessRunner->run(remoteCall, devConfig->sshParameters()); } void RemoteLinuxEnvironmentReader::stop() @@ -87,8 +85,6 @@ void RemoteLinuxEnvironmentReader::handleConnectionFailure() void RemoteLinuxEnvironmentReader::handleCurrentDeviceConfigChanged() { - m_devConfig = ProjectExplorer::DeviceProfileInformation::device(m_runConfig->target()->profile()); - if (m_remoteProcessRunner) disconnect(m_remoteProcessRunner, 0, this, 0); m_env.clear(); diff --git a/src/plugins/remotelinux/remotelinuxenvironmentreader.h b/src/plugins/remotelinux/remotelinuxenvironmentreader.h index c35a3321ecb..e8f6c0f717f 100644 --- a/src/plugins/remotelinux/remotelinuxenvironmentreader.h +++ b/src/plugins/remotelinux/remotelinuxenvironmentreader.h @@ -33,25 +33,22 @@ #include #include -#include - - -namespace QSsh { -class SshRemoteProcessRunner; +namespace ProjectExplorer { +class RunConfiguration; +class Profile; } -namespace RemoteLinux { -class LinuxDeviceConfiguration; -class RemoteLinuxRunConfiguration; +namespace QSsh { class SshRemoteProcessRunner; } +namespace RemoteLinux { namespace Internal { class RemoteLinuxEnvironmentReader : public QObject { Q_OBJECT + public: - RemoteLinuxEnvironmentReader(RemoteLinuxRunConfiguration *config, QObject *parent = 0); - ~RemoteLinuxEnvironmentReader(); + RemoteLinuxEnvironmentReader(ProjectExplorer::RunConfiguration *config, QObject *parent = 0); void start(const QString &environmentSetupCommand); void stop(); @@ -73,8 +70,7 @@ private: bool m_stop; Utils::Environment m_env; - ProjectExplorer::IDevice::ConstPtr m_devConfig; - RemoteLinuxRunConfiguration *m_runConfig; + ProjectExplorer::Profile *m_profile; QSsh::SshRemoteProcessRunner *m_remoteProcessRunner; }; diff --git a/src/plugins/remotelinux/remotelinuxpackageinstaller.cpp b/src/plugins/remotelinux/remotelinuxpackageinstaller.cpp index 27b2dedae7a..615d3f3f069 100644 --- a/src/plugins/remotelinux/remotelinuxpackageinstaller.cpp +++ b/src/plugins/remotelinux/remotelinuxpackageinstaller.cpp @@ -29,13 +29,10 @@ **************************************************************************/ #include "remotelinuxpackageinstaller.h" -#include "linuxdeviceconfiguration.h" - #include #include -#include - +using namespace ProjectExplorer; using namespace QSsh; namespace RemoteLinux { @@ -47,7 +44,7 @@ public: AbstractRemoteLinuxPackageInstallerPrivate() : isRunning(false), installer(0), killProcess(0) {} bool isRunning; - LinuxDeviceConfiguration::ConstPtr deviceConfig; + IDevice::ConstPtr deviceConfig; QSsh::SshRemoteProcessRunner *installer; QSsh::SshRemoteProcessRunner *killProcess; }; @@ -64,7 +61,7 @@ AbstractRemoteLinuxPackageInstaller::~AbstractRemoteLinuxPackageInstaller() delete d; } -void AbstractRemoteLinuxPackageInstaller::installPackage(const LinuxDeviceConfiguration::ConstPtr &deviceConfig, +void AbstractRemoteLinuxPackageInstaller::installPackage(const IDevice::ConstPtr &deviceConfig, const QString &packageFilePath, bool removePackageFile) { QTC_ASSERT(!d->isRunning, return); diff --git a/src/plugins/remotelinux/remotelinuxpackageinstaller.h b/src/plugins/remotelinux/remotelinuxpackageinstaller.h index 05b79d077c7..0d66733d9a0 100644 --- a/src/plugins/remotelinux/remotelinuxpackageinstaller.h +++ b/src/plugins/remotelinux/remotelinuxpackageinstaller.h @@ -27,17 +27,17 @@ ** ** **************************************************************************/ + #ifndef REMOTELINUXPACKAGEINSTALLER_H #define REMOTELINUXPACKAGEINSTALLER_H #include "remotelinux_export.h" -#include +#include + #include -#include namespace RemoteLinux { -class LinuxDeviceConfiguration; namespace Internal { class AbstractRemoteLinuxPackageInstallerPrivate; @@ -50,7 +50,7 @@ class REMOTELINUX_EXPORT AbstractRemoteLinuxPackageInstaller : public QObject public: ~AbstractRemoteLinuxPackageInstaller(); - void installPackage(const QSharedPointer &deviceConfig, + void installPackage(const ProjectExplorer::IDevice::ConstPtr &deviceConfig, const QString &packageFilePath, bool removePackageFile); void cancelInstallation(); diff --git a/src/plugins/remotelinux/remotelinuxrunconfiguration.cpp b/src/plugins/remotelinux/remotelinuxrunconfiguration.cpp index 33f93251863..3b73ebaf1e9 100644 --- a/src/plugins/remotelinux/remotelinuxrunconfiguration.cpp +++ b/src/plugins/remotelinux/remotelinuxrunconfiguration.cpp @@ -40,7 +40,6 @@ #include #include #include -#include #include #include @@ -141,18 +140,13 @@ void RemoteLinuxRunConfiguration::init() this, SLOT(handleDeployConfigChanged())); handleDeployConfigChanged(); - Qt4Project *pro = static_cast(target()->project()); + Project *pro = target()->project(); connect(pro, SIGNAL(proFileUpdated(Qt4ProjectManager::Qt4ProFileNode*,bool,bool)), this, SLOT(proFileUpdate(Qt4ProjectManager::Qt4ProFileNode*,bool,bool))); connect(target(), SIGNAL(profileChanged()), this, SLOT(handleDeployablesUpdated())); // Handles device changes, etc. } -Qt4BuildConfiguration *RemoteLinuxRunConfiguration::activeQt4BuildConfiguration() const -{ - return static_cast(activeBuildConfiguration()); -} - bool RemoteLinuxRunConfiguration::isEnabled() const { if (d->parseInProgress) { @@ -165,7 +159,7 @@ bool RemoteLinuxRunConfiguration::isEnabled() const d->disabledReason = project->disabledReasonForRunConfiguration(d->proFilePath); return false; } - if (!activeQt4BuildConfiguration()) { + if (!activeBuildConfiguration()) { d->disabledReason = tr("No active build configuration."); return false; } diff --git a/src/plugins/remotelinux/remotelinuxrunconfiguration.h b/src/plugins/remotelinux/remotelinuxrunconfiguration.h index 43cc07ecde3..ee869a62de4 100644 --- a/src/plugins/remotelinux/remotelinuxrunconfiguration.h +++ b/src/plugins/remotelinux/remotelinuxrunconfiguration.h @@ -33,13 +33,10 @@ #include "remotelinux_export.h" -#include "linuxdeviceconfiguration.h" - #include #include namespace Qt4ProjectManager { -class Qt4BuildConfiguration; class Qt4ProFileNode; } // namespace Qt4ProjectManager @@ -77,10 +74,8 @@ public: QString disabledReason() const; QWidget *createConfigurationWidget(); Utils::OutputFormatter *createOutputFormatter() const; - Qt4ProjectManager::Qt4BuildConfiguration *activeQt4BuildConfiguration() const; RemoteLinuxDeployConfiguration *deployConfig() const; - LinuxDeviceConfiguration::ConstPtr device() const; virtual QString environmentPreparationCommand() const; virtual QString commandPrefix() const; diff --git a/src/plugins/remotelinux/remotelinuxrunconfigurationwidget.cpp b/src/plugins/remotelinux/remotelinuxrunconfigurationwidget.cpp index 32da2c8b2cb..c31910d3add 100644 --- a/src/plugins/remotelinux/remotelinuxrunconfigurationwidget.cpp +++ b/src/plugins/remotelinux/remotelinuxrunconfigurationwidget.cpp @@ -29,7 +29,6 @@ **************************************************************************/ #include "remotelinuxrunconfigurationwidget.h" -#include "linuxdeviceconfiguration.h" #include "remotelinuxrunconfiguration.h" #include "remotelinuxenvironmentreader.h" #include "remotelinuxutils.h" @@ -38,7 +37,6 @@ #include #include #include -#include #include #include @@ -53,8 +51,6 @@ #include #include -using namespace Qt4ProjectManager; - namespace RemoteLinux { namespace Internal { namespace { diff --git a/src/plugins/remotelinux/remotelinuxruncontrolfactory.cpp b/src/plugins/remotelinux/remotelinuxruncontrolfactory.cpp index 918cdd7429a..36e2820b36d 100644 --- a/src/plugins/remotelinux/remotelinuxruncontrolfactory.cpp +++ b/src/plugins/remotelinux/remotelinuxruncontrolfactory.cpp @@ -72,9 +72,7 @@ bool RemoteLinuxRunControlFactory::canRun(RunConfiguration *runConfiguration, Ru const RemoteLinuxRunConfiguration * const remoteRunConfig = qobject_cast(runConfiguration); if (mode == DebugRunMode) { - LinuxDeviceConfiguration::ConstPtr dev = - ProjectExplorer::DeviceProfileInformation::device(runConfiguration->target()->profile()) - .dynamicCast(); + IDevice::ConstPtr dev = DeviceProfileInformation::device(runConfiguration->target()->profile()); if (dev.isNull()) return false; return remoteRunConfig->portsUsedByDebuggers() <= dev->freePorts().count(); diff --git a/src/plugins/remotelinux/typespecificdeviceconfigurationlistmodel.cpp b/src/plugins/remotelinux/typespecificdeviceconfigurationlistmodel.cpp index 464d21e4578..a09e78a9b34 100644 --- a/src/plugins/remotelinux/typespecificdeviceconfigurationlistmodel.cpp +++ b/src/plugins/remotelinux/typespecificdeviceconfigurationlistmodel.cpp @@ -39,7 +39,7 @@ using namespace ProjectExplorer; namespace RemoteLinux { namespace Internal { -TypeSpecificDeviceConfigurationListModel::TypeSpecificDeviceConfigurationListModel(ProjectExplorer::Target *target) +TypeSpecificDeviceConfigurationListModel::TypeSpecificDeviceConfigurationListModel(Target *target) : QAbstractListModel(target) { const DeviceManager * const devConfs = DeviceManager::instance(); @@ -47,10 +47,6 @@ TypeSpecificDeviceConfigurationListModel::TypeSpecificDeviceConfigurationListMod connect(target, SIGNAL(profileChanged()), this, SIGNAL(modelReset())); } -TypeSpecificDeviceConfigurationListModel::~TypeSpecificDeviceConfigurationListModel() -{ -} - int TypeSpecificDeviceConfigurationListModel::rowCount(const QModelIndex &parent) const { if (parent.isValid()) @@ -70,7 +66,7 @@ QVariant TypeSpecificDeviceConfigurationListModel::data(const QModelIndex &index { if (!index.isValid() || index.row() >= rowCount() || role != Qt::DisplayRole) return QVariant(); - const LinuxDeviceConfiguration::ConstPtr &devConf = deviceAt(index.row()); + const IDevice::ConstPtr &devConf = deviceAt(index.row()); Q_ASSERT(devConf); QString displayedName = devConf->displayName(); if (deviceMatches(devConf) @@ -80,7 +76,7 @@ QVariant TypeSpecificDeviceConfigurationListModel::data(const QModelIndex &index return displayedName; } -LinuxDeviceConfiguration::ConstPtr TypeSpecificDeviceConfigurationListModel::deviceAt(int idx) const +IDevice::ConstPtr TypeSpecificDeviceConfigurationListModel::deviceAt(int idx) const { int currentRow = -1; const DeviceManager * const devConfs = DeviceManager::instance(); @@ -88,13 +84,13 @@ LinuxDeviceConfiguration::ConstPtr TypeSpecificDeviceConfigurationListModel::dev for (int i = 0; i < devConfsCount; ++i) { const IDevice::ConstPtr device = devConfs->deviceAt(i); if (deviceMatches(device) && ++currentRow == idx) - return device.staticCast(); + return device; } QTC_CHECK(false); - return LinuxDeviceConfiguration::ConstPtr(); + return IDevice::ConstPtr(); } -LinuxDeviceConfiguration::ConstPtr TypeSpecificDeviceConfigurationListModel::defaultDeviceConfig() const +IDevice::ConstPtr TypeSpecificDeviceConfigurationListModel::defaultDeviceConfig() const { const DeviceManager * const deviceManager = DeviceManager::instance(); const int deviceCount = deviceManager->deviceCount(); @@ -102,17 +98,17 @@ LinuxDeviceConfiguration::ConstPtr TypeSpecificDeviceConfigurationListModel::def const IDevice::ConstPtr device = deviceManager->deviceAt(i); if (deviceMatches(device) && deviceManager->defaultDevice(device->type()) == device) { - return device.staticCast(); + return device; } } - return LinuxDeviceConfiguration::ConstPtr(); + return IDevice::ConstPtr(); } -LinuxDeviceConfiguration::ConstPtr TypeSpecificDeviceConfigurationListModel::find(Core::Id id) const +IDevice::ConstPtr TypeSpecificDeviceConfigurationListModel::find(Core::Id id) const { const IDevice::ConstPtr &devConf = DeviceManager::instance()->find(id); if (deviceMatches(devConf)) - return devConf.staticCast(); + return devConf; return defaultDeviceConfig(); } @@ -126,12 +122,12 @@ int TypeSpecificDeviceConfigurationListModel::indexForId(Core::Id id) const return -1; } -ProjectExplorer::Target *TypeSpecificDeviceConfigurationListModel::target() const +Target *TypeSpecificDeviceConfigurationListModel::target() const { - return qobject_cast(QObject::parent()); + return qobject_cast(QObject::parent()); } -bool TypeSpecificDeviceConfigurationListModel::deviceMatches(ProjectExplorer::IDevice::ConstPtr dev) const +bool TypeSpecificDeviceConfigurationListModel::deviceMatches(IDevice::ConstPtr dev) const { if (dev.isNull()) return false; diff --git a/src/plugins/remotelinux/typespecificdeviceconfigurationlistmodel.h b/src/plugins/remotelinux/typespecificdeviceconfigurationlistmodel.h index 054c6a9efe6..563d38002d4 100644 --- a/src/plugins/remotelinux/typespecificdeviceconfigurationlistmodel.h +++ b/src/plugins/remotelinux/typespecificdeviceconfigurationlistmodel.h @@ -30,10 +30,9 @@ #ifndef TYPESPECIFICDEVICECONFIGURATIONLISTMODEL_H #define TYPESPECIFICDEVICECONFIGURATIONLISTMODEL_H -#include "linuxdeviceconfiguration.h" +#include #include -#include namespace ProjectExplorer { class Target; } @@ -43,20 +42,18 @@ namespace Internal { class TypeSpecificDeviceConfigurationListModel : public QAbstractListModel { Q_OBJECT + public: explicit TypeSpecificDeviceConfigurationListModel(ProjectExplorer::Target *target); - ~TypeSpecificDeviceConfigurationListModel(); - virtual int rowCount(const QModelIndex &parent = QModelIndex()) const; - virtual QVariant data(const QModelIndex &index, - int role = Qt::DisplayRole) const; - - QSharedPointer deviceAt(int idx) const; - QSharedPointer defaultDeviceConfig() const; - QSharedPointer find(Core::Id id) const; - int indexForId(Core::Id id) const; + int rowCount(const QModelIndex &parent = QModelIndex()) const; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; private: + int indexForId(Core::Id id) const; + ProjectExplorer::IDevice::ConstPtr deviceAt(int idx) const; + ProjectExplorer::IDevice::ConstPtr defaultDeviceConfig() const; + ProjectExplorer::IDevice::ConstPtr find(Core::Id id) const; ProjectExplorer::Target *target() const; bool deviceMatches(ProjectExplorer::IDevice::ConstPtr dev) const; }; From a4ea39871a6db81f889d009e06615e97931f278c Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 26 Jul 2012 13:21:57 +0200 Subject: [PATCH 06/15] projectmanager: style Change-Id: Ic00f11b97f3cb4b14397c59ad9a51fb2c7fd2b48 Reviewed-by: hjk --- src/plugins/qt4projectmanager/makestep.cpp | 86 +++++++++++----------- 1 file changed, 42 insertions(+), 44 deletions(-) diff --git a/src/plugins/qt4projectmanager/makestep.cpp b/src/plugins/qt4projectmanager/makestep.cpp index 37a14b5c90d..24227bdc499 100644 --- a/src/plugins/qt4projectmanager/makestep.cpp +++ b/src/plugins/qt4projectmanager/makestep.cpp @@ -51,25 +51,25 @@ #include using ExtensionSystem::PluginManager; +using namespace ProjectExplorer; using namespace Qt4ProjectManager; using namespace Qt4ProjectManager::Internal; namespace { -const char * const MAKESTEP_BS_ID("Qt4ProjectManager.MakeStep"); - -const char * const MAKE_ARGUMENTS_KEY("Qt4ProjectManager.MakeStep.MakeArguments"); -const char * const MAKE_COMMAND_KEY("Qt4ProjectManager.MakeStep.MakeCommand"); -const char * const CLEAN_KEY("Qt4ProjectManager.MakeStep.Clean"); +const char MAKESTEP_BS_ID[] = "Qt4ProjectManager.MakeStep"; +const char MAKE_ARGUMENTS_KEY[] = "Qt4ProjectManager.MakeStep.MakeArguments"; +const char MAKE_COMMAND_KEY[] = "Qt4ProjectManager.MakeStep.MakeCommand"; +const char CLEAN_KEY[] = "Qt4ProjectManager.MakeStep.Clean"; } -MakeStep::MakeStep(ProjectExplorer::BuildStepList *bsl) : +MakeStep::MakeStep(BuildStepList *bsl) : AbstractProcessStep(bsl, Core::Id(MAKESTEP_BS_ID)), m_clean(false) { ctor(); } -MakeStep::MakeStep(ProjectExplorer::BuildStepList *bsl, MakeStep *bs) : +MakeStep::MakeStep(BuildStepList *bsl, MakeStep *bs) : AbstractProcessStep(bsl, bs), m_clean(bs->m_clean), m_userArgs(bs->m_userArgs), @@ -78,7 +78,7 @@ MakeStep::MakeStep(ProjectExplorer::BuildStepList *bsl, MakeStep *bs) : ctor(); } -MakeStep::MakeStep(ProjectExplorer::BuildStepList *bsl, const Core::Id id) : +MakeStep::MakeStep(BuildStepList *bsl, const Core::Id id) : AbstractProcessStep(bsl, id), m_clean(false) { @@ -121,7 +121,7 @@ QString MakeStep::makeCommand() const QVariantMap MakeStep::toMap() const { - QVariantMap map(ProjectExplorer::AbstractProcessStep::toMap()); + QVariantMap map(AbstractProcessStep::toMap()); map.insert(QLatin1String(MAKE_ARGUMENTS_KEY), m_userArgs); map.insert(QLatin1String(MAKE_COMMAND_KEY), m_makeCmd); map.insert(QLatin1String(CLEAN_KEY), m_clean); @@ -134,7 +134,7 @@ bool MakeStep::fromMap(const QVariantMap &map) m_userArgs = map.value(QLatin1String(MAKE_ARGUMENTS_KEY)).toString(); m_clean = map.value(QLatin1String(CLEAN_KEY)).toBool(); - return ProjectExplorer::AbstractProcessStep::fromMap(map); + return AbstractProcessStep::fromMap(map); } bool MakeStep::init() @@ -145,23 +145,21 @@ bool MakeStep::init() m_tasks.clear(); if (!bc) { - m_tasks.append(ProjectExplorer::Task(ProjectExplorer::Task::Error, - tr("Qt Creator needs a build configuration set up to build. Configure a tool chain in Project mode."), + m_tasks.append(Task(Task::Error, tr("Qt Creator needs a build configuration set up to build. Configure a tool chain in Project mode."), Utils::FileName(), -1, - Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))); + Core::Id(Constants::TASK_CATEGORY_BUILDSYSTEM))); return false; } - ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(target()->profile()); + ToolChain *tc = ToolChainProfileInformation::toolChain(target()->profile()); if (!tc) { - m_tasks.append(ProjectExplorer::Task(ProjectExplorer::Task::Error, - tr("Qt Creator needs a tool chain set up to build. Configure a tool chain the profile options."), + m_tasks.append(Task(Task::Error, tr("Qt Creator needs a tool chain set up to build. Configure a tool chain the profile options."), Utils::FileName(), -1, - Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))); + Core::Id(Constants::TASK_CATEGORY_BUILDSYSTEM))); return false; } - ProjectExplorer::ProcessParameters *pp = processParameters(); + ProcessParameters *pp = processParameters(); pp->setMacroExpander(bc->macroExpander()); QString workingDirectory; @@ -246,10 +244,10 @@ bool MakeStep::init() // but for now this is the least invasive change // We also prepend "L" to the MAKEFLAGS, so that nmake / jom are less verbose if (tc && m_makeCmd.isEmpty()) { - if (tc->targetAbi().binaryFormat() != ProjectExplorer::Abi::PEFormat ) + if (tc->targetAbi().binaryFormat() != Abi::PEFormat ) Utils::QtcProcess::addArg(&args, QLatin1String("-w")); - if (tc->targetAbi().os() == ProjectExplorer::Abi::WindowsOS - && tc->targetAbi().osFlavor() != ProjectExplorer::Abi::WindowsMSysFlavor) { + if (tc->targetAbi().os() == Abi::WindowsOS + && tc->targetAbi().osFlavor() != Abi::WindowsMSysFlavor) { const QString makeFlags = QLatin1String("MAKEFLAGS"); env.set(makeFlags, QLatin1Char('L') + env.value(makeFlags)); } @@ -258,7 +256,7 @@ bool MakeStep::init() pp->setEnvironment(env); pp->setArguments(args); - ProjectExplorer::IOutputParser *parser = 0; + IOutputParser *parser = 0; QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target()->profile()); if (version) parser = version->createOutputParser(); @@ -294,9 +292,9 @@ void MakeStep::run(QFutureInterface & fi) // Warn on common error conditions: bool canContinue = true; - foreach (const ProjectExplorer::Task &t, m_tasks) { + foreach (const Task &t, m_tasks) { addTask(t); - if (t.type == ProjectExplorer::Task::Error) + if (t.type == Task::Error) canContinue = false; } if (!canContinue) { @@ -322,7 +320,7 @@ bool MakeStep::immutable() const return false; } -ProjectExplorer::BuildStepConfigWidget *MakeStep::createConfigWidget() +BuildStepConfigWidget *MakeStep::createConfigWidget() { return new MakeStepConfigWidget(this); } @@ -361,13 +359,13 @@ MakeStepConfigWidget::MakeStepConfigWidget(MakeStep *makeStep) connect(makeStep, SIGNAL(userArgumentsChanged()), this, SLOT(userArgumentsChanged())); - ProjectExplorer::BuildConfiguration *bc = makeStep->buildConfiguration(); + BuildConfiguration *bc = makeStep->buildConfiguration(); if (!bc) { // That means the step is in the deploylist, so we listen to the active build config // changed signal and react to the buildDirectoryChanged() signal of the buildconfiguration bc = makeStep->target()->activeBuildConfiguration(); m_bc = bc; - connect (makeStep->target(), SIGNAL(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*)), + connect (makeStep->target(), SIGNAL(activeBuildConfigurationChanged(BuildConfiguration*)), this, SLOT(activeBuildConfigurationChanged())); } @@ -376,7 +374,7 @@ MakeStepConfigWidget::MakeStepConfigWidget(MakeStep *makeStep) this, SLOT(updateDetails())); } - connect(ProjectExplorer::ProjectExplorerPlugin::instance(), SIGNAL(settingsChanged()), + connect(ProjectExplorerPlugin::instance(), SIGNAL(settingsChanged()), this, SLOT(updateDetails())); connect(m_makeStep->target(), SIGNAL(profileChanged()), this, SLOT(updateDetails())); } @@ -412,8 +410,8 @@ MakeStepConfigWidget::~MakeStepConfigWidget() void MakeStepConfigWidget::updateDetails() { - ProjectExplorer::ToolChain *tc - = ProjectExplorer::ToolChainProfileInformation::toolChain(m_makeStep->target()->profile()); + ToolChain *tc + = ToolChainProfileInformation::toolChain(m_makeStep->target()->profile()); if (tc) m_ui->makeLabel->setText(tr("Override %1:").arg(tc->makeCommand())); else @@ -431,7 +429,7 @@ void MakeStepConfigWidget::updateDetails() return; } - ProjectExplorer::ProcessParameters param; + ProcessParameters param; param.setMacroExpander(bc->macroExpander()); param.setWorkingDirectory(bc->buildDirectory()); QString makeCmd = tc->makeCommand(); @@ -456,10 +454,10 @@ void MakeStepConfigWidget::updateDetails() // but for now this is the least invasive change // We also prepend "L" to the MAKEFLAGS, so that nmake / jom are less verbose if (tc && m_makeStep->makeCommand().isEmpty()) { - if (tc->targetAbi().binaryFormat() != ProjectExplorer::Abi::PEFormat ) + if (tc->targetAbi().binaryFormat() != Abi::PEFormat ) Utils::QtcProcess::addArg(&args, QLatin1String("-w")); - if (tc->targetAbi().os() == ProjectExplorer::Abi::WindowsOS - && tc->targetAbi().osFlavor() != ProjectExplorer::Abi::WindowsMSysFlavor) { + if (tc->targetAbi().os() == Abi::WindowsOS + && tc->targetAbi().osFlavor() != Abi::WindowsMSysFlavor) { const QString makeFlags = QLatin1String("MAKEFLAGS"); env.set(makeFlags, QLatin1Char('L') + env.value(makeFlags)); } @@ -510,7 +508,7 @@ void MakeStepConfigWidget::makeArgumentsLineEdited() /// MakeStepFactory::MakeStepFactory(QObject *parent) : - ProjectExplorer::IBuildStepFactory(parent) + IBuildStepFactory(parent) { } @@ -518,43 +516,43 @@ MakeStepFactory::~MakeStepFactory() { } -bool MakeStepFactory::canCreate(ProjectExplorer::BuildStepList *parent, const Core::Id id) const +bool MakeStepFactory::canCreate(BuildStepList *parent, const Core::Id id) const { if (parent->target()->project()->id() != Core::Id(Constants::QT4PROJECT_ID)) return false; return (id == Core::Id(MAKESTEP_BS_ID)); } -ProjectExplorer::BuildStep *MakeStepFactory::create(ProjectExplorer::BuildStepList *parent, const Core::Id id) +BuildStep *MakeStepFactory::create(BuildStepList *parent, const Core::Id id) { if (!canCreate(parent, id)) return 0; MakeStep *step = new MakeStep(parent); - if (parent->id() == Core::Id(ProjectExplorer::Constants::BUILDSTEPS_CLEAN)) { + if (parent->id() == Core::Id(Constants::BUILDSTEPS_CLEAN)) { step->setClean(true); step->setUserArguments(QLatin1String("clean")); } return step; } -bool MakeStepFactory::canClone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *source) const +bool MakeStepFactory::canClone(BuildStepList *parent, BuildStep *source) const { return canCreate(parent, source->id()); } -ProjectExplorer::BuildStep *MakeStepFactory::clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *source) +BuildStep *MakeStepFactory::clone(BuildStepList *parent, BuildStep *source) { if (!canClone(parent, source)) return 0; return new MakeStep(parent, static_cast(source)); } -bool MakeStepFactory::canRestore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map) const +bool MakeStepFactory::canRestore(BuildStepList *parent, const QVariantMap &map) const { - return canCreate(parent, ProjectExplorer::idFromMap(map)); + return canCreate(parent, idFromMap(map)); } -ProjectExplorer::BuildStep *MakeStepFactory::restore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map) +BuildStep *MakeStepFactory::restore(BuildStepList *parent, const QVariantMap &map) { if (!canRestore(parent, map)) return 0; @@ -565,7 +563,7 @@ ProjectExplorer::BuildStep *MakeStepFactory::restore(ProjectExplorer::BuildStepL return 0; } -QList MakeStepFactory::availableCreationIds(ProjectExplorer::BuildStepList *parent) const +QList MakeStepFactory::availableCreationIds(BuildStepList *parent) const { if (parent->target()->project()->id() == Core::Id(Constants::QT4PROJECT_ID)) return QList() << Core::Id(MAKESTEP_BS_ID); From 78d59afa8d8a83d5433fe9012a55e1caac692e5f Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Thu, 26 Jul 2012 14:41:29 +0300 Subject: [PATCH 07/15] Dumper: Rename upcast -> downcast Change-Id: I776373da348a961e3daf2c45bbbb84ca4736512a Reviewed-by: hjk --- share/qtcreator/dumper/dumper.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/share/qtcreator/dumper/dumper.py b/share/qtcreator/dumper/dumper.py index e1a9066764e..fefc81b8f58 100644 --- a/share/qtcreator/dumper/dumper.py +++ b/share/qtcreator/dumper/dumper.py @@ -117,7 +117,7 @@ def dynamicTypeName(value): pass return str(value.type) -def upcast(value): +def downcast(value): try: return value.cast(value.dynamic_type) except: @@ -128,7 +128,7 @@ def upcast(value): # pass return value -def expensiveUpcast(value): +def expensiveDowncast(value): try: return value.cast(value.dynamic_type) except: @@ -1054,7 +1054,7 @@ class Dumper: pass for item in locals: - value = upcast(item.value) + value = downcast(item.value) with OutputSafer(self): self.anonNumber = -1 @@ -1639,7 +1639,7 @@ class Dumper: if self.useDynamicType and tryDynamic: - self.putItem(expensiveUpcast(value), False) + self.putItem(expensiveDowncast(value), False) return format = self.formats.get(self.currentIName) @@ -1669,7 +1669,7 @@ class Dumper: dumper = qqDumpers.get(nsStrippedType, None) if not dumper is None: if tryDynamic: - dumper(self, expensiveUpcast(value)) + dumper(self, expensiveDowncast(value)) else: dumper(self, value) return @@ -1789,7 +1789,7 @@ class Dumper: #if not bitsize is None: # self.put("bitsize=\"%s\",bitpos=\"%s\"," # % (bitsize, bitpos)) - self.putItem(upcast(value[field.name])) + self.putItem(downcast(value[field.name])) def listAnonymous(self, value, name, type): From 99629d105968eefea46e9abf6fb3ba665b596732 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Thu, 26 Jul 2012 14:48:31 +0300 Subject: [PATCH 08/15] Dumper: Missed upcast -> downcast rename Change-Id: Ib16cf6356a94e652f09eadaf46c8579a801cc580 Reviewed-by: hjk --- share/qtcreator/dumper/qttypes.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/share/qtcreator/dumper/qttypes.py b/share/qtcreator/dumper/qttypes.py index c19f52321c6..34aa82e59b1 100644 --- a/share/qtcreator/dumper/qttypes.py +++ b/share/qtcreator/dumper/qttypes.py @@ -2003,7 +2003,7 @@ def qdump__std__shared_ptr(d, value): if isSimpleType(templateArgument(value.type, 0)): d.putValue("%s @0x%x" % (i.dereference(), long(i))) else: - i = expensiveUpcast(i) + i = expensiveDowncast(i) d.putValue("@0x%x" % long(i)) d.putNumChild(3) @@ -2024,7 +2024,7 @@ def qdump__std__unique_ptr(d, value): if isSimpleType(templateArgument(value.type, 0)): d.putValue("%s @0x%x" % (i.dereference(), long(i))) else: - i = expensiveUpcast(i) + i = expensiveDowncast(i) d.putValue("@0x%x" % long(i)) d.putNumChild(1) From 26b358e87c3ff465c89db6a2b150c8e59054fdac Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 26 Jul 2012 13:45:03 +0200 Subject: [PATCH 09/15] Doc: update screenshot with all output panes visible Change-Id: I1deb8b35f3a7b015ba2a7e5cfd419f145097b643 Reviewed-by: Leena Miettinen --- doc/images/qtcreator-breakdown.png | Bin 36428 -> 33962 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/images/qtcreator-breakdown.png b/doc/images/qtcreator-breakdown.png index 30d4f9c40ca608fce94eea4af96db1b8f241ec93..5cbaa5e9a8bc6d40f719dd6145bcef7728aefcb3 100644 GIT binary patch literal 33962 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%0DQ}X|y|F!D+z8UojaeH?b9-lIg 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 From fafda6354b30b2e6f314faaf1ea137dba1a71aa3 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 26 Jul 2012 13:50:32 +0200 Subject: [PATCH 10/15] Doc: update screenshot of Configure Project view Change-Id: I9cc43f3d0f8479b5273bb2672e404912fee572dc Reviewed-by: Leena Miettinen --- .../qtcreator-gs-build-example-targets.png | Bin 15326 -> 14105 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/images/qtcreator-gs-build-example-targets.png b/doc/images/qtcreator-gs-build-example-targets.png index 72437f6789d80bf59d1c7d4c10714748b94f5dd9..13a9255ad017a67e2346bb2ce2cb2af7e1ee7c9f 100644 GIT binary patch literal 14105 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 C7-1;@ From 42a26ad450f6a8ffe9bcb8a5c59ec79952ce6f96 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 26 Jul 2012 14:15:13 +0200 Subject: [PATCH 11/15] compile fix Change-Id: I619b710c403ed365b1e7b63bc8fdf0a2b853d9c8 Reviewed-by: hjk --- src/plugins/qt4projectmanager/makestep.cpp | 6 +++--- src/plugins/qt4projectmanager/makestep.h | 2 -- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/plugins/qt4projectmanager/makestep.cpp b/src/plugins/qt4projectmanager/makestep.cpp index 24227bdc499..5105a6130bf 100644 --- a/src/plugins/qt4projectmanager/makestep.cpp +++ b/src/plugins/qt4projectmanager/makestep.cpp @@ -147,7 +147,7 @@ bool MakeStep::init() if (!bc) { m_tasks.append(Task(Task::Error, tr("Qt Creator needs a build configuration set up to build. Configure a tool chain in Project mode."), Utils::FileName(), -1, - Core::Id(Constants::TASK_CATEGORY_BUILDSYSTEM))); + Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))); return false; } @@ -155,7 +155,7 @@ bool MakeStep::init() if (!tc) { m_tasks.append(Task(Task::Error, tr("Qt Creator needs a tool chain set up to build. Configure a tool chain the profile options."), Utils::FileName(), -1, - Core::Id(Constants::TASK_CATEGORY_BUILDSYSTEM))); + Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))); return false; } @@ -528,7 +528,7 @@ BuildStep *MakeStepFactory::create(BuildStepList *parent, const Core::Id id) if (!canCreate(parent, id)) return 0; MakeStep *step = new MakeStep(parent); - if (parent->id() == Core::Id(Constants::BUILDSTEPS_CLEAN)) { + if (parent->id() == Core::Id(ProjectExplorer::Constants::BUILDSTEPS_CLEAN)) { step->setClean(true); step->setUserArguments(QLatin1String("clean")); } diff --git a/src/plugins/qt4projectmanager/makestep.h b/src/plugins/qt4projectmanager/makestep.h index 7f9fa56c266..8c4ed24c344 100644 --- a/src/plugins/qt4projectmanager/makestep.h +++ b/src/plugins/qt4projectmanager/makestep.h @@ -39,9 +39,7 @@ namespace ProjectExplorer { class BuildStep; -class GnuMakeParser; class IBuildStepFactory; -class Project; } namespace Qt4ProjectManager { From 8eae872660c24a5f6e426b0f1a8980f6b5a98fcb Mon Sep 17 00:00:00 2001 From: Lukas Holecek Date: Wed, 25 Jul 2012 19:38:58 +0200 Subject: [PATCH 12/15] fakevim: Fix for searches with an empty match If searching (in "/" command mode) with regular expression "\\b" or ".{0}" the search takes infinitely long. This fix highlights one character to the right of empty match (behaviour is similar in Vim). Change-Id: I5113177cf6af0ef0197e14f0165227e7538a3d1d Reviewed-by: hjk --- src/plugins/fakevim/fakevimhandler.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp index f8d1e01a6a3..67669701a1e 100644 --- a/src/plugins/fakevim/fakevimhandler.cpp +++ b/src/plugins/fakevim/fakevimhandler.cpp @@ -3920,11 +3920,6 @@ static QRegExp vimPatternToQtPattern(QString needle, QTextDocument::FindFlags *f // FIXME: Rough mapping of a common case. if (needle.startsWith(_("\\<")) && needle.endsWith(_("\\>"))) (*flags) |= QTextDocument::FindWholeWords; - // Half-hearted attempt at removing pitfalls. - if (needle.startsWith(_(".*"))) - needle = needle.mid(2); - if (needle.endsWith(_(".*"))) - needle = needle.left(needle.size() - 2); needle.remove(_("\\<")); // start of word needle.remove(_("\\>")); // end of word @@ -4046,6 +4041,8 @@ void FakeVimHandler::Private::highlightMatches(const QString &needle) tc = tc.document()->find(needleExp, tc.position(), flags); if (tc.isNull()) break; + if (!tc.hasSelection()) + tc.movePosition(Right, KeepAnchor, 1); QTextEdit::ExtraSelection sel; sel.cursor = tc; sel.format = tc.blockCharFormat(); From ed7c80d4c6f0c1268836f6079d78e4560661412b Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Thu, 26 Jul 2012 14:53:45 +0200 Subject: [PATCH 13/15] Normalized connect()s Change-Id: Ieb95bd04026d4a8ba824e6355031954332654e99 Reviewed-by: hjk --- .../qtcreator/templates/wizards/bb-qt5-quick2app/main.cpp | 4 ++-- src/plugins/android/androiddebugsupport.cpp | 8 ++++---- src/plugins/android/androidruncontrol.cpp | 4 ++-- src/plugins/coreplugin/documentmanager.cpp | 4 ++-- src/plugins/debugger/memoryagent.cpp | 4 ++-- src/plugins/qnx/blackberryabstractdeploystep.cpp | 2 +- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/share/qtcreator/templates/wizards/bb-qt5-quick2app/main.cpp b/share/qtcreator/templates/wizards/bb-qt5-quick2app/main.cpp index c90d2f8a6c8..73140fdcc37 100644 --- a/share/qtcreator/templates/wizards/bb-qt5-quick2app/main.cpp +++ b/share/qtcreator/templates/wizards/bb-qt5-quick2app/main.cpp @@ -14,8 +14,8 @@ int main( int argc, char** argv ) view->setSource( QUrl( "app/native/qml/main.qml" ) ); QDeclarativeEngine* engine = view->engine(); - QObject::connect( engine, SIGNAL( quit() ), - QCoreApplication::instance(), SLOT( quit() ) ); + QObject::connect( engine, SIGNAL(quit()), + QCoreApplication::instance(), SLOT(quit()) ); window = view; window->showMaximized(); diff --git a/src/plugins/android/androiddebugsupport.cpp b/src/plugins/android/androiddebugsupport.cpp index 8459b047433..5e20cd67716 100644 --- a/src/plugins/android/androiddebugsupport.cpp +++ b/src/plugins/android/androiddebugsupport.cpp @@ -124,8 +124,8 @@ AndroidDebugSupport::AndroidDebugSupport(AndroidRunConfiguration *runConfig, connect(m_runner, SIGNAL(remoteProcessStarted(int,int)), SLOT(handleRemoteProcessStarted(int,int))); - connect(m_runner, SIGNAL(remoteProcessFinished(const QString &)), - SLOT(handleRemoteProcessFinished(const QString &))); + connect(m_runner, SIGNAL(remoteProcessFinished(QString)), + SLOT(handleRemoteProcessFinished(QString))); connect(m_runner, SIGNAL(remoteErrorOutput(QByteArray)), SLOT(handleRemoteErrorOutput(QByteArray))); @@ -146,8 +146,8 @@ void AndroidDebugSupport::handleRemoteProcessStarted(int gdbServerPort, int qmlP void AndroidDebugSupport::handleRemoteProcessFinished(const QString &errorMsg) { - disconnect(m_runner, SIGNAL(remoteProcessFinished(const QString &)), - this,SLOT(handleRemoteProcessFinished(const QString &))); + disconnect(m_runner, SIGNAL(remoteProcessFinished(QString)), + this,SLOT(handleRemoteProcessFinished(QString))); m_runControl->engine()->notifyEngineRemoteSetupFailed(errorMsg); } diff --git a/src/plugins/android/androidruncontrol.cpp b/src/plugins/android/androidruncontrol.cpp index c65973e6fe9..782a5059210 100644 --- a/src/plugins/android/androidruncontrol.cpp +++ b/src/plugins/android/androidruncontrol.cpp @@ -67,8 +67,8 @@ void AndroidRunControl::start() SLOT(handleRemoteErrorOutput(QByteArray))); connect(m_runner, SIGNAL(remoteOutput(QByteArray)), SLOT(handleRemoteOutput(QByteArray))); - connect(m_runner, SIGNAL(remoteProcessFinished(const QString &)), - SLOT(handleRemoteProcessFinished(const QString &))); + connect(m_runner, SIGNAL(remoteProcessFinished(QString)), + SLOT(handleRemoteProcessFinished(QString))); appendMessage(tr("Starting remote process ..."), Utils::NormalMessageFormat); m_runner->start(); } diff --git a/src/plugins/coreplugin/documentmanager.cpp b/src/plugins/coreplugin/documentmanager.cpp index a857a8c85da..7a1b0c5ab35 100644 --- a/src/plugins/coreplugin/documentmanager.cpp +++ b/src/plugins/coreplugin/documentmanager.cpp @@ -292,7 +292,7 @@ void DocumentManager::addDocuments(const QList &documents, bool add foreach (IDocument *document, documents) { if (document && !d->m_documentsWithoutWatch.contains(document)) { connect(document, SIGNAL(destroyed(QObject*)), m_instance, SLOT(documentDestroyed(QObject*))); - connect(document, SIGNAL(fileNameChanged(QString,QString)), m_instance, SLOT(fileNameChanged(QString, QString))); + connect(document, SIGNAL(fileNameChanged(QString,QString)), m_instance, SLOT(fileNameChanged(QString,QString))); d->m_documentsWithoutWatch.append(document); } } @@ -303,7 +303,7 @@ void DocumentManager::addDocuments(const QList &documents, bool add if (document && !d->m_documentsWithWatch.contains(document)) { connect(document, SIGNAL(changed()), m_instance, SLOT(checkForNewFileName())); connect(document, SIGNAL(destroyed(QObject*)), m_instance, SLOT(documentDestroyed(QObject*))); - connect(document, SIGNAL(fileNameChanged(QString,QString)), m_instance, SLOT(fileNameChanged(QString, QString))); + connect(document, SIGNAL(fileNameChanged(QString,QString)), m_instance, SLOT(fileNameChanged(QString,QString))); addFileInfo(document); } } diff --git a/src/plugins/debugger/memoryagent.cpp b/src/plugins/debugger/memoryagent.cpp index 0b55844bae1..022ea2d342b 100644 --- a/src/plugins/debugger/memoryagent.cpp +++ b/src/plugins/debugger/memoryagent.cpp @@ -154,8 +154,8 @@ void MemoryAgent::connectBinEditorWidget(QWidget *w) SIGNAL(dataChanged(Core::IEditor*,quint64,QByteArray)), SLOT(handleDataChanged(Core::IEditor*,quint64,QByteArray))); connect(w, - SIGNAL(addWatchpointRequested(quint64, uint)), - SLOT(handleWatchpointRequest(quint64, uint))); + SIGNAL(addWatchpointRequested(quint64,uint)), + SLOT(handleWatchpointRequest(quint64,uint))); } bool MemoryAgent::doCreateBinEditor(quint64 addr, unsigned flags, diff --git a/src/plugins/qnx/blackberryabstractdeploystep.cpp b/src/plugins/qnx/blackberryabstractdeploystep.cpp index f178c8ceaf2..755a19883eb 100644 --- a/src/plugins/qnx/blackberryabstractdeploystep.cpp +++ b/src/plugins/qnx/blackberryabstractdeploystep.cpp @@ -143,7 +143,7 @@ void BlackBerryAbstractDeployStep::runCommands() m_process->setEnvironment(m_environment); m_process->setWorkingDirectory(m_buildDirectory); - connect(m_process, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(handleProcessFinished(int, QProcess::ExitStatus)), Qt::DirectConnection); + connect(m_process, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(handleProcessFinished(int,QProcess::ExitStatus)), Qt::DirectConnection); runNextCommand(); } From 455b677f8e2f4d18fd3a8fe18fbf0e2d2cce5ba2 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 26 Jul 2012 16:08:41 +0200 Subject: [PATCH 14/15] tr()-fixes for 2.6 - 'profile' -> 'target'. - 'qt version' -> 'Qt version'. Fix occurrences in comments as well to make grepping easier. - Placeholders. Change-Id: I451eae2f0571bccf1e75cf0def425a09fa80855b Reviewed-by: hjk --- src/plugins/help/helpplugin.cpp | 2 +- src/plugins/madde/maemoqemumanager.cpp | 8 ++++---- src/plugins/madde/maemoqemumanager.h | 2 +- src/plugins/qt4projectmanager/makestep.cpp | 4 ++-- src/plugins/qt4projectmanager/qt4buildconfiguration.cpp | 4 ++-- src/plugins/qt4projectmanager/qt4buildconfiguration.h | 4 ++-- src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp | 4 ++-- src/plugins/qtsupport/baseqtversion.h | 2 +- src/plugins/qtsupport/exampleslistmodel.cpp | 2 +- src/plugins/qtsupport/qtoptionspage.cpp | 8 ++++---- src/plugins/qtsupport/qtversionmanager.cpp | 4 ++-- 11 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/plugins/help/helpplugin.cpp b/src/plugins/help/helpplugin.cpp index 4b471119ecd..2af6e437e1e 100644 --- a/src/plugins/help/helpplugin.cpp +++ b/src/plugins/help/helpplugin.cpp @@ -925,7 +925,7 @@ void HelpPlugin::activateContext() QUrl source = *links.begin(); const QLatin1String qtRefDoc = QLatin1String("com.trolltech.qt"); - // workaround to show the latest qt version + // workaround to show the latest Qt version foreach (const QUrl &tmp, links) { const QString &authority = tmp.authority(); if (authority.startsWith(qtRefDoc)) { diff --git a/src/plugins/madde/maemoqemumanager.cpp b/src/plugins/madde/maemoqemumanager.cpp index 36300472bf5..6140ee761bd 100644 --- a/src/plugins/madde/maemoqemumanager.cpp +++ b/src/plugins/madde/maemoqemumanager.cpp @@ -102,7 +102,7 @@ MaemoQemuManager::MaemoQemuManager(QObject *parent) m_qemuAction->setEnabled(false); m_qemuAction->setVisible(false); - // listen to qt version changes to update the start button + // listen to Qt version changes to update the start button connect(QtSupport::QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList,QList,QList)), this, SLOT(qtVersionsChanged(QList,QList,QList))); @@ -195,7 +195,7 @@ void MaemoQemuManager::qtVersionsChanged(const QList &added, const QListprofile())) return; - // handle the qt version changes the build configuration uses + // handle the Qt version changes the build configuration uses connect(target, SIGNAL(environmentChanged()), this, SLOT(environmentChanged())); connect(target, SIGNAL(profileChanged()), this, SLOT(systemChanged())); @@ -283,7 +283,7 @@ void MaemoQemuManager::systemChanged() void MaemoQemuManager::environmentChanged() { - // likely to happen when the qt version changes the build config is using + // likely to happen when the Qt version changes the build config is using if (ProjectExplorerPlugin *explorer = ProjectExplorerPlugin::instance()) { if (Project *project = explorer->session()->startupProject()) toggleStarterButton(project->activeTarget()); diff --git a/src/plugins/madde/maemoqemumanager.h b/src/plugins/madde/maemoqemumanager.h index a1eaf5db27a..01c620ac143 100644 --- a/src/plugins/madde/maemoqemumanager.h +++ b/src/plugins/madde/maemoqemumanager.h @@ -83,7 +83,7 @@ private slots: void targetChanged(ProjectExplorer::Target *target); void systemChanged(); - void environmentChanged(); // needed to check for qt version + void environmentChanged(); // needed to check for Qt version void deviceConfigurationChanged(ProjectExplorer::Target *target); void terminateRuntime(); diff --git a/src/plugins/qt4projectmanager/makestep.cpp b/src/plugins/qt4projectmanager/makestep.cpp index 5105a6130bf..847c80628d3 100644 --- a/src/plugins/qt4projectmanager/makestep.cpp +++ b/src/plugins/qt4projectmanager/makestep.cpp @@ -153,7 +153,7 @@ bool MakeStep::init() ToolChain *tc = ToolChainProfileInformation::toolChain(target()->profile()); if (!tc) { - m_tasks.append(Task(Task::Error, tr("Qt Creator needs a tool chain set up to build. Configure a tool chain the profile options."), + m_tasks.append(Task(Task::Error, tr("Qt Creator needs a tool chain set up to build. Configure a tool chain the target options."), Utils::FileName(), -1, Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))); return false; @@ -418,7 +418,7 @@ void MakeStepConfigWidget::updateDetails() m_ui->makeLabel->setText(tr("Make:")); if (!tc) { - setSummaryText(tr("Make: No tool chain set in profile.")); + setSummaryText(tr("Make: No tool chain set in target.")); return; } Qt4BuildConfiguration *bc = m_makeStep->qt4BuildConfiguration(); diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp index 20966cd3ab3..e89bba2ab7c 100644 --- a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp @@ -151,7 +151,7 @@ void Qt4BuildConfiguration::profileChanged() void Qt4BuildConfiguration::emitBuildDirectoryChanged() { - // We also emit buildDirectoryChanged if the the qt version's supportShadowBuild changed + // We also emit buildDirectoryChanged if the the Qt version's supportShadowBuild changed if (buildDirectory() != m_lastEmmitedBuildDirectory || supportsShadowBuilds() != m_qtVersionSupportsShadowBuilds) { m_lastEmmitedBuildDirectory = buildDirectory(); @@ -442,7 +442,7 @@ Qt4BuildConfiguration::MakefileState Qt4BuildConfiguration::compareToImportFrom( } } else { if (debug) - qDebug()<<"diffrent qt versions, buildconfiguration:"<qmakeCommand().toString()<<" Makefile:"<qmakeCommand().toString() << " Makefile:"<< qmakePath.toString(); return MakefileForWrongProject; } } diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.h b/src/plugins/qt4projectmanager/qt4buildconfiguration.h index 06e6a106e86..92cddb898f5 100644 --- a/src/plugins/qt4projectmanager/qt4buildconfiguration.h +++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.h @@ -123,14 +123,14 @@ public: QString additionalArguments, QString directory, bool importing); - /// returns whether the qt version in the profile supports shadow building (also true for no qt version) + /// returns whether the Qt version in the profile supports shadow building (also true for no Qt version) bool supportsShadowBuilds(); public slots: void emitEvaluateBuildSystem(); signals: - /// emitted for setQMakeBuildConfig, not emitted for qt version changes, even + /// emitted for setQMakeBuildConfig, not emitted for Qt version changes, even /// if those change the qmakebuildconfig void qmakeBuildConfigurationChanged(); /// emitted when smart installer property of S60 create package step changes diff --git a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp index c7fb94a4583..4369a1b9e86 100644 --- a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp +++ b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp @@ -111,7 +111,7 @@ Qt4ProjectConfigWidget::~Qt4ProjectConfigWidget() void Qt4ProjectConfigWidget::updateDetails() { m_detailsContainer->setSummaryText( - tr("building in %3") + tr("building in %1") .arg(QDir::toNativeSeparators(m_buildConfiguration->buildDirectory()))); } @@ -245,7 +245,7 @@ void Qt4ProjectConfigWidget::updateProblemLabel() QString shadowBuildWarning; if (!version->supportsShadowBuilds() && m_buildConfiguration->shadowBuild()) { - shadowBuildWarning =tr("The qt version %1 does not support shadow builds, building might fail.") + shadowBuildWarning =tr("The Qt version %1 does not support shadow builds, building might fail.") .arg(version->displayName()) + QLatin1String("
"); } diff --git a/src/plugins/qtsupport/baseqtversion.h b/src/plugins/qtsupport/baseqtversion.h index 5b4461811c3..8051e6d147b 100644 --- a/src/plugins/qtsupport/baseqtversion.h +++ b/src/plugins/qtsupport/baseqtversion.h @@ -245,7 +245,7 @@ private: QString findQtBinary(Binaries binary) const; void updateMkspec() const; void setId(int id); // used by the qtversionmanager for legacy restore - // and by the qtoptionspage to replace qt versions + // and by the qtoptionspage to replace Qt versions QString m_displayName; int m_id; bool m_isAutodetected; diff --git a/src/plugins/qtsupport/exampleslistmodel.cpp b/src/plugins/qtsupport/exampleslistmodel.cpp index 75b424fe222..8fec6169642 100644 --- a/src/plugins/qtsupport/exampleslistmodel.cpp +++ b/src/plugins/qtsupport/exampleslistmodel.cpp @@ -326,7 +326,7 @@ QStringList ExamplesListModel::exampleSources(QString *examplesFallback, QString return sources; // try to find a suitable Qt version - m_updateOnQtVersionsChanged = true; // this must be updated when the qt versions change + m_updateOnQtVersionsChanged = true; // this must be updated when the Qt versions change // fallbacks are passed back if no example manifest is found // and we fallback to Qt Creator's shipped manifest (e.g. only old Qt Versions found) QString potentialExamplesFallback; diff --git a/src/plugins/qtsupport/qtoptionspage.cpp b/src/plugins/qtsupport/qtoptionspage.cpp index 803de478cb6..f0c0ab580d4 100644 --- a/src/plugins/qtsupport/qtoptionspage.cpp +++ b/src/plugins/qtsupport/qtoptionspage.cpp @@ -700,7 +700,7 @@ void QtOptionsPageWidget::editPath() if (current->type() != version->type()) { // not the same type, error out QMessageBox::critical(this, tr("Qt versions incompatible"), - tr("The qt version selected must be for the same target."), + tr("The Qt version selected must be for the same target."), QMessageBox::Ok); delete version; return; @@ -911,7 +911,7 @@ void QtOptionsPageWidget::updateDebuggingHelperUi() } } -// To be called if a qt version was removed or added +// To be called if a Qt version was removed or added void QtOptionsPageWidget::updateCleanUpButton() { bool hasInvalidVersion = false; @@ -1057,7 +1057,7 @@ void QtOptionsPageWidget::apply() this, SLOT(updateQtVersions(QList,QList,QList))); } -/* Checks that the qt version name is unique +/* Checks that the Qt version name is unique * and otherwise changes the name * */ @@ -1115,7 +1115,7 @@ QString QtOptionsPageWidget::searchKeywords() const // Symbian specific, could be factored out to the factory // checking m_configurationWidget is not enough, we want them to be a keyword - // regardless of which qt versions configuration widget is currently active + // regardless of which Qt versions configuration widget is currently active ts << sep << tr("S60 SDK:") << sep << tr("SBS v2 directory:"); diff --git a/src/plugins/qtsupport/qtversionmanager.cpp b/src/plugins/qtsupport/qtversionmanager.cpp index 94bcd5b91a3..856d3fa9281 100644 --- a/src/plugins/qtsupport/qtversionmanager.cpp +++ b/src/plugins/qtsupport/qtversionmanager.cpp @@ -141,7 +141,7 @@ void QtVersionManager::extensionsInitialized() if (!success) { // We did neither restore our settings or upgraded // in that case figure out if there's a qt in path - // and add it to the qt versions + // and add it to the Qt versions findSystemQt(); } @@ -288,7 +288,7 @@ void QtVersionManager::updateFromInstaller() qDebug("Warning: Unable to find factory for type '%s'", qPrintable(type)); continue; } - // First try to find a existing qt version to update + // First try to find a existing Qt version to update bool restored = false; foreach (BaseQtVersion *v, m_versions) { if (v->autodetectionSource() == autoDetectionSource) { From 16a813694fec48d15de7d98b4c3428817d8e009d Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Thu, 26 Jul 2012 16:41:51 +0200 Subject: [PATCH 15/15] Improved check for NULL-pointer deref Change-Id: I48c49f1463a70c269ac25dc1ea691d020724abb8 Reviewed-by: Aurindam Jana --- src/plugins/debugger/qml/qmlinspectoradapter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/debugger/qml/qmlinspectoradapter.cpp b/src/plugins/debugger/qml/qmlinspectoradapter.cpp index 2b395fbfd5a..8a3dd71a1ee 100644 --- a/src/plugins/debugger/qml/qmlinspectoradapter.cpp +++ b/src/plugins/debugger/qml/qmlinspectoradapter.cpp @@ -285,7 +285,7 @@ void QmlInspectorAdapter::createPreviewForEditor(Core::IEditor *newEditor) if (!m_engineClientConnected) return; - if (newEditor && newEditor->id() + if (!newEditor || newEditor->id() != QmlJSEditor::Constants::C_QMLJSEDITOR_ID) return;