diff --git a/src/plugins/debugger/debuggerrunner.cpp b/src/plugins/debugger/debuggerrunner.cpp index a7cdeb680c54a83a9cb5861c0bb033f6a04296b4..a438b16eba1867f6c87a0a02703dfa1e31c45855 100644 --- a/src/plugins/debugger/debuggerrunner.cpp +++ b/src/plugins/debugger/debuggerrunner.cpp @@ -35,6 +35,10 @@ #include "debuggerplugin.h" #include "debuggerstringutils.h" #include "debuggeruiswitcher.h" +#include "gdb/gdbengine.h" +#include "gdb/remotegdbserveradapter.h" +#include "gdb/remoteplaingdbadapter.h" +#include "qml/qmlcppengine.h" #ifdef Q_OS_WIN # include "peutils.h" @@ -397,6 +401,7 @@ void DebuggerRunControl::createEngine(const DebuggerStartParameters &startParams switch (engineType) { case GdbEngineType: m_engine = createGdbEngine(sp); + initGdbEngine(qobject_cast<Internal::GdbEngine *>(m_engine)); break; case ScriptEngineType: m_engine = createScriptEngine(sp); @@ -415,6 +420,8 @@ void DebuggerRunControl::createEngine(const DebuggerStartParameters &startParams break; case QmlCppEngineType: m_engine = createQmlCppEngine(sp); + if (Internal::GdbEngine *embeddedGdbEngine = gdbEngine()) + initGdbEngine(embeddedGdbEngine); break; default: { // Could not find anything suitable. @@ -430,6 +437,21 @@ void DebuggerRunControl::createEngine(const DebuggerStartParameters &startParams } } +void DebuggerRunControl::initGdbEngine(Internal::GdbEngine *engine) +{ + QTC_ASSERT(engine, return) + + // Forward adapter signals. + Internal::AbstractGdbAdapter *adapter = engine->gdbAdapter(); + if (RemotePlainGdbAdapter *rpga = qobject_cast<RemotePlainGdbAdapter *>(adapter)) { + connect(rpga, SIGNAL(requestSetup()), this, + SIGNAL(gdbAdapterRequestSetup())); + } else if (RemoteGdbServerAdapter *rgsa = qobject_cast<RemoteGdbServerAdapter *>(adapter)) { + connect(rgsa, SIGNAL(requestSetup()), + this, SIGNAL(gdbAdapterRequestSetup())); + } +} + QString DebuggerRunControl::displayName() const { QTC_ASSERT(m_engine, return QString()); @@ -592,4 +614,47 @@ Internal::DebuggerEngine *DebuggerRunControl::engine() return m_engine; } +Internal::GdbEngine *DebuggerRunControl::gdbEngine() const +{ + QTC_ASSERT(m_engine, return 0); + if (GdbEngine *gdbEngine = qobject_cast<GdbEngine *>(m_engine)) + return gdbEngine; + if (QmlCppEngine * const qmlEngine = qobject_cast<QmlCppEngine *>(m_engine)) + if (GdbEngine *embeddedGdbEngine = qobject_cast<GdbEngine *>(qmlEngine->cppEngine())) + return embeddedGdbEngine; + return 0; +} + +Internal::AbstractGdbAdapter *DebuggerRunControl::gdbAdapter() const +{ + GdbEngine *engine = gdbEngine(); + QTC_ASSERT(engine, return 0) + return engine->gdbAdapter(); +} + +void DebuggerRunControl::remoteGdbHandleSetupDone() +{ + Internal::AbstractGdbAdapter *adapter = gdbAdapter(); + QTC_ASSERT(adapter, return); + if (RemotePlainGdbAdapter *rpga = qobject_cast<RemotePlainGdbAdapter *>(adapter)) { + rpga->handleSetupDone(); + } else if (RemoteGdbServerAdapter *rgsa = qobject_cast<RemoteGdbServerAdapter *>(adapter)) { + rgsa->handleSetupDone(); + } else { + QTC_ASSERT(false, /* */ ); + } +} + +void DebuggerRunControl::remoteGdbHandleSetupFailed(const QString &message) +{ + Internal::AbstractGdbAdapter *adapter = gdbAdapter(); + QTC_ASSERT(adapter, return); + if (RemotePlainGdbAdapter *rpga = qobject_cast<RemotePlainGdbAdapter *>(adapter)) { + rpga->handleSetupFailed(message); + } else if (RemoteGdbServerAdapter *rgsa = qobject_cast<RemoteGdbServerAdapter *>(adapter)) { + rgsa->handleSetupFailed(message); + } else { + QTC_ASSERT(false, /* */ ); + } +} } // namespace Debugger diff --git a/src/plugins/debugger/debuggerrunner.h b/src/plugins/debugger/debuggerrunner.h index 2fbe020165ece04ce7e894cd13eb5226e6b7d435..cca2a24446fdfcf53900434e3b1a80dab2518a14 100644 --- a/src/plugins/debugger/debuggerrunner.h +++ b/src/plugins/debugger/debuggerrunner.h @@ -48,6 +48,8 @@ class DebuggerStartParameters; namespace Internal { class DebuggerEngine; class QmlEngine; +class GdbEngine; +class AbstractGdbAdapter; } //DEBUGGER_EXPORT QDebug operator<<(QDebug str, const DebuggerStartParameters &); @@ -113,11 +115,17 @@ public: void showMessage(const QString &msg, int channel); + void remoteGdbHandleSetupDone(); + void remoteGdbHandleSetupFailed(const QString &message); + static bool checkDebugConfiguration(int toolChain, QString *errorMessage, QString *settingsCategory = 0, QString *settingsPage = 0); +signals: + void gdbAdapterRequestSetup(); + private slots: void handleFinished(); @@ -127,6 +135,9 @@ protected: private: DebuggerEngineType engineForExecutable(const QString &executable); DebuggerEngineType engineForMode(DebuggerStartMode mode); + void initGdbEngine(Internal::GdbEngine *engine); + Internal::GdbEngine *gdbEngine() const; + Internal::AbstractGdbAdapter *gdbAdapter() const; Internal::DebuggerEngine *m_engine; const QWeakPointer<RunConfiguration> m_myRunConfiguration; diff --git a/src/plugins/debugger/gdb/remotegdbserveradapter.h b/src/plugins/debugger/gdb/remotegdbserveradapter.h index 0f514e4ac33ff2f78db1d463fd490323da9d273e..ffcb8851e0f6b56eefaeea9499ba64c9900bceba 100644 --- a/src/plugins/debugger/gdb/remotegdbserveradapter.h +++ b/src/plugins/debugger/gdb/remotegdbserveradapter.h @@ -43,7 +43,7 @@ namespace Internal { // /////////////////////////////////////////////////////////////////////// -class DEBUGGER_EXPORT RemoteGdbServerAdapter : public AbstractGdbAdapter +class RemoteGdbServerAdapter : public AbstractGdbAdapter { Q_OBJECT diff --git a/src/plugins/debugger/gdb/remoteplaingdbadapter.h b/src/plugins/debugger/gdb/remoteplaingdbadapter.h index 0505e3002b97da2958154c93651b1cdd3e9beb36..68a2651b06c7d74f1f5ecc5c17ecbdcb965ec80c 100644 --- a/src/plugins/debugger/gdb/remoteplaingdbadapter.h +++ b/src/plugins/debugger/gdb/remoteplaingdbadapter.h @@ -36,7 +36,7 @@ namespace Debugger { namespace Internal { -class DEBUGGER_EXPORT RemotePlainGdbAdapter : public AbstractPlainGdbAdapter +class RemotePlainGdbAdapter : public AbstractPlainGdbAdapter { Q_OBJECT diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodebugsupport.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemodebugsupport.cpp index 141f5a77aeeb13a90d67c8826c88c433ecf2f854..f204ac6f284d0aa7002aaf528fe84d57a70019db 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemodebugsupport.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemodebugsupport.cpp @@ -41,12 +41,10 @@ #include "maemosshrunner.h" #include <coreplugin/ssh/sftpchannel.h> -#include <debugger/debuggerengine.h> #include <debugger/debuggerplugin.h> #include <debugger/debuggerrunner.h> -#include <debugger/qml/qmlcppengine.h> -#include <debugger/gdb/remotegdbserveradapter.h> -#include <debugger/gdb/remoteplaingdbadapter.h> +#include <debugger/debuggerengine.h> + #include <projectexplorer/toolchain.h> #include <QtCore/QDir> @@ -115,18 +113,7 @@ MaemoDebugSupport::MaemoDebugSupport(MaemoRunConfiguration *runConfig, m_deviceConfig(m_runConfig->deviceConfig()), m_runner(new MaemoSshRunner(this, m_runConfig, true)) { - GdbEngine *gdbEngine = qobject_cast<GdbEngine *>(m_runControl->engine()); - if (!gdbEngine) { - QmlCppEngine * const qmlEngine - = qobject_cast<QmlCppEngine *>(m_runControl->engine()); - Q_ASSERT(qmlEngine); - gdbEngine = qobject_cast<GdbEngine *>(qmlEngine->cppEngine()); - } - Q_ASSERT(gdbEngine); - m_gdbAdapter = gdbEngine->gdbAdapter(); - Q_ASSERT(m_gdbAdapter); - connect(m_gdbAdapter, SIGNAL(requestSetup()), this, - SLOT(handleAdapterSetupRequested())); + connect(m_runControl, SIGNAL(gdbAdapterRequestSetup()), this, SLOT(handleAdapterSetupRequested())); connect(m_runControl, SIGNAL(finished()), this, SLOT(handleDebuggingFinished())); } @@ -291,11 +278,8 @@ void MaemoDebugSupport::stopSsh() void MaemoDebugSupport::handleAdapterSetupFailed(const QString &error) { - const QString msg = tr("Initial setup failed: %1").arg(error); - if (useGdb()) - qobject_cast<RemotePlainGdbAdapter *>(m_gdbAdapter)->handleSetupFailed(msg); - else - qobject_cast<RemoteGdbServerAdapter*>(m_gdbAdapter)->handleSetupFailed(msg); + + m_runControl->remoteGdbHandleSetupFailed(tr("Initial setup failed: %1").arg(error)); m_stopped = true; stopSsh(); } @@ -303,10 +287,7 @@ void MaemoDebugSupport::handleAdapterSetupFailed(const QString &error) void MaemoDebugSupport::handleAdapterSetupDone() { m_adapterStarted = true; - if (useGdb()) - qobject_cast<RemotePlainGdbAdapter *>(m_gdbAdapter)->handleSetupDone(); - else - qobject_cast<RemoteGdbServerAdapter*>(m_gdbAdapter)->handleSetupDone(); + m_runControl->remoteGdbHandleSetupDone(); } int MaemoDebugSupport::gdbServerPort(const MaemoRunConfiguration *rc) diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodebugsupport.h b/src/plugins/qt4projectmanager/qt-maemo/maemodebugsupport.h index eec6cdb22ff3218e413392369911bb468cca29fc..255dbef1773f8bd3a9240a51c5ed4e61b73e1d73 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemodebugsupport.h +++ b/src/plugins/qt4projectmanager/qt-maemo/maemodebugsupport.h @@ -46,9 +46,6 @@ namespace Core { class SftpChannel; } namespace Debugger { class DebuggerRunControl; -namespace Internal { -class AbstractGdbAdapter; -} } namespace ProjectExplorer { class RunControl; } @@ -100,8 +97,6 @@ private: const MaemoDeviceConfig m_deviceConfig; MaemoSshRunner * const m_runner; - Debugger::Internal::AbstractGdbAdapter *m_gdbAdapter; - QSharedPointer<Core::SftpChannel> m_uploader; Core::SftpJobId m_uploadJob; bool m_adapterStarted;