diff --git a/Languages/czech.lang b/Languages/czech.lang
index de8b1d35..502358df 100644
--- a/Languages/czech.lang
+++ b/Languages/czech.lang
@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-07-23 19:22+0200\n"
+"POT-Creation-Date: 2009-07-24 23:13-0400\n"
"PO-Revision-Date: 2009-07-18 15:18+0200\n"
"Last-Translator: David Jelinek (djelinek@hotmail.com) \n"
"Language-Team: Last version on http://startgolf.tym.cz/czech.lang \n"
diff --git a/Languages/danish.lang b/Languages/danish.lang
index f011518f..dd52e0c3 100644
--- a/Languages/danish.lang
+++ b/Languages/danish.lang
@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-07-23 19:22+0200\n"
+"POT-Creation-Date: 2009-07-24 23:13-0400\n"
"PO-Revision-Date: 2009-07-18 15:18+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
diff --git a/Languages/dutch.lang b/Languages/dutch.lang
index 1116f37e..0cdb4250 100644
--- a/Languages/dutch.lang
+++ b/Languages/dutch.lang
@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-07-23 19:22+0200\n"
+"POT-Creation-Date: 2009-07-24 23:13-0400\n"
"PO-Revision-Date: 2009-07-18 15:18+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
diff --git a/Languages/english.lang b/Languages/english.lang
index 7a2f33bb..52392574 100644
--- a/Languages/english.lang
+++ b/Languages/english.lang
@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-07-23 19:22+0200\n"
+"POT-Creation-Date: 2009-07-24 23:13-0400\n"
"PO-Revision-Date: 2009-07-18 15:18+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
diff --git a/Languages/finnish.lang b/Languages/finnish.lang
index 04fc2ef9..98da7f9d 100644
--- a/Languages/finnish.lang
+++ b/Languages/finnish.lang
@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-07-23 19:22+0200\n"
+"POT-Creation-Date: 2009-07-24 23:13-0400\n"
"PO-Revision-Date: 2009-07-18 15:18+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
diff --git a/Languages/french.lang b/Languages/french.lang
index 8b63ca75..95446ae4 100644
--- a/Languages/french.lang
+++ b/Languages/french.lang
@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-07-23 19:22+0200\n"
+"POT-Creation-Date: 2009-07-24 23:13-0400\n"
"PO-Revision-Date: 2009-07-18 15:18+0200\n"
"Last-Translator: Kin8\n"
"Language-Team: Badablek, Amour, ikya, OuahOuah, dj_skual & Kin8\n"
diff --git a/Languages/german.lang b/Languages/german.lang
index ed8e7a3c..c1b7a270 100644
--- a/Languages/german.lang
+++ b/Languages/german.lang
@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-07-23 19:22+0200\n"
+"POT-Creation-Date: 2009-07-24 23:13-0400\n"
"PO-Revision-Date: 2009-07-18 15:18+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
diff --git a/Languages/hungarian.lang b/Languages/hungarian.lang
index cd1637f7..ee024472 100644
--- a/Languages/hungarian.lang
+++ b/Languages/hungarian.lang
@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-07-23 19:22+0200\n"
+"POT-Creation-Date: 2009-07-24 23:13-0400\n"
"PO-Revision-Date: 2009-07-18 15:18+0200\n"
"Last-Translator: Tusk\n"
"Language-Team: \n"
diff --git a/Languages/italian.lang b/Languages/italian.lang
index e56d202f..f603c41d 100644
--- a/Languages/italian.lang
+++ b/Languages/italian.lang
@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-07-23 19:22+0200\n"
+"POT-Creation-Date: 2009-07-24 23:13-0400\n"
"PO-Revision-Date: 2009-07-20 20:00+0200\n"
"Last-Translator: Cambo \n"
"Language-Team: FoxeJoe & Cambo\n"
diff --git a/Languages/japanese.lang b/Languages/japanese.lang
index ba672bd5..1ca8518b 100644
--- a/Languages/japanese.lang
+++ b/Languages/japanese.lang
@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-07-23 19:22+0200\n"
+"POT-Creation-Date: 2009-07-24 23:13-0400\n"
"PO-Revision-Date: 2009-07-18 15:18+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
diff --git a/Languages/korean.lang b/Languages/korean.lang
index 3ccb22e6..f170f52a 100644
--- a/Languages/korean.lang
+++ b/Languages/korean.lang
@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-07-23 19:22+0200\n"
+"POT-Creation-Date: 2009-07-24 23:13-0400\n"
"PO-Revision-Date: 2009-07-18 15:18+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
diff --git a/Languages/norwegian.lang b/Languages/norwegian.lang
index 8573e55a..1d5de30d 100644
--- a/Languages/norwegian.lang
+++ b/Languages/norwegian.lang
@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-07-23 19:22+0200\n"
+"POT-Creation-Date: 2009-07-24 23:13-0400\n"
"PO-Revision-Date: 2009-07-18 15:18+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
diff --git a/Languages/polish.lang b/Languages/polish.lang
index 33ba9e90..3aa1af88 100644
--- a/Languages/polish.lang
+++ b/Languages/polish.lang
@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-07-23 19:22+0200\n"
+"POT-Creation-Date: 2009-07-24 23:13-0400\n"
"PO-Revision-Date: 2009-07-18 15:18+0200\n"
"Last-Translator: ziom666 (zadania_prog@vp.pl)\n"
"Language-Team: \n"
diff --git a/Languages/portuguese_br.lang b/Languages/portuguese_br.lang
index f7152b61..fba7f4dd 100644
--- a/Languages/portuguese_br.lang
+++ b/Languages/portuguese_br.lang
@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-07-23 19:22+0200\n"
+"POT-Creation-Date: 2009-07-24 23:13-0400\n"
"PO-Revision-Date: 2009-07-18 15:18+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
diff --git a/Languages/portuguese_pt.lang b/Languages/portuguese_pt.lang
index d3cbc409..34ebcec8 100644
--- a/Languages/portuguese_pt.lang
+++ b/Languages/portuguese_pt.lang
@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-07-23 19:22+0200\n"
+"POT-Creation-Date: 2009-07-24 23:13-0400\n"
"PO-Revision-Date: 2009-07-20 16:40\n"
"Last-Translator: Sky8000\n"
"Language-Team: \n"
diff --git a/Languages/russian.lang b/Languages/russian.lang
index 302cd4a5..13f87eed 100644
--- a/Languages/russian.lang
+++ b/Languages/russian.lang
@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-07-23 19:22+0200\n"
+"POT-Creation-Date: 2009-07-24 23:13-0400\n"
"PO-Revision-Date: 2009-07-18 15:18+0200\n"
"Last-Translator: Kir\n"
"Language-Team: Kir\n"
diff --git a/Languages/schinese.lang b/Languages/schinese.lang
index 32665bc3..cc9a4ef7 100644
--- a/Languages/schinese.lang
+++ b/Languages/schinese.lang
@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-07-23 19:22+0200\n"
+"POT-Creation-Date: 2009-07-24 23:13-0400\n"
"PO-Revision-Date: 2009-07-18 15:18+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
diff --git a/Languages/spanish.lang b/Languages/spanish.lang
index 952a65b5..df71b81d 100644
--- a/Languages/spanish.lang
+++ b/Languages/spanish.lang
@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-07-23 19:22+0200\n"
+"POT-Creation-Date: 2009-07-24 23:13-0400\n"
"PO-Revision-Date: 2009-07-18 15:18+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
diff --git a/Languages/swedish.lang b/Languages/swedish.lang
index 25a293b7..a947ec79 100644
--- a/Languages/swedish.lang
+++ b/Languages/swedish.lang
@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-07-23 19:22+0200\n"
+"POT-Creation-Date: 2009-07-24 23:13-0400\n"
"PO-Revision-Date: 2009-07-21 20:18+0200\n"
"Last-Translator: Katsurou\n"
"Language-Team: \n"
diff --git a/Languages/tchinese.lang b/Languages/tchinese.lang
index 199fefbf..e0f28c24 100644
--- a/Languages/tchinese.lang
+++ b/Languages/tchinese.lang
@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-07-23 19:22+0200\n"
+"POT-Creation-Date: 2009-07-24 23:13-0400\n"
"PO-Revision-Date: 2009-07-18 15:18+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
diff --git a/Languages/turkish.lang b/Languages/turkish.lang
index 286926de..c865e606 100644
--- a/Languages/turkish.lang
+++ b/Languages/turkish.lang
@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-07-23 19:22+0200\n"
+"POT-Creation-Date: 2009-07-24 23:13-0400\n"
"PO-Revision-Date: 2009-07-18 15:18+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
diff --git a/Makefile b/Makefile
index 73a1e3de..9ec65392 100644
--- a/Makefile
+++ b/Makefile
@@ -28,7 +28,7 @@ INCLUDES := source
CFLAGS = -g -O2 -save-temps -Wall $(MACHDEP) $(INCLUDE)
CXXFLAGS = -Xassembler -aln=$@.lst $(CFLAGS)
-LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map,--section-start,.init=0x80c00000
+LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map,--section-start,.init=0x80b00000
#---------------------------------------------------------------------------------
# any extra libraries we wish to link with the project
diff --git a/gui.pnps b/gui.pnps
index 3d1ccac3..a5e72cd6 100644
--- a/gui.pnps
+++ b/gui.pnps
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/source/homebrewboot/HomebrewBrowse.cpp b/source/homebrewboot/HomebrewBrowse.cpp
index edf692d2..d5cbbcf9 100644
--- a/source/homebrewboot/HomebrewBrowse.cpp
+++ b/source/homebrewboot/HomebrewBrowse.cpp
@@ -11,6 +11,7 @@
#include "language/gettext.h"
#include "libwiigui/gui.h"
+#include "prompts/TitleBrowser.h"
#include "prompts/PromptWindows.h"
#include "prompts/ProgressWindow.h"
#include "homebrewboot/HomebrewFiles.h"
@@ -104,6 +105,10 @@ int MenuHomebrewBrowse()
snprintf(imgPath, sizeof(imgPath), "%swifi1.png", CFG.theme_path);
GuiImageData wifiImgData(imgPath, wifi1_png);
+
+ snprintf(imgPath, sizeof(imgPath), "%sbrowser.png", CFG.theme_path);
+ GuiImageData channelImgData(imgPath, browser_png);
+
GuiImage background(&bgData);
@@ -294,6 +299,17 @@ int MenuHomebrewBrowse()
wifiBtn.SetEffectGrow();
wifiBtn.SetAlpha(80);
wifiBtn.SetTrigger(&trigA);
+
+ GuiImage channelBtnImg(&channelImgData);
+ channelBtnImg.SetWidescreen(CFG.widescreen);
+ GuiButton channelBtn(channelBtnImg.GetWidth(), channelBtnImg.GetHeight());
+ channelBtn.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
+ channelBtn.SetPosition(425, 400);
+ channelBtn.SetImage(&channelBtnImg);
+ channelBtn.SetSoundOver(&btnSoundOver);
+ channelBtn.SetSoundClick(&btnClick);
+ channelBtn.SetEffectGrow();
+ channelBtn.SetTrigger(&trigA);
GuiWindow w(screenwidth, screenheight);
@@ -385,6 +401,7 @@ int MenuHomebrewBrowse()
w.Append(&backBtn);
w.Append(&homo);
w.Append(&wifiBtn);
+ w.Append(&channelBtn);
w.Append(&GoRightBtn);
w.Append(&GoLeftBtn);
@@ -835,7 +852,19 @@ int MenuHomebrewBrowse()
CloseConnection();
ResumeNetworkWait();
}
-
+
+ else if(channelBtn.GetState() == STATE_CLICKED) {
+ w.SetState(STATE_DISABLED);
+ //10001 are the channels that are installed as channels, not including shop channel/mii channel etc
+ u32 num = 0x00010001;
+ TitleBrowser(num);
+ //if they didn't boot a channel reset this window
+ w.SetState(STATE_DEFAULT);
+ channelBtn.ResetState();
+
+
+ }
+
if(IsNetworkInit()) {
wifiBtn.SetAlpha(255);
}
diff --git a/source/homebrewboot/HomebrewFiles.cpp b/source/homebrewboot/HomebrewFiles.cpp
index 51465c36..4fea3226 100644
--- a/source/homebrewboot/HomebrewFiles.cpp
+++ b/source/homebrewboot/HomebrewFiles.cpp
@@ -45,8 +45,8 @@ bool HomebrewFiles::LoadPath(const char * folderpath)
temp[i] = filename[strlen(filename)-4+i];
}
- if(strncasecmp(temp, ".dol", 4) == 0 || strncasecmp(temp, ".elf", 4) == 0
- && filecount < MAXHOMEBREWS) {
+ if((strncasecmp(temp, ".dol", 4) == 0 || strncasecmp(temp, ".elf", 4) == 0)
+ && filecount < MAXHOMEBREWS && filename[0]!='.') {
strncpy(FileInfo[filecount].FilePath, folderpath, sizeof(FileInfo[filecount].FilePath));
strncpy(FileInfo[filecount].FileName, filename, sizeof(FileInfo[filecount].FileName));
diff --git a/source/images/addressbar_textbox.png b/source/images/addressbar_textbox.png
index 856be766..77007f5b 100644
Binary files a/source/images/addressbar_textbox.png and b/source/images/addressbar_textbox.png differ
diff --git a/source/images/bg_browser.png b/source/images/bg_browser.png
index f7796934..a2c03f38 100644
Binary files a/source/images/bg_browser.png and b/source/images/bg_browser.png differ
diff --git a/source/images/bg_browser_selection.png b/source/images/bg_browser_selection.png
index 54e7d9d0..2bdc02db 100644
Binary files a/source/images/bg_browser_selection.png and b/source/images/bg_browser_selection.png differ
diff --git a/source/libwiigui/gui_filebrowser.cpp b/source/libwiigui/gui_filebrowser.cpp
index c7986b0e..dadb1a40 100644
--- a/source/libwiigui/gui_filebrowser.cpp
+++ b/source/libwiigui/gui_filebrowser.cpp
@@ -9,7 +9,7 @@
***************************************************************************/
#include "gui.h"
-#include "filebrowser.h"
+#include "prompts/filebrowser.h"
#define FILEBROWSERSIZE 8
/**
@@ -46,7 +46,8 @@ GuiFileBrowser::GuiFileBrowser(int w, int h)
scrollbarImg = new GuiImage(scrollbar);
scrollbarImg->SetParent(this);
scrollbarImg->SetAlignment(ALIGN_RIGHT, ALIGN_TOP);
- scrollbarImg->SetPosition(0, 30);
+ scrollbarImg->SetPosition(0, 2);
+ scrollbarImg->SetSkew(0,0,0,0,0,-30,0,-30);
arrowDown = new GuiImageData(scrollbar_arrowdown_png);
arrowDownImg = new GuiImage(arrowDown);
@@ -59,6 +60,7 @@ GuiFileBrowser::GuiFileBrowser(int w, int h)
arrowUpBtn->SetParent(this);
arrowUpBtn->SetImage(arrowUpImg);
arrowUpBtn->SetAlignment(ALIGN_RIGHT, ALIGN_TOP);
+ arrowUpBtn->SetPosition(12,-12);
arrowUpBtn->SetSelectable(false);
arrowUpBtn->SetClickable(false);
arrowUpBtn->SetHoldable(true);
@@ -70,6 +72,7 @@ GuiFileBrowser::GuiFileBrowser(int w, int h)
arrowDownBtn->SetParent(this);
arrowDownBtn->SetImage(arrowDownImg);
arrowDownBtn->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
+ arrowDownBtn->SetPosition(12,12);
arrowDownBtn->SetSelectable(false);
arrowDownBtn->SetClickable(false);
arrowDownBtn->SetHoldable(true);
@@ -81,8 +84,8 @@ GuiFileBrowser::GuiFileBrowser(int w, int h)
scrollbarBoxBtn->SetParent(this);
scrollbarBoxBtn->SetImage(scrollbarBoxImg);
scrollbarBoxBtn->SetAlignment(ALIGN_RIGHT, ALIGN_TOP);
- scrollbarBoxBtn->SetMinY(0);
- scrollbarBoxBtn->SetMaxY(136);
+ scrollbarBoxBtn->SetMinY(-10);
+ scrollbarBoxBtn->SetMaxY(156);
scrollbarBoxBtn->SetSelectable(false);
scrollbarBoxBtn->SetClickable(false);
scrollbarBoxBtn->SetHoldable(true);
@@ -103,7 +106,7 @@ GuiFileBrowser::GuiFileBrowser(int w, int h)
fileListBg[i] = new GuiImage(bgFileSelectionEntry);
fileListFolder[i] = new GuiImage(fileFolder);
- fileList[i] = new GuiButton(512,30);
+ fileList[i] = new GuiButton(350,30);
fileList[i]->SetParent(this);
fileList[i]->SetLabel(fileListText[i]);
fileList[i]->SetLabelOver(fileListTextOver[i]);
@@ -228,7 +231,7 @@ void GuiFileBrowser::Update(GuiTrigger * t)
browser.numEntries > FILEBROWSERSIZE
)
{
- scrollbarBoxBtn->SetPosition(0,0);
+ scrollbarBoxBtn->SetPosition(20,-10);
positionWiimote = t->wpad.ir.y - 60 - scrollbarBoxBtn->GetTop();
if(positionWiimote < scrollbarBoxBtn->GetMinY())
@@ -236,7 +239,7 @@ void GuiFileBrowser::Update(GuiTrigger * t)
else if(positionWiimote > scrollbarBoxBtn->GetMaxY())
positionWiimote = scrollbarBoxBtn->GetMaxY();
- browser.pageIndex = (positionWiimote * browser.numEntries)/136.0 - selectedItem;
+ browser.pageIndex = (positionWiimote * browser.numEntries)/166.0 - selectedItem;
if(browser.pageIndex <= 0)
{
@@ -248,6 +251,8 @@ void GuiFileBrowser::Update(GuiTrigger * t)
}
listChanged = true;
focus = false;
+
+
}
if(arrowDownBtn->GetState() == STATE_HELD && arrowDownBtn->GetStateChan() == t->chan)
@@ -255,12 +260,14 @@ void GuiFileBrowser::Update(GuiTrigger * t)
t->wpad.btns_h |= WPAD_BUTTON_DOWN;
if(!this->IsFocused())
((GuiWindow *)this->GetParent())->ChangeFocus(this);
+
}
else if(arrowUpBtn->GetState() == STATE_HELD && arrowUpBtn->GetStateChan() == t->chan)
{
t->wpad.btns_h |= WPAD_BUTTON_UP;
if(!this->IsFocused())
((GuiWindow *)this->GetParent())->ChangeFocus(this);
+
}
// pad/joystick navigation
@@ -385,15 +392,15 @@ void GuiFileBrowser::Update(GuiTrigger * t)
}
else
{
- position = 136*(browser.pageIndex + FILEBROWSERSIZE/2.0) / (browser.numEntries*1.0);
+ position = -10+(166*(browser.pageIndex + FILEBROWSERSIZE/2.0) / (browser.numEntries*1.0));
if(browser.pageIndex/(FILEBROWSERSIZE/2.0) < 1)
- position = 0;
+ position = -10;
else if((browser.pageIndex+FILEBROWSERSIZE)/(FILEBROWSERSIZE*1.0) >= (browser.numEntries)/(FILEBROWSERSIZE*1.0))
- position = 136;
+ position = 156;
}
- scrollbarBoxBtn->SetPosition(0,position+36);
+ scrollbarBoxBtn->SetPosition(12,position+26);
listChanged = false;
diff --git a/source/menu.cpp b/source/menu.cpp
index 86afa313..2c20a481 100644
--- a/source/menu.cpp
+++ b/source/menu.cpp
@@ -25,7 +25,9 @@
#include "homebrewboot/HomebrewBrowse.h"
#include "homebrewboot/BootHomebrew.h"
#include "prompts/PromptWindows.h"
+#include "prompts/filebrowser.h"
#include "prompts/ProgressWindow.h"
+#include "prompts/TitleBrowser.h"
#include "prompts/gameinfo.h"
#include "mload/mload.h"
#include "patches/patchcode.h"
@@ -472,7 +474,7 @@ int MenuDiscList()
homebrewBtnImg.SetWidescreen(CFG.widescreen);
GuiButton homebrewBtn(homebrewBtnImg.GetWidth(), homebrewBtnImg.GetHeight());
homebrewBtn.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
- homebrewBtn.SetPosition(425, 400);
+ homebrewBtn.SetPosition(THEME.homebrew_x,THEME.homebrew_y);
homebrewBtn.SetImage(&homebrewBtnImg);
homebrewBtn.SetSoundOver(&btnSoundOver);
homebrewBtn.SetSoundClick(&btnClick);
@@ -618,7 +620,6 @@ int MenuDiscList()
{
w.Append(&gamecntTxt);
}
-
w.Append(&sdcardBtn);
w.Append(&poweroffBtn);
w.Append(&gameInfo);
diff --git a/source/prompts/TitleBrowser.cpp b/source/prompts/TitleBrowser.cpp
new file mode 100644
index 00000000..384841cf
--- /dev/null
+++ b/source/prompts/TitleBrowser.cpp
@@ -0,0 +1,194 @@
+/****************************************************************************
+ * TitleBrowser
+ * USB Loader GX 2009
+ *
+ * TitleBrowser.cpp
+ ***************************************************************************/
+#include "language/gettext.h"
+#include "libwiigui/gui.h"
+#include "libwiigui/gui_customoptionbrowser.h"
+#include "prompts/PromptWindows.h"
+#include "filelist.h"
+#include "settings/cfg.h"
+#include "sys.h"
+#include "menu.h"
+
+#include "../wad/title.h"
+
+/*** Extern functions ***/
+extern void ResumeGui();
+extern void HaltGui();
+
+/*** Extern variables ***/
+extern GuiWindow * mainWindow;
+extern u8 shutdown;
+extern u8 reset;
+
+
+/********************************************************************************
+* TitleBrowser- opens a browser with a list of installed Titles
+* relies on code from any title deleter.
+*********************************************************************************/
+int TitleBrowser(u32 type)
+{
+
+ u32 num_titles;
+ u32 titles[100] ATTRIBUTE_ALIGN(32);
+ s32 ret = -1;
+
+
+ // Get count of titles of our requested type
+ ret = getTitles_TypeCount(type, &num_titles);
+ if (ret < 0){
+ //printf("\tError! Can't get count of titles! (ret = %d)\n", ret);
+ //exit(1);
+ }
+
+ // Die if we can't handle this many
+ if (num_titles > 100){
+ //printf("\tError! Too many titles! (%u)\n", num_titles);
+ //exit(1);
+ }
+
+ // Get titles of our requested type
+ ret = getTitles_Type(type, titles, num_titles);
+ if (ret < 0){
+ //printf("\tError! Can't get list of titles! (ret = %d)\n", ret);
+ //exit(1);
+ }
+
+
+ customOptionList options3(num_titles);
+ //write the titles on the option browser
+ u32 i = 0;
+ while (i < num_titles){
+
+ char name[256];
+ char text[15];
+ //set the title's name, number, ID to text
+ sprintf(text, "%s", titleText(type, titles[i]));
+ getTitle_Name(name, TITLE_ID(type, titles[i]), text);
+
+ //set the text to the option browser
+ options3.SetName(i, "%s",name);
+ options3.SetValue(i, "%s (%08x)",text,titles[i]);
+
+ //move on to the next title
+ i++;
+ }
+
+ bool exit = false;
+
+ GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM, Settings.sfxvolume);
+ GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, SOUND_PCM, Settings.sfxvolume);
+
+ char imgPath[100];
+
+ snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", CFG.theme_path);
+ GuiImageData btnOutline(imgPath, button_dialogue_box_png);
+ snprintf(imgPath, sizeof(imgPath), "%sgamesettings_background.png", CFG.theme_path);
+ GuiImageData settingsbg(imgPath, settings_background_png);
+
+ GuiTrigger trigA;
+ trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
+ GuiTrigger trigHome;
+ trigHome.SetButtonOnlyTrigger(-1, WPAD_BUTTON_HOME | WPAD_CLASSIC_BUTTON_HOME, 0);
+ GuiTrigger trigB;
+ trigB.SetButtonOnlyTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B);
+
+ GuiText titleTxt("Title Launcher", 28, (GXColor){0, 0, 0, 255});
+ titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
+ titleTxt.SetPosition(12,40);
+ titleTxt.SetMaxWidth(356, GuiText::SCROLL);
+
+ GuiImage settingsbackground(&settingsbg);
+ GuiButton settingsbackgroundbtn(settingsbackground.GetWidth(), settingsbackground.GetHeight());
+ settingsbackgroundbtn.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
+ settingsbackgroundbtn.SetPosition(0, 0);
+ settingsbackgroundbtn.SetImage(&settingsbackground);
+
+ GuiText cancelBtnTxt(tr("Back"), 22, (GXColor){THEME.prompttxt_r, THEME.prompttxt_g, THEME.prompttxt_b, 255});
+ cancelBtnTxt.SetMaxWidth(btnOutline.GetWidth()-30);
+ GuiImage cancelBtnImg(&btnOutline);
+ if (Settings.wsprompt == yes){
+ cancelBtnTxt.SetWidescreen(CFG.widescreen);
+ cancelBtnImg.SetWidescreen(CFG.widescreen);
+ }
+ GuiButton cancelBtn(&cancelBtnImg,&cancelBtnImg, 2, 3, 180, 400, &trigA, &btnSoundOver, &btnClick,1);
+ cancelBtn.SetScale(0.9);
+ cancelBtn.SetLabel(&cancelBtnTxt);
+ cancelBtn.SetTrigger(&trigB);
+
+ u8 scrollbaron = 0;
+ if(num_titles > 9)
+ scrollbaron = 1;
+
+ GuiCustomOptionBrowser optionBrowser3(396, 280, &options3, CFG.theme_path, "bg_options_gamesettings.png", bg_options_settings_png, num_titles>9?1:0, 200);
+ optionBrowser3.SetPosition(0, 90);
+ optionBrowser3.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
+
+ HaltGui();
+ GuiWindow w(screenwidth, screenheight);
+ w.Append(&settingsbackgroundbtn);
+ w.Append(&titleTxt);
+ w.Append(&cancelBtn);
+ w.Append(&optionBrowser3);
+
+ mainWindow->Append(&w);
+
+ ResumeGui();
+
+ while(!exit)
+ {
+ VIDEO_WaitVSync();
+
+ if(shutdown == 1)
+ Sys_Shutdown();
+ if(reset == 1)
+ Sys_Reboot();
+
+ ret = optionBrowser3.GetClickedOption();
+
+ if(ret > -1) {//if a click happened
+ char name[256];
+ char text[15];
+
+ sprintf(text, "%s", titleText(type, titles[ret]));
+ getTitle_Name(name, TITLE_ID(type, titles[ret]), text);
+
+ char temp[100];
+ //prompt to boot selected title
+ snprintf(temp, sizeof(temp), "%s : %s",text,name);
+ int choice = WindowPrompt("Boot?", temp, tr("OK"), tr("Cancel"));
+ if(choice) {//if they say yes
+
+ WII_Initialize();
+ WII_LaunchTitle(TITLE_ID(type,titles[ret]));
+ //this really shouldn't be needed because the title will be booted
+ exit = true;
+ break;
+ }
+ else{
+ //if they said no to booting the title
+ ret = -1;
+ optionBrowser3.ResetState();
+ }
+ }
+
+ if (cancelBtn.GetState() == STATE_CLICKED)
+ {
+ //break the loop and end the function
+ exit = true;
+ ret = -10;
+ }
+ }
+
+ HaltGui();
+ mainWindow->Remove(&w);
+ ResumeGui();
+
+ return ret;
+}
+
+
+
diff --git a/source/prompts/TitleBrowser.h b/source/prompts/TitleBrowser.h
new file mode 100644
index 00000000..b6f12793
--- /dev/null
+++ b/source/prompts/TitleBrowser.h
@@ -0,0 +1,15 @@
+/****************************************************************************
+ * TitleBrowser
+ * USB Loader GX 2009
+ *
+ * TitleBrowser.h
+ ***************************************************************************/
+
+#ifndef _TITLEBROWSER_H_
+#define _TITLEBROWSER_H_
+
+///opens a window with a custom option browser in it populated with
+//! type is the type of chnnel to put in the list
+int TitleBrowser(u32 type);
+
+#endif
diff --git a/source/filebrowser.cpp b/source/prompts/filebrowser.cpp
similarity index 51%
rename from source/filebrowser.cpp
rename to source/prompts/filebrowser.cpp
index 790fc448..bc71b180 100644
--- a/source/filebrowser.cpp
+++ b/source/prompts/filebrowser.cpp
@@ -1,225 +1,239 @@
-/****************************************************************************
- * libwiigui Template
+/****************************************************************************
+ * libwiigui Template
* Tantric 2009
*
- * modified by dimok
- *
- * filebrowser.cpp
- *
- * Generic file routines - reading, writing, browsing
- ***************************************************************************/
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include "filebrowser.h"
-#include "menu.h"
-
-BROWSERINFO browser;
-BROWSERENTRY * browserList = NULL; // list of files/folders in browser
-
-/****************************************************************************
- * ResetBrowser()
- * Clears the file browser memory, and allocates one initial entry
- ***************************************************************************/
-void ResetBrowser()
-{
- browser.numEntries = 0;
- browser.selIndex = 0;
- browser.pageIndex = 0;
-
- // Clear any existing values
- if(browserList != NULL)
- {
- free(browserList);
- browserList = NULL;
- }
- // set aside space for 1 entry
- browserList = (BROWSERENTRY *)malloc(sizeof(BROWSERENTRY));
- memset(browserList, 0, sizeof(BROWSERENTRY));
-}
-
-/****************************************************************************
- * UpdateDirName()
- * Update curent directory name for file browser
- ***************************************************************************/
-int UpdateDirName()
-{
- int size=0;
- char * test;
- char temp[1024];
-
- /* current directory doesn't change */
- if (strcmp(browserList[browser.selIndex].filename,".") == 0)
- {
- return 0;
- }
- /* go up to parent directory */
- else if (strcmp(browserList[browser.selIndex].filename,"..") == 0)
- {
- /* determine last subdirectory namelength */
- sprintf(temp,"%s",browser.dir);
- test = strtok(temp,"/");
- while (test != NULL)
- {
- size = strlen(test);
- test = strtok(NULL,"/");
- }
-
- /* remove last subdirectory name */
- size = strlen(browser.dir) - size - 1;
- browser.dir[size] = 0;
-
- return 1;
- }
- /* Open a directory */
- else
- {
- /* test new directory namelength */
- if ((strlen(browser.dir)+1+strlen(browserList[browser.selIndex].filename)) < MAXPATHLEN)
- {
- /* update current directory name */
- sprintf(browser.dir, "%s/%s",browser.dir, browserList[browser.selIndex].filename);
- return 1;
- }
- else
- {
- return -1;
- }
- }
-}
-
-/****************************************************************************
- * FileSortCallback
- *
- * Quick sort callback to sort file entries with the following order:
- * .
- * ..
- *
- *
- ***************************************************************************/
-int FileSortCallback(const void *f1, const void *f2)
-{
- /* Special case for implicit directories */
- if(((BROWSERENTRY *)f1)->filename[0] == '.' || ((BROWSERENTRY *)f2)->filename[0] == '.')
- {
- if(strcmp(((BROWSERENTRY *)f1)->filename, ".") == 0) { return -1; }
- if(strcmp(((BROWSERENTRY *)f2)->filename, ".") == 0) { return 1; }
- if(strcmp(((BROWSERENTRY *)f1)->filename, "..") == 0) { return -1; }
- if(strcmp(((BROWSERENTRY *)f2)->filename, "..") == 0) { return 1; }
- }
-
- /* If one is a file and one is a directory the directory is first. */
- if(((BROWSERENTRY *)f1)->isdir && !(((BROWSERENTRY *)f2)->isdir)) return -1;
- if(!(((BROWSERENTRY *)f1)->isdir) && ((BROWSERENTRY *)f2)->isdir) return 1;
-
- return stricmp(((BROWSERENTRY *)f1)->filename, ((BROWSERENTRY *)f2)->filename);
-}
-
-/***************************************************************************
- * Browse subdirectories
- **************************************************************************/
-int
-ParseDirectory()
-{
- DIR_ITER *dir = NULL;
- char fulldir[MAXPATHLEN];
- char filename[MAXPATHLEN];
- struct stat filestat;
-
- // reset browser
- ResetBrowser();
-
- // open the directory
- sprintf(fulldir, "%s%s", browser.rootdir, browser.dir); // add currentDevice to path
- dir = diropen(fulldir);
-
- // if we can't open the dir, try opening the root dir
- if (dir == NULL)
- {
- sprintf(browser.dir,"/");
- dir = diropen(browser.rootdir);
- if (dir == NULL)
- {
- return -1;
- }
- }
-
- // index files/folders
- int entryNum = 0;
-
- while(dirnext(dir,filename,&filestat) == 0)
- {
- if(strcmp(filename,".") != 0)
- {
- BROWSERENTRY * newBrowserList = (BROWSERENTRY *)realloc(browserList, (entryNum+1) * sizeof(BROWSERENTRY));
-
- if(!newBrowserList) // failed to allocate required memory
- {
- ResetBrowser();
- entryNum = -1;
- break;
- }
- else
- {
- browserList = newBrowserList;
- }
- memset(&(browserList[entryNum]), 0, sizeof(BROWSERENTRY)); // clear the new entry
-
- strncpy(browserList[entryNum].filename, filename, MAXJOLIET);
-
- if(strcmp(filename,"..") == 0)
- {
- sprintf(browserList[entryNum].displayname, "..");
- }
- else
- {
- strcpy(browserList[entryNum].displayname, filename); // crop name for display
- }
-
- browserList[entryNum].length = filestat.st_size;
- browserList[entryNum].isdir = (filestat.st_mode & _IFDIR) == 0 ? 0 : 1; // flag this as a dir
-
- entryNum++;
- }
- }
-
- // close directory
- dirclose(dir);
-
- // Sort the file list
- qsort(browserList, entryNum, sizeof(BROWSERENTRY), FileSortCallback);
-
- browser.numEntries = entryNum;
- return entryNum;
-}
-
-/****************************************************************************
- * BrowserChangeFolder
- *
- * Update current directory and set new entry list if directory has changed
- ***************************************************************************/
-int BrowserChangeFolder()
-{
- if(!UpdateDirName())
- return -1;
-
- ParseDirectory();
-
- return browser.numEntries;
+ * modified by dimok
+ *
+ * filebrowser.cpp
+ *
+ * Generic file routines - reading, writing, browsing
+ ***************************************************************************/
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "filebrowser.h"
+#include "menu.h"
+
+#include "language/gettext.h"
+#include "PromptWindows.h"
+#include "libwiigui/gui.h"
+#include "sys.h"
+
+/*** Extern variables ***/
+extern GuiWindow * mainWindow;
+extern u8 shutdown;
+extern u8 reset;
+
+/*** Extern functions ***/
+extern void ResumeGui();
+extern void HaltGui();
+
+BROWSERINFO browser;
+BROWSERENTRY * browserList = NULL; // list of files/folders in browser
+
+/****************************************************************************
+ * ResetBrowser()
+ * Clears the file browser memory, and allocates one initial entry
+ ***************************************************************************/
+void ResetBrowser()
+{
+ browser.numEntries = 0;
+ browser.selIndex = 0;
+ browser.pageIndex = 0;
+
+ // Clear any existing values
+ if(browserList != NULL)
+ {
+ free(browserList);
+ browserList = NULL;
+ }
+ // set aside space for 1 entry
+ browserList = (BROWSERENTRY *)malloc(sizeof(BROWSERENTRY));
+ memset(browserList, 0, sizeof(BROWSERENTRY));
}
-/****************************************************************************
- * BrowseDevice
- * Displays a list of files on the selected device
- ***************************************************************************/
-int BrowseDevice(int device)
-{
+/****************************************************************************
+ * UpdateDirName()
+ * Update curent directory name for file browser
+ ***************************************************************************/
+int UpdateDirName()
+{
+ int size=0;
+ char * test;
+ char temp[1024];
+
+ /* current directory doesn't change */
+ if (strcmp(browserList[browser.selIndex].filename,".") == 0)
+ {
+ return 0;
+ }
+ /* go up to parent directory */
+ else if (strcmp(browserList[browser.selIndex].filename,"..") == 0)
+ {
+ /* determine last subdirectory namelength */
+ sprintf(temp,"%s",browser.dir);
+ test = strtok(temp,"/");
+ while (test != NULL)
+ {
+ size = strlen(test);
+ test = strtok(NULL,"/");
+ }
+
+ /* remove last subdirectory name */
+ size = strlen(browser.dir) - size - 1;
+ browser.dir[size] = 0;
+
+ return 1;
+ }
+ /* Open a directory */
+ else
+ {
+ /* test new directory namelength */
+ if ((strlen(browser.dir)+1+strlen(browserList[browser.selIndex].filename)) < MAXPATHLEN)
+ {
+ /* update current directory name */
+ sprintf(browser.dir, "%s/%s",browser.dir, browserList[browser.selIndex].filename);
+ return 1;
+ }
+ else
+ {
+ return -1;
+ }
+ }
+}
+
+/****************************************************************************
+ * FileSortCallback
+ *
+ * Quick sort callback to sort file entries with the following order:
+ * .
+ * ..
+ *
+ *
+ ***************************************************************************/
+int FileSortCallback(const void *f1, const void *f2)
+{
+ /* Special case for implicit directories */
+ if(((BROWSERENTRY *)f1)->filename[0] == '.' || ((BROWSERENTRY *)f2)->filename[0] == '.')
+ {
+ if(strcmp(((BROWSERENTRY *)f1)->filename, ".") == 0) { return -1; }
+ if(strcmp(((BROWSERENTRY *)f2)->filename, ".") == 0) { return 1; }
+ if(strcmp(((BROWSERENTRY *)f1)->filename, "..") == 0) { return -1; }
+ if(strcmp(((BROWSERENTRY *)f2)->filename, "..") == 0) { return 1; }
+ }
+
+ /* If one is a file and one is a directory the directory is first. */
+ if(((BROWSERENTRY *)f1)->isdir && !(((BROWSERENTRY *)f2)->isdir)) return -1;
+ if(!(((BROWSERENTRY *)f1)->isdir) && ((BROWSERENTRY *)f2)->isdir) return 1;
+
+ return stricmp(((BROWSERENTRY *)f1)->filename, ((BROWSERENTRY *)f2)->filename);
+}
+
+/***************************************************************************
+ * Browse subdirectories
+ **************************************************************************/
+int
+ParseDirectory()
+{
+ DIR_ITER *dir = NULL;
+ char fulldir[MAXPATHLEN];
+ char filename[MAXPATHLEN];
+ struct stat filestat;
+
+ // reset browser
+ ResetBrowser();
+
+ // open the directory
+ sprintf(fulldir, "%s%s", browser.rootdir, browser.dir); // add currentDevice to path
+ dir = diropen(fulldir);
+
+ // if we can't open the dir, try opening the root dir
+ if (dir == NULL)
+ {
+ sprintf(browser.dir,"/");
+ dir = diropen(browser.rootdir);
+ if (dir == NULL)
+ {
+ return -1;
+ }
+ }
+
+ // index files/folders
+ int entryNum = 0;
+
+ while(dirnext(dir,filename,&filestat) == 0)
+ {
+ if(strcmp(filename,".") != 0)
+ {
+ BROWSERENTRY * newBrowserList = (BROWSERENTRY *)realloc(browserList, (entryNum+1) * sizeof(BROWSERENTRY));
+
+ if(!newBrowserList) // failed to allocate required memory
+ {
+ ResetBrowser();
+ entryNum = -1;
+ break;
+ }
+ else
+ {
+ browserList = newBrowserList;
+ }
+ memset(&(browserList[entryNum]), 0, sizeof(BROWSERENTRY)); // clear the new entry
+
+ strncpy(browserList[entryNum].filename, filename, MAXJOLIET);
+
+ if(strcmp(filename,"..") == 0)
+ {
+ sprintf(browserList[entryNum].displayname, "..");
+ }
+ else
+ {
+ strcpy(browserList[entryNum].displayname, filename); // crop name for display
+ }
+
+ browserList[entryNum].length = filestat.st_size;
+ browserList[entryNum].isdir = (filestat.st_mode & _IFDIR) == 0 ? 0 : 1; // flag this as a dir
+
+ entryNum++;
+ }
+ }
+
+ // close directory
+ dirclose(dir);
+
+ // Sort the file list
+ qsort(browserList, entryNum, sizeof(BROWSERENTRY), FileSortCallback);
+
+ browser.numEntries = entryNum;
+ return entryNum;
+}
+
+/****************************************************************************
+ * BrowserChangeFolder
+ *
+ * Update current directory and set new entry list if directory has changed
+ ***************************************************************************/
+int BrowserChangeFolder()
+{
+ if(!UpdateDirName())
+ return -1;
+
+ ParseDirectory();
+
+ return browser.numEntries;
+}
+
+/****************************************************************************
+ * BrowseDevice
+ * Displays a list of files on the selected device
+ ***************************************************************************/
+int BrowseDevice(int device)
+{
sprintf(browser.dir, "/");
switch(device)
{
@@ -229,7 +243,190 @@ int BrowseDevice(int device)
case USB:
sprintf(browser.rootdir, "USB:");
break;
- }
- ParseDirectory(); // Parse root directory
- return browser.numEntries;
-}
+ }
+ ParseDirectory(); // Parse root directory
+ return browser.numEntries;
+}
+
+
+/****************************************************************************
+ * MenuBrowseDevice
+ ***************************************************************************/
+
+int BrowseDevice(char * var, int force)
+{
+
+ int result=-1;
+ int i;
+ char currentdir[90];
+ int curDivice = -1;
+ int forced =force;
+
+ if(forced>-1){
+ if(BrowseDevice(forced) > 0)
+ {
+ curDivice = forced;
+ goto main;
+ }
+ }
+
+ else if((!strcasecmp(bootDevice, "USB:"))&&(BrowseDevice(USB) > 0))
+ {
+ curDivice = USB;
+ goto main;
+ }
+ else if((!strcasecmp(bootDevice, "SD:"))&&(BrowseDevice(SD) > 0))
+ {
+ curDivice = SD;
+ goto main;
+ }
+ else {
+ WindowPrompt(tr("Error"),0,tr("Ok"));
+ return -1;
+ }
+
+main:
+ int menu = MENU_NONE;
+
+/*
+ GuiText titleTxt("Browse Files", 28, (GXColor){0, 0, 0, 230});
+ titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
+ titleTxt.SetPosition(70,20);
+*/
+ GuiTrigger trigA;
+ trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
+ GuiTrigger trigB;
+ trigB.SetButtonOnlyTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B);
+
+ GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM, Settings.sfxvolume);
+ GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, SOUND_PCM, Settings.sfxvolume);
+
+ GuiImageData btnOutline(button_dialogue_box_png);
+ GuiText ExitBtnTxt("Cancel", 24, (GXColor){0, 0, 0, 255});
+ GuiImage ExitBtnImg(&btnOutline);
+ if (Settings.wsprompt == yes){
+ ExitBtnTxt.SetWidescreen(CFG.widescreen);
+ ExitBtnImg.SetWidescreen(CFG.widescreen);
+ }GuiButton ExitBtn(btnOutline.GetWidth(), btnOutline.GetHeight());
+ ExitBtn.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
+ ExitBtn.SetPosition(-55, -35);
+ ExitBtn.SetLabel(&ExitBtnTxt);
+ ExitBtn.SetImage(&ExitBtnImg);
+ ExitBtn.SetTrigger(&trigA);
+ ExitBtn.SetTrigger(&trigB);
+ ExitBtn.SetEffectGrow();
+
+ GuiText okBtnTxt(tr("Ok"), 22, (GXColor){THEME.prompttxt_r, THEME.prompttxt_g, THEME.prompttxt_b, 255});
+ GuiImage okBtnImg(&btnOutline);
+ if (Settings.wsprompt == yes){
+ okBtnTxt.SetWidescreen(CFG.widescreen);
+ okBtnImg.SetWidescreen(CFG.widescreen);
+ }
+ GuiButton okBtn(&okBtnImg,&okBtnImg, 0, 4, 45, -35, &trigA, &btnSoundOver, &btnClick,1);
+ okBtn.SetLabel(&okBtnTxt);
+
+ GuiFileBrowser fileBrowser(396, 248);
+ fileBrowser.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
+ fileBrowser.SetPosition(0, 120);
+
+ GuiImageData Address(addressbar_textbox_png);
+ snprintf(currentdir, sizeof(currentdir), "%s%s", browser.rootdir, browser.dir);
+ GuiText AdressText(currentdir, 20, (GXColor) {0, 0, 0, 255});
+ AdressText.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
+ AdressText.SetPosition(20, 0);
+ AdressText.SetMaxWidth(Address.GetWidth()-40, GuiText::SCROLL);
+ GuiImage AdressbarImg(&Address);
+ GuiButton Adressbar(Address.GetWidth(), Address.GetHeight());
+ Adressbar.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
+ Adressbar.SetPosition(0, fileBrowser.GetTop()-45);
+ Adressbar.SetImage(&AdressbarImg);
+ Adressbar.SetLabel(&AdressText);
+
+ //save var in case they cancel and return it to them
+ snprintf(currentdir, sizeof(currentdir), "%s", var);
+ sprintf(var,"%s", browser.rootdir);
+
+ HaltGui();
+ GuiWindow w(screenwidth, screenheight);
+ w.Append(&ExitBtn);
+// w.Append(&titleTxt);
+ w.Append(&fileBrowser);
+ w.Append(&Adressbar);
+ w.Append(&okBtn);
+// w.Append(&deviceBtn);//i got codedump when i tried to make an extra button so i took this one out for now till i find the dump
+ mainWindow->Append(&w);
+ ResumeGui();
+
+ while(menu == MENU_NONE)
+ {
+ VIDEO_WaitVSync();
+
+ if(shutdown == 1)
+ Sys_Shutdown();
+
+ if(reset == 1)
+ Sys_Reboot();
+
+ for(i=0; iGetState() == STATE_CLICKED)
+ {
+ fileBrowser.fileList[i]->ResetState();
+ // check corresponding browser entry
+ if(browserList[browser.selIndex].isdir)
+ {
+ if(BrowserChangeFolder())
+ {
+ fileBrowser.ResetState();
+ fileBrowser.fileList[0]->SetState(STATE_SELECTED);
+ fileBrowser.TriggerUpdate();
+ sprintf(var,"%s", browser.rootdir);
+ int len=strlen(browser.rootdir);
+ for (unsigned int i=len;iSetState(STATE_DISABLED);
+ mainWindow->SetState(STATE_DEFAULT);
+ }
+ }
+ }
+
+ if(ExitBtn.GetState() == STATE_CLICKED)
+ {
+ snprintf(var,sizeof(currentdir),"%s", currentdir);
+ break;
+ }
+ if(okBtn.GetState() == STATE_CLICKED)
+ {
+ /*int e=0;
+ for(unsigned int d=0;dRemove(&w);
+ ResumeGui();
+
+ //}
+
+ return result;
+}
+
diff --git a/source/filebrowser.h b/source/prompts/filebrowser.h
similarity index 95%
rename from source/filebrowser.h
rename to source/prompts/filebrowser.h
index c4357047..6036fb1e 100644
--- a/source/filebrowser.h
+++ b/source/prompts/filebrowser.h
@@ -51,5 +51,6 @@ void ResetBrowser();
int ParseDirectory();
int BrowserChangeFolder();
int BrowseDevice(int device);
+int BrowseDevice(char * var, int force =-1);
#endif
diff --git a/source/settings/Settings.cpp b/source/settings/Settings.cpp
index 80f50925..d596dd38 100644
--- a/source/settings/Settings.cpp
+++ b/source/settings/Settings.cpp
@@ -9,6 +9,7 @@
#include "prompts/PromptWindows.h"
#include "prompts/DiscBrowser.h"
#include "settings/SettingsPrompts.h"
+#include "prompts/filebrowser.h"
#include "cheats/cheatmenu.h"
#include "fatmounter.h"
#include "menu.h"
@@ -976,7 +977,7 @@ int MenuSettings()
w.Remove(&optionBrowser2);
w.Remove(&backBtn);
char entered[20] = "";
- int result = OnScreenKeyboard(entered, 20,0);
+ int result = OnScreenKeyboard(entered, 20,0);
w.Append(&optionBrowser2);
w.Append(&backBtn);
if ( result == 1 ) {
@@ -1278,7 +1279,8 @@ int MenuSettings()
w.Remove(&backBtn);
char entered[43] = "";
strncpy(entered, Settings.covers_path, sizeof(entered));
- int result = OnScreenKeyboard(entered,43,0);
+ int result = BrowseDevice(entered);
+ //int result = OnScreenKeyboard(entered,43,0);
w.Append(&optionBrowser2);
w.Append(&backBtn);
if ( result == 1 )
@@ -1304,7 +1306,8 @@ int MenuSettings()
w.Remove(&backBtn);
char entered[43] = "";
strncpy(entered, Settings.disc_path, sizeof(entered));
- int result = OnScreenKeyboard(entered, 43,0);
+ int result = BrowseDevice(entered);
+ //int result = OnScreenKeyboard(entered, 43,0);
w.Append(&optionBrowser2);
w.Append(&backBtn);
if ( result == 1 )
@@ -1330,7 +1333,8 @@ int MenuSettings()
w.Remove(&backBtn);
char entered[43] = "";
strncpy(entered, CFG.theme_path, sizeof(entered));
- int result = OnScreenKeyboard(entered, 43,0);
+ int result = BrowseDevice(entered);
+ //int result = OnScreenKeyboard(entered, 43,0);
HaltGui();
w.RemoveAll();
if ( result == 1 )
@@ -1387,7 +1391,8 @@ int MenuSettings()
w.Remove(&backBtn);
char entered[43] = "";
strncpy(entered, Settings.titlestxt_path, sizeof(entered));
- int result = OnScreenKeyboard(entered,43,0);
+ int result = BrowseDevice(entered);
+ //int result = OnScreenKeyboard(entered,43,0);
w.Append(&optionBrowser2);
w.Append(&backBtn);
if ( result == 1 )
@@ -1418,7 +1423,8 @@ int MenuSettings()
w.Remove(&backBtn);
char entered[43] = "";
strncpy(entered, Settings.update_path, sizeof(entered));
- int result = OnScreenKeyboard(entered,43,0);
+ int result = BrowseDevice(entered);
+ //int result = OnScreenKeyboard(entered,43,0);
w.Append(&optionBrowser2);
w.Append(&backBtn);
if ( result == 1 )
@@ -1440,7 +1446,8 @@ int MenuSettings()
w.Remove(&backBtn);
char entered[43] = "";
strncpy(entered, Settings.Cheatcodespath, sizeof(entered));
- int result = OnScreenKeyboard(entered,43,0);
+ int result = BrowseDevice(entered);
+ //int result = OnScreenKeyboard(entered,43,0);
w.Append(&optionBrowser2);
w.Append(&backBtn);
if ( result == 1 )
@@ -1462,7 +1469,8 @@ int MenuSettings()
w.Remove(&backBtn);
char entered[43] = "";
strncpy(entered, Settings.TxtCheatcodespath, sizeof(entered));
- int result = OnScreenKeyboard(entered,43,0);
+ int result = BrowseDevice(entered);
+ //int result = OnScreenKeyboard(entered,43,0);
w.Append(&optionBrowser2);
w.Append(&backBtn);
if ( result == 1 )
@@ -1484,7 +1492,8 @@ int MenuSettings()
w.Remove(&backBtn);
char entered[43] = "";
strncpy(entered, Settings.dolpath, sizeof(entered));
- int result = OnScreenKeyboard(entered,43,0);
+ int result = BrowseDevice(entered);
+ //int result = OnScreenKeyboard(entered,43,0);
w.Append(&optionBrowser2);
w.Append(&backBtn);
if ( result == 1 )
@@ -1510,7 +1519,8 @@ int MenuSettings()
w.Remove(&backBtn);
char entered[43] = "";
strncpy(entered, Settings.homebrewapps_path, sizeof(entered));
- int result = OnScreenKeyboard(entered,43,0);
+ int result = BrowseDevice(entered);
+ //int result = OnScreenKeyboard(entered,43,0);
w.Append(&optionBrowser2);
w.Append(&backBtn);
if ( result == 1 )
diff --git a/source/testfilebrowser.cpp b/source/testfilebrowser.cpp
deleted file mode 100644
index 391c1ccd..00000000
--- a/source/testfilebrowser.cpp
+++ /dev/null
@@ -1,134 +0,0 @@
-#include
-#include
-
-#include "language/gettext.h"
-#include "prompts/PromptWindows.h"
-#include "libwiigui/gui.h"
-#include "filebrowser.h"
-#include "menu.h"
-#include "sys.h"
-
-/*** Extern variables ***/
-extern GuiWindow * mainWindow;
-extern u8 shutdown;
-extern u8 reset;
-
-/*** Extern functions ***/
-extern void ResumeGui();
-extern void HaltGui();
-
-/****************************************************************************
- * MenuBrowseDevice
- ***************************************************************************/
-int MenuBrowseDevice()
-{
- int i;
- char currentdir[50];
-
- // populate initial directory listing
- if(BrowseDevice(SD) <= 0)
- {
- int choice = WindowPrompt("Error",
- "Unable to load device.",
- "Retry",
- "Change Settings");
-
- if(choice) {
- return MENU_DISCLIST;
- }
- }
-
- int menu = MENU_NONE;
-
- GuiText titleTxt("Browse Files", 28, (GXColor){0, 0, 0, 230});
- titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
- titleTxt.SetPosition(70,20);
-
- GuiTrigger trigA;
- trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
- GuiTrigger trigPlus;
- trigPlus.SetButtonOnlyTrigger(-1, WPAD_BUTTON_PLUS | WPAD_CLASSIC_BUTTON_PLUS, 0);
- GuiTrigger trigMinus;
- trigMinus.SetButtonOnlyTrigger(-1, WPAD_BUTTON_MINUS | WPAD_CLASSIC_BUTTON_MINUS, 0);
-
- GuiFileBrowser fileBrowser(552, 248);
- fileBrowser.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
- fileBrowser.SetPosition(0, 100);
-
- GuiImageData btnOutline(button_dialogue_box_png);
- GuiText ExitBtnTxt("Exit", 24, (GXColor){0, 0, 0, 255});
- GuiImage ExitBtnImg(&btnOutline);
- GuiButton ExitBtn(btnOutline.GetWidth(), btnOutline.GetHeight());
- ExitBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
- ExitBtn.SetPosition(100, -35);
- ExitBtn.SetLabel(&ExitBtnTxt);
- ExitBtn.SetImage(&ExitBtnImg);
- ExitBtn.SetTrigger(&trigA);
- ExitBtn.SetEffectGrow();
-
- GuiImageData Address(addressbar_textbox_png);
- snprintf(currentdir, sizeof(currentdir), "%s%s", browser.rootdir, browser.dir);
- GuiText AdressText(currentdir, 20, (GXColor) {0, 0, 0, 255});
- AdressText.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
- AdressText.SetPosition(20, 0);
- AdressText.SetMaxWidth(Address.GetWidth()-40, GuiText::SCROLL);
- GuiImage AdressbarImg(&Address);
- GuiButton Adressbar(Address.GetWidth(), Address.GetHeight());
- Adressbar.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
- Adressbar.SetPosition(60, fileBrowser.GetTop()-45);
- Adressbar.SetImage(&AdressbarImg);
- Adressbar.SetLabel(&AdressText);
-
- HaltGui();
- GuiWindow w(screenwidth, screenheight);
- w.Append(&ExitBtn);
- w.Append(&titleTxt);
- w.Append(&fileBrowser);
- w.Append(&Adressbar);
- mainWindow->Append(&w);
- ResumeGui();
-
- while(menu == MENU_NONE)
- {
- VIDEO_WaitVSync();
-
- if(shutdown == 1)
- Sys_Shutdown();
-
- if(reset == 1)
- Sys_Reboot();
-
- for(i=0; iGetState() == STATE_CLICKED)
- {
- fileBrowser.fileList[i]->ResetState();
- // check corresponding browser entry
- if(browserList[browser.selIndex].isdir)
- {
- if(BrowserChangeFolder())
- {
- fileBrowser.ResetState();
- fileBrowser.fileList[0]->SetState(STATE_SELECTED);
- fileBrowser.TriggerUpdate();
- AdressText.SetTextf("%s%s", browser.rootdir, browser.dir);
- } else {
- menu = MENU_DISCLIST;
- break;
- }
- } else {
- mainWindow->SetState(STATE_DISABLED);
- mainWindow->SetState(STATE_DEFAULT);
- }
- }
- }
-
- if(ExitBtn.GetState() == STATE_CLICKED)
- menu = MENU_DISCLIST;
- }
- HaltGui();
- mainWindow->Remove(&w);
- ResumeGui();
-
- return menu;
-}
diff --git a/source/wad/title.c b/source/wad/title.c
index 0d05bd92..a2c10e99 100644
--- a/source/wad/title.c
+++ b/source/wad/title.c
@@ -2,9 +2,14 @@
#include
#include
#include
+#include
#include
#include "utils.h"
+#include "../settings/cfg.h"
+#include "fatmounter.h"
+
+#define MAX_TITLES 256
s32 Title_GetList(u64 **outbuf, u32 *outlen)
@@ -254,3 +259,458 @@ out:
return ret;
}
+
+
+/*-------------------------------------------------------------
+ taken from anytitledeleter
+ name.c -- functions for determining the name of a title
+
+ Copyright (C) 2009 MrClick
+
+-------------------------------------------------------------*/
+// Max number of entries in the database
+#define MAX_DB 1024
+
+// Max name length
+#define MAX_LINE 80
+
+// Contains all title ids (e.g.: "HAC")
+static char **__db_i;
+// Contains all title names (e.g.: "Mii Channel")
+static char **__db;
+// Contains the number of entries in the database
+static u32 __db_cnt = 0;
+
+s32 loadDatabase(){
+ FILE *fdb;
+
+ char dbfile[100];
+ snprintf(dbfile,sizeof(dbfile),"SD:/database.txt");
+ // Init SD card access, open database file and check if it worked
+ //fatInitDefault();
+ SDCard_Init();
+ fdb = fopen(dbfile, "r");
+ if (fdb == NULL)
+ return -1;
+
+ // Allocate memory for the database
+ __db_i = calloc(MAX_DB, sizeof(char*));
+ __db = calloc(MAX_DB, sizeof(char*));
+
+ // Define the line buffer. Each line in the db file will be stored here first
+ char line[MAX_LINE];
+ line[sizeof(line)] = 0;
+
+ // Generic char buffer and counter variable
+ char byte;
+ u32 i = 0;
+
+ // Read each character from the file
+ do {
+ byte = fgetc(fdb);
+ // In case a line was longer than MAX_LINE
+ if (i == -1){
+ // Read bytes till a new line is hit
+ if (byte == 0x0A)
+ i = 0;
+ // In case were still good with the line length
+ } else {
+ // Add the new byte to the line buffer
+ line[i] = byte;
+ i++;
+ // When a new line is hit or MAX_LINE is reached
+ if (byte == 0x0A || i == sizeof(line) - 1) {
+ // Terminate finished line to create a string
+ line[i] = 0;
+ // When the line is not a comment or not to short
+ if (line[0] != '#' && i > 5){
+
+ // Allocate and copy title id to database
+ __db_i[__db_cnt] = calloc(4, sizeof(char*));
+ memcpy(__db_i[__db_cnt], line, 3);
+ __db_i[__db_cnt][3] = 0;
+ // Allocate and copy title name to database
+ __db[__db_cnt] = calloc(i - 4, sizeof(char*));
+ memcpy(__db[__db_cnt], line + 4, i - 4);
+ __db[__db_cnt][i - 5] = 0;
+
+ // Check that the next line does not overflow the database
+ __db_cnt++;
+ if (__db_cnt == MAX_DB)
+ break;
+ }
+ // Set routine to ignore all bytes in the line when MAX_LINE is reached
+ if (byte == 0x0A) i = 0; else i = -1;
+ }
+ }
+ } while (!feof(fdb));
+
+ // Close database file; we are done with it
+ fclose(fdb);
+
+ return 0;
+}
+
+
+void freeDatabase(){
+ u32 i = 0;
+ for(; i < __db_cnt; i++){
+ free(__db_i[i]);
+ free(__db[i]);
+ }
+ free(__db_i);
+ free(__db);
+}
+
+
+s32 getDatabaseCount(){
+ return __db_cnt;
+}
+
+s32 __convertWiiString(char *str, u8 *data, u32 cnt){
+ u32 i = 0;
+ for(; i < cnt; data += 2){
+ u16 *chr = (u16*)data;
+ if (*chr == 0)
+ break;
+ // ignores all but ASCII characters
+ else if (*chr >= 0x20 && *chr <= 0x7E)
+ str[i] = *chr;
+ else
+ str[i] = '.';
+ i++;
+ }
+ str[i] = 0;
+
+ return 0;
+}
+
+s32 getNameDB(char* name, char* id){
+ // Return fixed values for special entries
+ if (strncmp(id, "IOS", 3) == 0){
+ sprintf(name, "Operating System %s", id);
+ return 0;
+ }
+ if (strncmp(id, "MIOS", 3) == 0){
+ sprintf(name, "Gamecube Compatibility Layer");
+ return 0;
+ }
+ if (strncmp(id, "SYSMENU", 3) == 0){
+ sprintf(name, "System Menu");
+ return 0;
+ }
+ if (strncmp(id, "BC", 2) == 0){
+ sprintf(name, "BC");
+ return 0;
+ }
+
+ // Create an ? just in case the function aborts prematurely
+ sprintf(name, "?");
+
+ u32 i;
+ u8 db_found = 0;
+ // Compare each id in the database to the title id
+ for (i = 0; i < __db_cnt; i++)
+ if (strncmp(id, __db_i[i], 3) == 0){
+ db_found = 1;
+ break;
+ }
+
+ if (db_found == 0)
+ // Return -1 if no mathcing entry was found
+ return -1;
+ else {
+ // Get name from database once a matching id was found
+ sprintf(name, __db[i]);
+ return 0;
+ }
+}
+
+
+s32 getNameBN(char* name, u64 id){
+ // Terminate the name string just in case the function exits prematurely
+ name[0] = 0;
+
+ // Create a string containing the absolute filename
+ char file[256] __attribute__ ((aligned (32)));
+ sprintf(file, "/title/%08x/%08x/data/banner.bin", (u32)(id >> 32), (u32)id);
+
+ // Bring the Wii into the title's userspace
+ if (ES_SetUID(id) < 0){
+ // Should that fail repeat after setting permissions to system menu mode
+// Identify_SysMenu();
+// if (ES_SetUID(id) < 0)
+// return -1;
+ }
+
+ // Try to open file
+ s32 fh = ISFS_Open(file, ISFS_OPEN_READ);
+
+ // If a title does not have a banner.bin bail out
+ if (fh == -106)
+ return -2;
+
+ // If it fails try to open again after identifying as SU
+ if (fh == -102){
+// Identify_SU();
+// fh = ISFS_Open(file, ISFS_OPEN_READ);
+ }
+ // If the file won't open
+ else if (fh < 0)
+ return fh;
+
+ // Seek to 0x20 where the name is stored
+ ISFS_Seek(fh, 0x20, 0);
+
+ // Read a chunk of 256 bytes from the banner.bin
+ u8 *data = memalign(32, 0x100);
+ if (ISFS_Read(fh, data, 0x100) < 0){
+ ISFS_Close(fh);
+ free(data);
+ return -3;
+ }
+
+
+ // Prepare the strings that will contain the name of the title
+ char name1[0x41] __attribute__ ((aligned (32)));
+ char name2[0x41] __attribute__ ((aligned (32)));
+ name1[0x40] = 0;
+ name2[0x40] = 0;
+
+ __convertWiiString(name1, data + 0x00, 0x40);
+ __convertWiiString(name2, data + 0x40, 0x40);
+ free(data);
+
+ // Assemble name
+ sprintf(name, "%s", name1);
+ if (strlen(name2) > 1)
+ sprintf(name, "%s (%s)", name, name2);
+
+ // Close the banner.bin
+ ISFS_Close(fh);
+
+ // Job well done
+ return 1;
+}
+
+
+s32 getName00(char* name, u64 id){
+ // Create a string containing the absolute filename
+ char file[256] __attribute__ ((aligned (32)));
+ sprintf(file, "/title/%08x/%08x/content/00000000.app", (u32)(id >> 32), (u32)id);
+
+ s32 fh = ISFS_Open(file, ISFS_OPEN_READ);
+
+
+
+ // If the title does not have 00000000.app bail out
+ if (fh == -106)
+ return fh;
+
+ // In case there is some problem with the permission
+ if (fh == -102){
+ // Identify as super user
+// Identify_SU();
+// fh = ISFS_Open(file, ISFS_OPEN_READ);
+ }
+ else if (fh < 0)
+ return fh;
+
+ // Jump to start of the name entries
+ ISFS_Seek(fh, 0x9C, 0);
+
+ // Read a chunk of 0x22 * 0x2B bytes from 00000000.app
+ u8 *data = memalign(32, 2048);
+ s32 r = ISFS_Read(fh, data, 0x22 * 0x2B);
+ //printf("%s %d\n", file, r);wait_anyKey();
+ if (r < 0){
+ ISFS_Close(fh);
+ free(data);
+ return -4;
+ }
+
+ // Take the entries apart
+ char str[0x22][0x2B];
+ u8 i = 0;
+ // Convert the entries to ASCII strings
+ for(; i < 0x22; i++)
+ __convertWiiString(str[i], data + (i * 0x2A), 0x2A);
+
+ // Clean up
+ ISFS_Close(fh);
+ free(data);
+
+ // Assemble name
+ // Only the English name is returned
+ // There are 6 other language names in the str array
+ sprintf(name, "%s", str[2]);
+ if (strlen(str[3]) > 1)
+ sprintf(name, "%s (%s)", name, str[3]);
+
+ // Job well done
+ return 2;
+}
+
+
+s32 printContent(u64 tid){
+ char dir[256] __attribute__ ((aligned (32)));
+ sprintf(dir, "/title/%08x/%08x/content", (u32)(tid >> 32), (u32)tid);
+
+ u32 num = 64;
+
+ static char list[8000] __attribute__((aligned(32)));
+
+ ISFS_ReadDir(dir, list, &num);
+
+ char *ptr = list;
+ u8 br = 0;
+ for (; strlen(ptr) > 0; ptr += strlen(ptr) + 1){
+ printf(" %-12.12s", ptr);
+ br++; if (br == 4) { br = 0; printf("\n"); }
+ }
+ if (br != 0)
+ printf("\n");
+
+ return num;
+}
+
+
+s32 getTitle_Name(char* name, u64 id, char *tid){
+ char buf[256] __attribute__ ((aligned (32)));
+
+ s32 r = -1;
+ // Determine the title's name database/banner/00000000.app
+ r = getNameDB(buf, tid);
+ if (r < 0)
+ r = getNameBN(buf, id);
+ if (r < 0)
+ r = getName00(buf, id);
+
+ switch (r){
+ // In case a name was found in the database
+ case 0: sprintf(name, "%s", buf);
+ break;
+ // In case a name was found in the banner.bin
+ case 1: sprintf(name, "*%s*", buf);
+ break;
+ // In case a name was found in the 00000000.app
+ case 2: sprintf(name, "+%s+", buf);
+ break;
+ // In case no proper name was found return a ?
+ default: sprintf(name, "Unknown Title");
+ break;
+ }
+
+ return 0;
+}
+
+char *titleText(u32 kind, u32 title){
+ static char text[10];
+
+ if (kind == 1){
+ // If we're dealing with System Titles, use custom names
+ switch (title){
+ case 1:
+ strcpy(text, "BOOT2");
+ break;
+ case 2:
+ strcpy(text, "SYSMENU");
+ break;
+ case 0x100:
+ strcpy(text, "BC");
+ break;
+ case 0x101:
+ strcpy(text, "MIOS");
+ break;
+ default:
+ sprintf(text, "IOS%u", title);
+ break;
+ }
+ } else {
+ // Otherwise, just convert the title to ASCII
+ int i =32, j = 0;
+ do {
+ u8 temp;
+ i -= 8;
+ temp = (title >> i) & 0x000000FF;
+ if (temp < 32 || temp > 126)
+ text[j] = '.';
+ else
+ text[j] = temp;
+ j++;
+ } while (i > 0);
+ text[4] = 0;
+ }
+ return text;
+}
+
+
+/*-------------------------------------------------------------
+ from any title deleter
+titles.c -- functions for grabbing all titles of a certain type
+
+Copyright (C) 2008 tona
+-------------------------------------------------------------*/
+
+u32 __titles_init = 0;
+u32 __num_titles;
+static u64 __title_list[MAX_TITLES] ATTRIBUTE_ALIGN(32);
+
+s32 __getTitles() {
+ s32 ret;
+ ret = ES_GetNumTitles(&__num_titles);
+ if (ret <0)
+ return ret;
+ if (__num_titles > MAX_TITLES)
+ return -1;
+ ret = ES_GetTitles(__title_list, __num_titles);
+ if (ret <0)
+ return ret;
+ __titles_init = 1;
+ return 0;
+}
+
+s32 getTitles_TypeCount(u32 type, u32 *count) {
+ s32 ret = 0;
+ u32 type_count;
+ if (!__titles_init)
+ ret = __getTitles();
+ if (ret <0)
+ return ret;
+ int i;
+ type_count = 0;
+ for (i=0; i < __num_titles; i++) {
+ u32 upper;
+ upper = __title_list[i] >> 32;
+ if(upper == type)
+ type_count++;
+ }
+ *count = type_count;
+ return ret;
+}
+
+s32 getTitles_Type(u32 type, u32 *titles, u32 count) {
+ s32 ret = 0;
+ u32 type_count;
+ if (!__titles_init)
+ ret = __getTitles();
+ if (ret <0)
+ return ret;
+ int i;
+ type_count = 0;
+ for (i=0; type_count < count && i < __num_titles; i++) {
+ u32 upper, lower;
+ upper = __title_list[i] >> 32;
+ lower = __title_list[i] & 0xFFFFFFFF;
+ if(upper == type) {
+ titles[type_count]=lower;
+ type_count++;
+ }
+ }
+ if (type_count < count)
+ return -2;
+ __titles_init = 0;
+ return 0;
+}
+
+
diff --git a/source/wad/title.h b/source/wad/title.h
index 619156ac..03a68af2 100644
--- a/source/wad/title.h
+++ b/source/wad/title.h
@@ -1,3 +1,25 @@
+/*-------------------------------------------------------------
+ from any title deleter and wad manager 1.4
+title.h --
+
+Copyright (C) 2008 tona and/or waninkoko
+-------------------------------------------------------------*/
+#include
+#include
+#include
+#include
+#include
+#include
+
+// Turn upper and lower into a full title ID
+#define TITLE_ID(x,y) (((u64)(x) << 32) | (y))
+// Get upper or lower half of a title ID
+#define TITLE_UPPER(x) ((u32)((x) >> 32))
+// Turn upper and lower into a full title ID
+#define TITLE_LOWER(x) ((u32)(x))
+
+#define MAX_TITLES 100
+
#ifndef _TITLE_H_
#define _TITLE_H_
@@ -16,6 +38,39 @@ s32 Title_GetVersion(u64, u16 *);
s32 Title_GetSysVersion(u64, u64 *);
s32 Title_GetSize(u64, u32 *);
s32 Title_GetIOSVersions(u8 **, u32 *);
+
+// Load the database from SD card
+s32 loadDatabase();
+
+// Free the database on exit
+void freeDatabase();
+
+// Get the number of entries in the database
+s32 getDatabaseCount();
+
+// Get the name of a title
+s32 getTitle_Name(char *name, u64 id, char *tid);
+
+// Get the name of a title from the database located on the SD card
+s32 getNameDB(char *name, char* id);
+
+// Get the name of a title from its banner.bin in NAND
+s32 getNameBN(char *name, u64 id);
+
+// Get the name of a title from its 00000000.app in NAND
+s32 getName00(char *name, u64 id);
+
+// Get string representation of lower title id
+char *titleText(u32 kind, u32 title);
+
+// Converts a 16 bit Wii string to a printable 8 bit string
+s32 __convertWiiString(char *str, u8 *data, u32 cnt);
+
+// Get the number of titles on the Wii of a given type
+s32 getTitles_TypeCount(u32 type, u32 *count);
+
+// Get the list of titles of this type
+s32 getTitles_Type(u32 type, u32 *titles, u32 count);
#ifdef __cplusplus
}