GH-1053 move launch process UI to a separate class
This commit is contained in:
@ -297,16 +297,15 @@ void BaseLauncher::checkJavaFinished(JavaCheckResult result)
|
||||
emit log(line, MessageLevel::Error);
|
||||
}
|
||||
emit log("\nCheck your MultiMC Java settings.", MessageLevel::MultiMC);
|
||||
m_instance->cleanupAfterRun();
|
||||
emit launch_failed(m_instance);
|
||||
// not running, failed
|
||||
m_instance->setRunning(false);
|
||||
return;
|
||||
emitFailed(tr("Could not start java!"));
|
||||
}
|
||||
else
|
||||
{
|
||||
emit log(tr("Java version is %1!\n").arg(result.javaVersion), MessageLevel::MultiMC);
|
||||
m_instance->settings()->set("JavaVersion", result.javaVersion);
|
||||
m_instance->settings()->set("JavaTimestamp", m_javaUnixTime);
|
||||
preLaunch();
|
||||
}
|
||||
emit log(tr("Java version is %1!\n").arg(result.javaVersion), MessageLevel::MultiMC);
|
||||
m_instance->settings()->set("JavaVersion", result.javaVersion);
|
||||
m_instance->settings()->set("JavaTimestamp", m_javaUnixTime);
|
||||
preLaunch();
|
||||
}
|
||||
|
||||
void BaseLauncher::executeTask()
|
||||
@ -401,13 +400,9 @@ void BaseLauncher::on_pre_state(LoggedProcess::State state)
|
||||
case LoggedProcess::Crashed:
|
||||
case LoggedProcess::FailedToStart:
|
||||
{
|
||||
emit log(tr("Pre-Launch command failed with code %1.\n\n")
|
||||
.arg(m_prelaunchprocess.exitCode()),
|
||||
MessageLevel::Fatal);
|
||||
m_instance->cleanupAfterRun();
|
||||
emit prelaunch_failed(m_instance, m_prelaunchprocess.exitCode(), m_prelaunchprocess.exitStatus());
|
||||
// not running, failed
|
||||
m_instance->setRunning(false);
|
||||
QString error = tr("Pre-Launch command failed with code %1.\n\n").arg(m_prelaunchprocess.exitCode());
|
||||
emit log(error, MessageLevel::Fatal);
|
||||
emitFailed(error);
|
||||
return;
|
||||
}
|
||||
case LoggedProcess::Finished:
|
||||
@ -446,10 +441,7 @@ void BaseLauncher::updateFinished()
|
||||
{
|
||||
QString reason = tr("Instance update failed because: %1.\n\n").arg(m_updateTask->failReason());
|
||||
emit log(reason, MessageLevel::Fatal);
|
||||
m_instance->cleanupAfterRun();
|
||||
emit update_failed(m_instance);
|
||||
emitFailed(reason);
|
||||
m_instance->setRunning(false);
|
||||
}
|
||||
}
|
||||
|
||||
@ -465,10 +457,9 @@ void BaseLauncher::makeReady()
|
||||
auto realWrapperCommand = QStandardPaths::findExecutable(wrapperCommand);
|
||||
if (realWrapperCommand.isEmpty())
|
||||
{
|
||||
emit log(tr("The wrapper command \"%1\" couldn't be found.").arg(wrapperCommand), MessageLevel::Warning);
|
||||
m_instance->cleanupAfterRun();
|
||||
emit launch_failed(m_instance);
|
||||
m_instance->setRunning(false);
|
||||
QString reason = tr("The wrapper command \"%1\" couldn't be found.").arg(wrapperCommand);
|
||||
emit log(reason, MessageLevel::Fatal);
|
||||
emitFailed(reason);
|
||||
return;
|
||||
}
|
||||
emit log("Wrapper command is:\n" + wrapperCommand + "\n\n");
|
||||
@ -484,11 +475,9 @@ void BaseLauncher::makeReady()
|
||||
if (!m_process.waitForStarted())
|
||||
{
|
||||
//: Error message displayed if instace can't start
|
||||
emit log(tr("Could not launch minecraft!"), MessageLevel::Error);
|
||||
m_instance->cleanupAfterRun();
|
||||
emit launch_failed(m_instance);
|
||||
// not running, failed
|
||||
m_instance->setRunning(false);
|
||||
QString reason = tr("Could not launch minecraft!");
|
||||
emit log(reason, MessageLevel::Fatal);
|
||||
emitFailed(reason);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -497,7 +486,7 @@ void BaseLauncher::makeReady()
|
||||
// send the launch script to the launcher part
|
||||
m_process.write(launchScript.toUtf8());
|
||||
|
||||
emit readyForLaunch(shared_from_this());
|
||||
emit readyForLaunch();
|
||||
}
|
||||
|
||||
void BaseLauncher::on_state(LoggedProcess::State state)
|
||||
@ -508,18 +497,17 @@ void BaseLauncher::on_state(LoggedProcess::State state)
|
||||
case LoggedProcess::Aborted:
|
||||
case LoggedProcess::Crashed:
|
||||
case LoggedProcess::FailedToStart:
|
||||
{
|
||||
estat = QProcess::CrashExit;
|
||||
emitFailed("Game crashed.");
|
||||
return;
|
||||
}
|
||||
case LoggedProcess::Finished:
|
||||
{
|
||||
auto exitCode = m_process.exitCode();
|
||||
m_postlaunchprocess.processEnvironment().insert("INST_EXITCODE", QString(exitCode));
|
||||
|
||||
// run post-exit
|
||||
postLaunch();
|
||||
m_instance->cleanupAfterRun();
|
||||
// no longer running...
|
||||
m_instance->setRunning(false);
|
||||
emit ended(m_instance, exitCode, estat);
|
||||
break;
|
||||
}
|
||||
case LoggedProcess::Skipped:
|
||||
@ -533,23 +521,6 @@ void BaseLauncher::on_state(LoggedProcess::State state)
|
||||
}
|
||||
}
|
||||
|
||||
void BaseLauncher::on_post_state(LoggedProcess::State state)
|
||||
{
|
||||
switch(state)
|
||||
{
|
||||
case LoggedProcess::Aborted:
|
||||
case LoggedProcess::Crashed:
|
||||
case LoggedProcess::FailedToStart:
|
||||
case LoggedProcess::Finished:
|
||||
case LoggedProcess::Skipped:
|
||||
{
|
||||
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void BaseLauncher::killProcess()
|
||||
{
|
||||
killed = true;
|
||||
@ -569,25 +540,56 @@ void BaseLauncher::killProcess()
|
||||
|
||||
void BaseLauncher::postLaunch()
|
||||
{
|
||||
if(killed)
|
||||
return;
|
||||
QString postlaunch_cmd = m_instance->settings()->get("PostExitCommand").toString();
|
||||
if (!postlaunch_cmd.isEmpty())
|
||||
{
|
||||
postlaunch_cmd = substituteVariables(postlaunch_cmd);
|
||||
emit log(tr("Running Post-Launch command: %1").arg(postlaunch_cmd));
|
||||
m_postlaunchprocess.start(postlaunch_cmd);
|
||||
if (m_postlaunchprocess.exitStatus() != QProcess::NormalExit)
|
||||
{
|
||||
emit log(tr("Post-Launch command failed with code %1.\n\n")
|
||||
.arg(m_postlaunchprocess.exitCode()),
|
||||
MessageLevel::Error);
|
||||
emit postlaunch_failed(m_instance, m_postlaunchprocess.exitCode(),
|
||||
m_postlaunchprocess.exitStatus());
|
||||
// not running, failed
|
||||
m_instance->setRunning(false);
|
||||
}
|
||||
else
|
||||
emit log(tr("Post-Launch command ran successfully.\n\n"));
|
||||
return;
|
||||
}
|
||||
emitSucceeded();
|
||||
}
|
||||
|
||||
void BaseLauncher::on_post_state(LoggedProcess::State state)
|
||||
{
|
||||
switch(state)
|
||||
{
|
||||
case LoggedProcess::Aborted:
|
||||
case LoggedProcess::Crashed:
|
||||
case LoggedProcess::FailedToStart:
|
||||
{
|
||||
QString error = tr("Post-Launch command failed with code %1.\n\n").arg(m_postlaunchprocess.exitCode());
|
||||
emit log(error, MessageLevel::Error);
|
||||
emitFailed(error);
|
||||
}
|
||||
case LoggedProcess::Finished:
|
||||
{
|
||||
emit log(tr("Post-Launch command ran successfully.\n\n"));
|
||||
}
|
||||
case LoggedProcess::Skipped:
|
||||
{
|
||||
emitSucceeded();
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void BaseLauncher::emitSucceeded()
|
||||
{
|
||||
m_instance->cleanupAfterRun();
|
||||
m_instance->setRunning(false);
|
||||
Task::emitSucceeded();
|
||||
}
|
||||
|
||||
void BaseLauncher::emitFailed(QString reason)
|
||||
{
|
||||
m_instance->cleanupAfterRun();
|
||||
m_instance->setRunning(false);
|
||||
Task::emitFailed(reason);
|
||||
}
|
||||
|
||||
QString BaseLauncher::substituteVariables(const QString &cmd) const
|
||||
|
@ -26,8 +26,13 @@
|
||||
#include "QObjectPtr.h"
|
||||
#include "tasks/Task.h"
|
||||
|
||||
class ProcessTask
|
||||
{
|
||||
|
||||
};
|
||||
|
||||
class BaseProfilerFactory;
|
||||
class BaseLauncher: public Task, public std::enable_shared_from_this<BaseLauncher>
|
||||
class BaseLauncher: public Task
|
||||
{
|
||||
Q_OBJECT
|
||||
protected:
|
||||
@ -102,6 +107,8 @@ protected: /* methods */
|
||||
void updateInstance();
|
||||
void makeReady();
|
||||
void postLaunch();
|
||||
virtual void emitFailed(QString reason);
|
||||
virtual void emitSucceeded();
|
||||
QString substituteVariables(const QString &cmd) const;
|
||||
void initializeEnvironment();
|
||||
|
||||
@ -112,35 +119,10 @@ protected: /* methods */
|
||||
virtual MessageLevel::Enum guessLevel(const QString &message, MessageLevel::Enum defaultLevel);
|
||||
|
||||
signals:
|
||||
/**
|
||||
* @brief emitted when the Process immediately fails to run
|
||||
*/
|
||||
void launch_failed(InstancePtr);
|
||||
|
||||
/**
|
||||
* @brief emitted when the PreLaunchCommand fails
|
||||
*/
|
||||
void prelaunch_failed(InstancePtr, int code, QProcess::ExitStatus status);
|
||||
|
||||
/**
|
||||
* @brief emitted when the instance update fails
|
||||
*/
|
||||
void update_failed(InstancePtr);
|
||||
|
||||
/**
|
||||
* @brief emitted when the PostLaunchCommand fails
|
||||
*/
|
||||
void postlaunch_failed(InstancePtr, int code, QProcess::ExitStatus status);
|
||||
|
||||
/**
|
||||
* @brief emitted when the process has finished and the PostLaunchCommand was run
|
||||
*/
|
||||
void ended(InstancePtr, int code, QProcess::ExitStatus status);
|
||||
|
||||
/**
|
||||
* @brief emitted when the launch preparations are done
|
||||
*/
|
||||
void readyForLaunch(std::shared_ptr<BaseLauncher> launcher);
|
||||
void readyForLaunch();
|
||||
|
||||
/**
|
||||
* @brief emitted when we want to log something
|
||||
@ -158,7 +140,7 @@ protected slots:
|
||||
void on_state(LoggedProcess::State state);
|
||||
void on_post_state(LoggedProcess::State state);
|
||||
|
||||
void checkJavaFinished(JavaCheckResult result);
|
||||
|
||||
|
||||
protected:
|
||||
InstancePtr m_instance;
|
||||
@ -172,15 +154,22 @@ protected:
|
||||
bool killed = false;
|
||||
QString m_header;
|
||||
|
||||
/**
|
||||
* java check step
|
||||
*/
|
||||
protected slots:
|
||||
void checkJavaFinished(JavaCheckResult result);
|
||||
|
||||
protected:
|
||||
// for java checker and launch
|
||||
QString m_javaPath;
|
||||
qlonglong m_javaUnixTime;
|
||||
std::shared_ptr<JavaChecker> m_JavaChecker;
|
||||
|
||||
protected: /* HACK: MINECRAFT: split! */
|
||||
AuthSessionPtr m_session;
|
||||
QString launchScript;
|
||||
QString m_nativeFolder;
|
||||
std::shared_ptr<JavaChecker> m_JavaChecker;
|
||||
std::shared_ptr<Task> m_updateTask;
|
||||
|
||||
protected: /* HACK: MINECRAFT: split! */
|
||||
|
Reference in New Issue
Block a user