GH-1053 base process and launch refactor, part 1

This commit is contained in:
Petr Mrázek
2015-05-11 22:21:37 +02:00
parent d14a61b0df
commit 34ddfc7ecc
29 changed files with 743 additions and 603 deletions

View File

@ -24,7 +24,7 @@
#include "minecraft/LegacyUpdate.h"
#include "icons/IconList.h"
#include "minecraft/MinecraftProcess.h"
#include "minecraft/MinecraftLauncher.h"
#include "minecraft/ModList.h"
LegacyInstance::LegacyInstance(SettingsObjectPtr globalSettings, SettingsObjectPtr settings, const QString &rootDir)
@ -95,7 +95,7 @@ std::shared_ptr<Task> LegacyInstance::doUpdate()
return std::shared_ptr<Task>(new LegacyUpdate(this, this));
}
BaseProcess *LegacyInstance::prepareForLaunch(AuthSessionPtr account)
BaseLauncher *LegacyInstance::prepareForLaunch(AuthSessionPtr account)
{
QString launchScript;
QIcon icon = ENV.icons()->getIcon(iconKey());
@ -122,7 +122,7 @@ BaseProcess *LegacyInstance::prepareForLaunch(AuthSessionPtr account)
launchScript += "lwjgl " + lwjgl + "\n";
launchScript += "launcher legacy\n";
}
auto process = MinecraftProcess::create(std::dynamic_pointer_cast<MinecraftInstance>(getSharedPtr()));
auto process = MinecraftLauncher::create(std::dynamic_pointer_cast<MinecraftInstance>(getSharedPtr()));
process->setLaunchScript(launchScript);
process->setWorkdir(minecraftRoot());
process->setLogin(account);

View File

@ -111,7 +111,7 @@ public:
virtual void setShouldUpdate(bool val) override;
virtual std::shared_ptr<Task> doUpdate() override;
virtual BaseProcess *prepareForLaunch(AuthSessionPtr account) override;
virtual BaseLauncher *prepareForLaunch(AuthSessionPtr account) override;
virtual void cleanupAfterRun() override;
virtual QString getStatusbarDescription() override;

View File

