From 85243e19a99e088df7d1d994a11d9d1a845d9c3e Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Thu, 8 Jul 2010 14:26:35 +0200
Subject: [PATCH] debugger: encapsulate part of the startup logic in the base
 class

---
 src/plugins/debugger/cdb/cdbengine.cpp       |  8 ++--
 src/plugins/debugger/debuggerengine.cpp      | 44 ++++++++++++--------
 src/plugins/debugger/debuggerengine.h        |  4 +-
 src/plugins/debugger/gdb/gdbengine.cpp       |  3 +-
 src/plugins/debugger/pdb/pdbengine.cpp       |  7 ++--
 src/plugins/debugger/qml/qmlengine.cpp       | 13 ++----
 src/plugins/debugger/script/scriptengine.cpp |  4 +-
 src/plugins/debugger/tcf/tcfengine.cpp       |  7 ++--
 8 files changed, 46 insertions(+), 44 deletions(-)

diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp
index 608b2cdd4b6..c22eacff989 100644
--- a/src/plugins/debugger/cdb/cdbengine.cpp
+++ b/src/plugins/debugger/cdb/cdbengine.cpp
@@ -387,7 +387,7 @@ void CdbEngine::startEngine()
         warning(QLatin1String("Internal error: Attempt to start debugger while another process is being debugged."));
         setState(EngineStartFailed, Q_FUNC_INFO, __LINE__);
         setState(DebuggerNotReady, Q_FUNC_INFO, __LINE__);
-        emit startFailed();
+        notifyEngineStartFailed();
         return;
     }
     switch (sp.startMode) {
@@ -396,7 +396,7 @@ void CdbEngine::startEngine()
         warning(QLatin1String("Internal error: Mode not supported."));
         setState(EngineStartFailed, Q_FUNC_INFO, __LINE__);
         setState(DebuggerNotReady, Q_FUNC_INFO, __LINE__);
-        emit startFailed();
+        notifyEngineStartFailed();
         break;
     default:
         break;
@@ -470,11 +470,11 @@ void CdbEngine::startEngine()
     if (rc) {
         if (needWatchTimer)
             m_d->startWatchTimer();
-        startSuccessful();
+        notifyEngineStarted();
     } else {
         warning(errorMessage);
         setState(InferiorStartFailed, Q_FUNC_INFO, __LINE__);
-        startFailed();
+        notifyEngineStartFailed();
     }
 }
 
diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp
index 6b4853e408a..619027a87d5 100644
--- a/src/plugins/debugger/debuggerengine.cpp
+++ b/src/plugins/debugger/debuggerengine.cpp
@@ -608,12 +608,12 @@ void DebuggerEngine::showMessage(const QString &msg, int channel, int timeout) c
 
 void DebuggerEngine::startDebugger(DebuggerRunControl *runControl)
 {
-    QTC_ASSERT(runControl, startFailed(); return);
-    QTC_ASSERT(!d->m_runControl, startFailed(); return);
+    QTC_ASSERT(runControl, notifyEngineStartFailed(); return);
+    QTC_ASSERT(!d->m_runControl, notifyEngineStartFailed(); return);
 
     DebuggerEngine *sessionTemplate = plugin()->sessionTemplate();
-    QTC_ASSERT(sessionTemplate, startFailed(); return);
-    QTC_ASSERT(sessionTemplate != this, startFailed(); return);
+    QTC_ASSERT(sessionTemplate, notifyEngineStartFailed(); return);
+    QTC_ASSERT(sessionTemplate != this, notifyEngineStartFailed(); return);
 
     breakHandler()->initializeFromTemplate(sessionTemplate->breakHandler());
     watchHandler()->initializeFromTemplate(sessionTemplate->watchHandler());
@@ -956,6 +956,18 @@ static bool isAllowedTransition(int from, int to)
     return false;
 }
 
