2016-08-14 06:03:31 +05:30
# include "LibrariesTask.h"
2021-11-22 03:51:12 +05:30
2017-07-24 12:31:37 +05:30
# include "minecraft/MinecraftInstance.h"
2020-06-27 15:32:31 +05:30
# include "minecraft/PackProfile.h"
2016-08-14 06:03:31 +05:30
2021-11-22 03:51:12 +05:30
# include "Application.h"
2017-07-24 12:31:37 +05:30
LibrariesTask : : LibrariesTask ( MinecraftInstance * inst )
2016-08-14 06:03:31 +05:30
{
2018-07-15 18:21:05 +05:30
m_inst = inst ;
2016-08-14 06:03:31 +05:30
}
void LibrariesTask : : executeTask ( )
{
2018-07-15 18:21:05 +05:30
setStatus ( tr ( " Getting the library files from Mojang... " ) ) ;
qDebug ( ) < < m_inst - > name ( ) < < " : downloading libraries " ;
MinecraftInstance * inst = ( MinecraftInstance * ) m_inst ;
2016-08-14 06:03:31 +05:30
2018-07-15 18:21:05 +05:30
// Build a list of URLs that will need to be downloaded.
2020-06-27 15:32:31 +05:30
auto components = inst - > getPackProfile ( ) ;
2018-07-15 18:21:05 +05:30
auto profile = components - > getProfile ( ) ;
2016-08-14 06:03:31 +05:30
2021-12-31 09:57:59 +05:30
auto job = new NetJob ( tr ( " Libraries for instance %1 " ) . arg ( inst - > name ( ) ) , APPLICATION - > network ( ) ) ;
2018-07-15 18:21:05 +05:30
downloadJob . reset ( job ) ;
2016-08-14 06:03:31 +05:30
2021-11-22 03:51:12 +05:30
auto metacache = APPLICATION - > metacache ( ) ;
2018-11-26 07:36:58 +05:30
2018-11-26 14:27:51 +05:30
auto processArtifactPool = [ & ] ( const QList < LibraryPtr > & pool , QStringList & errors , const QString & localPath )
2018-07-15 18:21:05 +05:30
{
2018-11-26 14:27:51 +05:30
for ( auto lib : pool )
2018-07-15 18:21:05 +05:30
{
2018-11-26 14:27:51 +05:30
if ( ! lib )
{
emitFailed ( tr ( " Null jar is specified in the metadata, aborting. " ) ) ;
return false ;
}
2022-07-11 12:31:07 +05:30
auto dls = lib - > getDownloads ( inst - > runtimeContext ( ) , metacache . get ( ) , errors , localPath ) ;
2018-11-26 14:27:51 +05:30
for ( auto dl : dls )
{
downloadJob - > addNetAction ( dl ) ;
}
2018-07-15 18:21:05 +05:30
}
2018-11-26 14:27:51 +05:30
return true ;
} ;
2017-04-07 03:01:23 +05:30
2018-11-26 14:27:51 +05:30
QStringList failedLocalLibraries ;
QList < LibraryPtr > libArtifactPool ;
libArtifactPool . append ( profile - > getLibraries ( ) ) ;
libArtifactPool . append ( profile - > getNativeLibraries ( ) ) ;
2020-03-27 06:53:15 +05:30
libArtifactPool . append ( profile - > getMavenFiles ( ) ) ;
2022-04-06 11:52:24 +05:30
for ( auto agent : profile - > getAgents ( ) )
{
libArtifactPool . append ( agent - > library ( ) ) ;
}
2018-11-26 14:27:51 +05:30
libArtifactPool . append ( profile - > getMainJar ( ) ) ;
processArtifactPool ( libArtifactPool , failedLocalLibraries , inst - > getLocalLibraryPath ( ) ) ;
QStringList failedLocalJarMods ;
2018-12-06 05:03:49 +05:30
processArtifactPool ( profile - > getJarMods ( ) , failedLocalJarMods , inst - > jarModsDir ( ) ) ;
2018-11-26 14:27:51 +05:30
if ( ! failedLocalJarMods . empty ( ) | | ! failedLocalLibraries . empty ( ) )
2018-07-15 18:21:05 +05:30
{
downloadJob . reset ( ) ;
2018-11-26 14:27:51 +05:30
QString failed_all = ( failedLocalLibraries + failedLocalJarMods ) . join ( " \n " ) ;
2018-12-06 05:06:31 +05:30
emitFailed ( tr ( " Some artifacts marked as 'local' are missing their files: \n %1 \n \n You need to either add the files, or removed the packages that require them. \n You'll have to correct this problem manually. " ) . arg ( failed_all ) ) ;
2018-07-15 18:21:05 +05:30
return ;
}
2018-11-26 14:27:51 +05:30
2018-07-15 18:21:05 +05:30
connect ( downloadJob . get ( ) , & NetJob : : succeeded , this , & LibrariesTask : : emitSucceeded ) ;
connect ( downloadJob . get ( ) , & NetJob : : failed , this , & LibrariesTask : : jarlibFailed ) ;
2022-06-23 04:26:24 +05:30
connect ( downloadJob . get ( ) , & NetJob : : aborted , this , [ this ] { emitFailed ( tr ( " Aborted " ) ) ; } ) ;
2018-07-15 18:21:05 +05:30
connect ( downloadJob . get ( ) , & NetJob : : progress , this , & LibrariesTask : : progress ) ;
2021-12-31 09:57:59 +05:30
downloadJob - > start ( ) ;
2016-08-14 06:03:31 +05:30
}
bool LibrariesTask : : canAbort ( ) const
{
2018-07-15 18:21:05 +05:30
return true ;
2016-08-14 06:03:31 +05:30
}
void LibrariesTask : : jarlibFailed ( QString reason )
{
2018-07-15 18:21:05 +05:30
emitFailed ( tr ( " Game update failed: it was impossible to fetch the required libraries. \n Reason: \n %1 " ) . arg ( reason ) ) ;
2016-08-14 06:03:31 +05:30
}
bool LibrariesTask : : abort ( )
{
2018-07-15 18:21:05 +05:30
if ( downloadJob )
{
return downloadJob - > abort ( ) ;
}
else
{
qWarning ( ) < < " Prematurely aborted LibrariesTask " ;
}
return true ;
2016-08-14 06:03:31 +05:30
}