1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-01-20 11:53:53 +00:00
openmw/apps/opencs/model/doc/runner.cpp

126 lines
2.6 KiB
C++
Raw Normal View History

2014-09-02 08:21:17 +00:00
#include "runner.hpp"
#include <QTemporaryFile>
#include <QTextStream>
#include "operation.hpp"
2014-09-02 08:21:17 +00:00
CSMDoc::Runner::Runner() : mRunning (false), mStartup (0)
2014-09-02 08:21:17 +00:00
{
connect (&mProcess, SIGNAL (finished (int, QProcess::ExitStatus)),
this, SLOT (finished (int, QProcess::ExitStatus)));
mProfile.blank();
2014-09-02 08:21:17 +00:00
}
CSMDoc::Runner::~Runner()
{
if (mRunning)
{
disconnect (&mProcess, 0, this, 0);
mProcess.kill();
mProcess.waitForFinished();
}
}
void CSMDoc::Runner::start (bool delayed)
2014-09-02 08:21:17 +00:00
{
if (mStartup)
{
delete mStartup;
mStartup = 0;
}
if (!delayed)
{
QString path = "openmw";
2014-09-02 08:21:17 +00:00
#ifdef Q_OS_WIN
path.append(QString(".exe"));
2014-09-02 08:21:17 +00:00
#elif defined(Q_OS_MAC)
QDir dir(QCoreApplication::applicationDirPath());
path = dir.absoluteFilePath(name);
2014-09-02 08:21:17 +00:00
#else
path.prepend(QString("./"));
2014-09-02 08:21:17 +00:00
#endif
mStartup = new QTemporaryFile (this);
mStartup->open();
{
QTextStream stream (mStartup);
if (!mStartupInstruction.empty())
stream << QString::fromUtf8 (mStartupInstruction.c_str()) << '\n';
stream << QString::fromUtf8 (mProfile.mScriptText.c_str());
}
mStartup->close();
QStringList arguments;
arguments << "--skip-menu";
if (mProfile.mFlags & ESM::DebugProfile::Flag_BypassNewGame)
arguments << "--new-game=0";
else
arguments << "--new-game=1";
arguments << ("--script-run="+mStartup->fileName());
mProcess.start (path, arguments);
}
mRunning = true;
emit runStateChanged();
2014-09-02 08:21:17 +00:00
}
void CSMDoc::Runner::stop()
{
delete mStartup;
mStartup = 0;
if (mProcess.state()==QProcess::NotRunning)
{
mRunning = false;
emit runStateChanged();
}
else
mProcess.kill();
2014-09-02 08:21:17 +00:00
}
bool CSMDoc::Runner::isRunning() const
{
return mRunning;
}
void CSMDoc::Runner::configure (const ESM::DebugProfile& profile,
const std::string& startupInstruction)
{
mProfile = profile;
mStartupInstruction = startupInstruction;
}
2014-09-02 08:21:17 +00:00
void CSMDoc::Runner::finished (int exitCode, QProcess::ExitStatus exitStatus)
{
mRunning = false;
emit runStateChanged();
2014-09-02 08:21:17 +00:00
}
CSMDoc::SaveWatcher::SaveWatcher (Runner *runner, Operation *operation)
: QObject (runner), mRunner (runner)
{
connect (operation, SIGNAL (done (int, bool)), this, SLOT (saveDone (int, bool)));
}
void CSMDoc::SaveWatcher::saveDone (int type, bool failed)
{
if (failed)
mRunner->stop();
else
mRunner->start();
deleteLater();
}