NOISSUE Refactors and moving of things
This commit is contained in:
400
logic/BaseProcess.cpp
Normal file
400
logic/BaseProcess.cpp
Normal file
@ -0,0 +1,400 @@
|
||||
/* Copyright 2013-2015 MultiMC Contributors
|
||||
*
|
||||
* Authors: Orochimarufan <orochimarufan.x3@gmail.com>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include "logic/BaseProcess.h"
|
||||
#include "logger/QsLog.h"
|
||||
#include <QDir>
|
||||
#include <QEventLoop>
|
||||
|
||||
MessageLevel::Enum MessageLevel::getLevel(const QString& levelName)
|
||||
{
|
||||
if (levelName == "MultiMC")
|
||||
return MessageLevel::MultiMC;
|
||||
else if (levelName == "Debug")
|
||||
return MessageLevel::Debug;
|
||||
else if (levelName == "Info")
|
||||
return MessageLevel::Info;
|
||||
else if (levelName == "Message")
|
||||
return MessageLevel::Message;
|
||||
else if (levelName == "Warning")
|
||||
return MessageLevel::Warning;
|
||||
else if (levelName == "Error")
|
||||
return MessageLevel::Error;
|
||||
else if (levelName == "Fatal")
|
||||
return MessageLevel::Fatal;
|
||||
// Skip PrePost, it's not exposed to !![]!
|
||||
else
|
||||
return MessageLevel::Message;
|
||||
}
|
||||
|
||||
BaseProcess::BaseProcess(InstancePtr instance): QProcess(), m_instance(instance)
|
||||
{
|
||||
}
|
||||
|
||||
void BaseProcess::init()
|
||||
{
|
||||
connect(this, SIGNAL(finished(int, QProcess::ExitStatus)),
|
||||
SLOT(finish(int, QProcess::ExitStatus)));
|
||||
|
||||
// prepare the process environment
|
||||
QProcessEnvironment rawenv = QProcessEnvironment::systemEnvironment();
|
||||
|
||||
QProcessEnvironment env;
|
||||
|
||||
QStringList ignored =
|
||||
{
|
||||
"JAVA_ARGS",
|
||||
"CLASSPATH",
|
||||
"CONFIGPATH",
|
||||
"JAVA_HOME",
|
||||
"JRE_HOME",
|
||||
"_JAVA_OPTIONS",
|
||||
"JAVA_OPTIONS",
|
||||
"JAVA_TOOL_OPTIONS"
|
||||
};
|
||||
for(auto key: rawenv.keys())
|
||||
{
|
||||
auto value = rawenv.value(key);
|
||||
// filter out dangerous java crap
|
||||
if(ignored.contains(key))
|
||||
{
|
||||
QLOG_INFO() << "Env: ignoring" << key << value;
|
||||
continue;
|
||||
}
|
||||
// filter MultiMC-related things
|
||||
if(key.startsWith("QT_"))
|
||||
{
|
||||
QLOG_INFO() << "Env: ignoring" << key << value;
|
||||
continue;
|
||||
}
|
||||
#ifdef LINUX
|
||||
// Do not pass LD_* variables to java. They were intended for MultiMC
|
||||
if(key.startsWith("LD_"))
|
||||
{
|
||||
QLOG_INFO() << "Env: ignoring" << key << value;
|
||||
continue;
|
||||
}
|
||||
// Strip IBus
|
||||
// IBus is a Linux IME framework. For some reason, it breaks MC?
|
||||
if (key == "XMODIFIERS" && value.contains(IBUS))
|
||||
{
|
||||
QString save = value;
|
||||
value.replace(IBUS, "");
|
||||
QLOG_INFO() << "Env: stripped" << IBUS << "from" << save << ":" << value;
|
||||
}
|
||||
#endif
|
||||
QLOG_INFO() << "Env: " << key << value;
|
||||
env.insert(key, value);
|
||||
}
|
||||
#ifdef LINUX
|
||||
// HACK: Workaround for QTBUG-42500
|
||||
env.insert("LD_LIBRARY_PATH", "");
|
||||
#endif
|
||||
|
||||
// export some infos
|
||||
auto variables = getVariables();
|
||||
for (auto it = variables.begin(); it != variables.end(); ++it)
|
||||
{
|
||||
env.insert(it.key(), it.value());
|
||||
}
|
||||
|
||||
this->setProcessEnvironment(env);
|
||||
m_prepostlaunchprocess.setProcessEnvironment(env);
|
||||
|
||||
// std channels
|
||||
connect(this, SIGNAL(readyReadStandardError()), SLOT(on_stdErr()));
|
||||
connect(this, SIGNAL(readyReadStandardOutput()), SLOT(on_stdOut()));
|
||||
|
||||
// Log prepost launch command output (can be disabled.)
|
||||
if (m_instance->settings().get("LogPrePostOutput").toBool())
|
||||
{
|
||||
connect(&m_prepostlaunchprocess, &QProcess::readyReadStandardError, this,
|
||||
&BaseProcess::on_prepost_stdErr);
|
||||
connect(&m_prepostlaunchprocess, &QProcess::readyReadStandardOutput, this,
|
||||
&BaseProcess::on_prepost_stdOut);
|
||||
}
|
||||
|
||||
// a process has been constructed for the instance. It is running from MultiMC POV
|
||||
m_instance->setRunning(true);
|
||||
}
|
||||
|
||||
|
||||
void BaseProcess::setWorkdir(QString path)
|
||||
{
|
||||
QDir mcDir(path);
|
||||
this->setWorkingDirectory(mcDir.absolutePath());
|
||||
m_prepostlaunchprocess.setWorkingDirectory(mcDir.absolutePath());
|
||||
}
|
||||
|
||||
void BaseProcess::logOutput(const QStringList &lines, MessageLevel::Enum defaultLevel,
|
||||
bool guessLevel, bool censor)
|
||||
{
|
||||
for (int i = 0; i < lines.size(); ++i)
|
||||
logOutput(lines[i], defaultLevel, guessLevel, censor);
|
||||
}
|
||||
|
||||
void BaseProcess::logOutput(QString line, MessageLevel::Enum defaultLevel, bool guessLevel,
|
||||
bool censor)
|
||||
{
|
||||
MessageLevel::Enum level = defaultLevel;
|
||||
|
||||
//FIXME: make more flexible in the future
|
||||
if(line.contains("ignoring option PermSize"))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Level prefix
|
||||
int endmark = line.indexOf("]!");
|
||||
if (line.startsWith("!
|
||||
{
|
||||
if (state == QProcess::NotRunning)
|
||||
{
|
||||
eventLoop.quit();
|
||||
}
|
||||
};
|
||||
auto connection = connect(&m_prepostlaunchprocess, &QProcess::stateChanged, finisher);
|
||||
int ret = eventLoop.exec();
|
||||
disconnect(connection);
|
||||
return ret == 0;
|
||||
}
|
||||
|
||||
QString BaseProcess::substituteVariables(const QString &cmd) const
|
||||
{
|
||||
QString out = cmd;
|
||||
auto variables = getVariables();
|
||||
for (auto it = variables.begin(); it != variables.end(); ++it)
|
||||
{
|
||||
out.replace("$" + it.key(), it.value());
|
||||
}
|
||||
auto env = QProcessEnvironment::systemEnvironment();
|
||||
for (auto var : env.keys())
|
||||
{
|
||||
out.replace("$" + var, env.value(var));
|
||||
}
|
||||
return out;
|
||||
}
|
Reference in New Issue
Block a user