usbloadergx/source/homebrewboot/HomebrewBrowse.cpp
2010-10-27 14:45:27 +00:00

1102 lines
45 KiB
C++

/****************************************************************************
* HomebrewBrowse
* USB Loader GX 2009
*
* Homebrew launcher for USB Loader GX
*
* homebrewbrowse.cpp
***************************************************************************/
#include <string.h>
#include <unistd.h>
#include <zlib.h>
#include <unzip/unzip.h>
#include "language/gettext.h"
#include "libwiigui/gui.h"
#include "prompts/TitleBrowser.h"
#include "prompts/PromptWindows.h"
#include "prompts/ProgressWindow.h"
#include "homebrewboot/HomebrewFiles.h"
#include "homebrewboot/HomebrewXML.h"
#include "homebrewboot/BootHomebrew.h"
#include "network/networkops.h"
#include "themes/CTheme.h"
#include "menu.h"
#include "menu/menus.h"
#include "filelist.h"
#include "sys.h"
#include "network/http.h"
#include "settings/cfg.h"
#include "utils/minizip/miniunz.h"
#include "usbloader/utils.h"
/*** Extern functions ***/
extern void ResumeGui();
extern void HaltGui();
/*** Extern variables ***/
extern GuiImage * bgImg;
extern u32 infilesize;
extern u32 uncfilesize;
extern char wiiloadVersion[2];
extern u8 shutdown;
extern u8 reset;
/*** Variables used elsewhere ***/
u8 boothomebrew = 0;
/****************************************************************************
* roundup Function
***************************************************************************/
int roundup(float number)
{
if (number == (int) number)
return (int) number;
else return (int) (number + 1);
}
/****************************************************************************
* MenuHomebrewBrowse
***************************************************************************/
int MenuHomebrewBrowse()
{
int menu = MENU_NONE;
int choice = 0;
HomebrewFiles HomebrewFiles(Settings.homebrewapps_path);
u32 filecount = HomebrewFiles.GetFilecount();
if (!filecount)
{
WindowPrompt(tr( "No .dol or .elf files found." ), 0, tr( "OK" ));
return MENU_DISCLIST;
}
enum
{
FADE, LEFT, RIGHT
};
if (IsNetworkInit()) ResumeNetworkWait();
int slidedirection = FADE;
/*** Sound Variables ***/
GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, Settings.sfxvolume);
// because destroy GuiSound must wait while sound playing is finished, we use a global sound
if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume);
// GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume);
GuiSound btnClick1(button_click_pcm, button_click_pcm_size, Settings.sfxvolume);
/*** Image Variables ***/
GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png"));
GuiImageData bgData(Resources::GetFile("settings_background.png"), Resources::GetFileSize("settings_background.png"));
GuiImageData MainButtonImgData(Resources::GetFile("settings_title.png"), Resources::GetFileSize("settings_title.png"));
GuiImageData MainButtonImgOverData(Resources::GetFile("settings_title_over.png"), Resources::GetFileSize("settings_title_over.png"));
GuiImageData arrow_left(Resources::GetFile("startgame_arrow_left.png"), Resources::GetFileSize("startgame_arrow_left.png"));
GuiImageData arrow_right(Resources::GetFile("startgame_arrow_right.png"), Resources::GetFileSize("startgame_arrow_right.png"));
GuiImageData wifiImgData(Resources::GetFile("Wifi_btn.png"), Resources::GetFileSize("Wifi_btn.png"));
GuiImageData channelImgData(Resources::GetFile("Channel_btn.png"), Resources::GetFileSize("Channel_btn.png"));
GuiImage background(&bgData);
/*** Trigger Variables ***/
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);
GuiTrigger trigL;
trigL.SetButtonOnlyTrigger(-1, WPAD_BUTTON_LEFT | WPAD_CLASSIC_BUTTON_LEFT, PAD_BUTTON_LEFT);
GuiTrigger trigR;
trigR.SetButtonOnlyTrigger(-1, WPAD_BUTTON_RIGHT | WPAD_CLASSIC_BUTTON_RIGHT, PAD_BUTTON_RIGHT);
GuiTrigger trigMinus;
trigMinus.SetButtonOnlyTrigger(-1, WPAD_BUTTON_MINUS | WPAD_CLASSIC_BUTTON_MINUS, 0);
GuiTrigger trigPlus;
trigPlus.SetButtonOnlyTrigger(-1, WPAD_BUTTON_PLUS | WPAD_CLASSIC_BUTTON_PLUS, 0);
GuiText titleTxt(tr( "Homebrew Launcher" ), 28, ( GXColor )
{ 0, 0, 0, 255});
titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
titleTxt.SetPosition(0, 40);
GuiImageData *IconData[4];
GuiImage *IconImg[4];
for (int i = 0; i < 4; i++)
{
IconData[i] = NULL;
IconImg[i] = NULL;
}
/*** Buttons ***/
GuiText backBtnTxt(tr( "Back" ), 22, Theme.prompttext);
backBtnTxt.SetMaxWidth(btnOutline.GetWidth() - 30);
GuiImage backBtnImg(&btnOutline);
if (Settings.wsprompt)
{
backBtnTxt.SetWidescreen(Settings.widescreen);
backBtnImg.SetWidescreen(Settings.widescreen);
}
GuiButton backBtn(&backBtnImg, &backBtnImg, 2, 3, -180, 400, &trigA, &btnSoundOver, btnClick2, 1);
backBtn.SetLabel(&backBtnTxt);
backBtn.SetTrigger(&trigB);
GuiButton homo(1, 1);
homo.SetTrigger(&trigHome);
GuiImage GoLeftImg(&arrow_left);
GuiButton GoLeftBtn(GoLeftImg.GetWidth(), GoLeftImg.GetHeight());
GoLeftBtn.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
GoLeftBtn.SetPosition(25, -25);
GoLeftBtn.SetImage(&GoLeftImg);
GoLeftBtn.SetSoundOver(&btnSoundOver);
GoLeftBtn.SetSoundClick(btnClick2);
GoLeftBtn.SetEffectGrow();
GoLeftBtn.SetTrigger(&trigA);
GoLeftBtn.SetTrigger(&trigL);
GoLeftBtn.SetTrigger(&trigMinus);
GuiImage GoRightImg(&arrow_right);
GuiButton GoRightBtn(GoRightImg.GetWidth(), GoRightImg.GetHeight());
GoRightBtn.SetAlignment(ALIGN_RIGHT, ALIGN_MIDDLE);
GoRightBtn.SetPosition(-25, -25);
GoRightBtn.SetImage(&GoRightImg);
GoRightBtn.SetSoundOver(&btnSoundOver);
GoRightBtn.SetSoundClick(btnClick2);
GoRightBtn.SetEffectGrow();
GoRightBtn.SetTrigger(&trigA);
GoRightBtn.SetTrigger(&trigR);
GoRightBtn.SetTrigger(&trigPlus);
char MainButtonText[50];
snprintf(MainButtonText, sizeof(MainButtonText), "%s", " ");
GuiImage MainButton1Img(&MainButtonImgData);
GuiImage MainButton1ImgOver(&MainButtonImgOverData);
GuiText MainButton1Txt(MainButtonText, 18, ( GXColor )
{ 0, 0, 0, 255});
MainButton1Txt.SetMaxWidth(MainButton1Img.GetWidth() - 150, DOTTED);
MainButton1Txt.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
MainButton1Txt.SetPosition(148, -12);
GuiText MainButton1DescTxt(MainButtonText, 18, ( GXColor )
{ 0, 0, 0, 255});
MainButton1DescTxt.SetMaxWidth(MainButton1Img.GetWidth() - 150, DOTTED);
MainButton1DescTxt.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
MainButton1DescTxt.SetPosition(148, 15);
GuiText MainButton1DescOverTxt(MainButtonText, 18, ( GXColor )
{ 0, 0, 0, 255});
MainButton1DescOverTxt.SetMaxWidth(MainButton1Img.GetWidth() - 150, SCROLL_HORIZONTAL);
MainButton1DescOverTxt.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
MainButton1DescOverTxt.SetPosition(148, 15);
GuiButton MainButton1(MainButton1Img.GetWidth(), MainButton1Img.GetHeight());
MainButton1.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
MainButton1.SetPosition(0, 90);
MainButton1.SetImage(&MainButton1Img);
MainButton1.SetImageOver(&MainButton1ImgOver);
MainButton1.SetLabel(&MainButton1Txt);
MainButton1.SetLabel(&MainButton1DescTxt, 1);
MainButton1.SetLabelOver(&MainButton1DescOverTxt, 1);
MainButton1.SetSoundOver(&btnSoundOver);
MainButton1.SetSoundClick(&btnClick1);
MainButton1.SetEffectGrow();
MainButton1.SetTrigger(&trigA);
GuiImage MainButton2Img(&MainButtonImgData);
GuiImage MainButton2ImgOver(&MainButtonImgOverData);
GuiText MainButton2Txt(MainButtonText, 18, ( GXColor )
{ 0, 0, 0, 255});
MainButton2Txt.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
MainButton2Txt.SetPosition(148, -12);
MainButton2Txt.SetMaxWidth(MainButton2Img.GetWidth() - 150, DOTTED);
GuiText MainButton2DescTxt(MainButtonText, 18, ( GXColor )
{ 0, 0, 0, 255});
MainButton2DescTxt.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
MainButton2DescTxt.SetPosition(148, 15);
MainButton2DescTxt.SetMaxWidth(MainButton2Img.GetWidth() - 150, DOTTED);
GuiText MainButton2DescOverTxt(MainButtonText, 18, ( GXColor )
{ 0, 0, 0, 255});
MainButton2DescOverTxt.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
MainButton2DescOverTxt.SetPosition(148, 15);
MainButton2DescOverTxt.SetMaxWidth(MainButton2Img.GetWidth() - 150, SCROLL_HORIZONTAL);
GuiButton MainButton2(MainButton2Img.GetWidth(), MainButton2Img.GetHeight());
MainButton2.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
MainButton2.SetPosition(0, 160);
MainButton2.SetImage(&MainButton2Img);
MainButton2.SetImageOver(&MainButton2ImgOver);
MainButton2.SetLabel(&MainButton2Txt);
MainButton2.SetLabel(&MainButton2DescTxt, 1);
MainButton2.SetLabelOver(&MainButton2DescOverTxt, 1);
MainButton2.SetSoundOver(&btnSoundOver);
MainButton2.SetSoundClick(&btnClick1);
MainButton2.SetEffectGrow();
MainButton2.SetTrigger(&trigA);
GuiImage MainButton3Img(&MainButtonImgData);
GuiImage MainButton3ImgOver(&MainButtonImgOverData);
GuiText MainButton3Txt(MainButtonText, 18, ( GXColor )
{ 0, 0, 0, 255});
MainButton3Txt.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
MainButton3Txt.SetPosition(148, -12);
MainButton3Txt.SetMaxWidth(MainButton3Img.GetWidth() - 150, DOTTED);
GuiText MainButton3DescTxt(MainButtonText, 18, ( GXColor )
{ 0, 0, 0, 255});
MainButton3DescTxt.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
MainButton3DescTxt.SetPosition(148, 15);
MainButton3DescTxt.SetMaxWidth(MainButton3Img.GetWidth() - 150, DOTTED);
GuiText MainButton3DescOverTxt(MainButtonText, 18, ( GXColor )
{ 0, 0, 0, 255});
MainButton3DescOverTxt.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
MainButton3DescOverTxt.SetPosition(148, 15);
MainButton3DescOverTxt.SetMaxWidth(MainButton3Img.GetWidth() - 150, SCROLL_HORIZONTAL);
GuiButton MainButton3(MainButton3Img.GetWidth(), MainButton3Img.GetHeight());
MainButton3.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
MainButton3.SetPosition(0, 230);
MainButton3.SetImage(&MainButton3Img);
MainButton3.SetImageOver(&MainButton3ImgOver);
MainButton3.SetLabel(&MainButton3Txt);
MainButton3.SetLabel(&MainButton3DescTxt, 1);
MainButton3.SetLabelOver(&MainButton3DescOverTxt, 1);
MainButton3.SetSoundOver(&btnSoundOver);
MainButton3.SetSoundClick(&btnClick1);
MainButton3.SetEffectGrow();
MainButton3.SetTrigger(&trigA);
GuiImage MainButton4Img(&MainButtonImgData);
GuiImage MainButton4ImgOver(&MainButtonImgOverData);
GuiText MainButton4Txt(MainButtonText, 18, ( GXColor )
{ 0, 0, 0, 255});
MainButton4Txt.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
MainButton4Txt.SetPosition(148, -12);
MainButton4Txt.SetMaxWidth(MainButton4Img.GetWidth() - 150, DOTTED);
GuiText MainButton4DescTxt(MainButtonText, 18, ( GXColor )
{ 0, 0, 0, 255});
MainButton4DescTxt.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
MainButton4DescTxt.SetPosition(148, 15);
MainButton4DescTxt.SetMaxWidth(MainButton4Img.GetWidth() - 150, DOTTED);
GuiText MainButton4DescOverTxt(MainButtonText, 18, ( GXColor )
{ 0, 0, 0, 255});
MainButton4DescOverTxt.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
MainButton4DescOverTxt.SetPosition(148, 15);
MainButton4DescOverTxt.SetMaxWidth(MainButton4Img.GetWidth() - 150, SCROLL_HORIZONTAL);
GuiButton MainButton4(MainButton4Img.GetWidth(), MainButton4Img.GetHeight());
MainButton4.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
MainButton4.SetPosition(0, 300);
MainButton4.SetImage(&MainButton4Img);
MainButton4.SetImageOver(&MainButton4ImgOver);
MainButton4.SetLabel(&MainButton4Txt);
MainButton4.SetLabel(&MainButton4DescTxt, 1);
MainButton4.SetLabelOver(&MainButton4DescOverTxt, 1);
MainButton4.SetSoundOver(&btnSoundOver);
MainButton4.SetSoundClick(&btnClick1);
MainButton4.SetEffectGrow();
MainButton4.SetTrigger(&trigA);
GuiImage wifiImg(&wifiImgData);
if (Settings.wsprompt)
{
wifiImg.SetWidescreen(Settings.widescreen);
}
GuiButton wifiBtn(wifiImg.GetWidth(), wifiImg.GetHeight());
wifiBtn.SetImage(&wifiImg);
wifiBtn.SetPosition(500, 400);
wifiBtn.SetSoundOver(&btnSoundOver);
wifiBtn.SetSoundClick(&btnClick1);
wifiBtn.SetEffectGrow();
wifiBtn.SetAlpha(80);
wifiBtn.SetTrigger(&trigA);
GuiImage channelBtnImg(&channelImgData);
channelBtnImg.SetWidescreen(Settings.widescreen);
GuiButton channelBtn(channelBtnImg.GetWidth(), channelBtnImg.GetHeight());
channelBtn.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
channelBtn.SetPosition(440, 400);
channelBtn.SetImage(&channelBtnImg);
channelBtn.SetSoundOver(&btnSoundOver);
channelBtn.SetSoundClick(btnClick2);
channelBtn.SetEffectGrow();
channelBtn.SetTrigger(&trigA);
GuiTooltip * titleTT = NULL;
GuiWindow w(screenwidth, screenheight);
/*** XML Variables ***/
HomebrewXML XMLInfo[4];
int pageToDisplay = 1;
const int pages = roundup(filecount / 4.0f);
bool wifi_btn_loaded = false;
while (menu == MENU_NONE) //set pageToDisplay to 0 to quit
{
VIDEO_WaitVSync();
menu = MENU_NONE;
bool changed = false;
int fileoffset = pageToDisplay * 4 - 4;
/** Standard procedure made in all pages **/
MainButton1.StopEffect();
MainButton2.StopEffect();
MainButton3.StopEffect();
MainButton4.StopEffect();
if (slidedirection == RIGHT)
{
MainButton1.SetEffect(EFFECT_SLIDE_LEFT | EFFECT_SLIDE_OUT, 60);
MainButton2.SetEffect(EFFECT_SLIDE_LEFT | EFFECT_SLIDE_OUT, 60);
MainButton3.SetEffect(EFFECT_SLIDE_LEFT | EFFECT_SLIDE_OUT, 60);
MainButton4.SetEffect(EFFECT_SLIDE_LEFT | EFFECT_SLIDE_OUT, 60);
while (MainButton1.GetEffect() > 0)
usleep(50);
}
else if (slidedirection == LEFT)
{
MainButton1.SetEffect(EFFECT_SLIDE_RIGHT | EFFECT_SLIDE_OUT, 60);
MainButton2.SetEffect(EFFECT_SLIDE_RIGHT | EFFECT_SLIDE_OUT, 60);
MainButton3.SetEffect(EFFECT_SLIDE_RIGHT | EFFECT_SLIDE_OUT, 60);
MainButton4.SetEffect(EFFECT_SLIDE_RIGHT | EFFECT_SLIDE_OUT, 60);
while (MainButton1.GetEffect() > 0)
usleep(50);
}
HaltGui();
mainWindow->RemoveAll();
/** Set new icons **/
for (int i = 0; i < 4; i++)
{
if (IconData[i] != NULL)
{
delete IconData[i];
IconData[i] = NULL;
}
if (IconImg[i] != NULL)
{
delete IconImg[i];
IconImg[i] = NULL;
}
if (fileoffset + i < (int) filecount)
{
char iconpath[200];
snprintf(iconpath, sizeof(iconpath), "%sicon.png", HomebrewFiles.GetFilepath(fileoffset + i));
IconData[i] = new GuiImageData(iconpath);
if (IconData[i]->GetImage())
{
IconImg[i] = new GuiImage(IconData[i]);
IconImg[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
IconImg[i]->SetPosition(12, 0);
IconImg[i]->SetScale(0.95);
}
}
}
if (IconImg[0] != 0)
MainButton1.SetIcon(IconImg[0]);
else MainButton1.SetIcon(NULL);
if (IconImg[1] != 0)
MainButton2.SetIcon(IconImg[1]);
else MainButton2.SetIcon(NULL);
if (IconImg[2] != 0)
MainButton3.SetIcon(IconImg[2]);
else MainButton3.SetIcon(NULL);
if (IconImg[3] != 0)
MainButton4.SetIcon(IconImg[3]);
else MainButton4.SetIcon(NULL);
mainWindow->Append(&w);
w.RemoveAll();
w.Append(&background);
w.Append(&titleTxt);
w.Append(&backBtn);
w.Append(&homo);
w.Append(&wifiBtn);
w.Append(&channelBtn);
w.Append(&GoRightBtn);
w.Append(&GoLeftBtn);
if (pageToDisplay == pages)
{
int buttonsleft = filecount - (pages - 1) * 4;
char * shortpath = NULL;
char temp[200];
if (buttonsleft > 0)
{
snprintf(temp, sizeof(temp), "%smeta.xml", HomebrewFiles.GetFilepath(fileoffset));
if (XMLInfo[0].LoadHomebrewXMLData(temp) > 0)
{
snprintf(MainButtonText, sizeof(MainButtonText), "%s", XMLInfo[0].GetName());
MainButton1Txt.SetText(MainButtonText);
snprintf(MainButtonText, sizeof(MainButtonText), "%s", XMLInfo[0].GetShortDescription());
MainButton1DescTxt.SetText(MainButtonText);
MainButton1DescOverTxt.SetText(MainButtonText);
}
else
{
snprintf(temp, strlen(HomebrewFiles.GetFilepath(fileoffset)), "%s", HomebrewFiles.GetFilepath(
fileoffset));
shortpath = strrchr(temp, '/');
snprintf(MainButtonText, sizeof(MainButtonText), "%s/%s", shortpath, HomebrewFiles.GetFilename(
fileoffset));
XMLInfo[0].SetName(MainButtonText);
MainButton1Txt.SetText(MainButtonText);
snprintf(MainButtonText, sizeof(MainButtonText), " ");
MainButton1DescTxt.SetText(MainButtonText);
MainButton1DescOverTxt.SetText(MainButtonText);
}
w.Append(&MainButton1);
}
if (buttonsleft > 1)
{
snprintf(temp, sizeof(temp), "%smeta.xml", HomebrewFiles.GetFilepath(fileoffset + 1));
if (XMLInfo[1].LoadHomebrewXMLData(temp) > 0)
{
snprintf(MainButtonText, sizeof(MainButtonText), "%s", XMLInfo[1].GetName());
MainButton2Txt.SetText(MainButtonText);
snprintf(MainButtonText, sizeof(MainButtonText), "%s", XMLInfo[1].GetShortDescription());
MainButton2DescTxt.SetText(MainButtonText);
MainButton2DescOverTxt.SetText(MainButtonText);
}
else
{
snprintf(temp, strlen(HomebrewFiles.GetFilepath(fileoffset + 1)), "%s", HomebrewFiles.GetFilepath(
fileoffset + 1));
shortpath = strrchr(temp, '/');
snprintf(MainButtonText, sizeof(MainButtonText), "%s/%s", shortpath, HomebrewFiles.GetFilename(
fileoffset + 1));
XMLInfo[1].SetName(MainButtonText);
MainButton2Txt.SetText(MainButtonText);
snprintf(MainButtonText, sizeof(MainButtonText), " ");
MainButton2DescTxt.SetText(MainButtonText);
MainButton2DescOverTxt.SetText(MainButtonText);
}
w.Append(&MainButton2);
}
if (buttonsleft > 2)
{
snprintf(temp, sizeof(temp), "%smeta.xml", HomebrewFiles.GetFilepath(fileoffset + 2));
if (XMLInfo[3].LoadHomebrewXMLData(temp) > 0)
{
snprintf(MainButtonText, sizeof(MainButtonText), "%s", XMLInfo[3].GetName());
MainButton3Txt.SetText(MainButtonText);
snprintf(MainButtonText, sizeof(MainButtonText), "%s", XMLInfo[3].GetShortDescription());
MainButton3DescTxt.SetText(MainButtonText);
MainButton3DescOverTxt.SetText(MainButtonText);
}
else
{
snprintf(temp, strlen(HomebrewFiles.GetFilepath(fileoffset + 2)), "%s", HomebrewFiles.GetFilepath(
fileoffset + 2));
shortpath = strrchr(temp, '/');
snprintf(MainButtonText, sizeof(MainButtonText), "%s/%s", shortpath, HomebrewFiles.GetFilename(
fileoffset + 2));
XMLInfo[2].SetName(MainButtonText);
MainButton3Txt.SetText(MainButtonText);
snprintf(MainButtonText, sizeof(MainButtonText), " ");
MainButton3DescTxt.SetText(MainButtonText);
MainButton3DescOverTxt.SetText(MainButtonText);
}
w.Append(&MainButton3);
}
if (buttonsleft > 3)
{
snprintf(temp, sizeof(temp), "%smeta.xml", HomebrewFiles.GetFilepath(fileoffset + 3));
if (XMLInfo[3].LoadHomebrewXMLData(temp) > 0)
{
snprintf(MainButtonText, sizeof(MainButtonText), "%s", XMLInfo[3].GetName());
MainButton4Txt.SetText(MainButtonText);
snprintf(MainButtonText, sizeof(MainButtonText), "%s", XMLInfo[3].GetShortDescription());
MainButton4DescTxt.SetText(MainButtonText);
MainButton4DescOverTxt.SetText(MainButtonText);
}
else
{
snprintf(temp, strlen(HomebrewFiles.GetFilepath(fileoffset + 3)), "%s", HomebrewFiles.GetFilepath(
fileoffset + 3));
shortpath = strrchr(temp, '/');
snprintf(MainButtonText, sizeof(MainButtonText), "%s/%s", shortpath, HomebrewFiles.GetFilename(
fileoffset + 3));
XMLInfo[3].SetName(MainButtonText);
MainButton4Txt.SetText(MainButtonText);
snprintf(MainButtonText, sizeof(MainButtonText), " ");
MainButton4DescTxt.SetText(MainButtonText);
MainButton4DescOverTxt.SetText(MainButtonText);
}
w.Append(&MainButton4);
}
}
else
{
char temp[200];
char *shortpath = NULL;
snprintf(temp, sizeof(temp), "%smeta.xml", HomebrewFiles.GetFilepath(fileoffset));
if (XMLInfo[0].LoadHomebrewXMLData(temp) > 0)
{
snprintf(MainButtonText, sizeof(MainButtonText), "%s", XMLInfo[0].GetName());
MainButton1Txt.SetText(MainButtonText);
snprintf(MainButtonText, sizeof(MainButtonText), "%s", XMLInfo[0].GetShortDescription());
MainButton1DescTxt.SetText(MainButtonText);
MainButton1DescOverTxt.SetText(MainButtonText);
}
else
{
snprintf(temp, strlen(HomebrewFiles.GetFilepath(fileoffset)), "%s", HomebrewFiles.GetFilepath(
fileoffset));
shortpath = strrchr(temp, '/');
snprintf(MainButtonText, sizeof(MainButtonText), "%s/%s", shortpath, HomebrewFiles.GetFilename(
fileoffset));
XMLInfo[0].SetName(MainButtonText);
MainButton1Txt.SetText(MainButtonText);
snprintf(MainButtonText, sizeof(MainButtonText), " ");
MainButton1DescTxt.SetText(MainButtonText);
MainButton1DescOverTxt.SetText(MainButtonText);
}
w.Append(&MainButton1);
snprintf(temp, sizeof(temp), "%smeta.xml", HomebrewFiles.GetFilepath(fileoffset + 1));
if (XMLInfo[1].LoadHomebrewXMLData(temp) > 0)
{
snprintf(MainButtonText, sizeof(MainButtonText), "%s", XMLInfo[1].GetName());
MainButton2Txt.SetText(MainButtonText);
snprintf(MainButtonText, sizeof(MainButtonText), "%s", XMLInfo[1].GetShortDescription());
MainButton2DescTxt.SetText(MainButtonText);
MainButton2DescOverTxt.SetText(MainButtonText);
}
else
{
snprintf(temp, strlen(HomebrewFiles.GetFilepath(fileoffset + 1)), "%s", HomebrewFiles.GetFilepath(
fileoffset + 1));
shortpath = strrchr(temp, '/');
snprintf(MainButtonText, sizeof(MainButtonText), "%s/%s", shortpath, HomebrewFiles.GetFilename(
fileoffset + 1));
XMLInfo[1].SetName(MainButtonText);
MainButton2Txt.SetText(MainButtonText);
snprintf(MainButtonText, sizeof(MainButtonText), " ");
MainButton2DescTxt.SetText(MainButtonText);
MainButton2DescOverTxt.SetText(MainButtonText);
}
w.Append(&MainButton2);
snprintf(temp, sizeof(temp), "%smeta.xml", HomebrewFiles.GetFilepath(fileoffset + 2));
if (XMLInfo[3].LoadHomebrewXMLData(temp) > 0)
{
snprintf(MainButtonText, sizeof(MainButtonText), "%s", XMLInfo[3].GetName());
MainButton3Txt.SetText(MainButtonText);
snprintf(MainButtonText, sizeof(MainButtonText), "%s", XMLInfo[3].GetShortDescription());
MainButton3DescTxt.SetText(MainButtonText);
MainButton3DescOverTxt.SetText(MainButtonText);
}
else
{
snprintf(temp, strlen(HomebrewFiles.GetFilepath(fileoffset + 2)), "%s", HomebrewFiles.GetFilepath(
fileoffset + 2));
shortpath = strrchr(temp, '/');
snprintf(MainButtonText, sizeof(MainButtonText), "%s/%s", shortpath, HomebrewFiles.GetFilename(
fileoffset + 2));
XMLInfo[2].SetName(MainButtonText);
MainButton3Txt.SetText(MainButtonText);
snprintf(MainButtonText, sizeof(MainButtonText), " ");
MainButton3DescTxt.SetText(MainButtonText);
MainButton3DescOverTxt.SetText(MainButtonText);
}
w.Append(&MainButton3);
snprintf(temp, sizeof(temp), "%smeta.xml", HomebrewFiles.GetFilepath(fileoffset + 3));
if (XMLInfo[3].LoadHomebrewXMLData(temp) > 0)
{
snprintf(MainButtonText, sizeof(MainButtonText), "%s", XMLInfo[3].GetName());
MainButton4Txt.SetText(MainButtonText);
snprintf(MainButtonText, sizeof(MainButtonText), "%s", XMLInfo[3].GetShortDescription());
MainButton4DescTxt.SetText(MainButtonText);
MainButton4DescOverTxt.SetText(MainButtonText);
}
else
{
snprintf(temp, strlen(HomebrewFiles.GetFilepath(fileoffset + 3)), "%s", HomebrewFiles.GetFilepath(
fileoffset + 3));
shortpath = strrchr(temp, '/');
snprintf(MainButtonText, sizeof(MainButtonText), "%s/%s", shortpath, HomebrewFiles.GetFilename(
fileoffset + 3));
XMLInfo[3].SetName(MainButtonText);
MainButton4Txt.SetText(MainButtonText);
snprintf(MainButtonText, sizeof(MainButtonText), " ");
MainButton4DescTxt.SetText(MainButtonText);
MainButton4DescOverTxt.SetText(MainButtonText);
}
w.Append(&MainButton4);
}
MainButton1.StopEffect();
MainButton2.StopEffect();
MainButton3.StopEffect();
MainButton4.StopEffect();
MainButton1.SetEffectGrow();
MainButton2.SetEffectGrow();
MainButton3.SetEffectGrow();
MainButton4.SetEffectGrow();
if (slidedirection == FADE)
{
MainButton1.SetEffect(EFFECT_FADE, 20);
MainButton2.SetEffect(EFFECT_FADE, 20);
MainButton3.SetEffect(EFFECT_FADE, 20);
MainButton4.SetEffect(EFFECT_FADE, 20);
}
else if (slidedirection == LEFT)
{
MainButton1.SetEffect(EFFECT_SLIDE_LEFT | EFFECT_SLIDE_IN, 60);
MainButton2.SetEffect(EFFECT_SLIDE_LEFT | EFFECT_SLIDE_IN, 60);
MainButton3.SetEffect(EFFECT_SLIDE_LEFT | EFFECT_SLIDE_IN, 60);
MainButton4.SetEffect(EFFECT_SLIDE_LEFT | EFFECT_SLIDE_IN, 60);
}
else if (slidedirection == RIGHT)
{
MainButton1.SetEffect(EFFECT_SLIDE_RIGHT | EFFECT_SLIDE_IN, 60);
MainButton2.SetEffect(EFFECT_SLIDE_RIGHT | EFFECT_SLIDE_IN, 60);
MainButton3.SetEffect(EFFECT_SLIDE_RIGHT | EFFECT_SLIDE_IN, 60);
MainButton4.SetEffect(EFFECT_SLIDE_RIGHT | EFFECT_SLIDE_IN, 60);
}
mainWindow->Append(&w);
ResumeGui();
while (MainButton1.GetEffect() > 0)
usleep(50);
while (!changed)
{
VIDEO_WaitVSync();
if (MainButton1.GetState() == STATE_CLICKED)
{
char temp[200];
char iconpath[200];
char metapath[200];
char * shortpath = NULL;
//write iconpath
snprintf(metapath, sizeof(metapath), "%smeta.xml", HomebrewFiles.GetFilepath(fileoffset));
//write iconpath
snprintf(iconpath, sizeof(iconpath), "%sicon.png", HomebrewFiles.GetFilepath(fileoffset));
//get filesize
u64 filesize = HomebrewFiles.GetFilesize(fileoffset);
//write short filename
snprintf(temp, strlen(HomebrewFiles.GetFilepath(fileoffset)), "%s", HomebrewFiles.GetFilepath(
fileoffset));
shortpath = strrchr(temp, '/');
snprintf(temp, sizeof(temp), "%s/%s", shortpath, HomebrewFiles.GetFilename(fileoffset));
int choice = HBCWindowPrompt(XMLInfo[0].GetName(), XMLInfo[0].GetCoder(), XMLInfo[0].GetVersion(),
XMLInfo[0].GetReleasedate(), XMLInfo[0].GetLongDescription(), iconpath, filesize);
if (choice == 1)
{
boothomebrew = 1;
menu = MENU_EXIT;
snprintf(Settings.selected_homebrew, sizeof(Settings.selected_homebrew), "%s%s",
HomebrewFiles.GetFilepath(fileoffset), HomebrewFiles.GetFilename(fileoffset));
break;
}
MainButton1.ResetState();
}
else if (MainButton2.GetState() == STATE_CLICKED)
{
char temp[200];
char iconpath[200];
char metapath[200];
char * shortpath = NULL;
//write iconpath
snprintf(metapath, sizeof(metapath), "%smeta.xml", HomebrewFiles.GetFilepath(fileoffset + 1));
//write iconpath
snprintf(iconpath, sizeof(iconpath), "%sicon.png", HomebrewFiles.GetFilepath(fileoffset + 1));
//get filesize
u64 filesize = HomebrewFiles.GetFilesize(fileoffset + 1);
//write short filename
snprintf(temp, strlen(HomebrewFiles.GetFilepath(fileoffset + 1)), "%s", HomebrewFiles.GetFilepath(
fileoffset + 1));
shortpath = strrchr(temp, '/');
snprintf(temp, sizeof(temp), "%s/%s", shortpath, HomebrewFiles.GetFilename(fileoffset + 1));
int choice = HBCWindowPrompt(XMLInfo[1].GetName(), XMLInfo[1].GetCoder(), XMLInfo[1].GetVersion(),
XMLInfo[1].GetReleasedate(), XMLInfo[1].GetLongDescription(), iconpath, filesize);
if (choice == 1)
{
boothomebrew = 1;
menu = MENU_EXIT;
snprintf(Settings.selected_homebrew, sizeof(Settings.selected_homebrew), "%s%s",
HomebrewFiles.GetFilepath(fileoffset + 1), HomebrewFiles.GetFilename(fileoffset + 1));
break;
}
MainButton2.ResetState();
}
else if (MainButton3.GetState() == STATE_CLICKED)
{
char temp[200];
char iconpath[200];
char metapath[200];
char * shortpath = NULL;
//write iconpath
snprintf(metapath, sizeof(metapath), "%smeta.xml", HomebrewFiles.GetFilepath(fileoffset + 2));
//write iconpath
snprintf(iconpath, sizeof(iconpath), "%sicon.png", HomebrewFiles.GetFilepath(fileoffset + 2));
//get filesize
u64 filesize = HomebrewFiles.GetFilesize(fileoffset + 2);
//write short filename
snprintf(temp, strlen(HomebrewFiles.GetFilepath(fileoffset + 2)), "%s", HomebrewFiles.GetFilepath(
fileoffset + 2));
shortpath = strrchr(temp, '/');
snprintf(temp, sizeof(temp), "%s/%s", shortpath, HomebrewFiles.GetFilename(fileoffset + 2));
int choice = HBCWindowPrompt(XMLInfo[2].GetName(), XMLInfo[2].GetCoder(), XMLInfo[2].GetVersion(),
XMLInfo[2].GetReleasedate(), XMLInfo[2].GetLongDescription(), iconpath, filesize);
if (choice == 1)
{
boothomebrew = 1;
menu = MENU_EXIT;
snprintf(Settings.selected_homebrew, sizeof(Settings.selected_homebrew), "%s%s",
HomebrewFiles.GetFilepath(fileoffset + 2), HomebrewFiles.GetFilename(fileoffset + 2));
break;
}
MainButton3.ResetState();
}
else if (MainButton4.GetState() == STATE_CLICKED)
{
char temp[200];
char iconpath[200];
char metapath[200];
char * shortpath = NULL;
//write iconpath
snprintf(metapath, sizeof(metapath), "%smeta.xml", HomebrewFiles.GetFilepath(fileoffset + 3));
//write iconpath
snprintf(iconpath, sizeof(iconpath), "%sicon.png", HomebrewFiles.GetFilepath(fileoffset + 3));
//get filesize
u64 filesize = HomebrewFiles.GetFilesize(fileoffset + 3);
//write short filename
snprintf(temp, strlen(HomebrewFiles.GetFilepath(fileoffset + 3)), "%s", HomebrewFiles.GetFilepath(
fileoffset + 3));
shortpath = strrchr(temp, '/');
snprintf(temp, sizeof(temp), "%s/%s", shortpath, HomebrewFiles.GetFilename(fileoffset + 3));
int choice = HBCWindowPrompt(XMLInfo[3].GetName(), XMLInfo[3].GetCoder(), XMLInfo[3].GetVersion(),
XMLInfo[3].GetReleasedate(), XMLInfo[3].GetLongDescription(), iconpath, filesize);
if (choice == 1)
{
boothomebrew = 1;
menu = MENU_EXIT;
snprintf(Settings.selected_homebrew, sizeof(Settings.selected_homebrew), "%s%s",
HomebrewFiles.GetFilepath(fileoffset + 3), HomebrewFiles.GetFilename(fileoffset + 3));
break;
}
MainButton4.ResetState();
}
else if (shutdown == 1)
Sys_Shutdown();
else if (reset == 1)
Sys_Reboot();
else if (backBtn.GetState() == STATE_CLICKED)
{
menu = MENU_DISCLIST;
changed = true;
}
else if (GoLeftBtn.GetState() == STATE_CLICKED)
{
pageToDisplay--;
/** Change direction of the flying buttons **/
if (pageToDisplay < 1) pageToDisplay = pages;
slidedirection = LEFT;
changed = true;
GoLeftBtn.ResetState();
}
else if (GoRightBtn.GetState() == STATE_CLICKED)
{
pageToDisplay++;
/** Change direction of the flying buttons **/
if (pageToDisplay > pages) pageToDisplay = 1;
slidedirection = RIGHT;
changed = true;
GoRightBtn.ResetState();
}
else if (wifiBtn.GetState() == STATE_CLICKED)
{
ResumeNetworkWait();
wifiBtn.ResetState();
}
else if (homo.GetState() == STATE_CLICKED)
{
Settings.Save();
bgMusic->Pause();
choice = WindowExitPrompt();
bgMusic->Resume();
if (choice == 3)
{
Sys_LoadMenu(); // Back to System Menu
}
else if (choice == 2)
{
Sys_BackToLoader();
}
else
{
homo.ResetState();
}
}
else if (infilesize > 0)
{
char filesizetxt[50];
char temp[50];
if (infilesize < MB_SIZE)
snprintf(filesizetxt, sizeof(filesizetxt), tr( "Incoming file %0.2fKB" ), infilesize / KB_SIZE);
else snprintf(filesizetxt, sizeof(filesizetxt), tr( "Incoming file %0.2fMB" ), infilesize / MB_SIZE);
snprintf(temp, sizeof(temp), tr( "Load file from: %s ?" ), GetIncommingIP());
int choice = WindowPrompt(filesizetxt, temp, tr( "OK" ), tr( "Cancel" ));
if (choice == 1)
{
int res = AllocHomebrewMemory(infilesize);
if (res < 0)
{
CloseConnection();
WindowPrompt(tr( "Not enough free memory." ), 0, tr( "OK" ));
}
else
{
u32 read = 0;
u8 *temp = NULL;
int len = NETWORKBLOCKSIZE;
temp = (u8 *) malloc(infilesize);
bool error = false;
u8 *ptr = temp;
while (read < infilesize)
{
ShowProgress(tr( "Receiving file from:" ), GetIncommingIP(), NULL, read, infilesize, true);
if (infilesize - read < (u32) len)
len = infilesize - read;
else len = NETWORKBLOCKSIZE;
int result = network_read(ptr, len);
if (result < 0)
{
WindowPrompt(tr( "Error while transfering data." ), 0, tr( "OK" ));
error = true;
break;
}
if (!result)
{
break;
}
ptr += result;
read += result;
}
char filename[101];
if (!error)
{
network_read((u8*) &filename, 100);
// Do we need to unzip this thing?
if (wiiloadVersion[0] > 0 || wiiloadVersion[1] > 4)
{
// We need to unzip...
if (temp[0] == 'P' && temp[1] == 'K' && temp[2] == 0x03 && temp[3] == 0x04)
{
// It's a zip file, unzip to the apps directory
// Zip archive, ask for permission to install the zip
char zippath[255];
sprintf((char *) &zippath, "%s%s", Settings.homebrewapps_path, filename);
FILE *fp = fopen(zippath, "wb");
if (fp != NULL)
{
fwrite(temp, 1, infilesize, fp);
fclose(fp);
// Now unzip the zip file...
unzFile uf = unzOpen(zippath);
if (uf == NULL)
{
error = true;
}
else
{
extractZip(uf, 0, 1, 0, Settings.homebrewapps_path);
unzCloseCurrentFile(uf);
remove(zippath);
// Reload this menu here...
menu = MENU_HOMEBREWBROWSE;
break;
}
}
else
{
error = true;
}
}
else if (uncfilesize != 0) // if uncfilesize == 0, it's not compressed
{
// It's compressed, uncompress
u8 *unc = (u8 *) malloc(uncfilesize);
uLongf f = uncfilesize;
error = uncompress(unc, &f, temp, infilesize) != Z_OK;
uncfilesize = f;
homebrewsize = uncfilesize;
free(temp);
temp = unc;
}
}
if (!error && strstr(filename, ".zip") == NULL)
{
innetbuffer = temp;
}
}
ProgressStop();
if (error || read != infilesize)
{
WindowPrompt(tr( "Error:" ), tr( "No data could be read." ), tr( "OK" ));
FreeHomebrewBuffer();
}
else
{
if (strstr(filename, ".dol") || strstr(filename, ".DOL") || strstr(filename, ".elf")
|| strstr(filename, ".ELF"))
{
boothomebrew = 2;
AddBootArgument(filename);
menu = MENU_EXIT;
CloseConnection();
break;
}
else if (strstr(filename, ".zip"))
{
WindowPrompt(tr( "Success:" ),
tr( "Uploaded ZIP file installed to homebrew directory." ), tr( "OK" ));
CloseConnection();
}
else
{
FreeHomebrewBuffer();
WindowPrompt(tr( "ERROR:" ), tr( "Not a DOL/ELF file." ), tr( "OK" ));
}
}
}
}
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
TitleBrowser();
//if they didn't boot a channel reset this window
w.SetState(STATE_DEFAULT);
channelBtn.ResetState();
}
if (IsNetworkInit())
{
if (!wifi_btn_loaded)
{
wifiBtn.SetAlpha(255);
titleTT = new GuiTooltip(GetNetworkIP());
titleTT->SetAlpha(Theme.tooltipAlpha);
wifiBtn.SetToolTip(titleTT, 0, -50, 0, 5);
wifi_btn_loaded = true;
}
}
}
}
w.SetEffect(EFFECT_FADE, -20);
while (w.GetEffect() > 0)
usleep(50);
HaltGui();
for (int i = 0; i < 4; i++)
{
if (IconData[i] != NULL)
{
delete IconData[i];
IconData[i] = NULL;
}
if (IconImg[i] != NULL)
{
delete IconImg[i];
IconImg[i] = NULL;
}
}
delete titleTT;
titleTT = NULL;
if (IsNetworkInit()) HaltNetworkThread();
mainWindow->RemoveAll();
mainWindow->Append(bgImg);
ResumeGui();
return menu;
}