usbloadergx/source/usbloader/wbfs.cpp
dimok321 7bccfd2b17 *added loading screen
*Removed the console loading screen (no more console at all)
*Complete rework of device handle. You need to reset all your custom paths for this rev.
*Support for writing images/settings/... on any writable partition (FAT/NTFS/EXT). (Theoretically you can run the loader from NTFS only without the need of any other partition or SD if run from new forwarder channel, for example)
*Support for Primary/Logical partitions and GUID Partition Table (GPT)

Forwarder Channel in last revision was not using IOS58 (not sure about AHBPROT)
Here a corrected version (thx to Cyan):
http://www.mediafire.com/?a9y3ywqcm4v3lz3
2010-12-30 23:49:22 +00:00

203 lines
4.1 KiB
C++

#include <ogcsys.h>
#include <unistd.h>
#include <time.h>
#include "Controls/DeviceHandler.hpp"
#include "usbloader/usbstorage2.h"
#include "wbfs.h"
#include "usbloader/wbfs/wbfs_base.h"
#include "usbloader/wbfs/wbfs_wbfs.h"
#include "usbloader/wbfs/wbfs_fat.h"
#include "usbloader/wbfs/wbfs_ntfs.h"
#include "usbloader/wbfs/wbfs_ext.h"
#include "usbloader/GameList.h"
#include "menu/menus.h"
#include "gecko.h"
static Wbfs *current = NULL;
/* WBFS device */
s32 wbfsDev = WBFS_MIN_DEVICE;
u32 wbfs_part_idx = 0;
wbfs_disc_t* WBFS_OpenDisc(u8 *discid)
{
return current->OpenDisc(discid);
}
void WBFS_CloseDisc(wbfs_disc_t *disc)
{
current->CloseDisc(disc);
}
wbfs_t *GetHddInfo(void)
{
return current->GetHddInfo();
}
s32 WBFS_Init(u32 device)
{
return Wbfs::Init(device);
}
s32 WBFS_OpenPart(int part_num)
{
PartitionHandle * usbHandle = DeviceHandler::Instance()->GetUSBHandle();
if(part_num < 0 || part_num > usbHandle->GetPartitionCount())
return -1;
// close
WBFS_Close();
gprintf("\tWBFS_OpenPart: start sector %u, sector count: %u\n", usbHandle->GetLBAStart(part_num), usbHandle->GetSecCount(part_num));
if (strncmp(usbHandle->GetFSName(part_num), "FAT", 3) == 0)
{
current = new Wbfs_Fat(wbfsDev, usbHandle->GetLBAStart(part_num), usbHandle->GetSecCount(part_num));
}
else if (strncmp(usbHandle->GetFSName(part_num), "NTFS", 4) == 0)
{
current = new Wbfs_Ntfs(wbfsDev, usbHandle->GetLBAStart(part_num), usbHandle->GetSecCount(part_num));
}
else if (strncmp(usbHandle->GetFSName(part_num), "LINUX", 5) == 0)
{
current = new Wbfs_Ext(wbfsDev, usbHandle->GetLBAStart(part_num), usbHandle->GetSecCount(part_num));
}
else if (strncmp(usbHandle->GetFSName(part_num), "WBFS", 4) == 0)
{
current = new Wbfs_Wbfs(wbfsDev, usbHandle->GetLBAStart(part_num), usbHandle->GetSecCount(part_num));
}
if (current->Open())
{
delete current;
current = NULL;
return -1;
}
wbfs_part_idx = usbHandle->GetPartitionNum(part_num);
return 0;
}
bool WBFS_Close(void)
{
if (current != NULL)
{
current->Close();
delete current;
current = NULL;
}
gameList.clear();
return 0;
}
bool WBFS_Mounted()
{
return (current != NULL && current->IsMounted());
}
s32 WBFS_Format(u32 lba, u32 size)
{
return current->Format();
}
s32 WBFS_GetCount(u32 *count)
{
return current->GetCount(count);
}
s32 WBFS_GetHeaders(struct discHdr *outbuf, u32 cnt, u32 len)
{
return current->GetHeaders(outbuf, cnt, len);
}
s32 WBFS_CheckGame(u8 *discid)
{
return current->CheckGame(discid);
}
s32 WBFS_AddGame(void)
{
s32 retval = current->AddGame();
if (retval == 0) gameList.clear();
return retval;
}
s32 WBFS_RemoveGame(u8 *discid)
{
s32 retval = current->RemoveGame(discid);
if (retval == 0) gameList.clear();
return retval;
}
s32 WBFS_GameSize(u8 *discid, f32 *size)
{
return current->GameSize(discid, size);
}
s32 WBFS_DiskSpace(f32 *used, f32 *free)
{
return current->DiskSpace(used, free);
}
s32 WBFS_RenameGame(u8 *discid, const void *newname)
{
s32 retval = current->RenameGame(discid, newname);
if (retval == 0) gameList.clear();
return retval;
}
s32 WBFS_ReIDGame(u8 *discid, const void *newID)
{
s32 retval = current->ReIDGame(discid, newID);
if (retval == 0) gameList.clear();
return retval;
}
f32 WBFS_EstimeGameSize(void)
{
return current->EstimateGameSize();
}
int WBFS_GetFragList(u8 *id)
{
return current->GetFragList(id);
}
bool WBFS_ShowFreeSpace(void)
{
return current->ShowFreeSpace();
}
int MountWBFS(bool ShowGUI)
{
if(ShowGUI)
return DiscWait(tr( "Waiting for USB Device" ), 0, 0, 0, 1);
int ret = -1;
time_t currTime = time(0);
while (time(0) - currTime < 30)
{
ret = WBFS_Init(WBFS_DEVICE_USB);
printf("%i...", int(time(0) - currTime));
if (ret < 0)
sleep(1);
else
break;
DeviceHandler::Instance()->UnMountAllUSB();
DeviceHandler::Instance()->MountAllUSB();
}
printf("\n");
return ret;
}