From 77e3bfe8451343be5478027154a027cbcfe4b778 Mon Sep 17 00:00:00 2001 From: hjk <qtc-committer@nokia.com> Date: Fri, 10 Dec 2010 12:41:44 +0100 Subject: [PATCH] debugger: structural cleanup remote debugging Use virtual function instead of if/qobject_cast cascades. --- src/plugins/debugger/debuggerengine.cpp | 11 +++ src/plugins/debugger/debuggerengine.h | 16 ++- src/plugins/debugger/debuggerrunner.cpp | 97 ------------------- src/plugins/debugger/debuggerrunner.h | 3 - .../debugger/gdb/abstractgdbadapter.cpp | 11 +++ src/plugins/debugger/gdb/abstractgdbadapter.h | 3 + src/plugins/debugger/gdb/gdbengine.cpp | 10 ++ src/plugins/debugger/gdb/gdbengine.h | 2 + .../debugger/gdb/remotegdbserveradapter.cpp | 2 +- .../debugger/gdb/remoteplaingdbadapter.cpp | 6 +- .../debugger/gdb/remoteplaingdbadapter.h | 5 +- src/plugins/debugger/qml/qmlcppengine.cpp | 12 +++ src/plugins/debugger/qml/qmlcppengine.h | 2 + src/plugins/debugger/qml/qmlengine.cpp | 2 +- .../qt-maemo/maemodebugsupport.cpp | 6 +- 15 files changed, 74 insertions(+), 114 deletions(-) diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp index 3fc8de920b8..5196254c517 100644 --- a/src/plugins/debugger/debuggerengine.cpp +++ b/src/plugins/debugger/debuggerengine.cpp @@ -1430,6 +1430,17 @@ void DebuggerEngine::openDisassemblerView(const StackFrame &frame) agent->setFrame(frame, true, false); } +void DebuggerEngine::handleRemoteSetupDone(int gdbServerPort, int qmlPort) +{ + Q_UNUSED(gdbServerPort); + Q_UNUSED(qmlPort); +} + +void DebuggerEngine::handleRemoteSetupFailed(const QString &message) +{ + Q_UNUSED(message); +} + } // namespace Debugger #include "debuggerengine.moc" diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h index 4c6d2f8c3da..536d5ee1053 100644 --- a/src/plugins/debugger/debuggerengine.h +++ b/src/plugins/debugger/debuggerengine.h @@ -35,7 +35,7 @@ #include "moduleshandler.h" // For 'Symbols' #include "breakpoint.h" // For 'BreakpointId' -#include <coreplugin/ssh/sshconnection.h> +#include <coreplugin/ssh/sshconnection.h> #include <utils/environment.h> @@ -203,6 +203,9 @@ public: virtual void removeTooltip(); virtual void selectThread(int index); + virtual void handleRemoteSetupDone(int gdbServerPort, int qmlPort); + virtual void handleRemoteSetupFailed(const QString &message); + protected: friend class Internal::DebuggerPluginPrivate; virtual void detachDebugger(); @@ -255,7 +258,7 @@ public: void breakByFunction(const QString &functionName); void breakByFunctionMain(); - + DebuggerState state() const; DebuggerState lastGoodState() const; DebuggerState targetState() const; @@ -289,6 +292,15 @@ public: signals: void stateChanged(const DebuggerState &state); void updateViewsRequested(); + /* + * For "external" clients of a debugger run control that need to do + * further setup before the debugger is started (e.g. Maemo). + * Afterwards, handleSetupDone() or handleSetupFailed() must be called + * to continue or abort debugging, respectively. + * This signal is only emitted if the start parameters indicate that + * a server start script should be used, but none is given. + */ + void requestRemoteSetup(); protected: // The base notify*() function implementation should be sufficient diff --git a/src/plugins/debugger/debuggerrunner.cpp b/src/plugins/debugger/debuggerrunner.cpp index 97d904998c6..46c79b81682 100644 --- a/src/plugins/debugger/debuggerrunner.cpp +++ b/src/plugins/debugger/debuggerrunner.cpp @@ -35,12 +35,7 @@ #include "debuggermainwindow.h" #include "debuggerplugin.h" #include "debuggerstringutils.h" -#include "gdb/gdbengine.h" -#include "gdb/remotegdbserveradapter.h" -#include "gdb/remoteplaingdbadapter.h" #include "gdb/gdboptionspage.h" -#include "qml/qmlengine.h" -#include "qml/qmlcppengine.h" #include "lldb/lldbenginehost.h" #ifdef Q_OS_WIN @@ -269,10 +264,6 @@ public: DebuggerEngineType engineForMode(unsigned enabledEngineTypes, DebuggerStartMode mode); - void initGdbEngine(GdbEngine *engine); - GdbEngine *gdbEngine() const; - AbstractGdbAdapter *gdbAdapter() const; - public: DebuggerRunControl *q; DebuggerEngine *m_engine; @@ -383,38 +374,6 @@ DebuggerEngineType DebuggerRunControlPrivate::engineForMode #endif } -void DebuggerRunControlPrivate::initGdbEngine(GdbEngine *engine) -{ - QTC_ASSERT(engine, return) - - // Forward adapter signals. - AbstractGdbAdapter *adapter = engine->gdbAdapter(); - RemotePlainGdbAdapter *rpga = qobject_cast<RemotePlainGdbAdapter *>(adapter); - RemoteGdbServerAdapter *rgsa = qobject_cast<RemoteGdbServerAdapter *>(adapter); - if (rpga) - q->connect(rpga, SIGNAL(requestSetup()), SIGNAL(engineRequestSetup())); - else if (rgsa) - q->connect(rgsa, SIGNAL(requestSetup()), SIGNAL(engineRequestSetup())); -} - -GdbEngine *DebuggerRunControlPrivate::gdbEngine() const -{ - QTC_ASSERT(m_engine, return 0); - if (GdbEngine *gdbEngine = qobject_cast<GdbEngine *>(m_engine)) - return gdbEngine; - if (QmlCppEngine *qmlEngine = qobject_cast<QmlCppEngine *>(m_engine)) - if (GdbEngine *embeddedGdbEngine = qobject_cast<GdbEngine *>(qmlEngine->cppEngine())) - return embeddedGdbEngine; - return 0; -} - -AbstractGdbAdapter *DebuggerRunControlPrivate::gdbAdapter() const -{ - GdbEngine *engine = gdbEngine(); - QTC_ASSERT(engine, return 0) - return engine->gdbAdapter(); -} - } // namespace Internal @@ -514,7 +473,6 @@ DebuggerRunControl::DebuggerRunControl(RunConfiguration *runConfiguration, switch (engineType) { case GdbEngineType: d->m_engine = createGdbEngine(sp); - d->initGdbEngine(qobject_cast<GdbEngine *>(d->m_engine)); break; case ScriptEngineType: d->m_engine = createScriptEngine(sp); @@ -534,14 +492,9 @@ DebuggerRunControl::DebuggerRunControl(RunConfiguration *runConfiguration, break; case QmlEngineType: d->m_engine = createQmlEngine(sp); - connect(qobject_cast<QmlEngine *>(d->m_engine), - SIGNAL(remoteStartupRequested()), - SIGNAL(engineRequestSetup())); break; case QmlCppEngineType: d->m_engine = createQmlCppEngine(sp); - if (GdbEngine *embeddedGdbEngine = d->gdbEngine()) - d->initGdbEngine(embeddedGdbEngine); break; case LldbEngineType: d->m_engine = createLldbEngine(sp); @@ -742,56 +695,6 @@ DebuggerEngine *DebuggerRunControl::engine() return d->m_engine; } -void DebuggerRunControl::handleRemoteSetupDone(int gdbServerPort, int qmlPort) -{ - // FIXME: Use virtual functions? - if (QmlEngine *qmlEngine = qobject_cast<QmlEngine *>(d->m_engine)) { - qmlEngine->handleRemoteSetupDone(qmlPort); - return; - } - - AbstractGdbAdapter *adapter = d->gdbAdapter(); - QTC_ASSERT(adapter, return); - - RemotePlainGdbAdapter *rpga = qobject_cast<RemotePlainGdbAdapter *>(adapter); - if (rpga) { - rpga->handleSetupDone(qmlPort); - return; - } - - RemoteGdbServerAdapter *rgsa = qobject_cast<RemoteGdbServerAdapter *>(adapter); - if (rgsa) { - rgsa->handleSetupDone(gdbServerPort, qmlPort); - return; - } - QTC_ASSERT(false, /**/); -} - -void DebuggerRunControl::handleRemoteSetupFailed(const QString &message) -{ - // FIXME: Use virtual functions? - if (QmlEngine *qmlEngine = qobject_cast<QmlEngine *>(d->m_engine)) { - qmlEngine->handleRemoteSetupFailed(message); - return; - } - - AbstractGdbAdapter *adapter = d->gdbAdapter(); - QTC_ASSERT(adapter, return); - - RemotePlainGdbAdapter *rpga = qobject_cast<RemotePlainGdbAdapter *>(adapter); - if (rpga) { - rpga->handleSetupFailed(message); - return; - } - - RemoteGdbServerAdapter *rgsa = qobject_cast<RemoteGdbServerAdapter *>(adapter); - if (rgsa) { - rgsa->handleSetupFailed(message); - return; - } - QTC_ASSERT(false, /**/); -} - RunConfiguration *DebuggerRunControl::runConfiguration() const { return d->m_myRunConfiguration.data(); diff --git a/src/plugins/debugger/debuggerrunner.h b/src/plugins/debugger/debuggerrunner.h index 10562dfba48..c20a21dbc7b 100644 --- a/src/plugins/debugger/debuggerrunner.h +++ b/src/plugins/debugger/debuggerrunner.h @@ -106,9 +106,6 @@ public: void showMessage(const QString &msg, int channel); - void handleRemoteSetupDone(int gdbServerPort, int qmlPort); - void handleRemoteSetupFailed(const QString &message); - static bool checkDebugConfiguration(int toolChain, QString *errorMessage, QString *settingsCategory = 0, diff --git a/src/plugins/debugger/gdb/abstractgdbadapter.cpp b/src/plugins/debugger/gdb/abstractgdbadapter.cpp index fa9dbbc39cd..7879c5711b5 100644 --- a/src/plugins/debugger/gdb/abstractgdbadapter.cpp +++ b/src/plugins/debugger/gdb/abstractgdbadapter.cpp @@ -145,5 +145,16 @@ void AbstractGdbAdapter::showMessage(const QString &msg, int channel, int timeou m_engine->showMessage(msg, channel, timeout); } +void AbstractGdbAdapter::handleRemoteSetupDone(int gdbServerPort, int qmlPort) +{ + Q_UNUSED(gdbServerPort); + Q_UNUSED(qmlPort); +} + +void AbstractGdbAdapter::handleRemoteSetupFailed(const QString &reason) +{ + Q_UNUSED(reason); +} + } // namespace Internal } // namespace Debugger diff --git a/src/plugins/debugger/gdb/abstractgdbadapter.h b/src/plugins/debugger/gdb/abstractgdbadapter.h index 033f51cac37..609a36e1321 100644 --- a/src/plugins/debugger/gdb/abstractgdbadapter.h +++ b/src/plugins/debugger/gdb/abstractgdbadapter.h @@ -90,6 +90,9 @@ public: virtual void trkReloadRegisters() {} virtual void trkReloadThreads() {} + virtual void handleRemoteSetupDone(int gdbServerPort, int qmlPort); + virtual void handleRemoteSetupFailed(const QString &reason); + protected: DebuggerState state() const; const DebuggerStartParameters &startParameters() const; diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 63c858a8b54..64ab9b857da 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -4398,6 +4398,16 @@ void GdbEngine::removeTooltip() DebuggerEngine::removeTooltip(); } +void GdbEngine::handleRemoteSetupDone(int gdbServerPort, int qmlPort) +{ + m_gdbAdapter->handleRemoteSetupDone(gdbServerPort, qmlPort); +} + +void GdbEngine::handleRemoteSetupFailed(const QString &message) +{ + m_gdbAdapter->handleRemoteSetupFailed(message); +} + // // Factory // diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index 90ce7ae0364..a3eabba00a0 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -127,6 +127,8 @@ private: ////////// Gdb Process Management ////////// const QString &settingsIdHint = QString()); void handleInferiorShutdown(const GdbResponse &response); void handleGdbExit(const GdbResponse &response); + void handleRemoteSetupDone(int gdbServerPort, int qmlPort); + void handleRemoteSetupFailed(const QString &message); void handleAdapterStarted(); void defaultInferiorShutdown(const char *cmd); diff --git a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp index e8e74b7e711..14a1286b898 100644 --- a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp +++ b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp @@ -96,7 +96,7 @@ void RemoteGdbServerAdapter::startAdapter() } if (startParameters().serverStartScript.isEmpty()) { showMessage(_("No server start script given. "), StatusBar); - emit requestSetup(); + m_engine->requestRemoteSetup(); } else { m_uploadProc.start(_("/bin/sh ") + startParameters().serverStartScript); m_uploadProc.waitForStarted(); diff --git a/src/plugins/debugger/gdb/remoteplaingdbadapter.cpp b/src/plugins/debugger/gdb/remoteplaingdbadapter.cpp index 559bb0bd803..53bf78dfcbe 100644 --- a/src/plugins/debugger/gdb/remoteplaingdbadapter.cpp +++ b/src/plugins/debugger/gdb/remoteplaingdbadapter.cpp @@ -50,8 +50,7 @@ void RemotePlainGdbAdapter::startAdapter() { QTC_ASSERT(state() == EngineSetupRequested, qDebug() << state()); showMessage(QLatin1String("TRYING TO START ADAPTER")); - - emit requestSetup(); + m_engine->requestRemoteSetup(); } void RemotePlainGdbAdapter::setupInferior() @@ -101,8 +100,9 @@ void RemotePlainGdbAdapter::shutdownAdapter() m_engine->notifyAdapterShutdownOk(); } -void RemotePlainGdbAdapter::handleSetupDone(int qmlPort) +void RemotePlainGdbAdapter::handleSetupDone(int gdbServerPort, int qmlPort) { + Q_UNUSED(gdbServerPort); QTC_ASSERT(state() == EngineSetupRequested, qDebug() << state()); if (qmlPort != -1) diff --git a/src/plugins/debugger/gdb/remoteplaingdbadapter.h b/src/plugins/debugger/gdb/remoteplaingdbadapter.h index 6485831020a..a7b41d7d91c 100644 --- a/src/plugins/debugger/gdb/remoteplaingdbadapter.h +++ b/src/plugins/debugger/gdb/remoteplaingdbadapter.h @@ -43,12 +43,9 @@ class RemotePlainGdbAdapter : public AbstractPlainGdbAdapter public: friend class RemoteGdbProcess; explicit RemotePlainGdbAdapter(GdbEngine *engine, QObject *parent = 0); - void handleSetupDone(int qmlPort); + void handleSetupDone(int gdbServerPort, int qmlPort); void handleSetupFailed(const QString &reason); -signals: - void requestSetup(); - private slots: void handleGdbStarted(); void handleGdbStartFailed(); diff --git a/src/plugins/debugger/qml/qmlcppengine.cpp b/src/plugins/debugger/qml/qmlcppengine.cpp index 6dc28e87c1b..ee6fedc9b24 100644 --- a/src/plugins/debugger/qml/qmlcppengine.cpp +++ b/src/plugins/debugger/qml/qmlcppengine.cpp @@ -634,6 +634,18 @@ void QmlCppEngine::engineStateChanged(const DebuggerState &newState) } } +void QmlCppEngine::handleRemoteSetupDone(int gdbServerPort, int qmlPort) +{ + d->m_qmlEngine->handleRemoteSetupDone(gdbServerPort, qmlPort); + d->m_cppEngine->handleRemoteSetupDone(gdbServerPort, qmlPort); +} + +void QmlCppEngine::handleRemoteSetupFailed(const QString &message) +{ + d->m_qmlEngine->handleRemoteSetupFailed(message); + d->m_cppEngine->handleRemoteSetupFailed(message); +} + DebuggerEngine *QmlCppEngine::cppEngine() const { return d->m_cppEngine; diff --git a/src/plugins/debugger/qml/qmlcppengine.h b/src/plugins/debugger/qml/qmlcppengine.h index 10c9a4011b1..46b5a6c391c 100644 --- a/src/plugins/debugger/qml/qmlcppengine.h +++ b/src/plugins/debugger/qml/qmlcppengine.h @@ -71,6 +71,8 @@ public: QAbstractItemModel *sourceFilesModel() const; DebuggerEngine *cppEngine() const; + virtual void handleRemoteSetupDone(int gdbServerPort, int qmlPort); + virtual void handleRemoteSetupFailed(const QString &message); protected: virtual void detachDebugger(); diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp index 5d3d12cd02b..314c87e41f7 100644 --- a/src/plugins/debugger/qml/qmlengine.cpp +++ b/src/plugins/debugger/qml/qmlengine.cpp @@ -200,7 +200,7 @@ void QmlEngine::setupInferior() QTC_ASSERT(state() == InferiorSetupRequested, qDebug() << state()); if (startParameters().startMode == AttachToRemote) { - emit remoteStartupRequested(); + requestRemoteSetup(); } else { connect(&d->m_applicationLauncher, SIGNAL(processExited(int)), SLOT(disconnected())); diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodebugsupport.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemodebugsupport.cpp index af85c550dee..12b0ba8bd2f 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemodebugsupport.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemodebugsupport.cpp @@ -121,7 +121,7 @@ MaemoDebugSupport::MaemoDebugSupport(MaemoRunConfiguration *runConfig, m_dumperLib(runConfig->dumperLib()), m_state(Inactive), m_gdbServerPort(-1), m_qmlPort(-1) { - connect(m_runControl, SIGNAL(engineRequestSetup()), this, + connect(m_runControl->engine(), SIGNAL(requestRemoteSetup()), this, SLOT(handleAdapterSetupRequested())); connect(m_runControl, SIGNAL(finished()), this, SLOT(handleDebuggingFinished())); @@ -320,13 +320,13 @@ void MaemoDebugSupport::handleProgressReport(const QString &progressOutput) void MaemoDebugSupport::handleAdapterSetupFailed(const QString &error) { setState(Inactive); - m_runControl->handleRemoteSetupFailed(tr("Initial setup failed: %1").arg(error)); + m_runControl->engine()->handleRemoteSetupFailed(tr("Initial setup failed: %1").arg(error)); } void MaemoDebugSupport::handleAdapterSetupDone() { setState(Debugging); - m_runControl->handleRemoteSetupDone(m_gdbServerPort, m_qmlPort); + m_runControl->engine()->handleRemoteSetupDone(m_gdbServerPort, m_qmlPort); } void MaemoDebugSupport::setState(State newState) -- GitLab