mirror of
https://github.com/wiidev/usbloadergx.git
synced 2024-12-23 10:21:55 +01:00
f3ef9104b1
*Moved all related global settings to a settings class. one for themes and individual games will follow. Probably broke some settings or theme loading, we can deal with that later and fix when someone discovers bugs.
214 lines
4.0 KiB
C++
214 lines
4.0 KiB
C++
#include "wbfs_wbfs.h"
|
|
#include "prompts/ProgressWindow.h"
|
|
#include "settings/CSettings.h"
|
|
#include "wbfs_rw.h"
|
|
|
|
extern u32 sector_size;
|
|
|
|
s32 Wbfs_Wbfs::Open()
|
|
{
|
|
wbfs_t *part = NULL;
|
|
|
|
/* Open partition */
|
|
part = wbfs_open_partition( readCallback, writeCallback, NULL, sector_size, size, lba, 0 );
|
|
if ( !part ) return -1;
|
|
|
|
/* Close current hard disk */
|
|
Close();
|
|
hdd = part;
|
|
|
|
// Save the new sector size, so it will be used in read and write calls
|
|
sector_size = 1 << hdd->head->hd_sec_sz_s;
|
|
|
|
return 0;
|
|
}
|
|
|
|
wbfs_disc_t* Wbfs_Wbfs::OpenDisc( u8 *discid )
|
|
{
|
|
/* No device open */
|
|
if ( !hdd )
|
|
return NULL;
|
|
|
|
/* Open disc */
|
|
return wbfs_open_disc( hdd, discid );
|
|
}
|
|
|
|
void Wbfs_Wbfs::CloseDisc( wbfs_disc_t *disc )
|
|
{
|
|
/* No device open */
|
|
if ( !hdd || !disc )
|
|
return;
|
|
|
|
/* Close disc */
|
|
wbfs_close_disc( disc );
|
|
}
|
|
|
|
s32 Wbfs_Wbfs::Format()
|
|
{
|
|
wbfs_t *partition = NULL;
|
|
|
|
/* Reset partition */
|
|
partition = wbfs_open_partition( readCallback, writeCallback, NULL, sector_size, size, lba, 1 );
|
|
if ( !partition )
|
|
return -1;
|
|
|
|
/* Free memory */
|
|
wbfs_close( partition );
|
|
|
|
return 0;
|
|
}
|
|
|
|
s32 Wbfs_Wbfs::GetCount( u32 *count )
|
|
{
|
|
/* No device open */
|
|
if ( !hdd )
|
|
return -1;
|
|
|
|
/* Get list length */
|
|
*count = wbfs_count_discs( hdd );
|
|
|
|
return 0;
|
|
}
|
|
|
|
s32 Wbfs_Wbfs::GetHeaders( struct discHdr *outbuf, u32 cnt, u32 len )
|
|
{
|
|
u32 idx, size;
|
|
s32 ret;
|
|
|
|
/* No device open */
|
|
if ( !hdd )
|
|
return -1;
|
|
|
|
for ( idx = 0; idx < cnt; idx++ )
|
|
{
|
|
u8 *ptr = ( ( u8 * )outbuf ) + ( idx * len );
|
|
|
|
/* Get header */
|
|
ret = wbfs_get_disc_info( hdd, idx, ptr, len, &size );
|
|
if ( ret < 0 )
|
|
return ret;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
s32 Wbfs_Wbfs::AddGame()
|
|
{
|
|
s32 ret;
|
|
|
|
/* No device open */
|
|
if ( !hdd )
|
|
return -1;
|
|
|
|
/* Add game to device */
|
|
partition_selector_t part_sel;
|
|
int copy_1_1 = 0;
|
|
|
|
if ( Settings.fullcopy )
|
|
{
|
|
part_sel = ALL_PARTITIONS;
|
|
copy_1_1 = 1;
|
|
}
|
|
else
|
|
{
|
|
part_sel = Settings.partitions_to_install == install_game_only ? ONLY_GAME_PARTITION : ALL_PARTITIONS;
|
|
}
|
|
|
|
ret = wbfs_add_disc( hdd, __ReadDVD, NULL, ProgressCallback, part_sel, copy_1_1 );
|
|
if ( ret < 0 )
|
|
return ret;
|
|
|
|
return 0;
|
|
}
|
|
|
|
s32 Wbfs_Wbfs::RemoveGame( u8 *discid )
|
|
{
|
|
s32 ret;
|
|
|
|
/* No device open */
|
|
if ( !hdd )
|
|
return -1;
|
|
|
|
/* Remove game from USB device */
|
|
ret = wbfs_rm_disc( hdd, discid );
|
|
if ( ret < 0 )
|
|
return ret;
|
|
|
|
return 0;
|
|
}
|
|
|
|
s32 Wbfs_Wbfs::DiskSpace( f32 *used, f32 *free )
|
|
{
|
|
f32 ssize;
|
|
u32 cnt;
|
|
|
|
/* No device open */
|
|
if ( !hdd )
|
|
return -1;
|
|
|
|
/* Count used blocks */
|
|
cnt = wbfs_count_usedblocks( hdd );
|
|
|
|
/* Sector size in GB */
|
|
ssize = hdd->wbfs_sec_sz / GB_SIZE;
|
|
|
|
/* Copy values */
|
|
*free = ssize * cnt;
|
|
*used = ssize * ( hdd->n_wbfs_sec - cnt );
|
|
|
|
return 0;
|
|
}
|
|
|
|
s32 Wbfs_Wbfs::RenameGame( u8 *discid, const void *newname )
|
|
{
|
|
s32 ret;
|
|
|
|
/* No USB device open */
|
|
if ( !hdd )
|
|
return -1;
|
|
ret = wbfs_ren_disc( hdd, discid, ( u8* )newname );
|
|
if ( ret < 0 )
|
|
return ret;
|
|
|
|
return 0;
|
|
}
|
|
|
|
s32 Wbfs_Wbfs::ReIDGame( u8 *discid, const void *newID )
|
|
{
|
|
s32 ret;
|
|
|
|
/* No USB device open */
|
|
if ( !hdd )
|
|
return -1;
|
|
ret = wbfs_rID_disc( hdd, discid, ( u8* )newID );
|
|
if ( ret < 0 )
|
|
return ret;
|
|
|
|
return 0;
|
|
}
|
|
|
|
f32 Wbfs_Wbfs::EstimateGameSize()
|
|
{
|
|
partition_selector_t part_sel = ONLY_GAME_PARTITION;
|
|
if ( Settings.fullcopy )
|
|
{
|
|
part_sel = ALL_PARTITIONS;
|
|
}
|
|
else
|
|
{
|
|
switch ( Settings.partitions_to_install )
|
|
{
|
|
case install_game_only:
|
|
part_sel = ONLY_GAME_PARTITION;
|
|
break;
|
|
case install_all:
|
|
part_sel = ALL_PARTITIONS;
|
|
break;
|
|
case install_all_but_update:
|
|
part_sel = REMOVE_UPDATE_PARTITION;
|
|
break;
|
|
}
|
|
}
|
|
return wbfs_estimate_disc( hdd, __ReadDVD, NULL, part_sel );
|
|
}
|