2017-01-08 09:28:05 +05:30
/* Copyright 2013-2017 MultiMC Contributors
2015-07-21 06:08:15 +05:30
*
* 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 "CheckJava.h"
# include <launch/LaunchTask.h>
2015-10-05 05:17:27 +05:30
# include <FileSystem.h>
2015-07-21 06:08:15 +05:30
# include <QStandardPaths>
2015-07-22 12:31:04 +05:30
# include <QFileInfo>
2017-01-02 00:29:46 +05:30
# include <sys.h>
2015-07-21 06:08:15 +05:30
void CheckJava : : executeTask ( )
{
auto instance = m_parent - > instance ( ) ;
2015-08-24 13:08:05 +05:30
auto settings = instance - > settings ( ) ;
2015-10-05 05:17:27 +05:30
m_javaPath = FS : : ResolveExecutable ( settings - > get ( " JavaPath " ) . toString ( ) ) ;
2015-08-24 13:08:05 +05:30
bool perInstance = settings - > get ( " OverrideJava " ) . toBool ( ) | | settings - > get ( " OverrideJavaLocation " ) . toBool ( ) ;
2015-07-21 06:08:15 +05:30
auto realJavaPath = QStandardPaths : : findExecutable ( m_javaPath ) ;
if ( realJavaPath . isEmpty ( ) )
{
2015-08-24 13:08:05 +05:30
if ( perInstance )
{
emit logLine (
tr ( " The java binary \" %1 \" couldn't be found. Please fix the java path "
" override in the instance's settings or disable it. " ) . arg ( m_javaPath ) ,
MessageLevel : : Warning ) ;
}
else
{
emit logLine ( tr ( " The java binary \" %1 \" couldn't be found. Please set up java in "
" the settings. " ) . arg ( m_javaPath ) ,
MessageLevel : : Warning ) ;
}
2015-08-24 04:26:45 +05:30
emitFailed ( tr ( " Java path is not valid. " ) ) ;
return ;
}
else
{
emit logLine ( " Java path is: \n " + m_javaPath + " \n \n " , MessageLevel : : MultiMC ) ;
2015-07-21 06:08:15 +05:30
}
QFileInfo javaInfo ( realJavaPath ) ;
qlonglong javaUnixTime = javaInfo . lastModified ( ) . toMSecsSinceEpoch ( ) ;
2015-08-24 13:08:05 +05:30
auto storedUnixTime = settings - > get ( " JavaTimestamp " ) . toLongLong ( ) ;
2016-06-16 05:50:23 +05:30
auto storedArchitecture = settings - > get ( " JavaArchitecture " ) . toString ( ) ;
auto storedVersion = settings - > get ( " JavaVersion " ) . toString ( ) ;
2015-07-21 06:08:15 +05:30
m_javaUnixTime = javaUnixTime ;
2016-06-16 05:50:23 +05:30
// if timestamps are not the same, or something is missing, check!
if ( javaUnixTime ! = storedUnixTime | | storedVersion . size ( ) = = 0 | | storedArchitecture . size ( ) = = 0 )
2015-07-21 06:08:15 +05:30
{
m_JavaChecker = std : : make_shared < JavaChecker > ( ) ;
emit logLine ( tr ( " Checking Java version... " ) , MessageLevel : : MultiMC ) ;
2016-06-16 05:50:23 +05:30
connect ( m_JavaChecker . get ( ) , & JavaChecker : : checkFinished , this , & CheckJava : : checkJavaFinished ) ;
2015-07-21 06:08:15 +05:30
m_JavaChecker - > m_path = realJavaPath ;
m_JavaChecker - > performCheck ( ) ;
2015-08-24 04:26:45 +05:30
return ;
2015-07-21 06:08:15 +05:30
}
2016-06-16 05:50:23 +05:30
else
{
auto verString = instance - > settings ( ) - > get ( " JavaVersion " ) . toString ( ) ;
auto archString = instance - > settings ( ) - > get ( " JavaArchitecture " ) . toString ( ) ;
printJavaInfo ( verString , archString ) ;
}
2015-07-21 06:08:15 +05:30
emitSucceeded ( ) ;
}
void CheckJava : : checkJavaFinished ( JavaCheckResult result )
{
2017-01-07 11:22:09 +05:30
switch ( result . validity )
2015-07-21 06:08:15 +05:30
{
2017-01-07 11:22:09 +05:30
case JavaCheckResult : : Validity : : Errored :
{
// Error message displayed if java can't start
emit logLine ( tr ( " Could not start java: " ) , MessageLevel : : Error ) ;
emit logLines ( result . errorLog . split ( ' \n ' ) , MessageLevel : : Error ) ;
emit logLine ( " \n Check your MultiMC Java settings. " , MessageLevel : : MultiMC ) ;
printSystemInfo ( false , false ) ;
emitFailed ( tr ( " Could not start java! " ) ) ;
return ;
}
case JavaCheckResult : : Validity : : ReturnedInvalidData :
{
emit logLine ( tr ( " Java checker returned some invalid data MultiMC doesn't understand: " ) , MessageLevel : : Error ) ;
emit logLines ( result . outLog . split ( ' \n ' ) , MessageLevel : : Warning ) ;
emit logLine ( " \n Minecraft might not start properly. " , MessageLevel : : MultiMC ) ;
printSystemInfo ( false , false ) ;
emitSucceeded ( ) ;
return ;
}
case JavaCheckResult : : Validity : : Valid :
{
auto instance = m_parent - > instance ( ) ;
printJavaInfo ( result . javaVersion . toString ( ) , result . mojangPlatform ) ;
instance - > settings ( ) - > set ( " JavaVersion " , result . javaVersion . toString ( ) ) ;
instance - > settings ( ) - > set ( " JavaArchitecture " , result . mojangPlatform ) ;
instance - > settings ( ) - > set ( " JavaTimestamp " , m_javaUnixTime ) ;
emitSucceeded ( ) ;
return ;
}
2015-07-21 06:08:15 +05:30
}
}
2016-06-16 05:50:23 +05:30
void CheckJava : : printJavaInfo ( const QString & version , const QString & architecture )
{
emit logLine ( tr ( " Java is version %1, using %2-bit architecture. \n \n " ) . arg ( version , architecture ) , MessageLevel : : MultiMC ) ;
2017-01-02 00:29:46 +05:30
printSystemInfo ( true , architecture = = " 64 " ) ;
}
void CheckJava : : printSystemInfo ( bool javaIsKnown , bool javaIs64bit )
{
auto cpu64 = Sys : : isCPU64bit ( ) ;
auto system64 = Sys : : isSystem64bit ( ) ;
if ( cpu64 ! = system64 )
{
emit logLine ( tr ( " Your CPU architecture is not matching your system architecture. You might want to install a 64bit Operating System. \n \n " ) , MessageLevel : : Error ) ;
}
if ( javaIsKnown )
{
if ( javaIs64bit ! = system64 )
{
emit logLine ( tr ( " Your Java architecture is not matching your system architecture. You might want to install a 64bit Java version. \n \n " ) , MessageLevel : : Error ) ;
}
}
2016-06-16 05:50:23 +05:30
}