2022-03-27 12:13:32 +01:00
// SPDX-License-Identifier: GPL-3.0-only
/*
* PolyMC - Minecraft Launcher
* Copyright ( C ) 2022 Sefa Eyeoglu < contact @ scrumplex . net >
2015-07-21 01:38:15 +01:00
*
2022-03-27 12:13:32 +01:00
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , version 3.
2015-07-21 01:38:15 +01:00
*
2022-03-27 12:13:32 +01:00
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
2015-07-21 01:38:15 +01:00
*
2022-03-27 12:13:32 +01:00
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < https : //www.gnu.org/licenses/>.
*
* This file incorporates work covered by the following copyright and
* permission notice :
*
* Copyright 2013 - 2021 MultiMC Contributors
*
* 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 .
2015-07-21 01:38:15 +01:00
*/
# include "CheckJava.h"
2022-06-14 21:00:24 +01:00
# include "java/JavaUtils.h"
2015-07-21 01:38:15 +01:00
# include <launch/LaunchTask.h>
2015-10-05 00:47:27 +01:00
# include <FileSystem.h>
2015-07-21 01:38:15 +01:00
# include <QStandardPaths>
2015-07-22 08:01:04 +01:00
# include <QFileInfo>
2017-01-01 18:59:46 +00:00
# include <sys.h>
2015-07-21 01:38:15 +01:00
void CheckJava : : executeTask ( )
{
2018-07-15 13:51:05 +01:00
auto instance = m_parent - > instance ( ) ;
auto settings = instance - > settings ( ) ;
m_javaPath = FS : : ResolveExecutable ( settings - > get ( " JavaPath " ) . toString ( ) ) ;
bool perInstance = settings - > get ( " OverrideJava " ) . toBool ( ) | | settings - > get ( " OverrideJavaLocation " ) . toBool ( ) ;
2015-07-21 01:38:15 +01:00
2018-07-15 13:51:05 +01:00
auto realJavaPath = QStandardPaths : : findExecutable ( m_javaPath ) ;
if ( realJavaPath . isEmpty ( ) )
{
if ( perInstance )
{
emit logLine (
2020-09-07 21:33:57 +01:00
QString ( " The java binary \" %1 \" couldn't be found. Please fix the java path "
2018-07-15 13:51:05 +01:00
" override in the instance's settings or disable it. " ) . arg ( m_javaPath ) ,
MessageLevel : : Warning ) ;
}
else
{
2020-09-07 21:33:57 +01:00
emit logLine ( QString ( " The java binary \" %1 \" couldn't be found. Please set up java in "
2018-07-15 13:51:05 +01:00
" the settings. " ) . arg ( m_javaPath ) ,
MessageLevel : : Warning ) ;
}
2020-09-07 21:33:57 +01:00
emitFailed ( QString ( " Java path is not valid. " ) ) ;
2018-07-15 13:51:05 +01:00
return ;
}
else
{
2021-10-17 23:47:02 +01:00
emit logLine ( " Java path is: \n " + m_javaPath + " \n \n " , MessageLevel : : Launcher ) ;
2018-07-15 13:51:05 +01:00
}
2015-07-21 01:38:15 +01:00
2022-06-14 21:00:24 +01:00
if ( JavaUtils : : getJavaCheckPath ( ) . isEmpty ( ) )
{
const char * reason = QT_TR_NOOP ( " Java checker library could not be found. Please check your installation. " ) ;
emit logLine ( tr ( reason ) , MessageLevel : : Fatal ) ;
emitFailed ( tr ( reason ) ) ;
return ;
}
2018-07-15 13:51:05 +01:00
QFileInfo javaInfo ( realJavaPath ) ;
qlonglong javaUnixTime = javaInfo . lastModified ( ) . toMSecsSinceEpoch ( ) ;
auto storedUnixTime = settings - > get ( " JavaTimestamp " ) . toLongLong ( ) ;
auto storedArchitecture = settings - > get ( " JavaArchitecture " ) . toString ( ) ;
2022-06-11 09:48:56 +01:00
auto storedRealArchitecture = settings - > get ( " JavaRealArchitecture " ) . toString ( ) ;
2018-07-15 13:51:05 +01:00
auto storedVersion = settings - > get ( " JavaVersion " ) . toString ( ) ;
2020-09-07 21:28:41 +01:00
auto storedVendor = settings - > get ( " JavaVendor " ) . toString ( ) ;
2018-07-15 13:51:05 +01:00
m_javaUnixTime = javaUnixTime ;
// if timestamps are not the same, or something is missing, check!
2022-06-11 09:48:56 +01:00
if ( javaUnixTime ! = storedUnixTime | | storedVersion . size ( ) = = 0
| | storedArchitecture . size ( ) = = 0 | | storedRealArchitecture . size ( ) = = 0
| | storedVendor . size ( ) = = 0 )
2018-07-15 13:51:05 +01:00
{
2019-04-07 22:59:04 +01:00
m_JavaChecker = new JavaChecker ( ) ;
2021-10-17 23:47:02 +01:00
emit logLine ( QString ( " Checking Java version... " ) , MessageLevel : : Launcher ) ;
2018-07-15 13:51:05 +01:00
connect ( m_JavaChecker . get ( ) , & JavaChecker : : checkFinished , this , & CheckJava : : checkJavaFinished ) ;
m_JavaChecker - > m_path = realJavaPath ;
m_JavaChecker - > performCheck ( ) ;
return ;
}
else
{
auto verString = instance - > settings ( ) - > get ( " JavaVersion " ) . toString ( ) ;
auto archString = instance - > settings ( ) - > get ( " JavaArchitecture " ) . toString ( ) ;
2022-06-11 09:48:56 +01:00
auto realArchString = settings - > get ( " JavaRealArchitecture " ) . toString ( ) ;
2020-09-07 21:28:41 +01:00
auto vendorString = instance - > settings ( ) - > get ( " JavaVendor " ) . toString ( ) ;
2022-06-11 09:48:56 +01:00
printJavaInfo ( verString , archString , realArchString , vendorString ) ;
2018-07-15 13:51:05 +01:00
}
emitSucceeded ( ) ;
2015-07-21 01:38:15 +01:00
}
void CheckJava : : checkJavaFinished ( JavaCheckResult result )
{
2018-07-15 13:51:05 +01:00
switch ( result . validity )
{
case JavaCheckResult : : Validity : : Errored :
{
// Error message displayed if java can't start
2020-09-07 21:33:57 +01:00
emit logLine ( QString ( " Could not start java: " ) , MessageLevel : : Error ) ;
2018-07-15 13:51:05 +01:00
emit logLines ( result . errorLog . split ( ' \n ' ) , MessageLevel : : Error ) ;
2022-03-26 21:21:08 +00:00
emit logLine ( QString ( " \n Check your Java settings. " ) , MessageLevel : : Launcher ) ;
2018-07-15 13:51:05 +01:00
printSystemInfo ( false , false ) ;
2020-09-07 21:33:57 +01:00
emitFailed ( QString ( " Could not start java! " ) ) ;
2018-07-15 13:51:05 +01:00
return ;
}
case JavaCheckResult : : Validity : : ReturnedInvalidData :
{
2022-03-26 21:21:08 +00:00
emit logLine ( QString ( " Java checker returned some invalid data we don't understand: " ) , MessageLevel : : Error ) ;
2018-07-15 13:51:05 +01:00
emit logLines ( result . outLog . split ( ' \n ' ) , MessageLevel : : Warning ) ;
2021-10-17 23:47:02 +01:00
emit logLine ( " \n Minecraft might not start properly. " , MessageLevel : : Launcher ) ;
2018-07-15 13:51:05 +01:00
printSystemInfo ( false , false ) ;
emitSucceeded ( ) ;
return ;
}
case JavaCheckResult : : Validity : : Valid :
{
auto instance = m_parent - > instance ( ) ;
2022-06-11 09:48:56 +01:00
printJavaInfo ( result . javaVersion . toString ( ) , result . mojangPlatform , result . realPlatform , result . javaVendor ) ;
2022-02-19 15:47:34 +00:00
printSystemInfo ( true , result . is_64bit ) ;
2018-07-15 13:51:05 +01:00
instance - > settings ( ) - > set ( " JavaVersion " , result . javaVersion . toString ( ) ) ;
instance - > settings ( ) - > set ( " JavaArchitecture " , result . mojangPlatform ) ;
2022-06-11 09:48:56 +01:00
instance - > settings ( ) - > set ( " JavaRealArchitecture " , result . realPlatform ) ;
2020-09-07 21:28:41 +01:00
instance - > settings ( ) - > set ( " JavaVendor " , result . javaVendor ) ;
2018-07-15 13:51:05 +01:00
instance - > settings ( ) - > set ( " JavaTimestamp " , m_javaUnixTime ) ;
emitSucceeded ( ) ;
return ;
}
}
2015-07-21 01:38:15 +01:00
}
2016-06-16 01:20:23 +01:00
2022-06-11 09:48:56 +01:00
void CheckJava : : printJavaInfo ( const QString & version , const QString & architecture , const QString & realArchitecture , const QString & vendor )
2016-06-16 01:20:23 +01:00
{
2022-06-11 09:48:56 +01:00
emit logLine ( QString ( " Java is version %1, using %2 (%3) architecture, from %4. \n \n " )
. arg ( version , architecture , realArchitecture , vendor ) , MessageLevel : : Launcher ) ;
2017-01-01 18:59:46 +00:00
}
void CheckJava : : printSystemInfo ( bool javaIsKnown , bool javaIs64bit )
{
2018-07-15 13:51:05 +01:00
auto cpu64 = Sys : : isCPU64bit ( ) ;
auto system64 = Sys : : isSystem64bit ( ) ;
if ( cpu64 ! = system64 )
{
2020-09-07 21:33:57 +01:00
emit logLine ( QString ( " Your CPU architecture is not matching your system architecture. You might want to install a 64bit Operating System. \n \n " ) , MessageLevel : : Error ) ;
2018-07-15 13:51:05 +01:00
}
if ( javaIsKnown )
{
if ( javaIs64bit ! = system64 )
{
2020-09-07 21:33:57 +01:00
emit logLine ( QString ( " Your Java architecture is not matching your system architecture. You might want to install a 64bit Java version. \n \n " ) , MessageLevel : : Error ) ;
2018-07-15 13:51:05 +01:00
}
}
2016-06-16 01:20:23 +01:00
}