summaryrefslogtreecommitdiff
path: root/src/plugins/debugger/lldb/lldbenginehost.cpp
diff options
context:
space:
mode:
authorArvid Ephraim Picciani <arvid.picciani@nokia.com>2010-12-01 15:41:08 +0100
committerArvid Ephraim Picciani <arvid.picciani@nokia.com>2010-12-01 15:50:18 +0100
commit0ab67db58ea2824d03e6f7e10da367ad0ac0b29f (patch)
tree37c32679fac857d1885ba4f80e3cfa1731fb6e01 /src/plugins/debugger/lldb/lldbenginehost.cpp
parent1d5fadb12e0c350f5f83fca2b0c6408340bee2de (diff)
downloadqt-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.cpp142
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
+