2010-10-27 19:50:48 +00:00
# include <dirent.h>
# include <unistd.h>
# include "FileOperations/fileops.h"
2010-11-07 20:31:45 +00:00
# include "wad/nandtitle.h"
# include "system/IosLoader.h"
2010-10-27 19:50:48 +00:00
# include "menus.h"
# include "wpad.h"
# include "fatmounter.h"
# include "usbloader/wbfs.h"
# include "xml/xml.h"
extern int load_from_fs ;
extern char game_partition [ 6 ] ;
extern PartList partitions ;
static int FindGamesPartition ( PartList * partitions )
{
if ( partitions - > wbfs_n ! = 0 )
{
WBFS_Open ( ) ;
2010-10-28 09:00:52 +00:00
2010-10-27 19:50:48 +00:00
for ( int p = 0 ; p < partitions - > num ; p + + )
{
if ( partitions - > pinfo [ p ] . fs_type = = FS_TYPE_WBFS )
{
Settings . partition = p ;
load_from_fs = PART_FS_WBFS ;
return 0 ;
}
}
}
2010-11-07 20:31:45 +00:00
if ( IosLoader : : IsWaninkokoIOS ( ) & & NandTitles . VersionOf ( TITLE_ID ( 1 , IOS_GetVersion ( ) ) ) < 18 )
return - 1 ;
2010-10-27 19:50:48 +00:00
// Loop through FAT/NTFS partitions, and find the first partition with games on it (if there is one)
for ( int i = 0 ; i < partitions - > num ; i + + )
{
if ( partitions - > pinfo [ i ] . fs_type = = FS_TYPE_FAT32 | | partitions - > pinfo [ i ] . fs_type = = FS_TYPE_NTFS )
{
if ( ! WBFS_OpenPart ( partitions - > pinfo [ i ] . part_fs , partitions - > pinfo [ i ] . index ,
partitions - > pentry [ i ] . sector , partitions - > pentry [ i ] . size , ( char * ) & game_partition ) )
{
u32 count ;
// Get the game count...
WBFS_GetCount ( & count ) ;
if ( count > 0 )
{
load_from_fs = partitions - > pinfo [ i ] . part_fs ;
Settings . partition = i ;
return 0 ;
}
else
{
WBFS_Close ( ) ;
}
}
}
}
return - 1 ;
}
static int PartitionChoice ( )
{
int ret = - 1 ;
int choice = WindowPrompt ( tr ( " No WBFS or FAT/NTFS partition found " ) ,
tr ( " You need to select or format a partition " ) , tr ( " Select " ) , tr ( " Format " ) , tr ( " Return " ) ) ;
if ( choice = = 0 )
{
Sys_LoadMenu ( ) ;
}
else if ( choice = = 1 )
{
int part_num = SelectPartitionMenu ( ) ;
if ( part_num > = 0 )
{
2010-11-07 20:31:45 +00:00
if ( IosLoader : : IsWaninkokoIOS ( ) & & NandTitles . VersionOf ( TITLE_ID ( 1 , IOS_GetVersion ( ) ) ) < 18
& & ( partitions . pinfo [ part_num ] . part_fs = = FS_TYPE_FAT32 | | partitions . pinfo [ part_num ] . part_fs = = FS_TYPE_NTFS ) )
WindowPrompt ( tr ( " Warning: " ) , tr ( " You are trying to select a FAT32/NTFS partition with cIOS 249 Rev < 18. This is not supported. Continue on your own risk. " ) , tr ( " OK " ) ) ;
2010-10-27 19:50:48 +00:00
ret = WBFS_OpenPart ( partitions . pinfo [ part_num ] . part_fs , partitions . pinfo [ part_num ] . index , partitions . pentry [ part_num ] . sector , partitions . pentry [ part_num ] . size , ( char * ) & game_partition ) ;
load_from_fs = partitions . pinfo [ part_num ] . part_fs ;
Settings . partition = part_num ;
Settings . Save ( ) ;
}
}
else if ( choice = = 2 )
{
while ( ret < 0 | | ret = = - 666 )
{
int part_num = SelectPartitionMenu ( ) ;
if ( part_num > = 0 )
ret = FormatingPartition ( tr ( " Formatting, please wait... " ) , & partitions . pentry [ part_num ] ) ;
}
}
return ret ;
}
/****************************************************************************
* MountGamePartition
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int MountGamePartition ( bool ShowGUI )
{
gprintf ( " MenuCheck() \n " ) ;
s32 wbfsinit = MountWBFS ( ShowGUI ) ;
if ( wbfsinit < 0 )
{
WindowPrompt ( tr ( " Error ! " ) , tr ( " USB Device not found " ) , tr ( " OK " ) ) ;
Sys_LoadMenu ( ) ;
}
s32 ret = - 1 ;
memset ( game_partition , 0 , 6 ) ;
load_from_fs = - 1 ;
// Added for slow HDD
for ( int retries = 10 ; retries > 0 ; retries - - )
{
2010-10-28 09:00:52 +00:00
if ( Partition_GetList ( WBFS_DEVICE_USB , & partitions ) = = 0 )
2010-10-27 19:50:48 +00:00
break ;
2010-10-28 09:00:52 +00:00
sleep ( 1 ) ;
2010-10-27 19:50:48 +00:00
}
if ( Settings . partition ! = - 1 & & partitions . num > Settings . partition )
{
PartInfo pinfo = partitions . pinfo [ Settings . partition ] ;
if ( ! WBFS_OpenPart ( pinfo . part_fs , pinfo . index , partitions . pentry [ Settings . partition ] . sector ,
partitions . pentry [ Settings . partition ] . size , ( char * ) & game_partition ) )
{
ret = 0 ;
load_from_fs = pinfo . part_fs ;
}
}
if ( ret < 0 )
ret = FindGamesPartition ( & partitions ) ;
if ( ret < 0 & & ShowGUI )
ret = PartitionChoice ( ) ;
if ( ret < 0 )
Sys_LoadMenu ( ) ;
ret = Disc_Init ( ) ;
if ( ret < 0 )
{
if ( ShowGUI )
WindowPrompt ( tr ( " Error ! " ) , tr ( " Could not initialize DIP module! " ) , tr ( " OK " ) ) ;
Sys_LoadMenu ( ) ;
}
// open database if needed, load titles if needed
if ( CheckFile ( Settings . titlestxt_path ) )
2010-11-13 22:34:53 +00:00
OpenXMLDatabase ( Settings . titlestxt_path , Settings . db_language , Settings . db_JPtoEN , true , Settings . titlesOverride , true ) ;
2010-10-27 19:50:48 +00:00
return ret ;
}