bool ConsoleProcess::start(const QString &program, const QString &args) { if (isRunning()) return false; d->m_errorString.clear(); d->m_error = QProcess::UnknownError; QString pcmd; QString pargs; if (d->m_mode != Run) { // The debugger engines already pre-process the arguments. pcmd = program; pargs = args; } else { QtcProcess::Arguments outArgs; QtcProcess::prepareCommand(program, args, &pcmd, &outArgs, OsTypeWindows, &d->m_environment, &d->m_workingDir); pargs = outArgs.toWindowsArgs(); } const QString err = stubServerListen(); if (!err.isEmpty()) { emitError(QProcess::FailedToStart, msgCommChannelFailed(err)); return false; } QStringList env = d->m_environment.toStringList(); if (!env.isEmpty()) { d->m_tempFile = new QTemporaryFile(); if (!d->m_tempFile->open()) { stubServerShutdown(); emitError(QProcess::FailedToStart, msgCannotCreateTempFile(d->m_tempFile->errorString())); delete d->m_tempFile; d->m_tempFile = 0; return false; } QTextStream out(d->m_tempFile); out.setCodec("UTF-16LE"); out.setGenerateByteOrderMark(false); foreach (const QString &var, fixWinEnvironment(env)) out << var << QChar(0); out << QChar(0); out.flush(); if (out.status() != QTextStream::Ok) { stubServerShutdown(); emitError(QProcess::FailedToStart, msgCannotWriteTempFile()); delete d->m_tempFile; d->m_tempFile = 0; return false; } }
bool ConsoleProcess::start(const QString &program, const QString &args) { if (isRunning()) return false; QtcProcess::SplitError perr; QtcProcess::Arguments pargs = QtcProcess::prepareArgs(args, &perr, HostOsInfo::hostOs(), &d->m_environment, &d->m_workingDir); QString pcmd; if (perr == QtcProcess::SplitOk) { pcmd = program; } else { if (perr != QtcProcess::FoundMeta) { emit processError(tr("Quoting error in command.")); return false; } if (d->m_mode == Debug) { // FIXME: QTCREATORBUG-2809 emit processError(tr("Debugging complex shell commands in a terminal" " is currently not supported.")); return false; } pcmd = QLatin1String("/bin/sh"); pargs = QtcProcess::Arguments::createUnixArgs(QStringList() << QLatin1String("-c") << (QtcProcess::quoteArg(program) + QLatin1Char(' ') + args)); } QtcProcess::SplitError qerr; QtcProcess::Arguments xtermArgs = QtcProcess::prepareArgs(terminalEmulator(d->m_settings), &qerr, HostOsInfo::hostOs(), &d->m_environment, &d->m_workingDir); if (qerr != QtcProcess::SplitOk) { emit processError(qerr == QtcProcess::BadQuoting ? tr("Quoting error in terminal command.") : tr("Terminal command may not be a shell command.")); return false; } const QString err = stubServerListen(); if (!err.isEmpty()) { emit processError(msgCommChannelFailed(err)); return false; } QStringList env = d->m_environment.toStringList(); if (!env.isEmpty()) { d->m_tempFile = new QTemporaryFile(); if (!d->m_tempFile->open()) { stubServerShutdown(); emit processError(msgCannotCreateTempFile(d->m_tempFile->errorString())); delete d->m_tempFile; d->m_tempFile = 0; return false; } QByteArray contents; foreach (const QString &var, env) { QByteArray l8b = var.toLocal8Bit(); contents.append(l8b.constData(), l8b.size() + 1); }