diff options
Diffstat (limited to 'src/plugins/valgrind/valgrindplugin.cpp')
| -rw-r--r-- | src/plugins/valgrind/valgrindplugin.cpp | 179 |
1 files changed, 170 insertions, 9 deletions
diff --git a/src/plugins/valgrind/valgrindplugin.cpp b/src/plugins/valgrind/valgrindplugin.cpp index e9f13d0265..86ac42e97f 100644 --- a/src/plugins/valgrind/valgrindplugin.cpp +++ b/src/plugins/valgrind/valgrindplugin.cpp @@ -33,21 +33,171 @@ **************************************************************************/ #include "valgrindplugin.h" -#include "valgrindsettings.h" -#include "callgrindtool.h" + #include "callgrindsettings.h" -#include "memchecktool.h" +#include "callgrindtool.h" #include "memchecksettings.h" +#include "memchecktool.h" +#include "valgrindsettings.h" -#include <analyzerbase/analyzersettings.h> +#include <analyzerbase/analyzerconstants.h> #include <analyzerbase/analyzermanager.h> +#include <analyzerbase/analyzerrunconfigwidget.h> +#include <analyzerbase/analyzerruncontrol.h> +#include <analyzerbase/analyzersettings.h> +#include <analyzerbase/analyzerstartparameters.h> +#include <analyzerbase/startremotedialog.h> + +#include <projectexplorer/applicationrunconfiguration.h> +#include <projectexplorer/projectexplorer.h> + +#include <remotelinux/linuxdeviceconfiguration.h> +#include <remotelinux/remotelinuxrunconfiguration.h> +#include <utils/qtcassert.h> + +#include <QtCore/QDebug> #include <QtCore/QStringList> #include <QtCore/QtPlugin> +#include <QtGui/QAction> using namespace Analyzer; using namespace Valgrind::Internal; +using namespace ProjectExplorer; + +///////////////////////////////////////////////////////////////////////////////// +// +// ValgrindRunControlFactory +// +///////////////////////////////////////////////////////////////////////////////// + +namespace Valgrind { +namespace Internal { +class ValgrindRunControlFactory : public ProjectExplorer::IRunControlFactory +{ + Q_OBJECT + +public: + ValgrindRunControlFactory(QObject *parent = 0); + + // IRunControlFactory + bool canRun(RunConfiguration *runConfiguration, const QString &mode) const; + RunControl *create(RunConfiguration *runConfiguration, const QString &mode); + QString displayName() const; + + IRunConfigurationAspect *createRunConfigurationAspect(); + RunConfigWidget *createConfigurationWidget(RunConfiguration *runConfiguration); +}; + +ValgrindRunControlFactory::ValgrindRunControlFactory(QObject *parent) + : IRunControlFactory(parent) +{ + setObjectName(QLatin1String("ValgrindRunControlFactory")); +} + +bool ValgrindRunControlFactory::canRun(RunConfiguration *runConfiguration, const QString &mode) const +{ + Q_UNUSED(runConfiguration); + return mode.startsWith("Callgrind") || mode.startsWith("Memcheck"); +} + +RunControl *ValgrindRunControlFactory::create(RunConfiguration *runConfiguration, const QString &mode) +{ + QTC_ASSERT(canRun(runConfiguration, mode), return 0); + + AnalyzerStartParameters sp; + if (LocalApplicationRunConfiguration *rc1 = + qobject_cast<LocalApplicationRunConfiguration *>(runConfiguration)) { + sp.startMode = StartLocal; + sp.environment = rc1->environment(); + sp.workingDirectory = rc1->workingDirectory(); + sp.debuggee = rc1->executable(); + sp.debuggeeArgs = rc1->commandLineArguments(); + sp.displayName = rc1->displayName(); + sp.connParams.host = QLatin1String("localhost"); + sp.connParams.port = rc1->qmlDebugServerPort(); + } else if (RemoteLinux::RemoteLinuxRunConfiguration *rc2 = + qobject_cast<RemoteLinux::RemoteLinuxRunConfiguration *>(runConfiguration)) { + sp.startMode = StartRemote; + sp.debuggee = rc2->remoteExecutableFilePath(); + sp.debuggeeArgs = rc2->arguments(); + sp.connParams = rc2->deviceConfig()->sshParameters(); + sp.analyzerCmdPrefix = rc2->commandPrefix(); + sp.displayName = rc2->displayName(); + } else { + // Might be S60DeviceRunfiguration, or something else ... + //sp.startMode = StartRemote; + sp.startMode = StartRemote; + } + + IAnalyzerTool *tool = AnalyzerManager::toolFromId(mode.toLatin1()); + AnalyzerRunControl *rc = new AnalyzerRunControl(tool, sp, runConfiguration); + QObject::connect(AnalyzerManager::stopAction(), SIGNAL(triggered()), rc, SLOT(stopIt())); + return rc; +} + +QString ValgrindRunControlFactory::displayName() const +{ + return tr("Analyzer"); +} + +IRunConfigurationAspect *ValgrindRunControlFactory::createRunConfigurationAspect() +{ + return new AnalyzerProjectSettings; +} + +RunConfigWidget *ValgrindRunControlFactory::createConfigurationWidget(RunConfiguration *runConfiguration) +{ + LocalApplicationRunConfiguration *localRc = + qobject_cast<LocalApplicationRunConfiguration *>(runConfiguration); + if (!localRc) + return 0; + AnalyzerProjectSettings *settings = runConfiguration->extraAspect<AnalyzerProjectSettings>(); + if (!settings) + return 0; + + AnalyzerRunConfigWidget *ret = new AnalyzerRunConfigWidget; + ret->setRunConfiguration(runConfiguration); + return ret; +} + +///////////////////////////////////////////////////////////////////////////////// +// +// ValgrindPlugin +// +///////////////////////////////////////////////////////////////////////////////// + +static void startRemoteTool(IAnalyzerTool *tool, StartMode mode) +{ + Q_UNUSED(tool); + StartRemoteDialog dlg; + if (dlg.exec() != QDialog::Accepted) + return; + + AnalyzerStartParameters sp; + sp.toolId = tool->id(); + sp.startMode = mode; + sp.connParams = dlg.sshParams(); + sp.debuggee = dlg.executable(); + sp.debuggeeArgs = dlg.arguments(); + sp.displayName = dlg.executable(); + sp.workingDirectory = dlg.workingDirectory(); + + AnalyzerRunControl *rc = new AnalyzerRunControl(tool, sp, 0); + //m_currentRunControl = rc; + QObject::connect(AnalyzerManager::stopAction(), SIGNAL(triggered()), rc, SLOT(stopIt())); + + ProjectExplorerPlugin::instance()->startRunControl(rc, tool->id()); +} + +void ValgrindPlugin::startValgrindTool(IAnalyzerTool *tool, StartMode mode) +{ + if (mode == StartLocal) + AnalyzerManager::startLocalTool(tool, mode); + if (mode == StartRemote) + startRemoteTool(tool, mode); +} static AbstractAnalyzerSubConfig *valgrindConfigFactory() { @@ -80,14 +230,25 @@ bool ValgrindPlugin::initialize(const QStringList &, QString *) AnalyzerGlobalSettings::instance()->registerSubConfigs(&globalCallgrindFactory, &projectCallgrindFactory); AnalyzerGlobalSettings::instance()->registerSubConfigs(&globalMemcheckFactory, &projectMemcheckFactory); - AnalyzerManager::instance()->addTool(new MemcheckTool(this)); - AnalyzerManager::instance()->addTool(new CallgrindTool(this)); + StartModes modes; +#ifndef Q_OS_WIN + modes.append(StartMode(StartLocal)); +#endif + modes.append(StartMode(StartRemote)); + + AnalyzerManager::addTool(new MemcheckTool(this), modes); + AnalyzerManager::addTool(new CallgrindTool(this), modes); + + ValgrindRunControlFactory *factory = new ValgrindRunControlFactory(); + addAutoReleasedObject(factory); + return true; } +} // namespace Internal +} // namespace Valgrind -void ValgrindPlugin::extensionsInitialized() -{ -} Q_EXPORT_PLUGIN(Valgrind::Internal::ValgrindPlugin) + +#include "valgrindplugin.moc" |