@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "minecraft/MinecraftProcess.h"
#include "minecraft/MinecraftLauncher.h"
#include "BaseInstance.h"
#include <java/JavaChecker.h>
#include <MMCStrings.h>
@ -32,19 +32,19 @@
#include "cmdutils.h"
// constructor
MinecraftProcess::MinecraftProcess(MinecraftInstancePtr inst) : BaseProcess(inst)
MinecraftLauncher::MinecraftLauncher(MinecraftInstancePtr inst) : BaseLauncher(inst)
{
}
MinecraftProcess* MinecraftProcess::create(MinecraftInstancePtr inst)
MinecraftLauncher* MinecraftLauncher::create(MinecraftInstancePtr inst)
{
auto proc = new MinecraftProcess(inst);
auto proc = new MinecraftLauncher(inst);
proc->init();
return proc;
}
QString MinecraftProcess::censorPrivateInfo(QString in)
QString MinecraftLauncher::censorPrivateInfo(QString in)
{
if (!m_session)
return in;
@ -67,7 +67,7 @@ QString MinecraftProcess::censorPrivateInfo(QString in)
}
// console window
MessageLevel::Enum MinecraftProcess::guessLevel(const QString &line, MessageLevel::Enum level)
MessageLevel::Enum MinecraftLauncher::guessLevel(const QString &line, MessageLevel::Enum level)
{
QRegularExpression re("\\[(?<timestamp>[0-9:]+)\\] \\[[^/]+/(?<level>[^\\]]+)\\]");
auto match = re.match(line);
@ -107,7 +107,7 @@ MessageLevel::Enum MinecraftProcess::guessLevel(const QString &line, MessageLeve
return level;
}
QMap<QString, QString> MinecraftProcess::getVariables() const
QMap<QString, QString> MinecraftLauncher::getVariables() const
{
auto mcInstance = std::dynamic_pointer_cast<MinecraftInstance>(m_instance);
QMap<QString, QString> out;
@ -120,7 +120,7 @@ QMap<QString, QString> MinecraftProcess::getVariables() const
return out;
}
QStringList MinecraftProcess::javaArguments() const
QStringList MinecraftLauncher::javaArguments() const
{
QStringList args;
@ -161,22 +161,8 @@ QStringList MinecraftProcess::javaArguments() const
return args;
}
void MinecraftProcess::arm()
bool MinecraftLauncher::checkJava(QString JavaPath)
{
printHeader();
emit log("Minecraft folder is:\n" + workingDirectory() + "\n\n");
if (!preLaunch())
{
emit ended(m_instance, 1, QProcess::CrashExit);
return;
}
m_instance->setLastLaunch();
QString JavaPath = m_instance->settings()->get("JavaPath").toString();
emit log("Java path is:\n" + JavaPath + "\n\n");
auto realJavaPath = QStandardPaths::findExecutable(JavaPath);
if (realJavaPath.isEmpty())
{
@ -185,51 +171,73 @@ void MinecraftProcess::arm()
MessageLevel::Warning);
}
// check java version here.
QFileInfo javaInfo(realJavaPath);
qlonglong javaUnixTime = javaInfo.lastModified().toMSecsSinceEpoch();
auto storedUnixTime = m_instance->settings()->get("JavaTimestamp").toLongLong();
// if they are not the same, check!
if(javaUnixTime != storedUnixTime)
{
QFileInfo javaInfo(realJavaPath);
qlonglong javaUnixTime = javaInfo.lastModified().toMSecsSinceEpoch();
auto storedUnixTime = m_instance->settings()->get("JavaTimestamp").toLongLong();
// if they are not the same, check!
if(javaUnixTime != storedUnixTime)
{
QEventLoop ev;
auto checker = std::make_shared<JavaChecker>();
bool successful = false;
QString errorLog;
QString version;
emit log(tr("Checking Java version..."), MessageLevel::MultiMC);
connect(checker.get(), &JavaChecker::checkFinished,
[&](JavaCheckResult result)
{
successful = result.valid;
errorLog = result.errorLog;
version = result.javaVersion;
ev.exit();
});
checker->m_path = realJavaPath;
checker->performCheck();
ev.exec();
if(!successful)
{
// Error message displayed if java can't start
emit log(tr("Could not start java:"), MessageLevel::Error);
auto lines = errorLog.split('\n');
for(auto line: lines)
QEventLoop ev;
auto checker = std::make_shared<JavaChecker>();
bool successful = false;
QString errorLog;
QString version;
emit log(tr("Checking Java version..."), MessageLevel::MultiMC);
connect(checker.get(), &JavaChecker::checkFinished,
[&](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;
successful = result.valid;
errorLog = result.errorLog;
version = result.javaVersion;
ev.exit();
});
checker->m_path = realJavaPath;
checker->performCheck();
ev.exec();
if(!successful)
{
// Error message displayed if java can't start
emit log(tr("Could not start java:"), MessageLevel::Error);
auto lines = errorLog.split('\n');
for(auto line: lines)
{
emit log(line, MessageLevel::Error);
}
emit log(tr("Java version is %1!\n").arg(version), MessageLevel::MultiMC);
m_instance->settings()->set("JavaVersion", version);
m_instance->settings()->set("JavaTimestamp", javaUnixTime);
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 false;
}
emit log(tr("Java version is %1!\n").arg(version), MessageLevel::MultiMC);
m_instance->settings()->set("JavaVersion", version);
m_instance->settings()->set("JavaTimestamp", javaUnixTime);
}
return true;
}
void MinecraftLauncher::arm()
{
printHeader();
emit log("Minecraft folder is:\n" + m_process.workingDirectory() + "\n\n");
/*
if (!preLaunch())
{
emit ended(m_instance, 1, QProcess::CrashExit);
return;
}
*/
m_instance->setLastLaunch();
QString JavaPath = m_instance->settings()->get("JavaPath").toString();
emit log("Java path is:\n" + JavaPath + "\n\n");
if(!checkJava(JavaPath))
{
return;
}
QStringList args = javaArguments();
@ -250,14 +258,15 @@ void MinecraftProcess::arm()
}
emit log("Wrapper command is:\n" + wrapperCommand + "\n\n");
args.prepend(JavaPath);
start(wrapperCommand, args);
m_process.start(wrapperCommand, args);
}
else
{
start(JavaPath, args);
m_process.start(JavaPath, args);
}
if (!waitForStarted())
// instantiate the launcher part
if (!m_process.waitForStarted())
{
//: Error message displayed if instace can't start
emit log(tr("Could not launch minecraft!"), MessageLevel::Error);
@ -268,23 +277,20 @@ void MinecraftProcess::arm()
return;
}
emit log(tr("Minecraft process ID: %1\n\n").arg(processId()), MessageLevel::MultiMC);
emit log(tr("Minecraft process ID: %1\n\n").arg(m_process.processId()), MessageLevel::MultiMC);
// send the launch script to the launcher part
QByteArray bytes = launchScript.toUtf8();
writeData(bytes.constData(), bytes.length());
m_process.write(launchScript.toUtf8());
}
void MinecraftProcess::launch()
void MinecraftLauncher::launch()
{
QString launchString("launch\n");
QByteArray bytes = launchString.toUtf8();
writeData(bytes.constData(), bytes.length());
m_process.write(launchString.toUtf8());
}
void MinecraftProcess::abort()
void MinecraftLauncher::abort()
{
QString launchString("abort\n");
QByteArray bytes = launchString.toUtf8();
writeData(bytes.constData(), bytes.length());
m_process.write(launchString.toUtf8());
}