+void DebuggerEngine::notifyEngineStarted()
+{
+    QTC_ASSERT(state() == EngineStarting, /**/);
+    setState(EngineStarted);
+}
+
+void DebuggerEngine::notifyEngineStartFailed()
+{
+    QTC_ASSERT(state() == EngineStarting, /**/);
+    setState(EngineStartFailed);
+}
+
 void DebuggerEngine::setState(DebuggerState state, bool forced)
 {
     //qDebug() << "STATUS CHANGE: FROM " << stateName(d->m_state)
@@ -972,8 +984,16 @@ void DebuggerEngine::setState(DebuggerState state, bool forced)
     showMessage(msg, LogDebug);
     plugin()->updateState(this);
 
-    if (state != oldState && state == DebuggerNotReady)
-        d->m_runControl->debuggingFinished();
+    if (state != oldState) {
+        if (state == DebuggerNotReady) {
+            d->m_runControl->debuggingFinished();
+        } else if (state == EngineStarted) {
+            d->m_runControl->startSuccessful();
+        } else if (state == EngineStartFailed) {
+            d->m_runControl->debuggingFinished();
+            d->m_runControl->startFailed();
+        }
+    }
 }
 
 bool DebuggerEngine::debuggerActionsEnabled() const
@@ -1008,18 +1028,6 @@ bool DebuggerEngine::debuggerActionsEnabled(DebuggerState state)
     return false;
 }
 
