2009-02-25 09:15:00 +01:00
|
|
|
/**************************************************************************
|
2008-12-02 12:01:29 +01:00
|
|
|
**
|
|
|
|
|
** This file is part of Qt Creator
|
|
|
|
|
**
|
2009-02-25 09:15:00 +01:00
|
|
|
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
|
2008-12-02 12:01:29 +01:00
|
|
|
**
|
|
|
|
|
** Contact: Qt Software Information (qt-info@nokia.com)
|
|
|
|
|
**
|
2009-02-25 09:15:00 +01:00
|
|
|
** Commercial Usage
|
2008-12-02 14:17:16 +01:00
|
|
|
**
|
2009-02-25 09:15:00 +01:00
|
|
|
** Licensees holding valid Qt Commercial licenses may use this file in
|
|
|
|
|
** accordance with the Qt Commercial License Agreement provided with the
|
|
|
|
|
** Software or, alternatively, in accordance with the terms contained in
|
|
|
|
|
** a written agreement between you and Nokia.
|
2008-12-02 14:17:16 +01:00
|
|
|
**
|
2009-02-25 09:15:00 +01:00
|
|
|
** GNU Lesser General Public License Usage
|
2008-12-02 14:17:16 +01:00
|
|
|
**
|
2009-02-25 09:15:00 +01:00
|
|
|
** Alternatively, this file may be used under the terms of the GNU Lesser
|
|
|
|
|
** General Public License version 2.1 as published by the Free Software
|
|
|
|
|
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
|
|
|
** packaging of this file. Please review the following information to
|
|
|
|
|
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
|
|
|
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
2008-12-02 14:17:16 +01:00
|
|
|
**
|
2009-02-25 09:15:00 +01:00
|
|
|
** If you are unsure which license is appropriate for your use, please
|
|
|
|
|
** contact the sales department at qt-sales@nokia.com.
|
2008-12-02 12:01:29 +01:00
|
|
|
**
|
2009-02-25 09:15:00 +01:00
|
|
|
**************************************************************************/
|
2008-12-02 16:19:05 +01:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
#include "consoleprocess.h"
|
|
|
|
|
|
2009-01-29 20:11:02 +01:00
|
|
|
using namespace Core::Utils;
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
|
ConsoleProcess::ConsoleProcess(QObject *parent)
|
|
|
|
|
: QObject(parent)
|
|
|
|
|
{
|
|
|
|
|
m_isRunning = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ConsoleProcess::~ConsoleProcess()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2009-01-15 19:44:59 +01:00
|
|
|
static QString shellEscape(const QString &in)
|
|
|
|
|
{
|
|
|
|
|
QString out = in;
|
|
|
|
|
out.replace('\'', "'\''");
|
|
|
|
|
out.prepend('\'');
|
|
|
|
|
out.append('\'');
|
|
|
|
|
return out;
|
|
|
|
|
}
|
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
bool ConsoleProcess::start(const QString &program, const QStringList &args)
|
|
|
|
|
{
|
2009-01-30 11:57:55 +01:00
|
|
|
if (m_process.state() != QProcess::NotRunning)
|
2008-12-02 12:01:29 +01:00
|
|
|
return false;
|
|
|
|
|
QString shellArgs;
|
|
|
|
|
shellArgs += QLatin1String("cd ");
|
2009-01-15 19:44:59 +01:00
|
|
|
shellArgs += shellEscape(workingDirectory());
|
2008-12-02 12:01:29 +01:00
|
|
|
shellArgs += QLatin1Char(';');
|
2009-01-15 19:44:59 +01:00
|
|
|
shellArgs += shellEscape(program);
|
2008-12-02 12:01:29 +01:00
|
|
|
foreach (const QString &arg, args) {
|
|
|
|
|
shellArgs += QLatin1Char(' ');
|
2009-01-15 19:44:59 +01:00
|
|
|
shellArgs += shellEscape(arg);
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
2009-01-15 19:44:59 +01:00
|
|
|
shellArgs += QLatin1String("; echo; echo \"Press enter to close this window\"; read DUMMY");
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-01-30 11:57:55 +01:00
|
|
|
m_process.setEnvironment(environment());
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-01-30 11:57:55 +01:00
|
|
|
connect(&m_process, SIGNAL(finished(int, QProcess::ExitStatus)),
|
2008-12-02 12:01:29 +01:00
|
|
|
this, SLOT(processFinished(int, QProcess::ExitStatus)));
|
|
|
|
|
|
2009-01-30 11:57:55 +01:00
|
|
|
m_process.start(QLatin1String("xterm"), QStringList() << QLatin1String("-e") << "/bin/sh" << "-c" << shellArgs);
|
|
|
|
|
if (!m_process.waitForStarted())
|
2008-12-02 12:01:29 +01:00
|
|
|
return false;
|
|
|
|
|
emit processStarted();
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ConsoleProcess::processFinished(int, QProcess::ExitStatus)
|
|
|
|
|
{
|
|
|
|
|
emit processStopped();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool ConsoleProcess::isRunning() const
|
|
|
|
|
{
|
2009-01-30 11:57:55 +01:00
|
|
|
return m_process.state() != QProcess::NotRunning;
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ConsoleProcess::stop()
|
|
|
|
|
{
|
2009-01-30 11:57:55 +01:00
|
|
|
m_process.terminate();
|
|
|
|
|
m_process.waitForFinished();
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
qint64 ConsoleProcess::applicationPID() const
|
|
|
|
|
{
|
2009-01-30 11:57:55 +01:00
|
|
|
return m_process.pid();
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int ConsoleProcess::exitCode() const
|
|
|
|
|
{
|
2009-01-30 11:57:55 +01:00
|
|
|
return m_process.exitCode();
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|