WiiFlow_Lite/source/loader/gc_disc.hpp
overjoy.psm bf39d8e26a * The second disc of a Gamecube game that comes with two discs is now marked as "disc 2" in coverflow
* The GC Ex Dumper will now wait after the first read error so the user can eject the disc to clean it
* Added a check to the GC Ex Dumper that sees if the disc is ejected by accident
* Fixed free block/size calculation for GC Ex Dumper
* Fixed some thread messages
* Again some code cleanup and minor fixes
* Updated dutch.ini
* Updated english.ini

NOTE: The GC Ex dumper will only wait after the first read error. If the disc still contains errors after it's cleaned the dumper will stop the process or continue and lose the unreadable data in "skip on error" mode
2012-03-09 02:47:41 +00:00

128 lines
3.1 KiB
C++

/***************************************************************************
* Copyright (C) 2012
* by OverjoY and FIX94 for Wiiflow
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any
* damages arising from the use of this software.
*
* Permission is granted to anyone to use this software for any
* purpose, including commercial applications, and to alter it and
* redistribute it freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you
* must not claim that you wrote the original software. If you use
* this software in a product, an acknowledgment in the product
* documentation would be appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and
* must not be misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*
* gc_disc.hpp
*
***************************************************************************/
#ifndef GC_DISC_H_
#define GC_DISC_H_
typedef void (*progress_callback_t)(int status,int total,void *user_data);
typedef void (*message_callback_t)(int message, int info, char *cinfo, void *user_data);
enum spcall
{
KB = 0,
BL,
MB,
GB,
};
class GCDump
{
public:
void Init(bool skip, bool comp, bool wexf, bool align, u32 nretry, u32 rsize, const char* partition, const char* m_DMLgameDir, progress_callback_t i_spinner, message_callback_t i_message, void *i_udata)
{
skiponerror = skip;
compressed = comp;
writeexfiles = wexf;
force_32k_align = align;
gc_nbrretry = nretry;
gc_readsize = rsize;
gamepartition = partition;
usb_dml_game_dir = m_DMLgameDir;
gc_skipped = 0;
spinner = i_spinner;
message = i_message;
u_data = i_udata;
waitonerror = true;
}
s32 DumpGame( );
s32 CheckSpace(u32 *needed, bool comp);
u32 GetFreeSpace(char *path, u32 Value);
private:
progress_callback_t spinner;
message_callback_t message;
void *u_data;
bool force_32k_align;
bool skiponerror;
bool compressed;
bool writeexfiles;
bool waitonerror;
const char *gamepartition;
const char *usb_dml_game_dir;
char minfo[74];
u8 Disc;
u8 Disc2;
u32 gc_nbrretry;
u32 gc_error;
u32 gc_retry;
u32 gc_skipped;
u32 gc_readsize;
u32 gc_done;
u32 ID;
u32 ID2;
u32 ApploaderSize;
u32 DOLOffset;
u32 DOLSize;
u32 FSTOffset;
u32 FSTSize;
u32 FSTTotal;
u32 FSTEnt;
u32 GamePartOffset;
u32 DataSize;
u32 DiscSize;
u32 DiscSizeCalculated;
typedef struct
{
union
{
struct
{
u32 Type :8;
u32 NameOffset :24;
};
u32 TypeName;
};
union
{
struct
{
u32 FileOffset;
u32 FileLength;
};
struct
{
u32 ParentOffset;
u32 NextOffset;
};
u32 entry[2];
};
} FST;
s32 __DiscReadRaw(void *outbuf, u32 offset, u32 length);
s32 __DiscWrite(char * path, u32 offset, u32 length, u8 *ReadBuffer);
s32 __DiscWriteFile(FILE *f, u32 offset, u32 length, u8 *ReadBuffer);
bool __WaitForDisc(u8 dsc, u32 msg);
};
#endif