2022-03-27 16:43:32 +05:30
// SPDX-License-Identifier: GPL-3.0-only
/*
* PolyMC - Minecraft Launcher
* Copyright ( C ) 2022 Sefa Eyeoglu < contact @ scrumplex . net >
2015-07-21 06:08:15 +05:30
*
2022-03-27 16:43:32 +05:30
* 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 06:08:15 +05:30
*
2022-03-27 16:43:32 +05:30
* 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 06:08:15 +05:30
*
2022-03-27 16:43:32 +05:30
* 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 06:08:15 +05:30
*/
# 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 ( )
{
2018-07-15 18:21:05 +05:30
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 06:08:15 +05:30
2018-07-15 18:21:05 +05:30
auto realJavaPath = QStandardPaths : : findExecutable ( m_javaPath ) ;
if ( realJavaPath . isEmpty ( ) )
{
if ( perInstance )
{
emit logLine (
2020-09-08 02:03:57 +05:30
QString ( " The java binary \" %1 \" couldn't be found. Please fix the java path "
2018-07-15 18:21:05 +05:30
" override in the instance's settings or disable it. " ) . arg ( m_javaPath ) ,
MessageLevel : : Warning ) ;
}
else
{
2020-09-08 02:03:57 +05:30
emit logLine ( QString ( " The java binary \" %1 \" couldn't be found. Please set up java in "
2018-07-15 18:21:05 +05:30
" the settings. " ) . arg ( m_javaPath ) ,
MessageLevel : : Warning ) ;
}
2020-09-08 02:03:57 +05:30
emitFailed ( QString ( " Java path is not valid. " ) ) ;
2018-07-15 18:21:05 +05:30
return ;
}
else
{
2021-10-18 04:17:02 +05:30
emit logLine ( " Java path is: \n " + m_javaPath + " \n \n " , MessageLevel : : Launcher ) ;
2018-07-15 18:21:05 +05:30
}
2015-07-21 06:08:15 +05:30
2018-07-15 18:21:05 +05:30
QFileInfo javaInfo ( realJavaPath ) ;
qlonglong javaUnixTime = javaInfo . lastModified ( ) . toMSecsSinceEpoch ( ) ;
auto storedUnixTime = settings - > get ( " JavaTimestamp " ) . toLongLong ( ) ;
auto storedArchitecture = settings - > get ( " JavaArchitecture " ) . toString ( ) ;
auto storedVersion = settings - > get ( " JavaVersion " ) . toString ( ) ;
2020-09-08 01:58:41 +05:30
auto storedVendor = settings - > get ( " JavaVendor " ) . toString ( ) ;
2018-07-15 18:21:05 +05:30
m_javaUnixTime = javaUnixTime ;
// if timestamps are not the same, or something is missing, check!
2020-09-08 01:58:41 +05:30
if ( javaUnixTime ! = storedUnixTime | | storedVersion . size ( ) = = 0 | | storedArchitecture . size ( ) = = 0 | | storedVendor . size ( ) = = 0 )
2018-07-15 18:21:05 +05:30
{
2019-04-08 03:29:04 +05:30
m_JavaChecker = new JavaChecker ( ) ;
2021-10-18 04:17:02 +05:30
emit logLine ( QString ( " Checking Java version... " ) , MessageLevel : : Launcher ) ;
2018-07-15 18:21:05 +05:30
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 ( ) ;
2020-09-08 01:58:41 +05:30
auto vendorString = instance - > settings ( ) - > get ( " JavaVendor " ) . toString ( ) ;
printJavaInfo ( verString , archString , vendorString ) ;
2018-07-15 18:21:05 +05:30
}
emitSucceeded ( ) ;
2015-07-21 06:08:15 +05:30
}
void CheckJava : : checkJavaFinished ( JavaCheckResult result )
{
2018-07-15 18:21:05 +05:30
switch ( result . validity )
{
case JavaCheckResult : : Validity : : Errored :
{
// Error message displayed if java can't start
2020-09-08 02:03:57 +05:30
emit logLine ( QString ( " Could not start java: " ) , MessageLevel : : Error ) ;
2018-07-15 18:21:05 +05:30
emit logLines ( result . errorLog . split ( ' \n ' ) , MessageLevel : : Error ) ;
2022-03-27 02:51:08 +05:30
emit logLine ( QString ( " \n Check your Java settings. " ) , MessageLevel : : Launcher ) ;
2018-07-15 18:21:05 +05:30
printSystemInfo ( false , false ) ;
2020-09-08 02:03:57 +05:30
emitFailed ( QString ( " Could not start java! " ) ) ;
2018-07-15 18:21:05 +05:30
return ;
}
case JavaCheckResult : : Validity : : ReturnedInvalidData :
{
2022-03-27 02:51:08 +05:30
emit logLine ( QString ( " Java checker returned some invalid data we don't understand: " ) , MessageLevel : : Error ) ;
2018-07-15 18:21:05 +05:30
emit logLines ( result . outLog . split ( ' \n ' ) , MessageLevel : : Warning ) ;
2021-10-18 04:17:02 +05:30
emit logLine ( " \n Minecraft might not start properly. " , MessageLevel : : Launcher ) ;
2018-07-15 18:21:05 +05:30
printSystemInfo ( false , false ) ;
emitSucceeded ( ) ;
return ;
}
case JavaCheckResult : : Validity : : Valid :
{
auto instance = m_parent - > instance ( ) ;
2022-02-19 21:17:34 +05:30
printJavaInfo ( result . javaVersion . toString ( ) , result . realPlatform , result . javaVendor ) ;
printSystemInfo ( true , result . is_64bit ) ;
2018-07-15 18:21:05 +05:30
instance - > settings ( ) - > set ( " JavaVersion " , result . javaVersion . toString ( ) ) ;
instance - > settings ( ) - > set ( " JavaArchitecture " , result . mojangPlatform ) ;
2020-09-08 01:58:41 +05:30
instance - > settings ( ) - > set ( " JavaVendor " , result . javaVendor ) ;
2018-07-15 18:21:05 +05:30
instance - > settings ( ) - > set ( " JavaTimestamp " , m_javaUnixTime ) ;
emitSucceeded ( ) ;
return ;
}
}
2015-07-21 06:08:15 +05:30
}
2016-06-16 05:50:23 +05:30
2020-09-08 01:58:41 +05:30
void CheckJava : : printJavaInfo ( const QString & version , const QString & architecture , const QString & vendor )
2016-06-16 05:50:23 +05:30
{
2022-02-19 21:17:34 +05:30
emit logLine ( QString ( " Java is version %1, using %2 architecture, from %3. \n \n " ) . arg ( version , architecture , vendor ) , MessageLevel : : Launcher ) ;
2017-01-02 00:29:46 +05:30
}
void CheckJava : : printSystemInfo ( bool javaIsKnown , bool javaIs64bit )
{
2018-07-15 18:21:05 +05:30
auto cpu64 = Sys : : isCPU64bit ( ) ;
auto system64 = Sys : : isSystem64bit ( ) ;
if ( cpu64 ! = system64 )
{
2020-09-08 02:03:57 +05:30
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 18:21:05 +05:30
}
if ( javaIsKnown )
{
if ( javaIs64bit ! = system64 )
{
2020-09-08 02:03:57 +05:30
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 18:21:05 +05:30
}
}
2016-06-16 05:50:23 +05:30
}