From 04a15daab72b21885be6a519afad475e83c7b543 Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <qtc-committer@nokia.com>
Date: Tue, 17 Mar 2009 16:54:35 +0100
Subject: [PATCH] Fixes: Compilation/start on handling console processes.

---
 src/plugins/debugger/cdb/cdbdebugengine.cpp | 60 +++++++++++++++++++--
 src/plugins/debugger/cdb/cdbdebugengine.h   | 11 +++-
 src/plugins/debugger/cdb/cdbdebugengine_p.h |  2 +
 3 files changed, 66 insertions(+), 7 deletions(-)

diff --git a/src/plugins/debugger/cdb/cdbdebugengine.cpp b/src/plugins/debugger/cdb/cdbdebugengine.cpp
index 84b22c530dc..81a36f03c58 100644
--- a/src/plugins/debugger/cdb/cdbdebugengine.cpp
+++ b/src/plugins/debugger/cdb/cdbdebugengine.cpp
@@ -45,6 +45,8 @@
 #include <QtCore/QDir>
 #include <QtCore/QLibrary>
 #include <QtCore/QCoreApplication>
+#include <QtGui/QMessageBox>
+#include <QtGui/QMainWindow>
 
 #define DBGHELP_TRANSLATE_TCHAR
 #include <inc/Dbghelp.h>
@@ -218,6 +220,10 @@ CdbDebugEngine::CdbDebugEngine(DebuggerManager *parent) :
     IDebuggerEngine(parent),
     m_d(new CdbDebugEnginePrivate(parent, this))
 {
+    // m_d->m_consoleStubProc.setDebug(true);
+    connect(&m_d->m_consoleStubProc, SIGNAL(processError(QString)), this, SLOT(slotConsoleStubError(QString)));
+    connect(&m_d->m_consoleStubProc, SIGNAL(processStarted()), this, SLOT(slotConsoleStubStarted()));
+    connect(&m_d->m_consoleStubProc, SIGNAL(wrapperStopped()), this, SLOT(slotConsoleStubTerminated()));
 }
 
 CdbDebugEngine::~CdbDebugEngine()
@@ -260,14 +266,24 @@ bool CdbDebugEngine::startDebugger()
     QString errorMessage;
     bool rc = false;
     m_d->m_bIgnoreNextDebugEvent = false;
-    m_d->m_mode = m_d->m_debuggerManager->startMode();
-    switch (m_d->m_mode) {
+    const DebuggerStartMode mode = m_d->m_debuggerManager->startMode();
+    switch (mode) {
     case AttachExternal:
         rc = startAttachDebugger(m_d->m_debuggerManager->m_attachedPID, &errorMessage);
         break;
     case StartInternal:
     case StartExternal:
-        rc = startDebuggerWithExecutable(&errorMessage);
+        if (m_d->m_debuggerManager->m_useTerminal) {
+            // Launch console stub and wait for its startup
+            m_d->m_consoleStubProc.stop(); // We leave the console open, so recycle it now.
+            m_d->m_consoleStubProc.setWorkingDirectory(m_d->m_debuggerManager->m_workingDir);
+            m_d->m_consoleStubProc.setEnvironment(m_d->m_debuggerManager->m_environment);
+            rc = m_d->m_consoleStubProc.start(m_d->m_debuggerManager->m_executable, m_d->m_debuggerManager->m_processArgs);
+            if (!rc)
+                errorMessage = tr("The console stub process was unable to start '%1'.").arg(m_d->m_debuggerManager->m_executable);
+        } else {
+            rc = startDebuggerWithExecutable(mode, &errorMessage);
+        }
         break;
     case AttachCore:
         errorMessage = tr("CdbDebugEngine: Attach to core not supported!");
@@ -282,7 +298,7 @@ bool CdbDebugEngine::startDebugger()
     return rc;
 }
 
-bool CdbDebugEngine::startAttachDebugger(unsigned long pid, QString *errorMessage)
+bool CdbDebugEngine::startAttachDebugger(qint64 pid, QString *errorMessage)
 {
     // Need to aatrach invasively, otherwise, no notification signals
     // for for CreateProcess/ExitProcess occur.
@@ -293,11 +309,13 @@ bool CdbDebugEngine::startAttachDebugger(unsigned long pid, QString *errorMessag
     if (FAILED(hr)) {
         *errorMessage = tr("AttachProcess failed for pid %1: %2").arg(pid).arg(msgDebugEngineComResult(hr));
         return false;
+    } else {
+        m_d->m_mode = AttachExternal;
     }
     return true;
 }
 
-bool CdbDebugEngine::startDebuggerWithExecutable(QString *errorMessage)
+bool CdbDebugEngine::startDebuggerWithExecutable(DebuggerStartMode sm, QString *errorMessage)
 {
     m_d->m_debuggerManager->showStatusMessage("Starting Debugger", -1);
 
@@ -335,6 +353,8 @@ bool CdbDebugEngine::startDebuggerWithExecutable(QString *errorMessage)
         *errorMessage = tr("CreateProcess2Wide failed for '%1': %2").arg(cmd, msgDebugEngineComResult(hr));
         m_d->m_debuggerManagerAccess->notifyInferiorExited();
         return false;
+    } else {
+        m_d->m_mode = sm;
     }
     m_d->m_debuggerManagerAccess->notifyInferiorRunning();
     return true;
@@ -790,6 +810,31 @@ void CdbDebugEngine::timerEvent(QTimerEvent* te)
     }
 }
 