View File

@ -19,20 +19,20 @@
#include <QString>
#include "minecraft/MinecraftInstance.h"
#include "BaseProcess.h"
#include "BaseLauncher.h"
/**
* The MinecraftProcess class
* The MinecraftLauncher class
*/
class MinecraftProcess : public BaseProcess
class MinecraftLauncher : public BaseLauncher
{
Q_OBJECT
protected:
MinecraftProcess(MinecraftInstancePtr inst);
MinecraftLauncher(MinecraftInstancePtr inst);
public:
static MinecraftProcess *create(MinecraftInstancePtr inst);
static MinecraftLauncher *create(MinecraftInstancePtr inst);
virtual ~MinecraftProcess(){};
virtual ~MinecraftLauncher(){};
/**
* @brief start the launcher part with the provided launch script
@ -69,8 +69,9 @@ protected:
QString launchScript;
QString m_nativeFolder;
protected:
bool checkJava(QString path);
virtual QMap<QString, QString> getVariables() const override;
QStringList javaArguments() const;
virtual QString censorPrivateInfo(QString in) override;
virtual MessageLevel::Enum guessLevel(const QString &message, MessageLevel::Enum defaultLevel) override;

View File

@ -22,7 +22,7 @@
#include "minecraft/OneSixUpdate.h"
#include "minecraft/MinecraftProfile.h"
#include "minecraft/VersionBuildError.h"
#include "minecraft/MinecraftProcess.h"
#include "minecraft/MinecraftLauncher.h"
#include "minecraft/OneSixProfileStrategy.h"
#include "MMCZip.h"
@ -123,7 +123,7 @@ QStringList OneSixInstance::processMinecraftArgs(AuthSessionPtr session)
return parts;
}
BaseProcess *OneSixInstance::prepareForLaunch(AuthSessionPtr session)
BaseLauncher *OneSixInstance::prepareForLaunch(AuthSessionPtr session)
{
QString launchScript;
QIcon icon = ENV.icons()->getIcon(iconKey());
@ -230,7 +230,7 @@ BaseProcess *OneSixInstance::prepareForLaunch(AuthSessionPtr session)
}
launchScript += "launcher onesix\n";
auto process = MinecraftProcess::create(std::dynamic_pointer_cast<MinecraftInstance>(getSharedPtr()));
auto process = MinecraftLauncher::create(std::dynamic_pointer_cast<MinecraftInstance>(getSharedPtr()));
process->setLaunchScript(launchScript);
process->setWorkdir(minecraftRoot());
process->setLogin(session);

View File

@ -49,7 +49,7 @@ public:
virtual QString instanceConfigFolder() const override;
virtual std::shared_ptr<Task> doUpdate() override;
virtual BaseProcess *prepareForLaunch(AuthSessionPtr account) override;
virtual BaseLauncher *prepareForLaunch(AuthSessionPtr account) override;
virtual void cleanupAfterRun() override;