From 5e022195b8bd427e315c27d928ceacf8f865f46a Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Fri, 5 Sep 2014 11:40:01 +0200 Subject: [PATCH] create startup script when running from OpenCS --- apps/opencs/model/doc/document.cpp | 3 ++- apps/opencs/model/doc/runner.cpp | 34 ++++++++++++++++++++++++++++-- apps/opencs/model/doc/runner.hpp | 7 +++++- 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/apps/opencs/model/doc/document.cpp b/apps/opencs/model/doc/document.cpp index 1f73770eb..17d624be7 100644 --- a/apps/opencs/model/doc/document.cpp +++ b/apps/opencs/model/doc/document.cpp @@ -2375,7 +2375,8 @@ bool CSMDoc::Document::isBlacklisted (const CSMWorld::UniversalId& id) void CSMDoc::Document::startRunning (const std::string& profile, const std::string& startupInstruction) { - mRunner.configure (getData().getDebugProfiles().getRecord (profile).get()); + mRunner.configure (getData().getDebugProfiles().getRecord (profile).get(), + startupInstruction); int state = getState(); diff --git a/apps/opencs/model/doc/runner.cpp b/apps/opencs/model/doc/runner.cpp index 8b26668a7..67bd5e4d2 100644 --- a/apps/opencs/model/doc/runner.cpp +++ b/apps/opencs/model/doc/runner.cpp @@ -1,9 +1,12 @@ #include "runner.hpp" +#include +#include + #include "operation.hpp" -CSMDoc::Runner::Runner() : mRunning (false) +CSMDoc::Runner::Runner() : mRunning (false), mStartup (0) { connect (&mProcess, SIGNAL (finished (int, QProcess::ExitStatus)), this, SLOT (finished (int, QProcess::ExitStatus))); @@ -23,6 +26,12 @@ CSMDoc::Runner::~Runner() void CSMDoc::Runner::start (bool delayed) { + if (mStartup) + { + delete mStartup; + mStartup = 0; + } + if (!delayed) { QString path = "openmw"; @@ -35,6 +44,20 @@ void CSMDoc::Runner::start (bool delayed) path.prepend(QString("./")); #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"; @@ -43,6 +66,8 @@ void CSMDoc::Runner::start (bool delayed) else arguments << "--new-game=1"; + arguments << ("--script-run="+mStartup->fileName()); + mProcess.start (path, arguments); } @@ -52,6 +77,9 @@ void CSMDoc::Runner::start (bool delayed) void CSMDoc::Runner::stop() { + delete mStartup; + mStartup = 0; + if (mProcess.state()==QProcess::NotRunning) { mRunning = false; @@ -66,9 +94,11 @@ bool CSMDoc::Runner::isRunning() const return mRunning; } -void CSMDoc::Runner::configure (const ESM::DebugProfile& profile) +void CSMDoc::Runner::configure (const ESM::DebugProfile& profile, + const std::string& startupInstruction) { mProfile = profile; + mStartupInstruction = startupInstruction; } void CSMDoc::Runner::finished (int exitCode, QProcess::ExitStatus exitStatus) diff --git a/apps/opencs/model/doc/runner.hpp b/apps/opencs/model/doc/runner.hpp index 00092d0fe..f63968e3b 100644 --- a/apps/opencs/model/doc/runner.hpp +++ b/apps/opencs/model/doc/runner.hpp @@ -6,6 +6,8 @@ #include +class QTemporaryFile; + namespace CSMDoc { class Runner : public QObject @@ -15,6 +17,8 @@ namespace CSMDoc QProcess mProcess; bool mRunning; ESM::DebugProfile mProfile; + std::string mStartupInstruction; + QTemporaryFile *mStartup; public: @@ -32,7 +36,8 @@ namespace CSMDoc /// is not necessarily identical to the moment the child process is started. bool isRunning() const; - void configure (const ESM::DebugProfile& profile); + void configure (const ESM::DebugProfile& profile, + const std::string& startupInstruction); signals: