GH-1053 base process and launch refactor, part 1
This commit is contained in:
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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());
|
||||
}
|
@ -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;
|
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
Reference in New Issue
Block a user