2011-05-13 18:31:13 +02:00
|
|
|
/**************************************************************************
|
|
|
|
**
|
2012-02-06 10:49:11 +01:00
|
|
|
** This file is part of Installer Framework
|
2011-05-13 18:31:13 +02:00
|
|
|
**
|
2012-02-06 10:49:11 +01:00
|
|
|
** Copyright (c) 2010-2012 Nokia Corporation and/or its subsidiary(-ies).
|
|
|
|
**
|
2012-02-06 11:30:37 +01:00
|
|
|
** Contact: Nokia Corporation (qt-info@nokia.com)
|
2011-05-13 18:31:13 +02:00
|
|
|
**
|
|
|
|
**
|
|
|
|
** GNU Lesser General Public License Usage
|
|
|
|
**
|
|
|
|
** 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.
|
|
|
|
**
|
|
|
|
** In addition, as a special exception, Nokia gives you certain additional
|
2012-02-06 10:49:11 +01:00
|
|
|
** rights. These rights are described in the Nokia Qt LGPL Exception
|
|
|
|
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
|
|
|
**
|
|
|
|
** Other Usage
|
2011-05-13 18:31:13 +02:00
|
|
|
**
|
2012-02-06 10:49:11 +01:00
|
|
|
** Alternatively, this file may be used in accordance with the terms and
|
|
|
|
** conditions contained in a signed written agreement between you and Nokia.
|
|
|
|
**
|
|
|
|
** If you have questions regarding the use of this file, please contact
|
2012-02-06 11:30:37 +01:00
|
|
|
** Nokia at qt-info@nokia.com.
|
2011-05-13 18:31:13 +02:00
|
|
|
**
|
|
|
|
**************************************************************************/
|
2012-02-06 10:49:11 +01:00
|
|
|
|
2011-05-13 18:31:13 +02:00
|
|
|
#include "qprocesswrapper.h"
|
2011-05-16 23:58:46 +02:00
|
|
|
|
2011-05-13 18:31:13 +02:00
|
|
|
#include "fsengineclient.h"
|
2011-05-16 23:58:46 +02:00
|
|
|
#include "templates.cpp"
|
2011-05-13 18:31:13 +02:00
|
|
|
|
|
|
|
#include <QtCore/QThread>
|
|
|
|
|
|
|
|
#include <QtNetwork/QTcpSocket>
|
|
|
|
|
|
|
|
// -- QProcessWrapper::Private
|
|
|
|
|
|
|
|
class QProcessWrapper::Private
|
|
|
|
{
|
|
|
|
public:
|
2011-05-16 21:15:04 +02:00
|
|
|
Private(QProcessWrapper *qq)
|
|
|
|
: q(qq),
|
|
|
|
ignoreTimer(false),
|
2011-11-18 00:52:16 +01:00
|
|
|
socket(0)
|
|
|
|
{}
|
2011-05-13 18:31:13 +02:00
|
|
|
|
|
|
|
bool createSocket()
|
|
|
|
{
|
2011-06-15 15:29:31 +02:00
|
|
|
if (!FSEngineClientHandler::instance().isActive())
|
2011-05-13 18:31:13 +02:00
|
|
|
return false;
|
2011-05-17 12:47:15 +02:00
|
|
|
if (socket != 0 && socket->state() == static_cast< int >(QAbstractSocket::ConnectedState))
|
2011-05-13 18:31:13 +02:00
|
|
|
return true;
|
2011-05-16 21:15:04 +02:00
|
|
|
if (socket != 0)
|
2011-05-13 18:31:13 +02:00
|
|
|
delete socket;
|
|
|
|
socket = new QTcpSocket;
|
2011-05-17 12:47:15 +02:00
|
|
|
|
2011-06-15 15:29:31 +02:00
|
|
|
if (!FSEngineClientHandler::instance().connect(socket))
|
2011-05-13 18:31:13 +02:00
|
|
|
return false;
|
2011-05-16 21:15:04 +02:00
|
|
|
stream.setDevice(socket);
|
|
|
|
stream.setVersion(QDataStream::Qt_4_2);
|
2011-05-13 18:31:13 +02:00
|
|
|
|
2011-05-16 21:15:04 +02:00
|
|
|
stream << QString::fromLatin1("createQProcess");
|
2011-05-13 18:31:13 +02:00
|
|
|
socket->flush();
|
2011-05-16 21:15:04 +02:00
|
|
|
stream.device()->waitForReadyRead(-1);
|
2011-05-13 18:31:13 +02:00
|
|
|
quint32 test;
|
|
|
|
stream >> test;
|
|
|
|
stream.device()->readAll();
|
|
|
|
|
2011-05-16 21:15:04 +02:00
|
|
|
q->startTimer(250);
|
2011-05-13 18:31:13 +02:00
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
class TimerBlocker
|
|
|
|
{
|
|
|
|
public:
|
2011-05-16 21:15:04 +02:00
|
|
|
explicit TimerBlocker(const QProcessWrapper *wrapper)
|
2011-11-17 22:12:18 +01:00
|
|
|
: w(const_cast<QProcessWrapper *>(wrapper))
|
2011-05-13 18:31:13 +02:00
|
|
|
{
|
|
|
|
w->d->ignoreTimer = true;
|
|
|
|
}
|
2011-05-16 21:15:04 +02:00
|
|
|
|
2011-05-13 18:31:13 +02:00
|
|
|
~TimerBlocker()
|
|
|
|
{
|
|
|
|
w->d->ignoreTimer = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
2011-05-16 21:15:04 +02:00
|
|
|
QProcessWrapper *const w;
|
2011-05-13 18:31:13 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
private:
|
2011-05-16 21:15:04 +02:00
|
|
|
QProcessWrapper *const q;
|
2011-05-13 18:31:13 +02:00
|
|
|
|
|
|
|
public:
|
|
|
|
bool ignoreTimer;
|
|
|
|
|
|
|
|
QProcess process;
|
2011-05-16 21:15:04 +02:00
|
|
|
mutable QTcpSocket *socket;
|
2011-05-13 18:31:13 +02:00
|
|
|
mutable QDataStream stream;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// -- QProcessWrapper
|
|
|
|
|
2011-05-16 21:15:04 +02:00
|
|
|
QProcessWrapper::QProcessWrapper(QObject *parent)
|
|
|
|
: QObject(parent),
|
|
|
|
d(new Private(this))
|
2011-05-13 18:31:13 +02:00
|
|
|
{
|
2011-11-18 00:52:16 +01:00
|
|
|
connect(&d->process, SIGNAL(bytesWritten(qint64)), SIGNAL(bytesWritten(qint64)));
|
|
|
|
connect(&d->process, SIGNAL(aboutToClose()), SIGNAL(aboutToClose()));
|
|
|
|
connect(&d->process, SIGNAL(readChannelFinished()), SIGNAL(readChannelFinished()));
|
|
|
|
connect(&d->process, SIGNAL(error(QProcess::ProcessError)), SIGNAL(error(QProcess::ProcessError)));
|
|
|
|
connect(&d->process, SIGNAL(readyReadStandardOutput()), SIGNAL(readyReadStandardOutput()));
|
|
|
|
connect(&d->process, SIGNAL(readyReadStandardError()), SIGNAL(readyReadStandardError()));
|
|
|
|
connect(&d->process, SIGNAL(finished(int)), SIGNAL(finished(int)));
|
|
|
|
connect(&d->process, SIGNAL(finished(int,QProcess::ExitStatus)), SIGNAL(finished(int,QProcess::ExitStatus)));
|
|
|
|
connect(&d->process, SIGNAL(readyRead()), SIGNAL(readyRead()));
|
|
|
|
connect(&d->process, SIGNAL(started()), SIGNAL(started()));
|
|
|
|
connect(&d->process, SIGNAL(stateChanged(QProcess::ProcessState)), SIGNAL(stateChanged(QProcess::ProcessState)));
|
2011-05-13 18:31:13 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
QProcessWrapper::~QProcessWrapper()
|
|
|
|
{
|
2011-05-16 21:15:04 +02:00
|
|
|
if (d->socket != 0) {
|
|
|
|
d->stream << QString::fromLatin1("destroyQProcess");
|
2011-05-13 18:31:13 +02:00
|
|
|
d->socket->flush();
|
|
|
|
quint32 result;
|
|
|
|
d->stream >> result;
|
|
|
|
|
2011-05-16 21:15:04 +02:00
|
|
|
if (QThread::currentThread() == d->socket->thread()) {
|
2011-05-13 18:31:13 +02:00
|
|
|
d->socket->close();
|
|
|
|
delete d->socket;
|
2011-05-16 21:15:04 +02:00
|
|
|
} else {
|
2011-05-13 18:31:13 +02:00
|
|
|
d->socket->deleteLater();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
delete d;
|
|
|
|
}
|
|
|
|
|
2011-05-16 21:15:04 +02:00
|
|
|
void QProcessWrapper::timerEvent(QTimerEvent *event)
|
2011-05-13 18:31:13 +02:00
|
|
|
{
|
2011-05-16 21:15:04 +02:00
|
|
|
Q_UNUSED(event)
|
2011-05-13 18:31:13 +02:00
|
|
|
|
2011-05-16 21:15:04 +02:00
|
|
|
if (d->ignoreTimer)
|
2011-05-13 18:31:13 +02:00
|
|
|
return;
|
|
|
|
|
2011-05-16 21:15:04 +02:00
|
|
|
QList<QVariant> receivedSignals;
|
2011-05-13 18:31:13 +02:00
|
|
|
{
|
2011-05-16 21:15:04 +02:00
|
|
|
const Private::TimerBlocker blocker(this);
|
2011-05-13 18:31:13 +02:00
|
|
|
|
2011-05-16 21:15:04 +02:00
|
|
|
d->stream << QString::fromLatin1("getQProcessSignals");
|
2011-05-13 18:31:13 +02:00
|
|
|
d->socket->flush();
|
2011-05-16 21:15:04 +02:00
|
|
|
d->stream.device()->waitForReadyRead(-1);
|
2011-05-13 18:31:13 +02:00
|
|
|
quint32 test;
|
|
|
|
d->stream >> test;
|
|
|
|
d->stream >> receivedSignals;
|
|
|
|
d->stream.device()->readAll();
|
|
|
|
}
|
|
|
|
|
2011-05-16 21:15:04 +02:00
|
|
|
while (!receivedSignals.isEmpty()) {
|
2011-05-13 18:31:13 +02:00
|
|
|
const QString name = receivedSignals.takeFirst().toString();
|
2011-05-16 21:15:04 +02:00
|
|
|
if (name == QLatin1String("started")) {
|
2011-05-13 18:31:13 +02:00
|
|
|
emit started();
|
2011-05-16 21:15:04 +02:00
|
|
|
} else if (name == QLatin1String("readyRead")) {
|
2011-05-13 18:31:13 +02:00
|
|
|
emit readyRead();
|
2011-05-16 21:15:04 +02:00
|
|
|
} else if (name == QLatin1String("stateChanged")) {
|
|
|
|
const QProcess::ProcessState newState =
|
|
|
|
static_cast<QProcess::ProcessState> (receivedSignals.takeFirst().toInt());
|
|
|
|
emit stateChanged(newState);
|
|
|
|
} else if (name == QLatin1String("finished")) {
|
2011-05-13 18:31:13 +02:00
|
|
|
const int exitCode = receivedSignals.takeFirst().toInt();
|
2011-05-16 21:15:04 +02:00
|
|
|
const QProcess::ExitStatus exitStatus =
|
|
|
|
static_cast<QProcess::ExitStatus> (receivedSignals.takeFirst().toInt());
|
|
|
|
emit finished(exitCode);
|
|
|
|
emit finished(exitCode, exitStatus);
|
2011-05-13 18:31:13 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-05-16 21:15:04 +02:00
|
|
|
bool startDetached(const QString &program, const QStringList &args, const QString &workingDirectory,
|
|
|
|
qint64 *pid);
|
2011-05-13 18:31:13 +02:00
|
|
|
|
2011-05-16 21:15:04 +02:00
|
|
|
bool QProcessWrapper::startDetached(const QString &program, const QStringList &arguments,
|
|
|
|
const QString &workingDirectory, qint64 *pid)
|
2011-05-13 18:31:13 +02:00
|
|
|
{
|
|
|
|
QProcessWrapper w;
|
2011-05-16 21:15:04 +02:00
|
|
|
if (w.d->createSocket()) {
|
|
|
|
const QPair<bool, qint64> result = callRemoteMethod<QPair<bool, qint64> >(w.d->stream,
|
|
|
|
QLatin1String("QProcess::startDetached"), program, arguments, workingDirectory);
|
|
|
|
if (pid != 0)
|
2011-05-13 18:31:13 +02:00
|
|
|
*pid = result.second;
|
|
|
|
return result.first;
|
|
|
|
}
|
2011-05-16 21:15:04 +02:00
|
|
|
return ::startDetached(program, arguments, workingDirectory, pid);
|
2011-05-13 18:31:13 +02:00
|
|
|
}
|
|
|
|
|
2011-05-16 21:15:04 +02:00
|
|
|
bool QProcessWrapper::startDetached(const QString &program, const QStringList &arguments)
|
2011-05-13 18:31:13 +02:00
|
|
|
{
|
2011-05-16 21:15:04 +02:00
|
|
|
return startDetached(program, arguments, QDir::currentPath());
|
2011-05-13 18:31:13 +02:00
|
|
|
}
|
|
|
|
|
2011-05-16 21:15:04 +02:00
|
|
|
bool QProcessWrapper::startDetached(const QString &program)
|
2011-05-13 18:31:13 +02:00
|
|
|
{
|
2011-05-16 21:15:04 +02:00
|
|
|
return startDetached(program, QStringList());
|
2011-05-13 18:31:13 +02:00
|
|
|
}
|
|
|
|
|
2011-05-16 21:15:04 +02:00
|
|
|
void QProcessWrapper::setProcessChannelMode(QProcessWrapper::ProcessChannelMode mode)
|
|
|
|
{
|
|
|
|
const Private::TimerBlocker blocker(this);
|
|
|
|
if (d->createSocket()) {
|
|
|
|
callRemoteVoidMethod(d->stream, QLatin1String("QProcess::setProcessChannelMode"),
|
|
|
|
static_cast<QProcess::ProcessChannelMode>(mode));
|
|
|
|
} else {
|
|
|
|
d->process.setProcessChannelMode(static_cast<QProcess::ProcessChannelMode>(mode));
|
|
|
|
}
|
2011-05-13 18:31:13 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
Cancels the process. This methods tries to terminate the process
|
|
|
|
gracefully by calling QProcess::terminate. After 10 seconds, the process gets killed.
|
|
|
|
*/
|
|
|
|
void QProcessWrapper::cancel()
|
|
|
|
{
|
2011-05-16 21:15:04 +02:00
|
|
|
if (state() == QProcessWrapper::Running)
|
2011-05-13 18:31:13 +02:00
|
|
|
terminate();
|
2011-05-16 21:15:04 +02:00
|
|
|
|
|
|
|
if (!waitForFinished(10000))
|
2011-05-13 18:31:13 +02:00
|
|
|
kill();
|
|
|
|
}
|
|
|
|
|
2011-05-16 21:15:04 +02:00
|
|
|
void QProcessWrapper::setReadChannel(QProcessWrapper::ProcessChannel chan)
|
2011-05-13 18:31:13 +02:00
|
|
|
{
|
2011-05-16 21:15:04 +02:00
|
|
|
const Private::TimerBlocker blocker(this);
|
|
|
|
if (d->createSocket()) {
|
|
|
|
callRemoteVoidMethod(d->stream, QLatin1String("QProcess::setReadChannel"),
|
|
|
|
static_cast<QProcess::ProcessChannel>(chan));
|
|
|
|
} else {
|
|
|
|
d->process.setReadChannel(static_cast<QProcess::ProcessChannel>(chan));
|
|
|
|
}
|
2011-05-13 18:31:13 +02:00
|
|
|
}
|
|
|
|
|
2011-05-16 21:15:04 +02:00
|
|
|
bool QProcessWrapper::waitForFinished(int msecs)
|
2011-05-13 18:31:13 +02:00
|
|
|
{
|
2011-05-16 21:15:04 +02:00
|
|
|
const Private::TimerBlocker blocker(this);
|
|
|
|
if (d->createSocket())
|
2011-05-17 09:54:15 +02:00
|
|
|
return callRemoteMethod<bool>(d->stream, QLatin1String("QProcess::waitForFinished"), msecs);
|
|
|
|
return d->process.waitForFinished(msecs);
|
2011-05-13 18:31:13 +02:00
|
|
|
}
|
|
|
|
|
2011-05-16 21:15:04 +02:00
|
|
|
bool QProcessWrapper::waitForStarted(int msecs)
|
2011-05-13 18:31:13 +02:00
|
|
|
{
|
2011-05-16 21:15:04 +02:00
|
|
|
const Private::TimerBlocker blocker(this);
|
|
|
|
if (d->createSocket())
|
2011-05-17 09:54:15 +02:00
|
|
|
return callRemoteMethod<bool>(d->stream, QLatin1String("QProcess::waitForStarted"), msecs);
|
|
|
|
return d->process.waitForStarted(msecs);
|
2011-05-13 18:31:13 +02:00
|
|
|
}
|
|
|
|
|
2011-05-16 21:15:04 +02:00
|
|
|
qint64 QProcessWrapper::write(const QByteArray &data)
|
2011-05-13 18:31:13 +02:00
|
|
|
{
|
2011-05-16 21:15:04 +02:00
|
|
|
const Private::TimerBlocker blocker(this);
|
|
|
|
if (d->createSocket())
|
2011-05-17 09:54:15 +02:00
|
|
|
return callRemoteMethod<qint64>(d->stream, QLatin1String("QProcess::write"), data);
|
|
|
|
return d->process.write(data);
|
|
|
|
}
|
|
|
|
|
|
|
|
void QProcessWrapper::closeWriteChannel()
|
|
|
|
{
|
|
|
|
const Private::TimerBlocker blocker(this);
|
|
|
|
if (d->createSocket())
|
|
|
|
callRemoteVoidMethod<void>(d->stream, QLatin1String("QProcess::closeWriteChannel"));
|
2011-05-13 18:31:13 +02:00
|
|
|
else
|
2011-05-17 09:54:15 +02:00
|
|
|
d->process.closeWriteChannel();
|
2011-11-17 22:12:18 +01:00
|
|
|
}
|
2011-05-17 09:54:15 +02:00
|
|
|
|
|
|
|
int QProcessWrapper::exitCode() const
|
|
|
|
{
|
|
|
|
const Private::TimerBlocker blocker(this);
|
|
|
|
if (d->createSocket())
|
|
|
|
return callRemoteMethod<int>(d->stream, QLatin1String("QProcess::exitCode"));
|
|
|
|
return static_cast< int>(d->process.exitCode());
|
2011-11-17 22:12:18 +01:00
|
|
|
}
|
2011-05-17 09:54:15 +02:00
|
|
|
|
|
|
|
QProcessWrapper::ExitStatus QProcessWrapper::exitStatus() const
|
|
|
|
{
|
|
|
|
const Private::TimerBlocker blocker(this);
|
|
|
|
if (d->createSocket())
|
|
|
|
return callRemoteMethod<QProcessWrapper::ExitStatus>(d->stream, QLatin1String("QProcess::exitStatus"));
|
|
|
|
return static_cast< QProcessWrapper::ExitStatus>(d->process.exitStatus());
|
2011-11-17 22:12:18 +01:00
|
|
|
}
|
2011-05-17 09:54:15 +02:00
|
|
|
|
|
|
|
void QProcessWrapper::kill()
|
|
|
|
{
|
|
|
|
const Private::TimerBlocker blocker(this);
|
|
|
|
if (d->createSocket())
|
|
|
|
callRemoteVoidMethod<void>(d->stream, QLatin1String("QProcess::kill"));
|
|
|
|
else
|
|
|
|
d->process.kill();
|
2011-05-13 18:31:13 +02:00
|
|
|
}
|
|
|
|
|
2011-05-17 09:54:15 +02:00
|
|
|
QByteArray QProcessWrapper::readAll()
|
2011-05-17 09:55:48 +02:00
|
|
|
{
|
2011-05-17 09:54:15 +02:00
|
|
|
const Private::TimerBlocker blocker(this);
|
|
|
|
if (d->createSocket())
|
|
|
|
return callRemoteMethod<QByteArray>(d->stream, QLatin1String("QProcess::readAll"));
|
|
|
|
return d->process.readAll();
|
2011-11-17 22:12:18 +01:00
|
|
|
}
|
2011-05-17 09:54:15 +02:00
|
|
|
|
|
|
|
QByteArray QProcessWrapper::readAllStandardOutput()
|
|
|
|
{
|
|
|
|
const Private::TimerBlocker blocker(this);
|
|
|
|
if (d->createSocket())
|
|
|
|
return callRemoteMethod<QByteArray>(d->stream, QLatin1String("QProcess::readAllStandardOutput"));
|
|
|
|
return d->process.readAllStandardOutput();
|
2011-11-17 22:12:18 +01:00
|
|
|
}
|
2011-05-17 09:54:15 +02:00
|
|
|
|
2011-11-17 22:12:18 +01:00
|
|
|
void QProcessWrapper::start(const QString ¶m1, const QStringList ¶m2, QIODevice::OpenMode param3)
|
2011-05-17 09:54:15 +02:00
|
|
|
{
|
|
|
|
const Private::TimerBlocker blocker(this);
|
|
|
|
if (d->createSocket())
|
|
|
|
callRemoteVoidMethod(d->stream, QLatin1String("QProcess::start"), param1, param2, param3);
|
|
|
|
else
|
|
|
|
d->process.start(param1, param2, param3);
|
2011-05-13 18:31:13 +02:00
|
|
|
}
|
|
|
|
|
2011-11-17 22:12:18 +01:00
|
|
|
void QProcessWrapper::start(const QString ¶m1)
|
2011-05-17 09:54:15 +02:00
|
|
|
{
|
|
|
|
const Private::TimerBlocker blocker(this);
|
2011-05-17 09:55:48 +02:00
|
|
|
if (d->createSocket())
|
2011-05-17 09:54:15 +02:00
|
|
|
callRemoteVoidMethod(d->stream, QLatin1String("QProcess::start"), param1);
|
|
|
|
else
|
|
|
|
d->process.start(param1);
|
2011-05-13 18:31:13 +02:00
|
|
|
}
|
|
|
|
|
2011-05-17 09:54:15 +02:00
|
|
|
QProcessWrapper::ProcessState QProcessWrapper::state() const
|
|
|
|
{
|
|
|
|
const Private::TimerBlocker blocker(this);
|
|
|
|
if (d->createSocket())
|
|
|
|
return callRemoteMethod<QProcessWrapper::ProcessState>(d->stream, QLatin1String("QProcess::state"));
|
|
|
|
return static_cast< QProcessWrapper::ProcessState>(d->process.state());
|
2011-05-13 18:31:13 +02:00
|
|
|
}
|
|
|
|
|
2011-05-17 09:54:15 +02:00
|
|
|
void QProcessWrapper::terminate()
|
|
|
|
{
|
|
|
|
const Private::TimerBlocker blocker(this);
|
|
|
|
if (d->createSocket())
|
|
|
|
callRemoteVoidMethod<void>(d->stream, QLatin1String("QProcess::terminate"));
|
|
|
|
else
|
|
|
|
d->process.terminate();
|
2011-05-13 18:31:13 +02:00
|
|
|
}
|
|
|
|
|
2011-05-17 09:54:15 +02:00
|
|
|
QProcessWrapper::ProcessChannel QProcessWrapper::readChannel() const
|
2011-05-17 09:55:48 +02:00
|
|
|
{
|
2011-05-17 09:54:15 +02:00
|
|
|
const Private::TimerBlocker blocker(this);
|
|
|
|
if (d->createSocket()) {
|
|
|
|
return callRemoteMethod<QProcessWrapper::ProcessChannel>(d->stream,
|
|
|
|
QLatin1String("QProcess::readChannel"));
|
|
|
|
}
|
|
|
|
return static_cast< QProcessWrapper::ProcessChannel>(d->process.readChannel());
|
2011-05-13 18:31:13 +02:00
|
|
|
}
|
|
|
|
|
2011-05-17 09:54:15 +02:00
|
|
|
QProcessWrapper::ProcessChannelMode QProcessWrapper::processChannelMode() const
|
|
|
|
{
|
|
|
|
const Private::TimerBlocker blocker(this);
|
|
|
|
if (d->createSocket()) {
|
|
|
|
return callRemoteMethod<QProcessWrapper::ProcessChannelMode>(d->stream,
|
|
|
|
QLatin1String("QProcess::processChannelMode"));
|
|
|
|
}
|
|
|
|
return static_cast< QProcessWrapper::ProcessChannelMode>(d->process.processChannelMode());
|
2011-05-13 18:31:13 +02:00
|
|
|
}
|
|
|
|
|
2011-05-17 09:54:15 +02:00
|
|
|
QString QProcessWrapper::workingDirectory() const
|
2011-05-17 09:55:48 +02:00
|
|
|
{
|
2011-05-17 09:54:15 +02:00
|
|
|
const Private::TimerBlocker blocker(this);
|
|
|
|
if (d->createSocket())
|
|
|
|
return callRemoteMethod<QString>(d->stream, QLatin1String("QProcess::workingDirectory"));
|
|
|
|
return static_cast< QString>(d->process.workingDirectory());
|
2011-05-13 18:31:13 +02:00
|
|
|
}
|
|
|
|
|
2011-11-17 22:12:18 +01:00
|
|
|
void QProcessWrapper::setEnvironment(const QStringList ¶m1)
|
2011-05-17 09:54:15 +02:00
|
|
|
{
|
|
|
|
const Private::TimerBlocker blocker(this);
|
|
|
|
if (d->createSocket())
|
|
|
|
callRemoteVoidMethod(d->stream, QLatin1String("QProcess::setEnvironment"), param1);
|
|
|
|
else
|
|
|
|
d->process.setEnvironment(param1);
|
2011-05-16 21:15:04 +02:00
|
|
|
}
|
|
|
|
|
2011-05-13 18:31:13 +02:00
|
|
|
#ifdef Q_OS_WIN
|
2011-11-17 22:12:18 +01:00
|
|
|
void QProcessWrapper::setNativeArguments(const QString ¶m1)
|
2011-05-17 09:54:15 +02:00
|
|
|
{
|
|
|
|
const Private::TimerBlocker blocker(this);
|
|
|
|
if (d->createSocket())
|
|
|
|
callRemoteVoidMethod(d->stream, QLatin1String("QProcess::setNativeArguments"), param1);
|
|
|
|
else
|
|
|
|
d->process.setNativeArguments(param1);
|
|
|
|
}
|
2011-05-13 18:31:13 +02:00
|
|
|
#endif
|
2011-05-17 09:54:15 +02:00
|
|
|
|
2011-11-17 22:12:18 +01:00
|
|
|
void QProcessWrapper::setWorkingDirectory(const QString ¶m1)
|
2011-05-17 09:55:48 +02:00
|
|
|
{
|
2011-05-17 09:54:15 +02:00
|
|
|
const Private::TimerBlocker blocker(this);
|
|
|
|
if (d->createSocket())
|
|
|
|
callRemoteVoidMethod(d->stream, QLatin1String("QProcess::setWorkingDirectory"), param1);
|
|
|
|
else
|
|
|
|
d->process.setWorkingDirectory(param1);
|
|
|
|
}
|