*Fixed DVD support in IOS58 modus. You have to have AHBPROT flag enabled for the DVD access support in IOS58 mode. It might be possible that the forwarder channel does not have it set yet. Start from HBC 1.0.8 with IOS58 and you will have it for sure.

*Fixed several leaks
*Source optimization
*Reworked new titles class (a few leaks  fixed)
This commit is contained in:
dimok321 2011-01-13 19:05:31 +00:00
parent 3503f114ed
commit 4a3d3fb31b
15 changed files with 276 additions and 236 deletions

View File

@ -2,8 +2,8 @@
<app version="1"> <app version="1">
<name> USB Loader GX</name> <name> USB Loader GX</name>
<coder>USB Loader GX Team</coder> <coder>USB Loader GX Team</coder>
<version>2.0 r1041</version> <version>2.0 r1042</version>
<release_date>201101111755</release_date> <release_date>201101121930</release_date>
<no_ios_reload/> <no_ios_reload/>
<short_description>Loads games from USB-devices</short_description> <short_description>Loads games from USB-devices</short_description>
<long_description>USB Loader GX is a libwiigui based USB iso loader with a wii-like GUI. You can install games to your HDDs and boot them with shorter loading times. <long_description>USB Loader GX is a libwiigui based USB iso loader with a wii-like GUI. You can install games to your HDDs and boot them with shorter loading times.

View File

@ -63,7 +63,7 @@ LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map,--section-start,.init=0x80B00
# any extra libraries we wish to link with the project # any extra libraries we wish to link with the project
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
LIBS := -lpngu -lpng -lgd -lm -lz -lwiiuse -lbte -lasnd -logc -lfreetype -lvorbisidec \ LIBS := -lpngu -lpng -lgd -lm -lz -lwiiuse -lbte -lasnd -logc -lfreetype -lvorbisidec \
-lmad -lmxml -ljpeg -lzip -lcustomfat -lcustomntfs -lcustomext2fs -lmad -lmxml -ljpeg -lzip -lcustomfat -lcustomntfs -lcustomext2fs -ldi
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
# list of directories containing libraries, this must be the top level containing # list of directories containing libraries, this must be the top level containing
# include and lib # include and lib

View File

