diff options
author | Arvid Ephraim Picciani <arvid.picciani@nokia.com> | 2010-12-01 15:41:08 +0100 |
---|---|---|
committer | Arvid Ephraim Picciani <arvid.picciani@nokia.com> | 2010-12-01 15:50:18 +0100 |
commit | 0ab67db58ea2824d03e6f7e10da367ad0ac0b29f (patch) | |
tree | 37c32679fac857d1885ba4f80e3cfa1731fb6e01 /src/plugins/debugger/lldb/lldbenginehost.cpp | |
parent | 1d5fadb12e0c350f5f83fca2b0c6408340bee2de (diff) | |
download | qt-creator-0ab67db58ea2824d03e6f7e10da367ad0ac0b29f.tar.gz |
lldb: introduce dialog to start engine remotely
Diffstat (limited to 'src/plugins/debugger/lldb/lldbenginehost.cpp')
-rw-r--r-- | src/plugins/debugger/lldb/lldbenginehost.cpp | 142 |
1 files changed, 121 insertions, 21 deletions
diff --git a/src/plugins/debugger/lldb/lldbenginehost.cpp b/src/plugins/debugger/lldb/lldbenginehost.cpp index 49a6ff1269..a5f3b79b35 100644 --- a/src/plugins/debugger/lldb/lldbenginehost.cpp +++ b/src/plugins/debugger/lldb/lldbenginehost.cpp @@ -58,45 +58,140 @@ namespace Debugger { namespace Internal { +SshIODevice::SshIODevice(Core::SshRemoteProcessRunner::Ptr r) + : runner(r) + , buckethead(0) +{ + setOpenMode(QIODevice::ReadWrite | QIODevice::Unbuffered); + connect (runner.data(), SIGNAL(processStarted()), + this, SLOT(processStarted())); + connect(runner.data(), SIGNAL(processOutputAvailable(const QByteArray &)), + this, SLOT(outputAvailable(const QByteArray &))); + connect(runner.data(), SIGNAL(processErrorOutputAvailable(const QByteArray &)), + this, SLOT(errorOutputAvailable(const QByteArray &))); +} +qint64 SshIODevice::bytesAvailable () const +{ + qint64 r = QIODevice::bytesAvailable(); + foreach (const QByteArray &bucket, buckets) + r += bucket.size(); + r-= buckethead; + return r; +} +qint64 SshIODevice::writeData (const char * data, qint64 maxSize) +{ + if (proc == 0) { + startupbuffer += QByteArray::fromRawData(data, maxSize); + return maxSize; + } + proc->sendInput(QByteArray::fromRawData(data, maxSize)); + return maxSize; +} +qint64 SshIODevice::readData (char * data, qint64 maxSize) +{ + if (proc == 0) + return 0; + qint64 size = maxSize; + while (size > 0) { + if (!buckets.size()) { + return maxSize - size; + } + QByteArray &bucket = buckets.head(); + if ((size + buckethead) >= bucket.size()) { + int d = bucket.size() - buckethead; + memcpy(data, bucket.data() + buckethead, d); + data += d; + size -= d; + buckets.dequeue(); + buckethead = 0; + } else { + memcpy(data, bucket.data() + buckethead, size); + data += size; + buckethead += size; + size = 0; + } + } + return maxSize - size; +} + +void SshIODevice::processStarted() +{ + proc = runner->process(); + proc->sendInput(startupbuffer); +} + +void SshIODevice::outputAvailable(const QByteArray &output) +{ + buckets.enqueue(output); + emit readyRead(); +} + +void SshIODevice::errorOutputAvailable(const QByteArray &output) +{ + fprintf(stderr, "%s", output.data()); +} + + LldbEngineHost::LldbEngineHost(const DebuggerStartParameters &startParameters) :IPCEngineHost(startParameters) { showMessage(QLatin1String("setting up coms")); - m_guestProcess = new QProcess(this); + if (startParameters.startMode == StartRemoteEngine) + { + m_guestProcess = 0; + Core::SshRemoteProcessRunner::Ptr runner = + Core::SshRemoteProcessRunner::create(startParameters.connParams); + connect (runner.data(), SIGNAL(connectionError(Core::SshError)), + this, SLOT(sshConnectionError(Core::SshError))); + runner->run(startParameters.serverStartScript.toUtf8()); + setGuestDevice(new SshIODevice(runner)); + } else { + m_guestProcess = new QProcess(this); - connect(m_guestProcess, SIGNAL(finished(int, QProcess::ExitStatus)), - this, SLOT(finished(int, QProcess::ExitStatus))); + connect(m_guestProcess, SIGNAL(finished(int, QProcess::ExitStatus)), + this, SLOT(finished(int, QProcess::ExitStatus))); - connect(m_guestProcess, SIGNAL(readyReadStandardError()), this, - SLOT(stderrReady())); + connect(m_guestProcess, SIGNAL(readyReadStandardError()), this, + SLOT(stderrReady())); - QString a = Core::ICore::instance()->resourcePath() + QLatin1String("/qtcreator-lldb"); - if(getenv("QTC_LLDB_GUEST") != 0) - a = QString::fromLocal8Bit(getenv("QTC_LLDB_GUEST")); + QString a = Core::ICore::instance()->resourcePath() + QLatin1String("/qtcreator-lldb"); + if(getenv("QTC_LLDB_GUEST") != 0) + a = QString::fromLocal8Bit(getenv("QTC_LLDB_GUEST")); - showStatusMessage(QString(QLatin1String("starting %1")).arg(a)); + showStatusMessage(QString(QLatin1String("starting %1")).arg(a)); - m_guestProcess->start(a, QStringList()); - m_guestProcess->setReadChannel(QProcess::StandardOutput); + m_guestProcess->start(a, QStringList(), QIODevice::ReadWrite | QIODevice::Unbuffered); + m_guestProcess->setReadChannel(QProcess::StandardOutput); - if (!m_guestProcess->waitForStarted()) { - showStatusMessage(tr("qtcreator-lldb failed to start %1").arg(m_guestProcess->error())); - notifyEngineSpontaneousShutdown(); - return; - } + if (!m_guestProcess->waitForStarted()) { + showStatusMessage(tr("qtcreator-lldb failed to start %1").arg(m_guestProcess->error())); + notifyEngineSpontaneousShutdown(); + return; + } - setGuestDevice(m_guestProcess); + setGuestDevice(m_guestProcess); + } } LldbEngineHost::~LldbEngineHost() { showMessage(QLatin1String("tear down qtcreator-lldb")); - disconnect(m_guestProcess, SIGNAL(finished(int, QProcess::ExitStatus)), - this, SLOT(finished (int, QProcess::ExitStatus))); - m_guestProcess->terminate(); - m_guestProcess->kill(); + + if (m_guestProcess) { + disconnect(m_guestProcess, SIGNAL(finished(int, QProcess::ExitStatus)), + this, SLOT(finished (int, QProcess::ExitStatus))); + + + m_guestProcess->terminate(); + m_guestProcess->kill(); + } + if (m_ssh.data() && m_ssh->process().data()) { + // TODO: openssh doesn't do that + + m_ssh->process()->kill(); + } } void LldbEngineHost::nuke() @@ -108,6 +203,10 @@ void LldbEngineHost::nuke() m_guestProcess->kill(); notifyEngineSpontaneousShutdown(); } +void LldbEngineHost::sshConnectionError(Core::SshError e) +{ + showStatusMessage(tr("ssh connection error: %1").arg(e)); +} void LldbEngineHost::finished(int, QProcess::ExitStatus status) { @@ -128,3 +227,4 @@ DebuggerEngine *createLldbEngine(const DebuggerStartParameters &startParameters) } // namespace Internal } // namespace Debugger + |