-void DebuggerEngine::startFailed()
-{
-    // The concrete engines themselves are responsible for changing state.
-    QTC_ASSERT(state() == DebuggerNotReady, setState(DebuggerNotReady));
-    d->m_runControl->startFailed();
-}
-
-void DebuggerEngine::startSuccessful()
-{
-    d->m_runControl->startSuccessful();
-}
-
 void DebuggerEngine::notifyInferiorPid(qint64 pid)
 {
     if (d->m_inferiorPid == pid)
diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h
index c542087c251..69063ff276c 100644
--- a/src/plugins/debugger/debuggerengine.h
+++ b/src/plugins/debugger/debuggerengine.h
@@ -248,13 +248,13 @@ public slots:
     void openFile(const QString &fileName, int lineNumber = -1);
     void gotoLocation(const QString &fileName, int lineNumber, bool setMarker);
     void gotoLocation(const StackFrame &frame, bool setMarker);
-    void startSuccessful();
-    void startFailed();
     void raiseApplication();
     virtual void quitDebugger() { exitDebugger(); } // called by DebuggerRunControl
 
 protected:
     void setState(DebuggerState state, bool forced = false);
+    void notifyEngineStarted();
+    void notifyEngineStartFailed();
 
 private:
     void executeRunToLine();
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 0cd5b96f4ef..1b1083fd6c3 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -4205,7 +4205,7 @@ void GdbEngine::handleAdapterStartFailed(const QString &msg, const QString &sett
 
 void GdbEngine::handleAdapterStarted()
 {
-    setState(EngineStarted);
+    notifyEngineStarted();
     if (m_progress)
         m_progress->setProgressValue(25);
     showMessage(_("ADAPTER SUCCESSFULLY STARTED"));
@@ -4217,7 +4217,6 @@ void GdbEngine::handleAdapterStarted()
 
 void GdbEngine::handleInferiorPrepared()
 {
-    startSuccessful();
     const QByteArray qtInstallPath = startParameters().qtInstallPath.toLocal8Bit();
     if (!qtInstallPath.isEmpty()) {
         QByteArray qtBuildPath;
diff --git a/src/plugins/debugger/pdb/pdbengine.cpp b/src/plugins/debugger/pdb/pdbengine.cpp
index 4c92eb09cd7..fa732a44589 100644
--- a/src/plugins/debugger/pdb/pdbengine.cpp
+++ b/src/plugins/debugger/pdb/pdbengine.cpp
@@ -148,7 +148,7 @@ void PdbEngine::startEngine()
         //showMessage("STARTING " +m_scriptFileName + "FAILED");
         showMessage(QString::fromLatin1("Cannot open %1: %2").
                    arg(m_scriptFileName, scriptFile.errorString()), LogError);
-        startFailed();
+        notifyEngineStartFailed();
         return;
     }
     m_pdbProc.disconnect(); // From any previous runs
@@ -188,9 +188,10 @@ void PdbEngine::startEngine()
             Core::ICore::instance()->showWarningWithOptions(title, msg);
         }
         shutdown();
-        startFailed();
+        notifyEngineStartFailed();
         return;
     }
+    notifyEngineStarted();
     attemptBreakpointSynchronization();
 
     showMessage(_("PDB STARTED, INITIALIZING IT"));
@@ -199,9 +200,7 @@ void PdbEngine::startEngine()
     postCommand("execfile('" + dumperSourcePath + "pdumper.py')",
         CB(handleLoadDumper));
 
-    setState(EngineStarted);
     setState(InferiorStarting);
-    emit startSuccessful();
     showStatusMessage(tr("Running requested..."), 5000);
     setState(InferiorRunningRequested);
     setState(InferiorRunning);
diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp
index 4194733461c..eb47fa782b3 100644
--- a/src/plugins/debugger/qml/qmlengine.cpp
+++ b/src/plugins/debugger/qml/qmlengine.cpp
@@ -251,18 +251,13 @@ void QmlEngine::startEngine()
     m_proc.start(sp.executable, sp.processArgs);
 
     if (!m_proc.waitForStarted()) {
-        setState(EngineStartFailed);
-        startFailed();
+        notifyEngineStartFailed();
         return;
     }
 #endif
-    setState(EngineStarted);
-    startSuccessful();
-    setState(InferiorStarting);
-
+    notifyEngineStarted();
     //m_frameRate = new CanvasFrameRate(0);
     //m_frameRate->show();
-    setState(InferiorRunning);
 }
 
 void QmlEngine::setupConnection()
@@ -300,12 +295,12 @@ void QmlEngine::setupConnection()
 
     if (!m_conn->waitForConnected()) {
         qDebug() << "CONNECTION FAILED";
-        setState(InferiorStartFailed);
-        startFailed();
+        notifyEngineStartFailed();
         return;
     }
  #endif
 
+    notifyEngineStarted();
     qDebug() << "CONNECTION SUCCESSFUL";
     setState(InferiorRunningRequested);
     setState(InferiorRunning);
diff --git a/src/plugins/debugger/script/scriptengine.cpp b/src/plugins/debugger/script/scriptengine.cpp
index 70ffe851906..2109f0ba721 100644
--- a/src/plugins/debugger/script/scriptengine.cpp
+++ b/src/plugins/debugger/script/scriptengine.cpp
@@ -255,9 +255,10 @@ void ScriptEngine::startEngine()
     if (!scriptFile.open(QIODevice::ReadOnly|QIODevice::Text)) {
         showMessage(QString::fromLatin1("Cannot open %1: %2").
           arg(m_scriptFileName, scriptFile.errorString()), LogError);
-        startFailed();
+        notifyEngineStartFailed();
         return;
     }
+    notifyEngineStarted();
     QTextStream stream(&scriptFile);
     m_scriptContents = stream.readAll();
     scriptFile.close();
@@ -266,7 +267,6 @@ void ScriptEngine::startEngine()
     showStatusMessage(tr("Running requested..."), 5000);
     showMessage(QLatin1String("Running: ") + m_scriptFileName, LogMisc);
     QTimer::singleShot(0, this, SLOT(runInferior()));
-    startSuccessful();
 }
 
 void ScriptEngine::continueInferior()
diff --git a/src/plugins/debugger/tcf/tcfengine.cpp b/src/plugins/debugger/tcf/tcfengine.cpp
index cd458ef48bb..01fa77bf675 100644
--- a/src/plugins/debugger/tcf/tcfengine.cpp
+++ b/src/plugins/debugger/tcf/tcfengine.cpp
@@ -155,8 +155,10 @@ void TcfEngine::socketReadyRead()
 void TcfEngine::socketConnected()
 {
     showStatusMessage("Socket connected.");
-    m_socket->waitForConnected(2000);
-    //sendCommand("Locator", "redirect", "ID");
+    if (m_socket->waitForConnected(2000))
+        notifyEngineStarted();
+    else
+        notifyEngineStartFailed();
 }
 
 void TcfEngine::socketDisconnected()
@@ -211,7 +213,6 @@ void TcfEngine::startEngine()
     const quint16 port = sp.remoteChannel.mid(pos + 1).toInt();
     //QTimer::singleShot(0, this, SLOT(runInferior()));
     m_socket->connectToHost(host, port);
-    emit startSuccessful();
 }
 
 void TcfEngine::continueInferior()
-- 
GitLab