@ -91,7 +91,7 @@ void Mp3Decoder::OpenFile()
} }
u8 dummybuff[4096]; u8 dummybuff[4096];
int ret = Read((u8 *) &dummybuff, 4096, 0); int ret = Read(dummybuff, 4096, 0);
if(ret <= 0) if(ret <= 0)
{ {
if(file_fd) if(file_fd)

View File

@ -322,7 +322,7 @@ int HomebrewBrowser::ReceiveFile()
// It's a zip file, unzip to the apps directory // It's a zip file, unzip to the apps directory
// Zip archive, ask for permission to install the zip // Zip archive, ask for permission to install the zip
char zippath[255]; char zippath[255];
sprintf((char *) &zippath, "%s%s", Settings.homebrewapps_path, filename); sprintf(zippath, "%s%s", Settings.homebrewapps_path, filename);
FILE *fp = fopen(zippath, "wb"); FILE *fp = fopen(zippath, "wb");
if (!fp) if (!fp)

View File

@ -85,7 +85,7 @@ int DownloadFileToMem(const char *url, u8 **inbuffer, u32 *size)
char filename[255]; char filename[255];
memset(filename, 0, sizeof(filename)); memset(filename, 0, sizeof(filename));
int filesize = network_request(connection, header, (char *) &filename); int filesize = network_request(connection, header, filename);
if(filesize <= 0) if(filesize <= 0)
{ {
@ -205,7 +205,7 @@ int DownloadFileToPath(const char *orig_url, const char *dest, bool UseFilename)
char filename[255]; char filename[255];
memset(filename, 0, sizeof(filename)); memset(filename, 0, sizeof(filename));
int filesize = network_request(connection, header, (char *) &filename); int filesize = network_request(connection, header, filename);
if(filesize <= 0) if(filesize <= 0)
{ {

View File

@ -11,8 +11,7 @@ bool Anti_002_fix(u8 * Address, int Size)
{ {
u8 SearchPattern[12] = { 0x2C, 0x00, 0x00, 0x00, 0x48, 0x00, 0x02, 0x14, 0x3C, 0x60, 0x80, 0x00 }; u8 SearchPattern[12] = { 0x2C, 0x00, 0x00, 0x00, 0x48, 0x00, 0x02, 0x14, 0x3C, 0x60, 0x80, 0x00 };
u8 PatchData[12] = { 0x2C, 0x00, 0x00, 0x00, 0x40, 0x82, 0x02, 0x14, 0x3C, 0x60, 0x80, 0x00 }; u8 PatchData[12] = { 0x2C, 0x00, 0x00, 0x00, 0x40, 0x82, 0x02, 0x14, 0x3C, 0x60, 0x80, 0x00 };
return PatchDOL(Address, Size, (const u8 *) &SearchPattern, sizeof(SearchPattern), (const u8 *) &PatchData, return PatchDOL(Address, Size, (const u8 *) SearchPattern, sizeof(SearchPattern), (const u8 *) PatchData, sizeof(PatchData));
sizeof(PatchData));
} }
bool NSMBPatch() bool NSMBPatch()

View File

@ -20,7 +20,7 @@ CGameStatistics::~CGameStatistics()
{ {
} }
GameStatus * CGameStatistics::GetGameStatus(const char * id) GameStatus * CGameStatistics::GetGameStatus(const char * id) const
{ {
if(!id) if(!id)
return NULL; return NULL;
@ -29,7 +29,7 @@ GameStatus * CGameStatistics::GetGameStatus(const char * id)
{ {
if(strncmp(id, GameList[i].id, 6) == 0) if(strncmp(id, GameList[i].id, 6) == 0)
{ {
return &GameList[i]; return (GameStatus *) &GameList[i];
} }
} }
@ -208,7 +208,7 @@ bool CGameStatistics::ReadGameID(const char * src, char * GameID, int size)
return true; return true;
} }
#include "gecko.h"
void CGameStatistics::ParseLine(char *line) void CGameStatistics::ParseLine(char *line)
{ {
char name[1024], value[1024]; char name[1024], value[1024];
@ -238,7 +238,6 @@ void CGameStatistics::ParseLine(char *line)
this->TrimLine(name, LinePtr, sizeof(name)); this->TrimLine(name, LinePtr, sizeof(name));
this->TrimLine(value, eq + 1, sizeof(value)); this->TrimLine(value, eq + 1, sizeof(value));
//gprintf("ID: %s, Name = %s, Value = %s\n", GameID, name, value);
SetSetting(NewGame, name, value); SetSetting(NewGame, name, value);
LinePtr = strchr(LinePtr, ';'); LinePtr = strchr(LinePtr, ';');
@ -304,7 +303,7 @@ void CGameStatistics::SetFavoriteRank(const char * id, int rank)
AddGame(NewStatus); AddGame(NewStatus);
} }
int CGameStatistics::GetPlayCount(const char * id) int CGameStatistics::GetPlayCount(const char * id) const
{ {
if(!id) if(!id)
return 0; return 0;
@ -316,7 +315,7 @@ int CGameStatistics::GetPlayCount(const char * id)
return 0; return 0;
} }
int CGameStatistics::GetFavoriteRank(const char * id) int CGameStatistics::GetFavoriteRank(const char * id) const
{ {
if(!id) if(!id)
return 0; return 0;

View File

@ -38,23 +38,23 @@ class CGameStatistics
void SetPlayCount(const u8 * id, int count) { SetPlayCount((const char *) id, count); }; void SetPlayCount(const u8 * id, int count) { SetPlayCount((const char *) id, count); };
void SetPlayCount(const struct discHdr * game, int count) { if(!game) return; SetPlayCount(game->id, count); }; void SetPlayCount(const struct discHdr * game, int count) { if(!game) return; SetPlayCount(game->id, count); };
//!Overloads for get playcount //!Overloads for get playcount
int GetPlayCount(const char * id); int GetPlayCount(const char * id) const;
int GetPlayCount(const u8 * id) { return GetPlayCount((const char *) id); }; int GetPlayCount(const u8 * id) const { return GetPlayCount((const char *) id); };
int GetPlayCount(const struct discHdr * game) { if(!game) return 0; else return GetPlayCount(game->id); }; int GetPlayCount(const struct discHdr * game) const { if(!game) return 0; else return GetPlayCount(game->id); };
//!Overloads for set FavoriteRank //!Overloads for set FavoriteRank
void SetFavoriteRank(const char * id, int rank); void SetFavoriteRank(const char * id, int rank);
void SetFavoriteRank(const u8 * id, int rank) { SetFavoriteRank((const char *) id, rank); }; void SetFavoriteRank(const u8 * id, int rank) { SetFavoriteRank((const char *) id, rank); };
void SetFavoriteRank(const struct discHdr * game, int rank) { if(!game) return; SetFavoriteRank(game->id, rank); }; void SetFavoriteRank(const struct discHdr * game, int rank) { if(!game) return; SetFavoriteRank(game->id, rank); };
//!Overloads for get FavoriteRank //!Overloads for get FavoriteRank
int GetFavoriteRank(const char * id); int GetFavoriteRank(const char * id) const;
int GetFavoriteRank(const u8 * id) { return GetFavoriteRank((const char *) id); }; int GetFavoriteRank(const u8 * id) const { return GetFavoriteRank((const char *) id); };
int GetFavoriteRank(const struct discHdr * game) { if(!game) return 0; else return GetFavoriteRank(game->id); }; int GetFavoriteRank(const struct discHdr * game) const { if(!game) return 0; else return GetFavoriteRank(game->id); };
//!Get GameStatus //!Get GameStatus
GameStatus * GetGameStatus(const char * id); GameStatus * GetGameStatus(const char * id) const;
//!Overload //!Overload
GameStatus * GetGameStatus(const u8 * id) { return GetGameStatus((const char *) id); }; GameStatus * GetGameStatus(const u8 * id) const { return GetGameStatus((const char *) id); };
//!Overload //!Overload
GameStatus * GetGameStatus(const struct discHdr * game) { if(!game) return NULL; else return GetGameStatus(game->id); }; GameStatus * GetGameStatus(const struct discHdr * game) const { if(!game) return NULL; else return GetGameStatus(game->id); };
protected: protected:
bool ReadGameID(const char * src, char * GameID, int size); bool ReadGameID(const char * src, char * GameID, int size);

View File

@ -34,7 +34,7 @@ void CGameTitles::SetGameTitle(const char * id, const char * title)
TitleList.push_back(newTitle); TitleList.push_back(newTitle);
} }
const char * CGameTitles::GetTitle(const char * id) const char * CGameTitles::GetTitle(const char * id) const
{ {
if(!id) if(!id)
return NULL; return NULL;
@ -48,7 +48,7 @@ const char * CGameTitles::GetTitle(const char * id)
return NULL; return NULL;
} }
const char * CGameTitles::GetTitle(const struct discHdr *header) const char * CGameTitles::GetTitle(const struct discHdr *header) const
{ {
if(!header) if(!header)
return NULL; return NULL;
@ -62,7 +62,7 @@ const char * CGameTitles::GetTitle(const struct discHdr *header)
return header->title; return header->title;
} }
int CGameTitles::GetParentalRating(const char * id) int CGameTitles::GetParentalRating(const char * id) const
{ {
if(!id) if(!id)
return -1; return -1;

View File

@ -23,14 +23,14 @@ class CGameTitles
void SetGameTitle(const u8 * id, const char * title) { SetGameTitle((const char *) id, title); }; void SetGameTitle(const u8 * id, const char * title) { SetGameTitle((const char *) id, title); };
//! Get a game title //! Get a game title
const char * GetTitle(const char * id); const char * GetTitle(const char * id) const;
//! Overload //! Overload
const char * GetTitle(const u8 * id) { return GetTitle((const char *) id); }; const char * GetTitle(const u8 * id) const { return GetTitle((const char *) id); };
//! Overload //! Overload
const char * GetTitle(const struct discHdr *header); const char * GetTitle(const struct discHdr *header) const;
//! Get game parental rating //! Get game parental rating
int GetParentalRating(const char * id); int GetParentalRating(const char * id) const;
//! Load Game Titles from WiiTDB //! Load Game Titles from WiiTDB
void LoadTitlesFromWiiTDB(const char * path); void LoadTitlesFromWiiTDB(const char * path);

View File

@ -5,29 +5,11 @@
#include "settings/CGameStatistics.h" #include "settings/CGameStatistics.h"
#include "newtitles.h" #include "newtitles.h"
#define NEW_SECONDS 24 * 60 * 60 #define NEW_SECONDS (24 * 60 * 60)
#define GAMETITLES "gametitles.txt" #define GAMETITLES "GameTimestamps.txt"
NewTitles *NewTitles::instance = NULL; NewTitles *NewTitles::instance = NULL;
NewTitles* NewTitles::Instance()
{
if (instance == NULL)
{
instance = new NewTitles();
}
return instance;
}
void NewTitles::DestroyInstance()
{
if (instance != NULL)
{
delete instance;
instance = NULL;
}
}
NewTitles::NewTitles() NewTitles::NewTitles()
{ {
firstTitle = lastTitle = NULL; firstTitle = lastTitle = NULL;
@ -35,22 +17,38 @@ NewTitles::NewTitles()
// Read the text file // Read the text file
char path[255]; char path[255];
strcpy(path, Settings.titlestxt_path); snprintf(path, sizeof(path), Settings.titlestxt_path);
path[strlen(Settings.titlestxt_path) - 1] = '/'; if(path[strlen(path)-1] != '/')
strcat(path, GAMETITLES); strcat(path, "/");
char line[20]; snprintf(path, sizeof(path), "%s%s", path, GAMETITLES);
FILE *fp = fopen(path, "r");
if (fp != NULL) char line[50];
FILE *fp = fopen(path, "rb");
if (!fp)
{ {
isNewFile = true;
return;
}
time_t currenttime = time(0);
while (fgets(line, sizeof(line), fp)) while (fgets(line, sizeof(line), fp))
{ {
// This is one line // This is one line
if (line[0] != '#' || line[0] != ';') if (line[0] == '#' || line[0] == ';')
{ continue;
Title *title = new Title(); Title *title = new Title();
if (sscanf(line, "%6c:%ld", (u8 *) &title->titleId, &title->timestamp) == 2) if (sscanf(line, "%6c:%lu", title->titleId, &title->timestamp) != 2)
{ {
delete title; // Invalid title entry, ignore
continue;
}
title->next = NULL;
title->isNew = ((currenttime - title->timestamp) < NEW_SECONDS);
if (firstTitle == NULL) if (firstTitle == NULL)
{ {
firstTitle = title; firstTitle = title;
@ -62,20 +60,9 @@ NewTitles::NewTitles()
lastTitle = title; lastTitle = title;
} }
} }
else
{
delete title; // Invalid title entry, ignore
}
}
}
fclose(fp); fclose(fp);
} }
else
{
isNewFile = true;
}
}
NewTitles::~NewTitles() NewTitles::~NewTitles()
{ {
@ -84,39 +71,44 @@ NewTitles::~NewTitles()
Title *t = firstTitle; Title *t = firstTitle;
while (t != NULL) while (t != NULL)
{ {
Title *temp = (Title *) t->next; Title *temp = t->next;
delete t; delete t;
t = temp; t = temp;
} }
firstTitle = lastTitle = NULL; firstTitle = lastTitle = NULL;
} }
void NewTitles::CheckGame(u8 *titleid) void NewTitles::CheckGame(const u8 *titleid)
{ {
if (titleid == NULL || strlen((char *) titleid) == 0) if (titleid == NULL || strlen((char *) titleid) == 0)
{
return; return;
}
Title *t = firstTitle; Title *t = firstTitle;
while (t != NULL) while (t != NULL)
{ {
// Loop all titles, search for the correct titleid // Loop all titles, search for the correct titleid
if (strcmp((const char *) titleid, (const char *) t->titleId) == 0) if (memcmp(titleid, t->titleId, 6) == 0)
{
return; // Game found, which is excellent return; // Game found, which is excellent
}
t = (Title *) t->next; t = t->next;
} }
// Not found, add it // Not found, add it
t = new Title(); t = new Title;
strncpy((char *) t->titleId, (char *) titleid, 6); snprintf(t->titleId, sizeof(t->titleId), (char *) titleid);
t->timestamp = time(NULL); t->timestamp = time(0);
t->next = NULL;
if (isNewFile) if (isNewFile)
{ {
t->isNew = false;
t->timestamp -= (NEW_SECONDS + 1); // Mark all games as not new if this is a new file t->timestamp -= (NEW_SECONDS + 1); // Mark all games as not new if this is a new file
} }
else
{
GameStatus *Status = GameStatistics.GetGameStatus(titleid);
t->isNew = (Status == NULL || Status->PlayCount == 0);
}
if (firstTitle == NULL) if (firstTitle == NULL)
{ {
@ -131,58 +123,44 @@ void NewTitles::CheckGame(u8 *titleid)
isDirty = true; isDirty = true;
} }
bool NewTitles::IsNew(u8 *titleid) bool NewTitles::IsNew(const u8 *titleid) const
{ {
if (titleid == NULL || strlen((char *) titleid) == 0) return false; if (!titleid) return false;
Title *t = firstTitle; Title *t = firstTitle;
while(t != NULL) while(t != NULL)
{ {
// Loop all titles, search for the correct titleid // Loop all titles, search for the correct titleid
if (strcmp((const char *) titleid, (const char *) t->titleId) == 0) if (memcmp(titleid, t->titleId, 6) == 0)
{ return t->isNew;
// This title is less than 24 hours old
if ((time(NULL) - t->timestamp) < NEW_SECONDS) t = t->next;
{
// Only count the game as new when it's never been played through GX
GameStatus *gnum = GameStatistics.GetGameStatus(titleid);
return gnum == NULL || gnum->PlayCount == 0;
} }
return false; return false;
} }
t = (Title *) t->next;
}
// We should never get here, since all files should be added by now!
CheckGame(titleid);
return !isNewFile; // If this is a new file, return false void NewTitles::Remove(const u8 *titleid)
}
void NewTitles::Remove(u8 *titleid)
{ {
if (titleid == NULL || strlen((char *) titleid) == 0) return; if (titleid == NULL) return;
Title *t = firstTitle, *prev = NULL; Title *t = firstTitle, *prev = NULL;
while (t != NULL) while (t != NULL)
{ {
if (strcmp((const char *) titleid, (const char *) t->titleId) == 0) if (memcmp(titleid, t->titleId, 6) == 0)
{ {
if (prev == NULL) if (prev == NULL)
{ firstTitle = t->next;
firstTitle = (Title *) t->next;
}
else else
{
prev->next = t->next; prev->next = t->next;
}
delete t; delete t;
isDirty = true; isDirty = true;
return; return;
} }
prev = t; prev = t;
t = (Title *) t->next; t = t->next;
} }
} }
@ -191,19 +169,21 @@ void NewTitles::Save()
if (!isDirty) return; if (!isDirty) return;
char path[255]; char path[255];
strcpy(path, Settings.titlestxt_path); snprintf(path, sizeof(path), Settings.titlestxt_path);
path[strlen(Settings.titlestxt_path) - 1] = '/'; if(path[strlen(path)-1] != '/')
strcat(path, GAMETITLES); strcat(path, "/");
snprintf(path, sizeof(path), "%s%s", path, GAMETITLES);
FILE *fp = fopen(path, "wb");
if (fp == NULL)
return;
FILE *fp = fopen(path, "w");
if (fp != NULL)
{
Title *t = firstTitle; Title *t = firstTitle;
while (t != NULL && strlen((char *) t->titleId) > 0) while (t != NULL && strlen(t->titleId) > 0)
{ {
fprintf(fp, "%s:%ld\n", t->titleId, t->timestamp); fprintf(fp, "%s:%lu\n", t->titleId, t->timestamp);
t = (Title *) t->next; t = t->next;
} }
fclose(fp); fclose(fp);
} }
}

View File

@ -6,13 +6,13 @@
class NewTitles class NewTitles
{ {
public: public:
static NewTitles *Instance(); static NewTitles *Instance() { if(!instance) instance = new NewTitles(); return instance; }
static void DestroyInstance(); static void DestroyInstance() { delete instance; instance = NULL; }
void Save(); void Save();
void CheckGame(u8 *titleid); void CheckGame(const u8 *titleid);
bool IsNew(u8 *titleid); bool IsNew(const u8 *titleid) const;
void Remove(u8 *titleid); void Remove(const u8 *titleid);
private: private:
NewTitles(); NewTitles();
~NewTitles(); ~NewTitles();
@ -22,9 +22,10 @@ class NewTitles
class Title class Title
{ {
public: public:
u8 titleId[6]; char titleId[7];
time_t timestamp; time_t timestamp;
void *next; Title *next;
bool isNew;
}; };
Title *firstTitle; Title *firstTitle;

View File

@ -37,11 +37,6 @@
GameList gameList; GameList gameList;
GameList::GameList()
{
}
void GameList::clear() void GameList::clear()
{ {
GameFilter.clear(); GameFilter.clear();
@ -53,14 +48,7 @@ void GameList::clear()
std::vector<struct discHdr>().swap(FullGameList); std::vector<struct discHdr>().swap(FullGameList);
} }
struct discHdr * GameList::at(int i) struct discHdr * GameList::GetDiscHeader(const char * gameID) const
{
if (i < 0 || i >= (int) FilteredList.size()) return NULL;
return FilteredList[i];
}
struct discHdr * GameList::GetDiscHeader(const char * gameID)
{ {
for (u32 i = 0; i < FilteredList.size(); ++i) for (u32 i = 0; i < FilteredList.size(); ++i)
{ {
@ -148,15 +136,12 @@ int GameList::FilterList(const wchar_t * gameFilter)
GameCFG * GameConfig = GameSettings.GetGameCFG(header); GameCFG * GameConfig = GameSettings.GetGameCFG(header);
/* Rating based parental control method */
if (Settings.parentalcontrol != 4 && !Settings.godmode) if (Settings.parentalcontrol != 4 && !Settings.godmode)
{ {
if (GameConfig && GameConfig->parentalcontrol > Settings.parentalcontrol) if (GameConfig && GameConfig->parentalcontrol > Settings.parentalcontrol)
continue; continue;
}
/* Rating based parental control method */
if (Settings.parentalcontrol != 4 && Settings.godmode == 0)
{
// Check game rating in WiiTDB, since the default Wii parental control setting is enabled // Check game rating in WiiTDB, since the default Wii parental control setting is enabled
int rating = GameTitles.GetParentalRating((char *) header->id); int rating = GameTitles.GetParentalRating((char *) header->id);
if (rating > Settings.parentalcontrol) if (rating > Settings.parentalcontrol)
@ -168,7 +153,6 @@ int GameList::FilterList(const wchar_t * gameFilter)
continue; continue;
wchar_t *gameName = charToWideChar(GameTitles.GetTitle(header)); wchar_t *gameName = charToWideChar(GameTitles.GetTitle(header));
if (gameName && *GameFilter.c_str()) if (gameName && *GameFilter.c_str())
{ {
if (wcsnicmp(gameName, GameFilter.c_str(), GameFilter.size()) != 0) if (wcsnicmp(gameName, GameFilter.c_str(), GameFilter.size()) != 0)
@ -193,7 +177,8 @@ int GameList::FilterList(const wchar_t * gameFilter)
AvailableSearchChars.push_back(L'\0'); AvailableSearchChars.push_back(L'\0');
if (FilteredList.size() < 2) AvailableSearchChars.clear(); if (FilteredList.size() < 2)
AvailableSearchChars.clear();
SortList(); SortList();
@ -218,8 +203,8 @@ int GameList::LoadUnfiltered()
wchar_t *gameName = charToWideChar(GameTitles.GetTitle(header)); wchar_t *gameName = charToWideChar(GameTitles.GetTitle(header));
if (gameName) if (gameName)
{ {
if (wcslen(gameName) > GameFilter.size() && AvailableSearchChars.find(gameName[GameFilter.size()]) if (wcslen(gameName) > GameFilter.size() && AvailableSearchChars.find(gameName[GameFilter.size()]) == std::string::npos)
== std::string::npos) AvailableSearchChars.push_back(gameName[GameFilter.size()]); AvailableSearchChars.push_back(gameName[GameFilter.size()]);
delete[] gameName; delete[] gameName;
} }
@ -230,7 +215,8 @@ int GameList::LoadUnfiltered()
AvailableSearchChars.push_back(L'\0'); AvailableSearchChars.push_back(L'\0');
if (FilteredList.size() < 2) AvailableSearchChars.clear(); if (FilteredList.size() < 2)
AvailableSearchChars.clear();
SortList(); SortList();
@ -254,8 +240,8 @@ void GameList::SortList()
std::sort(FilteredList.begin(), FilteredList.end(), NameSortCallback); std::sort(FilteredList.begin(), FilteredList.end(), NameSortCallback);
} }
if (AvailableSearchChars.size() > 1) std::sort(AvailableSearchChars.begin(), AvailableSearchChars.end(), if (AvailableSearchChars.size() > 1)
WCharSortCallback); std::sort(AvailableSearchChars.begin(), AvailableSearchChars.end(), WCharSortCallback);
} }

View File

@ -8,19 +8,29 @@
class GameList class GameList
{ {
public: public:
GameList(); GameList() : selectedGame(0) { };
int ReadGameList(); int ReadGameList();
int size() { return FilteredList.size(); }; int size() const { return FilteredList.size(); }
int GameCount() { return FullGameList.size(); }; int GameCount() const { return FullGameList.size(); }
int FilterList(const wchar_t * gameFilter = NULL); int FilterList(const wchar_t * gameFilter = NULL);
int LoadUnfiltered(); int LoadUnfiltered();
struct discHdr * at(int i); struct discHdr * at(int i) const { return operator[](i); }
struct discHdr * operator[](int i) { return at(i); }; struct discHdr * operator[](int i) const { if (i < 0 || i >= (int) FilteredList.size()) return NULL; return FilteredList[i]; }
struct discHdr * GetDiscHeader(const char * gameID); struct discHdr * GetDiscHeader(const char * gameID) const;
const wchar_t * GetCurrentFilter() { return GameFilter.c_str(); }; const wchar_t * GetCurrentFilter() const { return GameFilter.c_str(); }
const wchar_t * GetAvailableSearchChars() { return AvailableSearchChars.c_str(); }; const wchar_t * GetAvailableSearchChars() const { return AvailableSearchChars.c_str(); }
void SortList(); void SortList();
void clear(); void clear();
bool operator!() const { return (FullGameList.size() == 0); }
//! Gamelist scrolling operators
int operator+=(int i) { return (selectedGame = (selectedGame+i) % FilteredList.size()); }
int operator-=(int i) { return (selectedGame = (selectedGame-i+FilteredList.size()) % FilteredList.size()); }
int operator++() { return (selectedGame = (++selectedGame) % FilteredList.size()); }
int operator--() { return (selectedGame = ((--selectedGame)+FilteredList.size()) % FilteredList.size()); }
int operator++(int i) { return operator++(); }
int operator--(int i) { return operator--(); }
struct discHdr * GetCurrentSelected() const { return operator[](selectedGame); }
protected: protected:
static bool NameSortCallback(const struct discHdr *a, const struct discHdr *b); static bool NameSortCallback(const struct discHdr *a, const struct discHdr *b);
static bool PlaycountSortCallback(const struct discHdr *a, const struct discHdr *b); static bool PlaycountSortCallback(const struct discHdr *a, const struct discHdr *b);
@ -28,6 +38,7 @@ class GameList
wString AvailableSearchChars; wString AvailableSearchChars;
wString GameFilter; wString GameFilter;
int selectedGame;
std::vector<struct discHdr *> FilteredList; std::vector<struct discHdr *> FilteredList;
std::vector<struct discHdr> FullGameList; std::vector<struct discHdr> FullGameList;
}; };

View File

@ -1,5 +1,6 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <di/di.h>
#include <malloc.h> #include <malloc.h>
#include <ogcsys.h> #include <ogcsys.h>
#include "gecko.h" #include "gecko.h"
@ -34,16 +35,22 @@ static u32 inbuf[8] ATTRIBUTE_ALIGN(32);
static u32 outbuf[8] ATTRIBUTE_ALIGN(32); static u32 outbuf[8] ATTRIBUTE_ALIGN(32);
static const char di_fs[] ATTRIBUTE_ALIGN(32) = "/dev/di"; static const char di_fs[] ATTRIBUTE_ALIGN(32) = "/dev/di";
static s32 di_fd = -1; static s32 _di_fd = -1;
static s32 currentIOS = -1;
s32 WDVD_Init(void) s32 WDVD_Init(void)
{ {
currentIOS = IOS_GetVersion();
if(currentIOS < 200)
return DI_Init();
/* Open "/dev/di" */ /* Open "/dev/di" */
if (di_fd < 0) { if (_di_fd < 0) {
di_fd = IOS_Open(di_fs, 0); _di_fd = IOS_Open(di_fs, 0);
if (di_fd < 0) if (_di_fd < 0)
return di_fd; return _di_fd;
} }
return 0; return 0;
@ -51,10 +58,16 @@ s32 WDVD_Init(void)
s32 WDVD_Close(void) s32 WDVD_Close(void)
{ {
if(currentIOS < 200)
{
DI_Close();
return 0;
}
/* Close "/dev/di" */ /* Close "/dev/di" */
if (di_fd >= 0) { if (_di_fd >= 0) {
IOS_Close(di_fd); IOS_Close(_di_fd);
di_fd = -1; _di_fd = -1;
} }
return 0; return 0;
@ -62,14 +75,20 @@ s32 WDVD_Close(void)
s32 WDVD_GetHandle(void) s32 WDVD_GetHandle(void)
{ {
if(currentIOS < 200)
return -1;
/* Return di handle */ /* Return di handle */
return di_fd; return _di_fd;
} }
s32 WDVD_Reset(void) s32 WDVD_Reset(void)
{ {
if (di_fd < 0) if(currentIOS < 200)
return di_fd; return DI_Reset();
if (_di_fd < 0)
return _di_fd;
s32 ret; s32 ret;
@ -80,7 +99,7 @@ s32 WDVD_Reset(void)
inbuf[1] = 1; inbuf[1] = 1;
ret = IOS_Ioctl(di_fd, IOCTL_DI_RESET, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf)); ret = IOS_Ioctl(_di_fd, IOCTL_DI_RESET, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
if (ret < 0) if (ret < 0)
return ret; return ret;
@ -89,8 +108,11 @@ s32 WDVD_Reset(void)
s32 WDVD_ReadDiskId(void *id) s32 WDVD_ReadDiskId(void *id)
{ {
if (di_fd < 0) if(currentIOS < 200)
return di_fd; return DI_ReadDiscID((u64 *) id);
if (_di_fd < 0)
return _di_fd;
s32 ret; s32 ret;
@ -99,7 +121,7 @@ s32 WDVD_ReadDiskId(void *id)
/* Read disc ID */ /* Read disc ID */
inbuf[0] = IOCTL_DI_READID << 24; inbuf[0] = IOCTL_DI_READID << 24;
ret = IOS_Ioctl(di_fd, IOCTL_DI_READID, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf)); ret = IOS_Ioctl(_di_fd, IOCTL_DI_READID, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
if (ret < 0) if (ret < 0)
return ret; return ret;
@ -113,8 +135,11 @@ s32 WDVD_ReadDiskId(void *id)
s32 WDVD_Seek(u64 offset) s32 WDVD_Seek(u64 offset)
{ {
if (di_fd < 0) if(currentIOS < 200)
return di_fd; return -1;
if (_di_fd < 0)
return _di_fd;
s32 ret; s32 ret;
@ -124,7 +149,7 @@ s32 WDVD_Seek(u64 offset)
inbuf[0] = IOCTL_DI_SEEK << 24; inbuf[0] = IOCTL_DI_SEEK << 24;
inbuf[1] = (u32)(offset >> 2); inbuf[1] = (u32)(offset >> 2);
ret = IOS_Ioctl(di_fd, IOCTL_DI_SEEK, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf)); ret = IOS_Ioctl(_di_fd, IOCTL_DI_SEEK, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
if (ret < 0) if (ret < 0)
return ret; return ret;
@ -134,8 +159,11 @@ s32 WDVD_Seek(u64 offset)
s32 WDVD_Offset(u64 offset) s32 WDVD_Offset(u64 offset)
{ {
if (di_fd < 0) if(currentIOS < 200)
return di_fd; return -1;
if (_di_fd < 0)
return _di_fd;
//u32 *off = (u32 *)((void *)&offset); //u32 *off = (u32 *)((void *)&offset);
union { u64 off64; u32 off32[2]; } off;off.off64 = offset; union { u64 off64; u32 off32[2]; } off;off.off64 = offset;
@ -148,7 +176,7 @@ s32 WDVD_Offset(u64 offset)
inbuf[1] = (off.off32[0]) ? 1: 0; inbuf[1] = (off.off32[0]) ? 1: 0;
inbuf[2] = (off.off32[1] >> 2); inbuf[2] = (off.off32[1] >> 2);
ret = IOS_Ioctl(di_fd, IOCTL_DI_OFFSET, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf)); ret = IOS_Ioctl(_di_fd, IOCTL_DI_OFFSET, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
if (ret < 0) if (ret < 0)
return ret; return ret;
@ -157,8 +185,11 @@ s32 WDVD_Offset(u64 offset)
s32 WDVD_StopLaser(void) s32 WDVD_StopLaser(void)
{ {
if (di_fd < 0) if(currentIOS < 200)
return di_fd; return -1;
if (_di_fd < 0)
return _di_fd;
s32 ret; s32 ret;
@ -167,7 +198,7 @@ s32 WDVD_StopLaser(void)
/* Stop laser */ /* Stop laser */
inbuf[0] = IOCTL_DI_STOPLASER << 24; inbuf[0] = IOCTL_DI_STOPLASER << 24;
ret = IOS_Ioctl(di_fd, IOCTL_DI_STOPLASER, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf)); ret = IOS_Ioctl(_di_fd, IOCTL_DI_STOPLASER, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
if (ret < 0) if (ret < 0)
return ret; return ret;
@ -176,8 +207,11 @@ s32 WDVD_StopLaser(void)
s32 WDVD_StopMotor(void) s32 WDVD_StopMotor(void)
{ {
if (di_fd < 0) if(currentIOS < 200)
return di_fd; return -1;
if (_di_fd < 0)
return _di_fd;
s32 ret; s32 ret;
@ -186,7 +220,7 @@ s32 WDVD_StopMotor(void)
/* Stop motor */ /* Stop motor */
inbuf[0] = IOCTL_DI_STOPMOTOR << 24; inbuf[0] = IOCTL_DI_STOPMOTOR << 24;
ret = IOS_Ioctl(di_fd, IOCTL_DI_STOPMOTOR, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf)); ret = IOS_Ioctl(_di_fd, IOCTL_DI_STOPMOTOR, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
if (ret < 0) if (ret < 0)
return ret; return ret;
@ -195,8 +229,11 @@ s32 WDVD_StopMotor(void)
s32 WDVD_OpenPartition(u64 offset) s32 WDVD_OpenPartition(u64 offset)
{ {
if (di_fd < 0) if(currentIOS < 200)
return di_fd; return DI_OpenPartition(offset >> 2);
if (_di_fd < 0)
return _di_fd;
static u8 Tmd_Buffer[0x4A00] ATTRIBUTE_ALIGN(32); static u8 Tmd_Buffer[0x4A00] ATTRIBUTE_ALIGN(32);
static ioctlv Vectors[5] ATTRIBUTE_ALIGN(32); static ioctlv Vectors[5] ATTRIBUTE_ALIGN(32);
@ -219,7 +256,7 @@ s32 WDVD_OpenPartition(u64 offset)
Vectors[4].data = outbuf; Vectors[4].data = outbuf;
Vectors[4].len = 0x20; Vectors[4].len = 0x20;
ret = IOS_Ioctlv(di_fd, IOCTL_DI_OPENPART, 3, 2, (ioctlv *)Vectors); ret = IOS_Ioctlv(_di_fd, IOCTL_DI_OPENPART, 3, 2, (ioctlv *)Vectors);
if (ret < 0) if (ret < 0)
return ret; return ret;
@ -229,8 +266,11 @@ s32 WDVD_OpenPartition(u64 offset)
s32 WDVD_ClosePartition(void) s32 WDVD_ClosePartition(void)
{ {
if (di_fd < 0) if(currentIOS < 200)
return di_fd; return DI_ClosePartition();
if (_di_fd < 0)
return _di_fd;
s32 ret; s32 ret;
@ -239,7 +279,7 @@ s32 WDVD_ClosePartition(void)
/* Close partition */ /* Close partition */
inbuf[0] = IOCTL_DI_CLOSEPART << 24; inbuf[0] = IOCTL_DI_CLOSEPART << 24;
ret = IOS_Ioctl(di_fd, IOCTL_DI_CLOSEPART, inbuf, sizeof(inbuf), NULL, 0); ret = IOS_Ioctl(_di_fd, IOCTL_DI_CLOSEPART, inbuf, sizeof(inbuf), NULL, 0);
if (ret < 0) if (ret < 0)
return ret; return ret;
@ -248,8 +288,11 @@ s32 WDVD_ClosePartition(void)
s32 WDVD_UnencryptedRead(void *buf, u32 len, u64 offset) s32 WDVD_UnencryptedRead(void *buf, u32 len, u64 offset)
{ {
if (di_fd < 0) if(currentIOS < 200)
return di_fd; return DI_UnencryptedRead(buf, len, offset >> 2);
if (_di_fd < 0)
return _di_fd;
s32 ret; s32 ret;
@ -260,7 +303,7 @@ s32 WDVD_UnencryptedRead(void *buf, u32 len, u64 offset)
inbuf[1] = len; inbuf[1] = len;
inbuf[2] = (u32)(offset >> 2); inbuf[2] = (u32)(offset >> 2);
ret = IOS_Ioctl(di_fd, IOCTL_DI_UNENCREAD, inbuf, sizeof(inbuf), buf, len); ret = IOS_Ioctl(_di_fd, IOCTL_DI_UNENCREAD, inbuf, sizeof(inbuf), buf, len);
if (ret < 0) if (ret < 0)
return ret; return ret;
@ -269,8 +312,11 @@ s32 WDVD_UnencryptedRead(void *buf, u32 len, u64 offset)
s32 WDVD_Read(void *buf, u32 len, u64 offset) s32 WDVD_Read(void *buf, u32 len, u64 offset)
{ {
if (di_fd < 0) if(currentIOS < 200)
return di_fd; return DI_Read(buf, len, offset >> 2);
if (_di_fd < 0)
return _di_fd;
s32 ret; s32 ret;
@ -281,7 +327,7 @@ s32 WDVD_Read(void *buf, u32 len, u64 offset)
inbuf[1] = len; inbuf[1] = len;
inbuf[2] = (u32)(offset >> 2); inbuf[2] = (u32)(offset >> 2);
ret = IOS_Ioctl(di_fd, IOCTL_DI_READ, inbuf, sizeof(inbuf), buf, len); ret = IOS_Ioctl(_di_fd, IOCTL_DI_READ, inbuf, sizeof(inbuf), buf, len);
if (ret < 0) if (ret < 0)
return ret; return ret;
@ -290,8 +336,11 @@ s32 WDVD_Read(void *buf, u32 len, u64 offset)
s32 WDVD_WaitForDisc(void) s32 WDVD_WaitForDisc(void)
{ {
if (di_fd < 0) if(currentIOS < 200)
return di_fd; return -1;
if (_di_fd < 0)
return _di_fd;
s32 ret; s32 ret;
@ -300,7 +349,7 @@ s32 WDVD_WaitForDisc(void)
/* Wait for disc */ /* Wait for disc */
inbuf[0] = IOCTL_DI_WAITCVRCLOSE << 24; inbuf[0] = IOCTL_DI_WAITCVRCLOSE << 24;
ret = IOS_Ioctl(di_fd, IOCTL_DI_WAITCVRCLOSE, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf)); ret = IOS_Ioctl(_di_fd, IOCTL_DI_WAITCVRCLOSE, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
if (ret < 0) if (ret < 0)
return ret; return ret;
@ -309,8 +358,11 @@ s32 WDVD_WaitForDisc(void)
s32 WDVD_GetCoverStatus(u32 *status) s32 WDVD_GetCoverStatus(u32 *status)
{ {
if (di_fd < 0) if(currentIOS < 200)
return di_fd; return DI_GetCoverRegister(status);
if (_di_fd < 0)
return _di_fd;
s32 ret; s32 ret;
@ -319,7 +371,7 @@ s32 WDVD_GetCoverStatus(u32 *status)
/* Get cover status */ /* Get cover status */
inbuf[0] = IOCTL_DI_GETCOVER << 24; inbuf[0] = IOCTL_DI_GETCOVER << 24;
ret = IOS_Ioctl(di_fd, IOCTL_DI_GETCOVER, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf)); ret = IOS_Ioctl(_di_fd, IOCTL_DI_GETCOVER, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
if (ret < 0) if (ret < 0)
return ret; return ret;
@ -335,8 +387,11 @@ s32 WDVD_GetCoverStatus(u32 *status)
s32 WDVD_SetUSBMode(const u8 *id, s32 partition) s32 WDVD_SetUSBMode(const u8 *id, s32 partition)
{ {
if (di_fd < 0) if(currentIOS < 200)
return di_fd; return 0;
if (_di_fd < 0)
return _di_fd;
s32 ret; s32 ret;
@ -354,12 +409,12 @@ s32 WDVD_SetUSBMode(const u8 *id, s32 partition)
} }
} }
ret = IOS_Ioctl(di_fd, IOCTL_DI_SETWBFSMODE, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf)); ret = IOS_Ioctl(_di_fd, IOCTL_DI_SETWBFSMODE, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
if (ret!=1) { if (ret!=1) {
// Try old cIOS 222 // Try old cIOS 222
/* Set USB mode */ /* Set USB mode */
inbuf[0] = DI_SETWBFSMODE << 24; inbuf[0] = DI_SETWBFSMODE << 24;
ret = IOS_Ioctl(di_fd, DI_SETWBFSMODE, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf)); ret = IOS_Ioctl(_di_fd, DI_SETWBFSMODE, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
} }
if (ret < 0) if (ret < 0)
@ -370,8 +425,11 @@ s32 WDVD_SetUSBMode(const u8 *id, s32 partition)
s32 WDVD_Read_Disc_BCA(void *buf) s32 WDVD_Read_Disc_BCA(void *buf)
{ {
if (di_fd < 0) if(currentIOS < 200)
return di_fd; return DI_Read_BCA(buf);
if (_di_fd < 0)
return _di_fd;
s32 ret; s32 ret;
@ -381,7 +439,7 @@ s32 WDVD_Read_Disc_BCA(void *buf)
inbuf[0] = IOCTL_DI_DISC_BCA << 24; inbuf[0] = IOCTL_DI_DISC_BCA << 24;
//inbuf[1] = 64; //inbuf[1] = 64;
ret = IOS_Ioctl(di_fd, IOCTL_DI_DISC_BCA, inbuf, sizeof(inbuf), buf, 64); ret = IOS_Ioctl(_di_fd, IOCTL_DI_DISC_BCA, inbuf, sizeof(inbuf), buf, 64);
if (ret < 0) if (ret < 0)
return ret; return ret;
@ -392,8 +450,11 @@ s32 WDVD_Read_Disc_BCA(void *buf)
s32 WDVD_SetFragList(int device, void *fraglist, int size) s32 WDVD_SetFragList(int device, void *fraglist, int size)
{ {
if (di_fd < 0) if(currentIOS < 200)
return di_fd; return 0;
if (_di_fd < 0)
return _di_fd;
s32 ret; s32 ret;
@ -407,7 +468,7 @@ s32 WDVD_SetFragList(int device, void *fraglist, int size)
inbuf[3] = size; inbuf[3] = size;
DCFlushRange(fraglist, size); DCFlushRange(fraglist, size);
ret = IOS_Ioctl(di_fd, IOCTL_DI_SETFRAG, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf)); ret = IOS_Ioctl(_di_fd, IOCTL_DI_SETFRAG, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
if (ret < 0) if (ret < 0)
return ret; return ret;
@ -417,8 +478,11 @@ s32 WDVD_SetFragList(int device, void *fraglist, int size)
s32 WDVD_Eject(void) s32 WDVD_Eject(void)
{ {
if (di_fd < 0) if(currentIOS < 200)
return di_fd; return DI_Eject();
if (_di_fd < 0)
return _di_fd;
s32 ret; s32 ret;
@ -429,7 +493,7 @@ s32 WDVD_Eject(void)
/* Eject DVD */ /* Eject DVD */
inbuf[1] = 1; inbuf[1] = 1;
ret = IOS_Ioctl(di_fd, IOCTL_DI_STOPMOTOR, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf)); ret = IOS_Ioctl(_di_fd, IOCTL_DI_STOPMOTOR, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
if (ret < 0) if (ret < 0)
return ret; return ret;