/**************************************************************************** * HomebrewBrowse * USB Loader GX 2009 * * Homebrew launcher for USB Loader GX * * homebrewbrowse.cpp ***************************************************************************/ #include #include #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 "menu.h" #include "menu/menus.h" #include "filelist.h" #include "sys.h" #include "network/http.h" #include #include "settings/cfg.h" #include "unzip/unzip.h" #include "unzip/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; extern struct SSettings Settings; extern void *innetbuffer; /*** 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 ***/ char imgPath[150]; snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", CFG.theme_path); GuiImageData btnOutline(imgPath, button_dialogue_box_png); snprintf(imgPath, sizeof(imgPath), "%ssettings_background.png", CFG.theme_path); GuiImageData bgData(imgPath, settings_background_png); snprintf(imgPath, sizeof(imgPath), "%ssettings_title.png", CFG.theme_path); GuiImageData MainButtonImgData(imgPath, settings_title_png); snprintf(imgPath, sizeof(imgPath), "%ssettings_title_over.png", CFG.theme_path); GuiImageData MainButtonImgOverData(imgPath, settings_title_over_png); snprintf(imgPath, sizeof(imgPath), "%sstartgame_arrow_left.png", CFG.theme_path); GuiImageData arrow_left(imgPath, startgame_arrow_left_png); snprintf(imgPath, sizeof(imgPath), "%sstartgame_arrow_right.png", CFG.theme_path); GuiImageData arrow_right(imgPath, startgame_arrow_right_png); snprintf(imgPath, sizeof(imgPath), "%sWifi_btn.png", CFG.theme_path); GuiImageData wifiImgData(imgPath, Wifi_btn_png); snprintf(imgPath, sizeof(imgPath), "%sChannel_btn.png", CFG.theme_path); GuiImageData channelImgData(imgPath, 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 == yes) { backBtnTxt.SetWidescreen(CFG.widescreen); backBtnImg.SetWidescreen(CFG.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, GuiText::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, GuiText::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, GuiText::SCROLL); 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, GuiText::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, GuiText::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, GuiText::SCROLL); 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, GuiText::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, GuiText::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, GuiText::SCROLL); 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, GuiText::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, GuiText::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, GuiText::SCROLL); 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 == yes) { wifiImg.SetWidescreen(CFG.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(CFG.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, 0); 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) { cfg_save_global(); 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; 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; 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 u32 num = 0x00010001; TitleBrowser(num); //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; }