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