forked from qt-creator/qt-creator
ProjectExplorer: Move RunControl related classes to separate file pair
Change-Id: I5da56f80336673d595907abcc797f628be680cd5 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
@@ -25,7 +25,7 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <projectexplorer/runconfiguration.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
#include <utils/environment.h>
|
||||
|
||||
namespace Android {
|
||||
|
@@ -27,7 +27,7 @@
|
||||
|
||||
#include "androidconfigurations.h"
|
||||
|
||||
#include <projectexplorer/runconfiguration.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
#include <qmldebug/qmldebugcommandlinearguments.h>
|
||||
#include <qmldebug/qmloutputparser.h>
|
||||
|
||||
|
@@ -32,11 +32,15 @@
|
||||
#include "androidgdbserverkitinformation.h"
|
||||
|
||||
#include <debugger/debuggerrunconfigurationaspect.h>
|
||||
|
||||
#include <projectexplorer/environmentaspect.h>
|
||||
#include <projectexplorer/runconfigurationaspects.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
#include <projectexplorer/target.h>
|
||||
|
||||
#include <qtsupport/baseqtversion.h>
|
||||
#include <qtsupport/qtkitinformation.h>
|
||||
|
||||
#include <utils/hostosinfo.h>
|
||||
#include <utils/runextensions.h>
|
||||
#include <utils/synchronousprocess.h>
|
||||
|
@@ -28,7 +28,7 @@
|
||||
#include "autotestconstants.h"
|
||||
|
||||
#include <projectexplorer/project.h>
|
||||
#include <projectexplorer/runconfiguration.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
#include <utils/environment.h>
|
||||
|
||||
#include <QFutureInterface>
|
||||
|
@@ -26,6 +26,7 @@
|
||||
#include "gdbserverproviderprocess.h"
|
||||
|
||||
#include <projectexplorer/devicesupport/idevice.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
|
||||
#include <utils/environment.h>
|
||||
#include <utils/qtcprocess.h>
|
||||
|
@@ -27,7 +27,7 @@
|
||||
|
||||
#include "clangfileinfo.h"
|
||||
|
||||
#include <projectexplorer/runconfiguration.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
#include <cpptools/projectinfo.h>
|
||||
#include <utils/environment.h>
|
||||
#include <utils/temporarydirectory.h>
|
||||
|
@@ -33,6 +33,7 @@
|
||||
#include <projectexplorer/localenvironmentaspect.h>
|
||||
#include <projectexplorer/project.h>
|
||||
#include <projectexplorer/runconfigurationaspects.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
#include <projectexplorer/target.h>
|
||||
|
||||
using namespace ProjectExplorer;
|
||||
|
@@ -28,7 +28,7 @@
|
||||
#include <coreplugin/icore.h>
|
||||
#include <projectexplorer/kitchooser.h>
|
||||
#include <projectexplorer/kitinformation.h>
|
||||
#include <projectexplorer/runconfiguration.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
#include <ssh/sshconnection.h>
|
||||
|
||||
#include <QDialogButtonBox>
|
||||
|
@@ -34,7 +34,7 @@
|
||||
|
||||
#include <coreplugin/icontext.h>
|
||||
#include <projectexplorer/devicesupport/idevice.h>
|
||||
#include <projectexplorer/runconfiguration.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
#include <texteditor/textmark.h>
|
||||
#include <utils/fileutils.h>
|
||||
|
||||
|
@@ -32,6 +32,7 @@
|
||||
|
||||
#include <projectexplorer/toolchain.h>
|
||||
#include <projectexplorer/projectexplorerconstants.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
|
||||
#include <utils/environment.h>
|
||||
#include <utils/fileutils.h>
|
||||
|
@@ -28,7 +28,7 @@
|
||||
#include <QCoreApplication>
|
||||
#include <QSocketNotifier>
|
||||
|
||||
#include <projectexplorer/runconfiguration.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
|
||||
#include <utils/consoleprocess.h>
|
||||
|
||||
|
@@ -30,6 +30,7 @@
|
||||
|
||||
#include <projectexplorer/localenvironmentaspect.h>
|
||||
#include <projectexplorer/runconfigurationaspects.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
|
||||
#include <utils/environment.h>
|
||||
|
||||
|
@@ -33,6 +33,7 @@
|
||||
#include <projectexplorer/devicesupport/deviceprocess.h>
|
||||
#include <projectexplorer/kit.h>
|
||||
#include <projectexplorer/kitinformation.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
#include <projectexplorer/target.h>
|
||||
|
||||
#include <utils/qtcprocess.h>
|
||||
|
@@ -38,7 +38,7 @@
|
||||
#include <projectexplorer/buildconfiguration.h>
|
||||
#include <projectexplorer/kitinformation.h>
|
||||
#include <projectexplorer/project.h>
|
||||
#include <projectexplorer/runconfiguration.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
#include <projectexplorer/session.h>
|
||||
#include <projectexplorer/target.h>
|
||||
#include <projectexplorer/toolchain.h>
|
||||
|
@@ -25,7 +25,7 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <projectexplorer/devicesupport/deviceprocess.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
|
||||
namespace PerfProfiler {
|
||||
namespace Internal {
|
||||
|
@@ -29,9 +29,13 @@
|
||||
#include <projectexplorer/devicesupport/devicemanager.h>
|
||||
#include <projectexplorer/kitinformation.h>
|
||||
#include <projectexplorer/project.h>
|
||||
#include <projectexplorer/projectexplorerconstants.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
#include <projectexplorer/session.h>
|
||||
#include <projectexplorer/target.h>
|
||||
|
||||
#include <utils/qtcassert.h>
|
||||
|
||||
#include <QVBoxLayout>
|
||||
#include <QHBoxLayout>
|
||||
#include <QPushButton>
|
||||
|
@@ -39,6 +39,7 @@
|
||||
#include "devicesupport/deviceprocess.h"
|
||||
#include "projectexplorer.h"
|
||||
#include "projectexplorersettings.h"
|
||||
#include "runcontrol.h"
|
||||
|
||||
#include <QTextCodec>
|
||||
#include <QTimer>
|
||||
|
@@ -24,10 +24,11 @@
|
||||
****************************************************************************/
|
||||
|
||||
#include "appoutputpane.h"
|
||||
|
||||
#include "projectexplorer.h"
|
||||
#include "projectexplorerconstants.h"
|
||||
#include "projectexplorericons.h"
|
||||
#include "runconfiguration.h"
|
||||
#include "runcontrol.h"
|
||||
#include "session.h"
|
||||
#include "windebuginterface.h"
|
||||
|
||||
@@ -157,11 +158,11 @@ void TabWidget::slotContextMenuRequested(const QPoint &pos)
|
||||
emit contextMenuRequested(pos, tabBar()->tabAt(pos));
|
||||
}
|
||||
|
||||
AppOutputPane::RunControlTab::RunControlTab(RunControl *rc, Core::OutputWindow *w) :
|
||||
runControl(rc), window(w)
|
||||
AppOutputPane::RunControlTab::RunControlTab(RunControl *runControl, Core::OutputWindow *w) :
|
||||
runControl(runControl), window(w)
|
||||
{
|
||||
if (rc && w)
|
||||
w->setFormatter(rc->outputFormatter());
|
||||
if (runControl && w)
|
||||
w->setFormatter(runControl->outputFormatter());
|
||||
}
|
||||
|
||||
AppOutputPane::AppOutputPane() :
|
||||
|
@@ -31,7 +31,7 @@
|
||||
#include "environmentaspect.h"
|
||||
#include "localenvironmentaspect.h"
|
||||
#include "project.h"
|
||||
#include "runconfigurationaspects.h"
|
||||
#include "runcontrol.h"
|
||||
#include "target.h"
|
||||
|
||||
#include <coreplugin/icore.h>
|
||||
|
@@ -31,7 +31,7 @@
|
||||
#include "desktopprocesssignaloperation.h"
|
||||
|
||||
#include <projectexplorer/projectexplorerconstants.h>
|
||||
#include <projectexplorer/runconfiguration.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
|
||||
#include <ssh/sshconnection.h>
|
||||
|
||||
|
@@ -26,7 +26,7 @@
|
||||
#include "desktopdeviceprocess.h"
|
||||
|
||||
#include "idevice.h"
|
||||
#include "../runconfiguration.h"
|
||||
#include "../runcontrol.h"
|
||||
|
||||
#include <utils/environment.h>
|
||||
#include <utils/qtcassert.h>
|
||||
|
@@ -26,7 +26,6 @@
|
||||
#pragma once
|
||||
|
||||
#include "../projectexplorer_export.h"
|
||||
#include "../runconfiguration.h"
|
||||
|
||||
#include <QObject>
|
||||
#include <QProcess>
|
||||
|
@@ -27,7 +27,7 @@
|
||||
|
||||
#include "idevice.h"
|
||||
|
||||
#include <projectexplorer/runconfiguration.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
|
||||
#include <utils/portlist.h>
|
||||
|
||||
|
@@ -26,7 +26,7 @@
|
||||
#include "sshdeviceprocess.h"
|
||||
|
||||
#include "idevice.h"
|
||||
#include "../runconfiguration.h"
|
||||
#include "../runcontrol.h"
|
||||
|
||||
#include <ssh/sshconnection.h>
|
||||
#include <ssh/sshconnectionmanager.h>
|
||||
|
@@ -77,6 +77,7 @@ HEADERS += projectexplorer.h \
|
||||
editorconfiguration.h \
|
||||
editorsettingspropertiespage.h \
|
||||
runconfiguration.h \
|
||||
runcontrol.h \
|
||||
applicationlauncher.h \
|
||||
runsettingspropertiespage.h \
|
||||
projecttreewidget.h \
|
||||
@@ -226,6 +227,7 @@ SOURCES += projectexplorer.cpp \
|
||||
editorconfiguration.cpp \
|
||||
editorsettingspropertiespage.cpp \
|
||||
runconfiguration.cpp \
|
||||
runcontrol.cpp \
|
||||
applicationlauncher.cpp \
|
||||
runsettingspropertiespage.cpp \
|
||||
projecttreewidget.cpp \
|
||||
|
@@ -128,6 +128,7 @@ Project {
|
||||
"projectwizardpage.cpp", "projectwizardpage.h", "projectwizardpage.ui",
|
||||
"removetaskhandler.cpp", "removetaskhandler.h",
|
||||
"runconfiguration.cpp", "runconfiguration.h",
|
||||
"runcontrol.cpp", "runcontrol.h",
|
||||
"runconfigurationaspects.cpp", "runconfigurationaspects.h",
|
||||
"runsettingspropertiespage.cpp", "runsettingspropertiespage.h",
|
||||
"selectablefilesmodel.cpp", "selectablefilesmodel.h",
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -50,7 +50,7 @@ namespace Utils { class OutputFormatter; }
|
||||
namespace ProjectExplorer {
|
||||
class BuildConfiguration;
|
||||
class GlobalOrProjectAspect;
|
||||
class Node;
|
||||
class Runnable;
|
||||
class RunConfigurationFactory;
|
||||
class RunConfiguration;
|
||||
class RunConfigurationCreationInfo;
|
||||
@@ -129,22 +129,6 @@ private:
|
||||
ISettingsAspect *m_globalSettings = nullptr; // Not owned.
|
||||
};
|
||||
|
||||
class PROJECTEXPLORER_EXPORT Runnable
|
||||
{
|
||||
public:
|
||||
Runnable() = default;
|
||||
|
||||
QString executable;
|
||||
QString commandLineArguments;
|
||||
QString workingDirectory;
|
||||
Utils::Environment environment;
|
||||
IDevice::ConstPtr device; // Override the kit's device. Keep unset by default.
|
||||
QHash<Core::Id, QVariant> extraData;
|
||||
|
||||
// FIXME: Not necessarily a display name
|
||||
QString displayName() const { return executable; }
|
||||
};
|
||||
|
||||
// Documentation inside.
|
||||
class PROJECTEXPLORER_EXPORT RunConfiguration : public StatefulProjectConfiguration
|
||||
{
|
||||
@@ -311,239 +295,4 @@ private:
|
||||
const bool m_decorateTargetName;
|
||||
};
|
||||
|
||||
class PROJECTEXPLORER_EXPORT RunWorker : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit RunWorker(RunControl *runControl);
|
||||
~RunWorker() override;
|
||||
|
||||
RunControl *runControl() const;
|
||||
|
||||
void addStartDependency(RunWorker *dependency);
|
||||
void addStopDependency(RunWorker *dependency);
|
||||
|
||||
void setId(const QString &id);
|
||||
|
||||
void setStartTimeout(int ms, const std::function<void()> &callback = {});
|
||||
void setStopTimeout(int ms, const std::function<void()> &callback = {});
|
||||
|
||||
void recordData(const QString &channel, const QVariant &data);
|
||||
QVariant recordedData(const QString &channel) const;
|
||||
|
||||
// Part of read-only interface of RunControl for convenience.
|
||||
void appendMessage(const QString &msg, Utils::OutputFormat format, bool appendNewLine = true);
|
||||
IDevice::ConstPtr device() const;
|
||||
const Runnable &runnable() const;
|
||||
Core::Id runMode() const;
|
||||
|
||||
// States
|
||||
void initiateStart();
|
||||
void reportStarted();
|
||||
|
||||
void initiateStop();
|
||||
void reportStopped();
|
||||
|
||||
void reportDone();
|
||||
|
||||
void reportFailure(const QString &msg = QString());
|
||||
void setSupportsReRunning(bool reRunningSupported);
|
||||
bool supportsReRunning() const;
|
||||
|
||||
static QString userMessageForProcessError(QProcess::ProcessError, const QString &programName);
|
||||
|
||||
bool isEssential() const;
|
||||
void setEssential(bool essential);
|
||||
|
||||
signals:
|
||||
void started();
|
||||
void stopped();
|
||||
|
||||
protected:
|
||||
void virtual start();
|
||||
void virtual stop();
|
||||
void virtual onFinished() {}
|
||||
|
||||
private:
|
||||
friend class Internal::RunControlPrivate;
|
||||
friend class Internal::RunWorkerPrivate;
|
||||
const std::unique_ptr<Internal::RunWorkerPrivate> d;
|
||||
};
|
||||
|
||||
class PROJECTEXPLORER_EXPORT RunWorkerFactory
|
||||
{
|
||||
public:
|
||||
using WorkerCreator = std::function<RunWorker *(RunControl *)>;
|
||||
using Constraint = std::function<bool(RunConfiguration *)>;
|
||||
|
||||
RunWorkerFactory();
|
||||
virtual ~RunWorkerFactory();
|
||||
|
||||
bool canRun(RunConfiguration *runConfiguration, Core::Id runMode) const;
|
||||
|
||||
void setProducer(const WorkerCreator &producer);
|
||||
void addConstraint(const Constraint &constraint);
|
||||
void addSupportedRunMode(Core::Id runMode);
|
||||
|
||||
WorkerCreator producer() const { return m_producer; }
|
||||
|
||||
private:
|
||||
// FIXME: That's temporary until ownership has been transferred to
|
||||
// the individual plugins.
|
||||
friend class ProjectExplorerPlugin;
|
||||
static void destroyRemainingRunWorkerFactories();
|
||||
|
||||
QList<Core::Id> m_supportedRunModes;
|
||||
QList<Constraint> m_constraints;
|
||||
WorkerCreator m_producer;
|
||||
};
|
||||
|
||||
/**
|
||||
* A RunControl controls the running of an application or tool
|
||||
* on a target device. It controls start and stop, and handles
|
||||
* application output.
|
||||
*
|
||||
* RunControls are created by RunControlFactories.
|
||||
*/
|
||||
|
||||
class PROJECTEXPLORER_EXPORT RunControl : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit RunControl(Core::Id mode);
|
||||
~RunControl() override;
|
||||
|
||||
void setRunConfiguration(RunConfiguration *runConfig);
|
||||
void setTarget(Target *target);
|
||||
void setKit(Kit *kit);
|
||||
|
||||
void initiateStart();
|
||||
void initiateReStart();
|
||||
void initiateStop();
|
||||
void forceStop();
|
||||
void initiateFinish();
|
||||
|
||||
bool promptToStop(bool *optionalPrompt = nullptr) const;
|
||||
void setPromptToStop(const std::function<bool(bool *)> &promptToStop);
|
||||
|
||||
bool supportsReRunning() const;
|
||||
|
||||
virtual QString displayName() const;
|
||||
void setDisplayName(const QString &displayName);
|
||||
|
||||
bool isRunning() const;
|
||||
bool isStarting() const;
|
||||
bool isStopping() const;
|
||||
bool isStopped() const;
|
||||
|
||||
void setIcon(const Utils::Icon &icon);
|
||||
Utils::Icon icon() const;
|
||||
|
||||
Utils::ProcessHandle applicationProcessHandle() const;
|
||||
void setApplicationProcessHandle(const Utils::ProcessHandle &handle);
|
||||
IDevice::ConstPtr device() const;
|
||||
|
||||
RunConfiguration *runConfiguration() const; // FIXME: Remove.
|
||||
// FIXME: Try to cut down to amount of functions.
|
||||
Target *target() const;
|
||||
Project *project() const;
|
||||
Kit *kit() const;
|
||||
ProjectConfigurationAspect *aspect(Core::Id id) const;
|
||||
template <typename T> T *aspect() const {
|
||||
return runConfiguration() ? runConfiguration()->aspect<T>() : nullptr;
|
||||
}
|
||||
ISettingsAspect *settings(Core::Id id) const;
|
||||
QString buildKey() const;
|
||||
BuildTargetInfo buildTargetInfo() const;
|
||||
|
||||
Utils::OutputFormatter *outputFormatter() const;
|
||||
Core::Id runMode() const;
|
||||
|
||||
const Runnable &runnable() const;
|
||||
void setRunnable(const Runnable &runnable);
|
||||
|
||||
static bool showPromptToStopDialog(const QString &title, const QString &text,
|
||||
const QString &stopButtonText = QString(),
|
||||
const QString &cancelButtonText = QString(),
|
||||
bool *prompt = nullptr);
|
||||
|
||||
RunWorker *createWorker(Core::Id id);
|
||||
|
||||
using WorkerCreator = RunWorkerFactory::WorkerCreator;
|
||||
using Constraint = RunWorkerFactory::Constraint;
|
||||
|
||||
static void registerWorkerCreator(Core::Id id, const WorkerCreator &workerCreator);
|
||||
|
||||
static void registerWorker(Core::Id runMode, const WorkerCreator &producer,
|
||||
const Constraint &constraint = {})
|
||||
{
|
||||
auto factory = new RunWorkerFactory;
|
||||
factory->setProducer(producer);
|
||||
factory->addSupportedRunMode(runMode);
|
||||
factory->addConstraint(constraint);
|
||||
}
|
||||
template <class Worker>
|
||||
static void registerWorker(Core::Id runMode, const Constraint &constraint)
|
||||
{
|
||||
auto factory = new RunWorkerFactory;
|
||||
factory->setProducer([](RunControl *rc) { return new Worker(rc); });
|
||||
factory->addSupportedRunMode(runMode);
|
||||
factory->addConstraint(constraint);
|
||||
}
|
||||
|
||||
static WorkerCreator producer(RunConfiguration *runConfiguration, Core::Id runMode);
|
||||
|
||||
signals:
|
||||
void appendMessage(const QString &msg, Utils::OutputFormat format);
|
||||
void aboutToStart();
|
||||
void started();
|
||||
void stopped();
|
||||
void finished();
|
||||
void applicationProcessHandleChanged(QPrivateSignal); // Use setApplicationProcessHandle
|
||||
|
||||
private:
|
||||
void setDevice(const IDevice::ConstPtr &device);
|
||||
|
||||
friend class RunWorker;
|
||||
friend class Internal::RunWorkerPrivate;
|
||||
|
||||
const std::unique_ptr<Internal::RunControlPrivate> d;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* A simple TargetRunner for cases where a plain ApplicationLauncher is
|
||||
* sufficient for running purposes.
|
||||
*/
|
||||
|
||||
class PROJECTEXPLORER_EXPORT SimpleTargetRunner : public RunWorker
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit SimpleTargetRunner(RunControl *runControl);
|
||||
|
||||
void setRunnable(const Runnable &runnable);
|
||||
|
||||
void setDevice(const IDevice::ConstPtr &device);
|
||||
IDevice::ConstPtr device() const;
|
||||
|
||||
protected:
|
||||
void start() override;
|
||||
void stop() override;
|
||||
|
||||
private:
|
||||
void onProcessStarted();
|
||||
void onProcessFinished(int exitCode, QProcess::ExitStatus status);
|
||||
void onProcessError(QProcess::ProcessError error);
|
||||
|
||||
ApplicationLauncher m_launcher;
|
||||
Runnable m_runnable;
|
||||
IDevice::ConstPtr m_device;
|
||||
bool m_stopReported = false;
|
||||
bool m_useTerminal = false;
|
||||
};
|
||||
|
||||
} // namespace ProjectExplorer
|
||||
|
1529
src/plugins/projectexplorer/runcontrol.cpp
Normal file
1529
src/plugins/projectexplorer/runcontrol.cpp
Normal file
File diff suppressed because it is too large
Load Diff
330
src/plugins/projectexplorer/runcontrol.h
Normal file
330
src/plugins/projectexplorer/runcontrol.h
Normal file
@@ -0,0 +1,330 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2019 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of Qt Creator.
|
||||
**
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "applicationlauncher.h"
|
||||
#include "buildtargetinfo.h"
|
||||
#include "devicesupport/idevice.h"
|
||||
#include "projectexplorerconstants.h"
|
||||
#include "runconfiguration.h"
|
||||
|
||||
#include <utils/environment.h>
|
||||
#include <utils/port.h>
|
||||
#include <utils/processhandle.h>
|
||||
#include <utils/qtcassert.h>
|
||||
#include <utils/icon.h>
|
||||
|
||||
#include <QHash>
|
||||
#include <QPointer>
|
||||
#include <QVariant>
|
||||
#include <QWidget>
|
||||
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
|
||||
namespace Utils {
|
||||
class MacroExpander;
|
||||
class OutputFormatter;
|
||||
} // Utils
|
||||
|
||||
namespace ProjectExplorer {
|
||||
class BuildConfiguration;
|
||||
class GlobalOrProjectAspect;
|
||||
class Node;
|
||||
class RunConfigurationFactory;
|
||||
class RunConfiguration;
|
||||
class RunConfigurationCreationInfo;
|
||||
class RunControl;
|
||||
class RunWorkerFactory;
|
||||
class Target;
|
||||
|
||||
namespace Internal {
|
||||
class RunControlPrivate;
|
||||
class RunWorkerPrivate;
|
||||
} // Internal
|
||||
|
||||
|
||||
class PROJECTEXPLORER_EXPORT Runnable
|
||||
{
|
||||
public:
|
||||
Runnable() = default;
|
||||
|
||||
QString executable;
|
||||
QString commandLineArguments;
|
||||
QString workingDirectory;
|
||||
Utils::Environment environment;
|
||||
IDevice::ConstPtr device; // Override the kit's device. Keep unset by default.
|
||||
QHash<Core::Id, QVariant> extraData;
|
||||
|
||||
// FIXME: Not necessarily a display name
|
||||
QString displayName() const { return executable; }
|
||||
};
|
||||
|
||||
class PROJECTEXPLORER_EXPORT RunWorker : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit RunWorker(RunControl *runControl);
|
||||
~RunWorker() override;
|
||||
|
||||
RunControl *runControl() const;
|
||||
|
||||
void addStartDependency(RunWorker *dependency);
|
||||
void addStopDependency(RunWorker *dependency);
|
||||
|
||||
void setId(const QString &id);
|
||||
|
||||
void setStartTimeout(int ms, const std::function<void()> &callback = {});
|
||||
void setStopTimeout(int ms, const std::function<void()> &callback = {});
|
||||
|
||||
void recordData(const QString &channel, const QVariant &data);
|
||||
QVariant recordedData(const QString &channel) const;
|
||||
|
||||
// Part of read-only interface of RunControl for convenience.
|
||||
void appendMessage(const QString &msg, Utils::OutputFormat format, bool appendNewLine = true);
|
||||
IDevice::ConstPtr device() const;
|
||||
const Runnable &runnable() const;
|
||||
Core::Id runMode() const;
|
||||
|
||||
// States
|
||||
void initiateStart();
|
||||
void reportStarted();
|
||||
|
||||
void initiateStop();
|
||||
void reportStopped();
|
||||
|
||||
void reportDone();
|
||||
|
||||
void reportFailure(const QString &msg = QString());
|
||||
void setSupportsReRunning(bool reRunningSupported);
|
||||
bool supportsReRunning() const;
|
||||
|
||||
static QString userMessageForProcessError(QProcess::ProcessError, const QString &programName);
|
||||
|
||||
bool isEssential() const;
|
||||
void setEssential(bool essential);
|
||||
|
||||
signals:
|
||||
void started();
|
||||
void stopped();
|
||||
|
||||
protected:
|
||||
void virtual start();
|
||||
void virtual stop();
|
||||
void virtual onFinished() {}
|
||||
|
||||
private:
|
||||
friend class Internal::RunControlPrivate;
|
||||
friend class Internal::RunWorkerPrivate;
|
||||
const std::unique_ptr<Internal::RunWorkerPrivate> d;
|
||||
};
|
||||
|
||||
class PROJECTEXPLORER_EXPORT RunWorkerFactory
|
||||
{
|
||||
public:
|
||||
using WorkerCreator = std::function<RunWorker *(RunControl *)>;
|
||||
using Constraint = std::function<bool(RunConfiguration *)>;
|
||||
|
||||
RunWorkerFactory();
|
||||
virtual ~RunWorkerFactory();
|
||||
|
||||
bool canRun(RunConfiguration *runConfiguration, Core::Id runMode) const;
|
||||
|
||||
void setProducer(const WorkerCreator &producer);
|
||||
void addConstraint(const Constraint &constraint);
|
||||
void addSupportedRunMode(Core::Id runMode);
|
||||
|
||||
WorkerCreator producer() const { return m_producer; }
|
||||
|
||||
private:
|
||||
// FIXME: That's temporary until ownership has been transferred to
|
||||
// the individual plugins.
|
||||
friend class ProjectExplorerPlugin;
|
||||
static void destroyRemainingRunWorkerFactories();
|
||||
|
||||
QList<Core::Id> m_supportedRunModes;
|
||||
QList<Constraint> m_constraints;
|
||||
WorkerCreator m_producer;
|
||||
};
|
||||
|
||||
/**
|
||||
* A RunControl controls the running of an application or tool
|
||||
* on a target device. It controls start and stop, and handles
|
||||
* application output.
|
||||
*
|
||||
* RunControls are created by RunControlFactories.
|
||||
*/
|
||||
|
||||
class PROJECTEXPLORER_EXPORT RunControl : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit RunControl(Core::Id mode);
|
||||
~RunControl() override;
|
||||
|
||||
void setRunConfiguration(RunConfiguration *runConfig);
|
||||
void setTarget(Target *target);
|
||||
void setKit(Kit *kit);
|
||||
|
||||
void initiateStart();
|
||||
void initiateReStart();
|
||||
void initiateStop();
|
||||
void forceStop();
|
||||
void initiateFinish();
|
||||
|
||||
bool promptToStop(bool *optionalPrompt = nullptr) const;
|
||||
void setPromptToStop(const std::function<bool(bool *)> &promptToStop);
|
||||
|
||||
bool supportsReRunning() const;
|
||||
|
||||
virtual QString displayName() const;
|
||||
void setDisplayName(const QString &displayName);
|
||||
|
||||
bool isRunning() const;
|
||||
bool isStarting() const;
|
||||
bool isStopping() const;
|
||||
bool isStopped() const;
|
||||
|
||||
void setIcon(const Utils::Icon &icon);
|
||||
Utils::Icon icon() const;
|
||||
|
||||
Utils::ProcessHandle applicationProcessHandle() const;
|
||||
void setApplicationProcessHandle(const Utils::ProcessHandle &handle);
|
||||
IDevice::ConstPtr device() const;
|
||||
|
||||
RunConfiguration *runConfiguration() const; // FIXME: Remove.
|
||||
// FIXME: Try to cut down to amount of functions.
|
||||
Target *target() const;
|
||||
Project *project() const;
|
||||
Kit *kit() const;
|
||||
Utils::MacroExpander *macroExpander() const;
|
||||
ProjectConfigurationAspect *aspect(Core::Id id) const;
|
||||
template <typename T> T *aspect() const {
|
||||
return runConfiguration() ? runConfiguration()->aspect<T>() : nullptr;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
auto aspectData() -> decltype(T::runData(nullptr, this)) {
|
||||
if (T *asp = aspect<T>())
|
||||
return T::runData(asp, this);
|
||||
return {};
|
||||
}
|
||||
|
||||
ISettingsAspect *settings(Core::Id id) const;
|
||||
QString buildKey() const;
|
||||
BuildTargetInfo buildTargetInfo() const;
|
||||
|
||||
Utils::OutputFormatter *outputFormatter() const;
|
||||
Core::Id runMode() const;
|
||||
|
||||
const Runnable &runnable() const;
|
||||
void setRunnable(const Runnable &runnable);
|
||||
|
||||
static bool showPromptToStopDialog(const QString &title, const QString &text,
|
||||
const QString &stopButtonText = QString(),
|
||||
const QString &cancelButtonText = QString(),
|
||||
bool *prompt = nullptr);
|
||||
|
||||
RunWorker *createWorker(Core::Id id);
|
||||
|
||||
using WorkerCreator = RunWorkerFactory::WorkerCreator;
|
||||
using Constraint = RunWorkerFactory::Constraint;
|
||||
|
||||
static void registerWorkerCreator(Core::Id id, const WorkerCreator &workerCreator);
|
||||
|
||||
static void registerWorker(Core::Id runMode, const WorkerCreator &producer,
|
||||
const Constraint &constraint = {})
|
||||
{
|
||||
auto factory = new RunWorkerFactory;
|
||||
factory->setProducer(producer);
|
||||
factory->addSupportedRunMode(runMode);
|
||||
factory->addConstraint(constraint);
|
||||
}
|
||||
template <class Worker>
|
||||
static void registerWorker(Core::Id runMode, const Constraint &constraint)
|
||||
{
|
||||
auto factory = new RunWorkerFactory;
|
||||
factory->setProducer([](RunControl *rc) { return new Worker(rc); });
|
||||
factory->addSupportedRunMode(runMode);
|
||||
factory->addConstraint(constraint);
|
||||
}
|
||||
|
||||
static WorkerCreator producer(RunConfiguration *runConfiguration, Core::Id runMode);
|
||||
|
||||
signals:
|
||||
void appendMessage(const QString &msg, Utils::OutputFormat format);
|
||||
void aboutToStart();
|
||||
void started();
|
||||
void stopped();
|
||||
void finished();
|
||||
void applicationProcessHandleChanged(QPrivateSignal); // Use setApplicationProcessHandle
|
||||
|
||||
private:
|
||||
void setDevice(const IDevice::ConstPtr &device);
|
||||
|
||||
friend class RunWorker;
|
||||
friend class Internal::RunWorkerPrivate;
|
||||
|
||||
const std::unique_ptr<Internal::RunControlPrivate> d;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* A simple TargetRunner for cases where a plain ApplicationLauncher is
|
||||
* sufficient for running purposes.
|
||||
*/
|
||||
|
||||
class PROJECTEXPLORER_EXPORT SimpleTargetRunner : public RunWorker
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit SimpleTargetRunner(RunControl *runControl);
|
||||
|
||||
void setRunnable(const Runnable &runnable);
|
||||
|
||||
void setDevice(const IDevice::ConstPtr &device);
|
||||
IDevice::ConstPtr device() const;
|
||||
|
||||
protected:
|
||||
void start() override;
|
||||
void stop() override;
|
||||
|
||||
private:
|
||||
void onProcessStarted();
|
||||
void onProcessFinished(int exitCode, QProcess::ExitStatus status);
|
||||
void onProcessError(QProcess::ProcessError error);
|
||||
|
||||
ApplicationLauncher m_launcher;
|
||||
Runnable m_runnable;
|
||||
IDevice::ConstPtr m_device;
|
||||
bool m_stopReported = false;
|
||||
bool m_useTerminal = false;
|
||||
};
|
||||
|
||||
} // namespace ProjectExplorer
|
@@ -29,7 +29,7 @@
|
||||
#include <QDialog>
|
||||
#include <QTime>
|
||||
|
||||
#include "runconfiguration.h"
|
||||
#include "runcontrol.h"
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QLabel;
|
||||
|
@@ -39,6 +39,7 @@
|
||||
#include <projectexplorer/buildtargetinfo.h>
|
||||
#include <projectexplorer/kitmanager.h>
|
||||
#include <projectexplorer/localenvironmentaspect.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
#include <projectexplorer/runconfiguration.h>
|
||||
#include <projectexplorer/runconfigurationaspects.h>
|
||||
#include <projectexplorer/project.h>
|
||||
|
@@ -32,6 +32,7 @@
|
||||
#include <projectexplorer/deploymentdata.h>
|
||||
#include <projectexplorer/localenvironmentaspect.h>
|
||||
#include <projectexplorer/project.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
#include <projectexplorer/runconfigurationaspects.h>
|
||||
#include <projectexplorer/target.h>
|
||||
|
||||
|
@@ -31,6 +31,7 @@
|
||||
#include <projectexplorer/project.h>
|
||||
#include <projectexplorer/projectnodes.h>
|
||||
#include <projectexplorer/runconfigurationaspects.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
#include <projectexplorer/target.h>
|
||||
|
||||
#include <qtsupport/qtkitinformation.h>
|
||||
|
@@ -25,9 +25,10 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <projectexplorer/runconfiguration.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
#include <extensionsystem/iplugin.h>
|
||||
#include <qmljs/qmljsdialect.h>
|
||||
|
||||
#include <QUrl>
|
||||
#include <QThread>
|
||||
|
||||
|
@@ -27,7 +27,7 @@
|
||||
|
||||
#include "qmlprofilerstatemanager.h"
|
||||
|
||||
#include <projectexplorer/runconfiguration.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
|
||||
#include <utils/outputformat.h>
|
||||
#include <utils/port.h>
|
||||
|
@@ -29,7 +29,7 @@
|
||||
#include <coreplugin/icore.h>
|
||||
#include <projectexplorer/kit.h>
|
||||
#include <projectexplorer/kitmanager.h>
|
||||
#include <projectexplorer/runconfiguration.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
#include <qmlprofiler/qmlprofilerattachdialog.h>
|
||||
#include <qmlprofiler/qmlprofilerclientmanager.h>
|
||||
#include <qmlprofiler/qmlprofilermodelmanager.h>
|
||||
|
@@ -34,6 +34,7 @@
|
||||
|
||||
#include <projectexplorer/kitinformation.h>
|
||||
#include <projectexplorer/projectexplorer.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
#include <projectexplorer/target.h>
|
||||
|
||||
#include <qtsupport/qtkitinformation.h>
|
||||
|
@@ -34,6 +34,7 @@
|
||||
#include "qnxdevicewizard.h"
|
||||
|
||||
#include <projectexplorer/devicesupport/sshdeviceprocess.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
|
||||
#include <ssh/sshconnection.h>
|
||||
#include <utils/port.h>
|
||||
|
@@ -26,6 +26,7 @@
|
||||
#include "qnxdeviceprocess.h"
|
||||
|
||||
#include <projectexplorer/devicesupport/sshdeviceprocess.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
|
||||
#include <utils/qtcprocess.h>
|
||||
|
||||
|
@@ -27,6 +27,8 @@
|
||||
|
||||
#include "qnxconstants.h"
|
||||
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
|
||||
using namespace ProjectExplorer;
|
||||
using namespace RemoteLinux;
|
||||
|
||||
|
@@ -27,7 +27,7 @@
|
||||
|
||||
#include <QObject>
|
||||
|
||||
#include <projectexplorer/runconfiguration.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
#include <remotelinux/linuxdevice.h>
|
||||
#include <utils/outputformat.h>
|
||||
|
||||
|
@@ -37,9 +37,12 @@
|
||||
#include <coreplugin/icore.h>
|
||||
#include <coreplugin/id.h>
|
||||
#include <coreplugin/messagemanager.h>
|
||||
|
||||
#include <projectexplorer/devicesupport/sshdeviceprocesslist.h>
|
||||
#include <projectexplorer/runconfiguration.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
|
||||
#include <ssh/sshremoteprocessrunner.h>
|
||||
|
||||
#include <utils/algorithm.h>
|
||||
#include <utils/hostosinfo.h>
|
||||
#include <utils/port.h>
|
||||
|
@@ -25,7 +25,7 @@
|
||||
|
||||
#include "linuxdeviceprocess.h"
|
||||
|
||||
#include <projectexplorer/runconfiguration.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
|
||||
#include <utils/environment.h>
|
||||
#include <utils/qtcprocess.h>
|
||||
|
@@ -30,6 +30,7 @@
|
||||
#include "remotelinuxx11forwardingaspect.h"
|
||||
|
||||
#include <projectexplorer/runconfigurationaspects.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
#include <projectexplorer/target.h>
|
||||
|
||||
#include <qtsupport/qtoutputformatter.h>
|
||||
|
@@ -27,7 +27,7 @@
|
||||
|
||||
#include <projectexplorer/devicesupport/deviceprocess.h>
|
||||
#include <projectexplorer/devicesupport/idevice.h>
|
||||
#include <projectexplorer/runconfiguration.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
|
||||
using namespace ProjectExplorer;
|
||||
|
||||
|
@@ -27,7 +27,7 @@
|
||||
|
||||
#include "remotelinuxkillappservice.h"
|
||||
|
||||
#include <projectexplorer/runconfiguration.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
#include <projectexplorer/target.h>
|
||||
#include <utils/qtcassert.h>
|
||||
|
||||
|
@@ -34,6 +34,7 @@
|
||||
#include <projectexplorer/kitinformation.h>
|
||||
#include <projectexplorer/project.h>
|
||||
#include <projectexplorer/runconfigurationaspects.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
#include <projectexplorer/target.h>
|
||||
|
||||
#include <qtsupport/qtoutputformatter.h>
|
||||
|
@@ -28,7 +28,7 @@
|
||||
#include <ssh/sshremoteprocess.h>
|
||||
#include <ssh/sshconnection.h>
|
||||
|
||||
#include <projectexplorer/runconfiguration.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
|
||||
#include <QProcess>
|
||||
|
||||
|
@@ -26,7 +26,7 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <projectexplorer/runconfiguration.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
#include <utils/environment.h>
|
||||
#include <valgrind/valgrindrunner.h>
|
||||
#include <valgrind/valgrindsettings.h>
|
||||
|
@@ -26,7 +26,7 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <projectexplorer/runconfiguration.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
|
||||
#include <utils/outputformat.h>
|
||||
|
||||
|
@@ -27,7 +27,7 @@
|
||||
|
||||
#include "winrtdevice.h"
|
||||
|
||||
#include <projectexplorer/runconfiguration.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
#include <utils/qtcprocess.h>
|
||||
|
||||
namespace WinRt {
|
||||
|
@@ -29,12 +29,14 @@
|
||||
#include "winrtrunconfiguration.h"
|
||||
|
||||
#include <coreplugin/idocument.h>
|
||||
|
||||
#include <projectexplorer/buildtargetinfo.h>
|
||||
#include <projectexplorer/devicesupport/idevice.h>
|
||||
#include <projectexplorer/buildconfiguration.h>
|
||||
#include <projectexplorer/project.h>
|
||||
#include <projectexplorer/runconfiguration.h>
|
||||
#include <projectexplorer/runcontrol.h>
|
||||
#include <projectexplorer/target.h>
|
||||
|
||||
#include <qtsupport/baseqtversion.h>
|
||||
#include <qtsupport/qtkitinformation.h>
|
||||
#include <utils/qtcprocess.h>
|
||||
|
Reference in New Issue
Block a user