+void CdbDebugEngine::slotConsoleStubStarted()
+{
+    const qint64 appPid = m_d->m_consoleStubProc.applicationPID();
+    if (debugCDB)
+        qDebug() << Q_FUNC_INFO << appPid;
+    // Attach to console process
+    QString errorMessage;
+    if (startAttachDebugger(appPid, &errorMessage)) {
+        m_d->m_debuggerManager->m_attachedPID = appPid;
+        m_d->m_debuggerManagerAccess->notifyInferiorPidChanged(appPid);
+    } else {
+        QMessageBox::critical(m_d->m_debuggerManager->mainWindow(), tr("Debugger Error"), errorMessage);
+    }
+}
+
+void CdbDebugEngine::slotConsoleStubError(const QString &msg)
+{
+    QMessageBox::critical(m_d->m_debuggerManager->mainWindow(), tr("Debugger Error"), msg);
+}
+
+void CdbDebugEngine::slotConsoleStubTerminated()
+{
+    exitDebugger();
+}
+
 void CdbDebugEnginePrivate::handleDebugEvent()
 {
     if (debugCDB)
@@ -931,6 +976,7 @@ void CdbDebugEnginePrivate::updateStackTrace()
 
 void CdbDebugEnginePrivate::handleDebugOutput(const char* szOutputString)
 {
+    qDebug() << Q_FUNC_INFO << szOutputString;
     m_debuggerManagerAccess->showApplicationOutput(QString::fromLocal8Bit(szOutputString));
 }
 
@@ -951,6 +997,10 @@ void CdbDebugEngine::setUseCustomDumpers(bool on)
     Q_UNUSED(on)
 }
 
+void CdbDebugEngine::recheckCustomDumperAvailability()
+{
+}
+
 void CdbDebugEngine::reloadSourceFiles()
 {
 }
diff --git a/src/plugins/debugger/cdb/cdbdebugengine.h b/src/plugins/debugger/cdb/cdbdebugengine.h
index 0ac5456510b..4bfc1f1bda2 100644
--- a/src/plugins/debugger/cdb/cdbdebugengine.h
+++ b/src/plugins/debugger/cdb/cdbdebugengine.h
@@ -31,6 +31,7 @@
 #define DEBUGGER_CDBENGINE_H
 
 #include "idebuggerengine.h"
+#include "debuggermanager.h"
 
 namespace Debugger {
 namespace Internal {
@@ -91,15 +92,21 @@ public:
 
     virtual void setDebugDumpers(bool on);
     virtual void setUseCustomDumpers(bool on);
+    virtual void recheckCustomDumperAvailability();
 
     virtual void reloadSourceFiles();
 
 protected:
     void timerEvent(QTimerEvent*);
 
+private slots:
+    void slotConsoleStubStarted();
+    void slotConsoleStubError(const QString &msg);
+    void slotConsoleStubTerminated();
+
 private:
-    bool startAttachDebugger(unsigned long pid, QString *errorMessage);
-    bool startDebuggerWithExecutable(QString *errorMessage);
+    bool startAttachDebugger(qint64 pid, QString *errorMessage);
+    bool startDebuggerWithExecutable(DebuggerStartMode sm, QString *errorMessage);
     void startWatchTimer();
     void killWatchTimer();
 
diff --git a/src/plugins/debugger/cdb/cdbdebugengine_p.h b/src/plugins/debugger/cdb/cdbdebugengine_p.h
index 11d50fc604a..e6235569a07 100644
--- a/src/plugins/debugger/cdb/cdbdebugengine_p.h
+++ b/src/plugins/debugger/cdb/cdbdebugengine_p.h
@@ -34,6 +34,7 @@
 #include "cdbdebugoutput.h"
 #include "stackhandler.h"
 #include "debuggermanager.h"
+#include <utils/consoleprocess.h>
 
 namespace Debugger {
 namespace Internal {
@@ -106,6 +107,7 @@ struct CdbDebugEnginePrivate
     DebuggerManager *m_debuggerManager;
     IDebuggerManagerAccessForEngines *m_debuggerManagerAccess;
     DebuggerStartMode m_mode;
+    Core::Utils::ConsoleProcess m_consoleStubProc;
 };
 
 enum { debugCDB = 0 };
-- 
GitLab