From aa936a5c43b7f335b2a4b68baafccd74d0e75123 Mon Sep 17 00:00:00 2001 From: giantpune Date: Thu, 1 Oct 2009 09:17:55 +0000 Subject: [PATCH] fix a little bug add function to create gameList based on installed channels. not used yet. --- source/homebrewboot/HomebrewBrowse.cpp | 2 +- source/menu.cpp | 103 ++++++----- source/prompts/DiscBrowser.cpp | 4 +- source/prompts/PromptWindows.cpp | 20 +-- source/prompts/TitleBrowser.cpp | 225 +++++++++++++++++++++---- source/prompts/TitleBrowser.h | 2 + source/settings/Settings.cpp | 8 +- source/usbloader/alternatedol.c | 4 +- source/usbloader/getentries.cpp | 186 +++++++++++++++++++- source/usbloader/getentries.h | 2 + 10 files changed, 462 insertions(+), 94 deletions(-) diff --git a/source/homebrewboot/HomebrewBrowse.cpp b/source/homebrewboot/HomebrewBrowse.cpp index 5dfbc186..17ccc02d 100644 --- a/source/homebrewboot/HomebrewBrowse.cpp +++ b/source/homebrewboot/HomebrewBrowse.cpp @@ -23,7 +23,7 @@ #include "sys.h" #include "network/http.h" #include -#include "Settings/cfg.h" +#include "settings/cfg.h" #include "unzip/unzip.h" #include "unzip/miniunz.h" diff --git a/source/menu.cpp b/source/menu.cpp index 24e9bed2..1b9c324b 100644 --- a/source/menu.cpp +++ b/source/menu.cpp @@ -64,7 +64,7 @@ float gamesize; int currentMenu; int idiotFlag=-1; char idiotChar[50]; -u8 dvdMounted=0; +u8 mountMethod=0; struct discHdr *dvdheader = NULL; @@ -222,7 +222,7 @@ void rockout(int f = 0) { if ((!(strcasestr(get_title(&gameList[num]),"guitar")|| strcasestr(get_title(&gameList[num]),"band")|| strcasestr(get_title(&gameList[num]),"rock")|| - f==1))||dvdMounted) { + f==1))||mountMethod) { for (int i = 0; i < 4; i++) delete pointer[i]; snprintf(imgPath, sizeof(imgPath), "%splayer1_point.png", CFG.theme_path); @@ -336,6 +336,13 @@ int MenuDiscList() { char dvdID[8]; if (!dvdheader) dvdheader = new struct discHdr; + u8 mountMethodOLD =0; + + + + ///WII_Initialize(); + ///WII_LaunchTitle(TITLE_ID(0x00010001,0xJODI)); + @@ -362,6 +369,7 @@ int MenuDiscList() { char theTime[80]=""; time_t lastrawtime=0; + if (mountMethod!=3) WBFS_DiskSpace(&used, &freespace); if (!gameCnt) { //if there is no list of games to display @@ -454,13 +462,13 @@ int MenuDiscList() { char spaceinfo[30]; - sprintf(spaceinfo,"%.2fGB %s %.2fGB %s",freespace,tr("of"),(freespace+used),tr("free")); + sprintf(spaceinfo,(mountMethod!=3?"%.2fGB %s %.2fGB %s":" "),freespace,tr("of"),(freespace+used),tr("free")); GuiText usedSpaceTxt(spaceinfo, 18, THEME.info); usedSpaceTxt.SetAlignment(THEME.hddinfo_align, ALIGN_TOP); usedSpaceTxt.SetPosition(THEME.hddinfo_x, THEME.hddinfo_y); char GamesCnt[15]; - sprintf(GamesCnt,"%s: %i",tr("Games"), gameCnt); + sprintf(GamesCnt,"%s: %i",(mountMethod!=3?tr("Games"):tr("Channels")), gameCnt); GuiText gamecntTxt(GamesCnt, 18, THEME.info); GuiButton gamecntBtn(100,18); @@ -729,15 +737,16 @@ int MenuDiscList() { - if (Settings.godmode == 1) {//only make the button have trigger & tooltip if in godmode + if (Settings.godmode == 1 && mountMethod!=3) {//only make the button have trigger & tooltip if in godmode DownloadBtn.SetSoundOver(&btnSoundOver); DownloadBtn.SetTrigger(&trigA); DownloadBtn.SetTrigger(&trig1); DownloadBtn.SetToolTip(&DownloadBtnTT,205,-30); idBtn.SetSoundOver(&btnSoundOver); - idBtn.SetTrigger(&trigA); - idBtn.SetToolTip(&IDBtnTT,205,-30); + idBtn.SetTrigger(&trigA); + idBtn.SetToolTip(&IDBtnTT,205,-30); + } else { DownloadBtn.SetRumble(false); @@ -810,6 +819,8 @@ int MenuDiscList() { w.SetUpdateCallback(DiscListWinUpdateCallback); // End Toolbar + + if (Settings.godmode == 1) w.Append(&homebrewBtn); @@ -835,8 +846,9 @@ int MenuDiscList() { if(searchBar) mainWindow->Append(searchBar); } - - ResumeGui(); + + ResumeGui(); + while (menu == MENU_NONE) { @@ -936,7 +948,7 @@ int MenuDiscList() { } } - } else if (gamecntBtn.GetState() == STATE_CLICKED) { + } else if (gamecntBtn.GetState() == STATE_CLICKED && mountMethod!=3) { char linebuf[150]; snprintf(linebuf, sizeof(linebuf), "%s %sGameList ?",tr("Save Game List to"), Settings.update_path); @@ -945,16 +957,7 @@ int MenuDiscList() { if (choice==1) { - if (save_gamelist(0)) - WindowPrompt(0,tr("Saved"), tr("OK")); - else - WindowPrompt(tr("Error"),tr("Could not save."), tr("OK")); - menu = MENU_DISCLIST; - break; - } - else if (choice==2) - { - if (save_gamelist(1)) + if (save_gamelist(choice-1)) WindowPrompt(0,tr("Saved"), tr("OK")); else WindowPrompt(tr("Error"),tr("Could not save."), tr("OK")); @@ -962,6 +965,7 @@ int MenuDiscList() { break; } + gamecntBtn.ResetState(); } else if (homeBtn.GetState() == STATE_CLICKED) { @@ -1112,7 +1116,7 @@ int MenuDiscList() { } - else if (searchBtn.GetState() == STATE_CLICKED) { + else if (searchBtn.GetState() == STATE_CLICKED && mountMethod!=3) { show_searchwindow=!show_searchwindow; HaltGui(); @@ -1270,7 +1274,7 @@ int MenuDiscList() { } else if (homebrewBtn.GetState() == STATE_CLICKED) { menu = MENU_HOMEBREWBROWSE; break; - } else if (gameInfo.GetState() == STATE_CLICKED) { + } else if (gameInfo.GetState() == STATE_CLICKED && mountMethod!=3) { gameInfo.ResetState(); gameSelected = selectImg1; rockout(); @@ -1286,7 +1290,9 @@ int MenuDiscList() { } } else if (dvdBtn.GetState() == STATE_CLICKED) { - dvdMounted=DiscMount(dvdID); + mountMethodOLD = (mountMethod==0||mountMethod==3?mountMethod:0); + + mountMethod=DiscMount(dvdID); dvdheader->id[0]=dvdID[0]; dvdheader->id[1]=dvdID[1]; dvdheader->id[2]=dvdID[2]; @@ -1344,7 +1350,7 @@ int MenuDiscList() { delete GameRegionTxt; GameRegionTxt = NULL; } - + switch (header->id[3]) { case 'E': sprintf(gameregion,"NTSC U"); @@ -1398,8 +1404,8 @@ int MenuDiscList() { idBtn.SetLabel(GameIDTxt); w.Append(&idBtn); } - - if ((Settings.sinfo == GameRegion) || (Settings.sinfo == Both)) { + //don't try to show region for channels because all the custom channels wont follow the rules + if (((Settings.sinfo == GameRegion) || (Settings.sinfo == Both))&&mountMethod!=3) { GameRegionTxt = new GuiText(gameregion, 22, THEME.info); GameRegionTxt->SetAlignment(ALIGN_LEFT, ALIGN_TOP); GameRegionTxt->SetPosition(THEME.region_x, THEME.region_y); @@ -1409,7 +1415,7 @@ int MenuDiscList() { } } - if (idBtn.GetState() == STATE_CLICKED) { + if (idBtn.GetState() == STATE_CLICKED && mountMethod!=3) { struct discHdr * header = &gameList[gameBrowser->GetSelectedOption()]; //enter new game ID char entered[10]; @@ -1426,7 +1432,7 @@ int MenuDiscList() { } } - if (((gameSelected >= 0) && (gameSelected < (s32)gameCnt)) || dvdMounted) { + if (((gameSelected >= 0) && (gameSelected < (s32)gameCnt)) || mountMethod==1 || mountMethod==2) { if(searchBar) { HaltGui(); @@ -1434,9 +1440,9 @@ int MenuDiscList() { ResumeGui(); } rockout(); - struct discHdr *header = (dvdMounted?dvdheader:&gameList[gameSelected]); + struct discHdr *header = (mountMethod==1||mountMethod==2?dvdheader:&gameList[gameSelected]); // struct discHdr *header = dvdheader:&gameList[gameSelected]); - if (!dvdMounted)//only get this stuff it we are booting a game from USB + if (!mountMethod)//only get this stuff it we are booting a game from USB { WBFS_GameSize(header->id, &size); if (strlen(get_title(header)) < (MAX_CHARACTERS + 3)) { @@ -1451,7 +1457,7 @@ int MenuDiscList() { //check if alt Dol and gct file is present FILE *exeFile = NULL; char nipple[100]; - header = (dvdMounted?dvdheader:&gameList[gameSelected]); //reset header + header = (mountMethod==1||mountMethod==2?dvdheader:&gameList[gameSelected]); //reset header snprintf (IDfull,sizeof(IDfull),"%c%c%c%c%c%c", header->id[0], header->id[1], header->id[2],header->id[3], header->id[4], header->id[5]); struct Game_CFG* game_cfg = CFG_get_game_opt(header->id); @@ -1523,7 +1529,7 @@ int MenuDiscList() { while (returnHere) { returnHere = false; if (Settings.wiilight != 2) wiilight(1); - choice = GameWindowPrompt(); + choice = GameWindowPrompt(); // header = &gameList[gameSelected]; //reset header if (choice == 1) { @@ -1574,7 +1580,7 @@ int MenuDiscList() { ResumeGui(); //re-evaluate header now in case they changed games while on the game prompt - header = (dvdMounted?dvdheader:&gameList[gameSelected]); + header = (mountMethod==1||mountMethod==2?dvdheader:&gameList[gameSelected]); int settret = GameSettings(header); /* unneeded for now, kept in case database gets a separate language setting //menu = MENU_DISCLIST; // refresh titles (needed if the language setting has changed) @@ -1593,7 +1599,7 @@ int MenuDiscList() { rockout(2); } - else if (choice == 3 && !dvdMounted) { //WBFS renaming + else if (choice == 3 && !mountMethod) { //WBFS renaming wiilight(0); //re-evaluate header now in case they changed games while on the game prompt header = &gameList[gameSelected]; @@ -1610,7 +1616,7 @@ int MenuDiscList() { } } else if (choice == 0) { rockout(2); - dvdMounted =0; + if (mountMethod==1||mountMethod==2)mountMethod = mountMethodOLD; if (Settings.gameDisplay==list) { gameBrowser->SetFocus(1); } else if (Settings.gameDisplay==grid) { @@ -1648,7 +1654,7 @@ int MenuDiscList() { // set alt dol default if (menu == MENU_EXIT && altdoldefault) { - struct discHdr *header = (dvdMounted?dvdheader:&gameList[gameSelected]); + struct discHdr *header = (mountMethod==1||mountMethod==2?dvdheader:&gameList[gameSelected]); struct Game_CFG* game_cfg = CFG_get_game_opt(header->id); // use default only if no alt dol was selected manually if (game_cfg) { @@ -1688,8 +1694,6 @@ int MenuDiscList() { gameGrid = NULL; delete gameCarousel; gameCarousel = NULL; - //delete dvdheader; - //dvdheader = NULL; ResumeGui(); return menu; } @@ -2163,12 +2167,14 @@ int MainMenu(int menu) { } //MemInfoPrompt(); - if (dvdMounted) + //for testing + /*if (mountMethod) { char tmp[30]; - sprintf(tmp,"boot method --> %i",dvdMounted); + sprintf(tmp,"boot method --> %i",mountMethod); WindowPrompt(0,tmp,0,0,0,0,100); } + */ CloseXMLDatabase(); ExitGUIThreads(); bgMusic->Stop(); @@ -2186,7 +2192,17 @@ int MainMenu(int menu) { delete fontSystem; ShutdownAudio(); StopGX(); - if (dvdMounted==2) + if (mountMethod==3) + { + struct discHdr *header = &gameList[gameSelected]; + char tmp[20]; + u32 tid; + sprintf(tmp,"%c%c%c%c",header->id[0],header->id[1],header->id[2],header->id[3]); + memcpy(&tid, tmp, 4); + WII_Initialize(); + WII_LaunchTitle(TITLE_ID((header->id[5]=='1'?0x00010001:0x00010002),tid)); + } + if (mountMethod==2) { WII_Initialize(); WII_LaunchTitle(0x0000000100000100ULL); @@ -2199,7 +2215,7 @@ int MainMenu(int menu) { } else { int ret = 0; - struct discHdr *header = (dvdMounted?dvdheader:&gameList[gameSelected]); + struct discHdr *header = (mountMethod?dvdheader:&gameList[gameSelected]); struct Game_CFG* game_cfg = CFG_get_game_opt(header->id); @@ -2234,6 +2250,7 @@ int MainMenu(int menu) { } reloadblock = off; } + int ios2; switch (iosChoice) { case i249: @@ -2260,7 +2277,7 @@ int MainMenu(int menu) { Sys_IosReload(249); } } - if (!dvdMounted) + if (!mountMethod) { ret = Disc_SetUSB(header->id); if (ret < 0) Sys_BackToLoader(); diff --git a/source/prompts/DiscBrowser.cpp b/source/prompts/DiscBrowser.cpp index 1158e62f..89c3ce50 100644 --- a/source/prompts/DiscBrowser.cpp +++ b/source/prompts/DiscBrowser.cpp @@ -30,7 +30,7 @@ extern void HaltGui(); extern GuiWindow * mainWindow; extern u8 shutdown; extern u8 reset; -extern u8 dvdMounted; +extern u8 mountMethod; /******************************************************************************** *Disk Browser @@ -41,7 +41,7 @@ int DiscBrowse(struct discHdr * header) { u64 offset; HaltGui(); - if (!dvdMounted) + if (!mountMethod) { ret = Disc_SetUSB(header->id); if (ret < 0) { diff --git a/source/prompts/PromptWindows.cpp b/source/prompts/PromptWindows.cpp index 21ec62be..63463455 100644 --- a/source/prompts/PromptWindows.cpp +++ b/source/prompts/PromptWindows.cpp @@ -51,7 +51,7 @@ extern float gamesize; extern struct discHdr * gameList; extern u8 shutdown; extern u8 reset; -extern u8 dvdMounted; +extern u8 mountMethod; extern struct discHdr *dvdheader; /*** Extern functions ***/ @@ -1034,7 +1034,7 @@ int GameWindowPrompt() { GuiImage dialogBoxImg(&dialogBox); GuiTooltip nameBtnTT(tr("Rename Game on WBFS")); - if (Settings.wsprompt == yes && !dvdMounted) + if (Settings.wsprompt == yes) nameBtnTT.SetWidescreen(CFG.widescreen); GuiText nameTxt("", 22, THEME.prompttext); if (Settings.wsprompt == yes) @@ -1047,9 +1047,9 @@ int GameWindowPrompt() { nameBtn.SetPosition(0,-122); nameBtn.SetSoundOver(&btnSoundOver); nameBtn.SetSoundClick(&btnClick); - nameBtn.SetToolTip(&nameBtnTT,24,-30, ALIGN_LEFT); + if (!mountMethod) nameBtn.SetToolTip(&nameBtnTT,24,-30, ALIGN_LEFT); - if (Settings.godmode == 1 && !dvdMounted) { + if (Settings.godmode == 1 && !mountMethod) { nameBtn.SetTrigger(&trigA); nameBtn.SetEffectGrow(); } @@ -1091,7 +1091,7 @@ int GameWindowPrompt() { btn2Img.SetWidescreen(CFG.widescreen); } GuiButton btn2(&btn2Img,&btn2Img, 1, 5, 0, 0, &trigA, &btnSoundOver, &btnClick,1); - if (Settings.godmode == 1 && dvdMounted!=2) { + if (Settings.godmode == 1 && mountMethod!=2 && mountMethod!=3) { btn2.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); btn2.SetPosition(-50, -40); } else { @@ -1143,7 +1143,7 @@ int GameWindowPrompt() { promptWindow.Append(&nameBtn); promptWindow.Append(&playcntTxt); promptWindow.Append(&btn2); - if (!dvdMounted)//stuff we don't show if it is a DVD mounted + if (!mountMethod)//stuff we don't show if it is a DVD mounted { promptWindow.Append(&sizeTxt); promptWindow.Append(&btnLeft); @@ -1152,7 +1152,7 @@ int GameWindowPrompt() { } //check if unlocked - if (Settings.godmode == 1 && dvdMounted!=2) { + if (Settings.godmode == 1 && mountMethod!=2 && mountMethod!=3) { promptWindow.Append(&btn3); } @@ -1180,7 +1180,7 @@ int GameWindowPrompt() { } //load disc image based or what game is seleted - struct discHdr * header = (dvdMounted?dvdheader:&gameList[gameSelected]); + struct discHdr * header = (mountMethod==1||mountMethod==2?dvdheader:&gameList[gameSelected]); snprintf (ID,sizeof(ID),"%c%c%c", header->id[0], header->id[1], header->id[2]); snprintf (IDFull,sizeof(IDFull),"%c%c%c%c%c%c", header->id[0], header->id[1], header->id[2],header->id[3], header->id[4], header->id[5]); @@ -1260,13 +1260,13 @@ int GameWindowPrompt() { } else diskImg.SetImage(diskCover); - if (!dvdMounted) + if (!mountMethod) { WBFS_GameSize(header->id, &size); sizeTxt.SetTextf("%.2fGB", size); //set size text; } - nameTxt.SetText(!dvdMounted?get_title(header):IDFull); + nameTxt.SetText(mountMethod!=1&&mountMethod!=2?get_title(header):IDFull); struct Game_NUM* game_num = CFG_get_game_num(header->id); if (game_num) { diff --git a/source/prompts/TitleBrowser.cpp b/source/prompts/TitleBrowser.cpp index 04773bfd..df04b010 100644 --- a/source/prompts/TitleBrowser.cpp +++ b/source/prompts/TitleBrowser.cpp @@ -24,7 +24,16 @@ #include "wad/wad.h" #include "xml/xml.h" #include "../wad/title.h" -#include "unzip/inflate.h" +#include "../usbloader/getentries.h" + +#define typei 0x00010001 + +struct discHdr * titleList=NULL; +//discHdr ** titleList; +u32 titleCnt; + +extern struct discHdr * gameList; +extern u32 gameCnt; /*** Extern functions ***/ extern void ResumeGui(); @@ -35,8 +44,188 @@ extern GuiWindow * mainWindow; extern u8 shutdown; extern u8 reset; extern u32 infilesize; -extern u32 uncfilesize; -extern char wiiloadVersion[2]; +extern wchar_t *gameFilter; + +inline int wcsnicmp(const wchar_t *s1, const wchar_t *s2, int len) +{ + if (len <= 0) + return (0); + do + { + int r = towupper(*s1) - towupper(*s2++); + if (r) return r; + if (*s1++ == 0) + break; + } while (--len != 0); + + return (0); +} + + +/******************************************************************************** +* put istalled titles into a struct so it can be handled by all the other +* shitloads of functions we have easily +* +*********************************************************************************/ +int buildTitleList1(int t, wchar_t* gameFilter, discHdr ** PgameList, u32 *PgameCnt){ + + struct discHdr *buffer = NULL; + u32 i = 0; + u32 cnt, cnt2=0, len; + u32 num_titles; + u32 titles[100] ATTRIBUTE_ALIGN(32); + u32 num_sys_titles; + u32 sys_titles[10] ATTRIBUTE_ALIGN(32); + s32 ret = -1; + FILE *f; + char path[100]; + + ISFS_Initialize(); + + sprintf(path,"%s/config/database.txt",bootDevice); + f = fopen(path, "r"); + + ret = getTitles_TypeCount(typei, &num_titles); + if (ret < 0) { + return -1; + } + + ret = getTitles_Type(typei, titles, num_titles); + if (ret < 0) { + return -2; + } + + ret = getTitles_TypeCount(0x00010002, &num_sys_titles); + if (ret < 0) { + return -3; + } + + ret = getTitles_Type(0x00010002, sys_titles, num_sys_titles); + if (ret < 0) { + return -4; + } + + cnt = (num_titles+num_sys_titles); + len = sizeof(struct discHdr) * cnt; + buffer = (struct discHdr *)memalign(32, len); + if (!buffer) + return -1; + + memset(buffer, 0, len); + + char name[64]; + while (i < (num_titles+num_sys_titles)) { + //start from the beginning of the file each loop + if (f)rewind(f); + char text[15]; + strcpy(name,"");//make sure name is empty + u8 found=0; + + sprintf(text, "%s", titleText(ititle,sizeof(header->title),"%s",tmp); + //break; + } + } + } + if (!found) { + if (getName00(header->title, TITLE_ID(i=0) + found=2; + + if (!found) { + if (getNameBN(header->title, TITLE_ID(i=0) + found=3; + + if (!found) + snprintf(header->title,sizeof(header->title),"%s (%08x)",text,iid[0]=text[0]; + header->id[1]=text[1]; + header->id[2]=text[2]; + header->id[3]=text[3]; + header->id[4]='G'; + header->id[5]='P'; + +//not using these filters right now, but i left them in just in case + // Filters + /*if (Settings.fave) { + struct Game_NUM* game_num = CFG_get_game_num(header->id); + if (!game_num || game_num->favorite==0) + continue; + } + + if (Settings.parentalcontrol && !Settings.godmode ) { + if (get_block(header) >= Settings.parentalcontrol) + continue; + }*/ + + if(gameFilter && *gameFilter) { + u32 filter_len = wcslen(gameFilter); + wchar_t *gameName = FreeTypeGX::charToWideChar(get_title(header)); + if (!gameName || wcsnicmp(gameName, gameFilter, filter_len)) { + delete [] gameName; + continue; + } + } + if(i != cnt2) + buffer[cnt2] = buffer[i]; + cnt2++; + } + i++; + } + + fclose(f); + + Uninstall_FromTitle(TITLE_ID(1, 0)); + ISFS_Deinitialize(); + + if(cnt > cnt2) + { + cnt = cnt2; + buffer = (struct discHdr *)realloc(buffer, sizeof(struct discHdr) * cnt); + } + if (!buffer) + return -1; + + if (Settings.sort==pcount) { + qsort(buffer, cnt, sizeof(struct discHdr), __Menu_EntryCmpCount); + } else { + qsort(buffer, cnt, sizeof(struct discHdr), __Menu_EntryCmp); + } + /*PgameList = buffer; + buffer = NULL; + PgameCnt = cnt;*/ + + if(PgameList) *PgameList = buffer; else free(buffer); + if(PgameCnt) *PgameCnt = cnt; + + return 0; + + return cnt; +} /******************************************************************************** * TitleBrowser- opens a browser with a list of installed Titles @@ -419,12 +608,7 @@ int TitleBrowser(u32 type) { int choice = WindowPrompt(filesizetxt, temp, tr("OK"), tr("Cancel")); if(choice == 1) { - bool compressed = (wiiloadVersion[0] > 1 || wiiloadVersion[1] > 4) && uncfilesize != 0; - - char currentPath[100]; - sprintf(currentPath, compressed ? "%s.z" : "%s", filepath); - - FILE *file = fopen(currentPath, "wb"); + FILE *file = fopen(filepath, "wb"); int len = NETWORKBLOCKSIZE; u8 *buffer = (u8*) malloc(NETWORKBLOCKSIZE); @@ -456,24 +640,6 @@ int TitleBrowser(u32 type) { } free(buffer); fclose(file); - - if (compressed) { - FILE *cfile = fopen(currentPath, "rb"); - FILE *ufile = fopen(filepath, "wb"); - - int r; - if (( r = inflateFile(cfile, ufile)) != Z_OK) { - char buf[100]; - sprintf((char *) &buf, "Inflate failed: %d", r); - WindowPrompt(tr("Compressed:"), (char *) &buf, tr("OK")); - } - - fclose(cfile); - fclose(ufile); - - remove(currentPath); - } - ProgressStop(); if (read != infilesize) { @@ -481,10 +647,6 @@ int TitleBrowser(u32 type) { remove(filepath); } else { - if (compressed) { - infilesize = uncfilesize; - } - //determine what type of file we just got char filename[101]; char tmptxt[200]; @@ -569,3 +731,4 @@ int TitleBrowser(u32 type) { } + diff --git a/source/prompts/TitleBrowser.h b/source/prompts/TitleBrowser.h index d4fdc412..b99774af 100644 --- a/source/prompts/TitleBrowser.h +++ b/source/prompts/TitleBrowser.h @@ -12,4 +12,6 @@ //! type is the type of chnnel to put in the list int TitleBrowser(u32 type); +//int buildTitleList(int t=0, const wchar_t* Filter=NULL); + #endif diff --git a/source/settings/Settings.cpp b/source/settings/Settings.cpp index 565eef1f..eb3644d4 100644 --- a/source/settings/Settings.cpp +++ b/source/settings/Settings.cpp @@ -35,7 +35,7 @@ extern GuiImageData * pointer[4]; extern GuiImageData * background; extern u8 shutdown; extern u8 reset; -extern u8 dvdMounted; +extern u8 mountMethod; extern struct discHdr *dvdheader; /**************************************************************************** @@ -1788,7 +1788,7 @@ int GameSettings(struct discHdr * header) { trigB.SetButtonOnlyTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B); char gameName[31]; - if (!dvdMounted) + if (!mountMethod) { if (strlen(get_title(header)) < (27 + 3)) { sprintf(gameName, "%s", get_title(header)); @@ -1800,7 +1800,7 @@ int GameSettings(struct discHdr * header) { } else sprintf(gameName, "%c%c%c%c%c%c", header->id[0], header->id[1], header->id[2],header->id[3], header->id[4], header->id[5]); - GuiText titleTxt(!dvdMounted?get_title(header):gameName, 28, (GXColor) {0, 0, 0, 255}); + GuiText titleTxt(!mountMethod?get_title(header):gameName, 28, (GXColor) {0, 0, 0, 255}); titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); titleTxt.SetPosition(12,40); titleTxt.SetMaxWidth(356, GuiText::SCROLL); @@ -2367,7 +2367,7 @@ int GameSettings(struct discHdr * header) { switch (ret) { case 0: choice1 = WindowPrompt(tr("Do you really want to delete:"),gameName,tr("Yes"),tr("Cancel")); - if (choice1 == 1 && !dvdMounted) { + if (choice1 == 1 && !mountMethod) { CFG_forget_game_opt(header->id); CFG_forget_game_num(header->id); ret = WBFS_RemoveGame(header->id); diff --git a/source/usbloader/alternatedol.c b/source/usbloader/alternatedol.c index 8f9b0283..28c5027f 100644 --- a/source/usbloader/alternatedol.c +++ b/source/usbloader/alternatedol.c @@ -10,7 +10,7 @@ #include "fstfile.h" #include "../patches/dvd_broadway.h" -extern u8 dvdMounted; +extern u8 mountMethod; /** Alternate dolloader made by WiiPower modified by dimok **/ bool Load_Dol(void **buffer, int* dollen, char * filepath) { @@ -198,7 +198,7 @@ u32 Load_Dol_from_disc(u32 doloffset, u8 videoSelected, u8 patchcountrystring, u return -1; } - if (!dvdMounted)ret = WDVD_Read(dol_header, sizeof(dolheader), (doloffset<<2)); + if (!mountMethod)ret = WDVD_Read(dol_header, sizeof(dolheader), (doloffset<<2)); else{ dvddone = 0; diff --git a/source/usbloader/getentries.cpp b/source/usbloader/getentries.cpp index 302ed527..8a211905 100644 --- a/source/usbloader/getentries.cpp +++ b/source/usbloader/getentries.cpp @@ -5,10 +5,20 @@ #include "main.h" #include #include "getentries.h" + +#include "../prompts/TitleBrowser.h" + +#include "wad/wad.h" +#include "xml/xml.h" +#include "../wad/title.h" #include #include +#include "listfiles.h" +#define typei 0x00010001 + + struct discHdr * gameList=NULL; s32 gameSelected=0, gameStart=0; u32 gameCnt=0; @@ -16,6 +26,8 @@ wchar_t *gameFilter=NULL; wchar_t *gameFilterNextList=NULL; wchar_t *gameFilterPrev=NULL; +extern u8 mountMethod; + /**************************************************************************** * wcsdup based on new wchar_t [...] ***************************************************************************/ @@ -236,6 +248,171 @@ error: return -1; } +int buildTitleList(int t, wchar_t* gameFilter, discHdr ** PgameList, u32 *PgameCnt){ + + struct discHdr *buffer = NULL; + u32 i = 0; + u32 cnt, cnt2=0, len; + u32 num_titles; + u32 titles[100] ATTRIBUTE_ALIGN(32); + u32 num_sys_titles; + u32 sys_titles[10] ATTRIBUTE_ALIGN(32); + s32 ret = -1; + FILE *f; + char path[100]; + + ISFS_Initialize(); + + sprintf(path,"%s/config/database.txt",bootDevice); + f = fopen(path, "r"); + + ret = getTitles_TypeCount(typei, &num_titles); + if (ret < 0) { + return -1; + } + + ret = getTitles_Type(typei, titles, num_titles); + if (ret < 0) { + return -2; + } + + ret = getTitles_TypeCount(0x00010002, &num_sys_titles); + if (ret < 0) { + return -3; + } + + ret = getTitles_Type(0x00010002, sys_titles, num_sys_titles); + if (ret < 0) { + return -4; + } + + cnt = (num_titles+num_sys_titles); + len = sizeof(struct discHdr) * cnt; + buffer = (struct discHdr *)memalign(32, len); + if (!buffer) + return -1; + + memset(buffer, 0, len); + + char name[64]; + while (i < (num_titles+num_sys_titles)) { + //start from the beginning of the file each loop + if (f)rewind(f); + char text[15]; + strcpy(name,"");//make sure name is empty + u8 found=0; + + sprintf(text, "%s", titleText(ititle,sizeof(header->title),"%s",tmp); + //break; + } + } + } + if (!found) { + if (getName00(header->title, TITLE_ID(i=0) + found=2; + + if (!found) { + if (getNameBN(header->title, TITLE_ID(i=0) + found=3; + + if (!found) + snprintf(header->title,sizeof(header->title),"%s (%08x)",text,iid[0]=text[0]; + header->id[1]=text[1]; + header->id[2]=text[2]; + header->id[3]=text[3]; + header->id[4]='1'; + header->id[5]=(i + +//not using these filters right now, but i left them in just in case + // Filters + /*if (Settings.fave) { + struct Game_NUM* game_num = CFG_get_game_num(header->id); + if (!game_num || game_num->favorite==0) + continue; + } + + if (Settings.parentalcontrol && !Settings.godmode ) { + if (get_block(header) >= Settings.parentalcontrol) + continue; + }*/ + + if(gameFilter && *gameFilter) { + u32 filter_len = wcslen(gameFilter); + wchar_t *gameName = FreeTypeGX::charToWideChar(get_title(header)); + if (!gameName || wcsnicmp(gameName, gameFilter, filter_len)) { + delete [] gameName; + continue; + } + } + if(i != cnt2) + buffer[cnt2] = buffer[i]; + cnt2++; + } + i++; + } + + fclose(f); + + Uninstall_FromTitle(TITLE_ID(1, 0)); + ISFS_Deinitialize(); + + if(cnt > cnt2) + { + cnt = cnt2; + buffer = (struct discHdr *)realloc(buffer, sizeof(struct discHdr) * cnt); + } + if (!buffer) + return -1; + + if (Settings.sort==pcount) { + qsort(buffer, cnt, sizeof(struct discHdr), __Menu_EntryCmpCount); + } else { + qsort(buffer, cnt, sizeof(struct discHdr), __Menu_EntryCmp); + } + /*PgameList = buffer; + buffer = NULL; + PgameCnt = cnt;*/ + + if(PgameList) *PgameList = buffer; else free(buffer); + if(PgameCnt) *PgameCnt = cnt; + + return 0; + + return cnt; +} + + + /**************************************************************************** * Get Gamelist ***************************************************************************/ @@ -317,6 +494,12 @@ int __Menu_GetGameList(int t, wchar_t* gameFilter, discHdr ** PgameList, u32 *Pg int __Menu_GetEntries(int t, const wchar_t* Filter) { + /*if (mountMethod==3) + { + return buildTitleList(); + }*/ + + u32 new_gameCnt = 0; struct discHdr *new_gameList = NULL; wchar_t *new_gameFilter = NULL; @@ -327,7 +510,8 @@ int __Menu_GetEntries(int t, const wchar_t* Filter) { if(new_gameFilter == NULL) return -1; for(;;) { - if(__Menu_GetGameList(t, new_gameFilter, &new_gameList, &new_gameCnt) < 0) + if(buildTitleList(t, new_gameFilter, &new_gameList, &new_gameCnt) < 0) + //if(__Menu_GetGameList(t, new_gameFilter, &new_gameList, &new_gameCnt) < 0) return -1; if(new_gameCnt > 0 || new_gameFilter[0] == 0) break; diff --git a/source/usbloader/getentries.h b/source/usbloader/getentries.h index 9ccdb289..0039a671 100644 --- a/source/usbloader/getentries.h +++ b/source/usbloader/getentries.h @@ -27,5 +27,7 @@ extern wchar_t *gameFilterPrev; //! if this Parameter="" then no filter is activ //! int __Menu_GetEntries(int t=0, const wchar_t* Filter=NULL); +s32 __Menu_EntryCmpCount(const void *a, const void *b); +s32 __Menu_EntryCmp(const void *a, const void *b); #endif